def add_flow_to_label(self, label_name: ScopedName, ap_change: RegChangeLike): """ Registers a flow from current location to a label, with some ap_change. For example, after 'jmp label1 if [ap] != 0; ap++', we have a flow to label1 with ap_change of 1. """ ap_change = RegChange.from_expr(ap_change) new_data = self.get().add_ap(ap_change, self._group_alloc) self.labels_data[label_name] = self.labels_data[label_name].converge( self.reference_manager, new_data, self._group_alloc)
def test_from_expr(): assert RegChange.from_expr(5) == RegChangeKnown(5) assert RegChange.from_expr(RegChangeKnown(6)) == RegChangeKnown(6) assert RegChange.from_expr(ExprConst(7)) == RegChangeKnown(7) assert RegChange.from_expr(ExprIdentifier('asd')) == RegChangeUnknown() with pytest.raises(TypeError): RegChange.from_expr('wrong type')
def translate_ap(expr, ap_diff: RegChangeLike): ap: Optional[Callable] ap_diff = RegChange.from_expr(ap_diff) if isinstance(ap_diff, RegChangeKnown): diff = ap_diff.value def ap(location): return ExprOperator(ExprReg(reg=Register.AP, location=location), '-', ExprConst(val=diff, location=location), location=location) else: ap = None fp = (lambda location: ExprReg(reg=Register.FP, location=location)) return SubstituteRegisterTransformer(ap, fp).visit(expr)
def add_ap(self, ap_change: RegChangeLike): ap_change = RegChange.from_expr(ap_change) self.data = self.get().add_ap(ap_change, self._group_alloc)