Example #1
0
	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
Example #2
0
	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
Example #3
0
    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