Home | History | Annotate | Download | only in compiler
      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)
     47