symbian-qemu-0.9.1-12/python-2.6.1/Tools/compiler/stacktest.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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:])