Home | History | Annotate | Download | only in compiler
      1 import compiler
      2 import dis
      3 import types
      4 
      5 def extract_code_objects(co):
      6     l = [co]
      7     for const in co.co_consts:
      8         if type(const) == types.CodeType:
      9             l.append(const)
     10     return l
     11 
     12 def compare(a, b):
     13     if not (a.co_name == "?" or a.co_name.startswith('<lambda')):
     14         assert a.co_name == b.co_name, (a, b)
     15     if a.co_stacksize != b.co_stacksize:
     16         print "stack mismatch %s: %d vs. %d" % (a.co_name,
     17                                                 a.co_stacksize,
     18                                                 b.co_stacksize)
     19         if a.co_stacksize > b.co_stacksize:
     20             print "good code"
     21             dis.dis(a)
     22             print "bad code"
     23             dis.dis(b)
     24             assert 0
     25 
     26 def main(files):
     27     for file in files:
     28         print file
     29         buf = open(file).read()
     30         try:
     31             co1 = compile(buf, file, "exec")
     32         except SyntaxError:
     33             print "skipped"
     34             continue
     35         co2 = compiler.compile(buf, file, "exec")
     36         co1l = extract_code_objects(co1)
     37         co2l = extract_code_objects(co2)
     38         for a, b in zip(co1l, co2l):
     39             compare(a, b)
     40 
     41 if __name__ == "__main__":
     42     import sys
     43     main(sys.argv[1:])
     44