def visitSwitch(self, node): condition = self(node.condition) # Can the switch be constant folded? # Done inside dataflow analysis, as it can # greatly improve precision cond = condition.conditional if existingConstant(cond): value = cond.object.pyobj taken = node.t if value else node.f # Note: condtion.conditional is killed, as # it is assumed to be a reference. return ast.Suite([condition.preamble, self(taken)]) # Split tf, ff = self.flow.popSplit() self.flow.restore(tf) t = self(node.t) tf = self.flow.pop() self.flow.restore(ff) f = self(node.f) ff = self.flow.pop() # Merge merged, changed = meet(self.meetF, tf, ff) self.flow.restore(merged) result = ast.Switch(condition, t, f) return result
def visitAssign(self, node): if len(node.lcls) == 1: lcl = node.lcls[0] if fold.existingConstant(node.expr): self.flow.define(lcl, node.expr.object) return node elif isinstance(node.expr, ast.Local): # Propagate names. if lcl.name and not node.expr.name: node.expr.name = lcl.name elif not lcl.name and node.expr.name: lcl.name = node.expr.name self.flow.define(lcl, node.expr) return node for lcl in node.lcls: self.flow.define(lcl, top) return node