示例#1
0
 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)
示例#2
0
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')
示例#3
0
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)
示例#4
0
 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)