def default(self, n, live): n.live = live if isinstance(n, ArithInstr): return live | free_vars(n.lhs) \ | reduce(lambda a,b: a | b, [free_vars(r) for r in n.rhs], set([])) else: return Visitor.default(self, n, live)
def visitIndirectCallX86(self, n, live): n.live = live | free_vars(n.funptr) return n.live
def visitReturn(self, n, live): n.live = free_vars(n.value) return n.live
def visitSetIfNotEqInstr(self, n, live): n.live = live return live - free_vars(n.lhs)
def visitIntMoveZeroExtendInstr(self, n, live): n.live = live return (live - free_vars(n.lhs)) | free_vars(n.rhs[0])
def visitIntNotInstr(self, n, live): n.live = live return live | free_vars(n.lhs)
def visitWhile(self, n, live): n.live = live test_free = free_vars(n.test) body_live = self.dispatch(n.body, live | test_free) body_live = self.dispatch(n.body, live | test_free | body_live) return live | test_free | body_live
def visitIf(self, n, live): n.live = live then_live = self.dispatch(n.tests[0][1], live) else_live = self.dispatch(n.else_, live) return then_live | else_live | free_vars(n.tests[0][0])
def visitSetIfEqInstr(self, n, live): n.live = live - free_vars(n.lhs) return n.live