#!/usr/bin/env python # -*- coding: utf-8 -*- """Recursive Python disassembler This module defines a disassembler for PBC. It is based on the dis module but is more advanced in that it disassembles code objects contained in other code objects. This module is intended for educational use. """ __all__ = ('disassemble',) from dis import dis as _dis def disassemble_code(co): """Do a recursive disassembly of a code object and it's child code objects in pre-order.""" print "== Disassembling %s ==" % co _dis(co) for const in co.co_consts: if hasattr(const, 'co_code'): disassemble_code(const) def disassemble(something): """Disassemble a class, a function, a code object or source code.""" if hasattr(something,'co_code'): disassemble_code(something) elif hasattr(something,'func_code'): disassemble_code(something.func_code) elif isinstance(something, str): # assume that this is a source string disassemble_code(compile(something,'','exec')) elif isinstance(something, type): classname = something.__name__ print "== Disassembling 'class %s%s' ==" % ( classname, something.__bases__) for name, value in vars(something): if hasattr(value,'func_code'): disassemble(value) print "%s.%s = %s" % (classname, name, value)