2000-10-09 14:35:24 +00:00
|
|
|
#! /usr/bin/env python
|
|
|
|
|
|
|
|
import marshal
|
2001-09-17 18:08:20 +00:00
|
|
|
import os
|
2000-10-09 14:35:24 +00:00
|
|
|
import dis
|
|
|
|
import types
|
|
|
|
|
|
|
|
def dump(obj):
|
|
|
|
print obj
|
|
|
|
for attr in dir(obj):
|
2001-09-17 18:08:20 +00:00
|
|
|
if attr.startswith('co_'):
|
|
|
|
val = getattr(obj, attr)
|
|
|
|
print "\t", attr, repr(val)
|
2000-10-09 14:35:24 +00:00
|
|
|
|
|
|
|
def loadCode(path):
|
|
|
|
f = open(path)
|
|
|
|
f.read(8)
|
|
|
|
co = marshal.load(f)
|
|
|
|
f.close()
|
|
|
|
return co
|
|
|
|
|
|
|
|
def walk(co, match=None):
|
|
|
|
if match is None or co.co_name == match:
|
|
|
|
dump(co)
|
|
|
|
print
|
|
|
|
dis.dis(co)
|
|
|
|
for obj in co.co_consts:
|
|
|
|
if type(obj) == types.CodeType:
|
|
|
|
walk(obj, match)
|
|
|
|
|
|
|
|
def main(filename, codename=None):
|
|
|
|
co = loadCode(filename)
|
|
|
|
walk(co, codename)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
import sys
|
|
|
|
if len(sys.argv) == 3:
|
|
|
|
filename, codename = sys.argv[1:]
|
|
|
|
else:
|
|
|
|
filename = sys.argv[1]
|
|
|
|
codename = None
|
2001-09-17 18:08:20 +00:00
|
|
|
if filename.endswith('.py') and os.path.exists(filename+"c"):
|
|
|
|
filename += "c"
|
2000-10-09 14:35:24 +00:00
|
|
|
main(filename, codename)
|