Moved most of bytecode_visitor.BytecodeFlowVisitor into a new parent class GenericFlowVisitor, which is a useful starting point for address-based flow visitors.

This commit is contained in:
Jon Riehl 2013-06-11 17:11:38 -05:00
commit 5f81cab357

View file

@ -190,7 +190,7 @@ class BasicBlockVisitor (BytecodeVisitor):
# ______________________________________________________________________
class BytecodeFlowVisitor (BytecodeVisitor):
class GenericFlowVisitor (BytecodeVisitor):
def visit (self, flow):
self.block_list = list(flow.keys())
self.block_list.sort()
@ -209,15 +209,6 @@ class BytecodeFlowVisitor (BytecodeVisitor):
del self.block_list
return self.exit_flow_object(flow)
def visit_op (self, i, op, arg, *args, **kws):
new_args = []
for child_i, child_op, _, child_arg, child_args in args:
new_args.extend(self.visit_op(child_i, child_op, child_arg,
*child_args))
ret_val = super(BytecodeFlowVisitor, self).visit_op(i, op, arg,
*new_args)
return ret_val
def enter_flow_object (self, flow):
self.new_flow = {}
@ -234,6 +225,18 @@ class BytecodeFlowVisitor (BytecodeVisitor):
# ______________________________________________________________________
class BytecodeFlowVisitor (GenericFlowVisitor):
def visit_op (self, i, op, arg, *args, **kws):
new_args = []
for child_i, child_op, _, child_arg, child_args in args:
new_args.extend(self.visit_op(child_i, child_op, child_arg,
*child_args))
ret_val = super(BytecodeFlowVisitor, self).visit_op(i, op, arg,
*new_args)
return ret_val
# ______________________________________________________________________
class BenignBytecodeVisitorMixin (object):
def _do_nothing (self, i, op, arg, *args, **kws):
return [(i, op, self.opnames[op], arg, args)]