equal
deleted
inserted
replaced
|
1 #! /usr/bin/env python |
|
2 |
|
3 import marshal |
|
4 import dis |
|
5 import types |
|
6 |
|
7 def dump(obj): |
|
8 print obj |
|
9 for attr in dir(obj): |
|
10 if attr.startswith('co_'): |
|
11 val = getattr(obj, attr) |
|
12 print "\t", attr, repr(val) |
|
13 |
|
14 def loadCode(path): |
|
15 f = open(path) |
|
16 f.read(8) |
|
17 co = marshal.load(f) |
|
18 f.close() |
|
19 return co |
|
20 |
|
21 def walk(co, match=None): |
|
22 if match is None or co.co_name == match: |
|
23 dump(co) |
|
24 print |
|
25 dis.dis(co) |
|
26 for obj in co.co_consts: |
|
27 if type(obj) == types.CodeType: |
|
28 walk(obj, match) |
|
29 |
|
30 def load(filename, codename=None): |
|
31 co = loadCode(filename) |
|
32 walk(co, codename) |
|
33 |
|
34 if __name__ == "__main__": |
|
35 import sys |
|
36 if len(sys.argv) == 3: |
|
37 filename, codename = sys.argv[1:] |
|
38 else: |
|
39 filename = sys.argv[1] |
|
40 codename = None |
|
41 if filename.endswith('.py'): |
|
42 buf = open(filename).read() |
|
43 co = compile(buf, filename, "exec") |
|
44 walk(co) |
|
45 else: |
|
46 load(filename, codename) |