| import compiler |
| import dis |
| import types |
| |
| def extract_code_objects(co): |
| l = [co] |
| for const in co.co_consts: |
| if type(const) == types.CodeType: |
| l.append(const) |
| return l |
| |
| def compare(a, b): |
| if not (a.co_name == "?" or a.co_name.startswith('<lambda')): |
| assert a.co_name == b.co_name, (a, b) |
| if a.co_stacksize != b.co_stacksize: |
| print "stack mismatch %s: %d vs. %d" % (a.co_name, |
| a.co_stacksize, |
| b.co_stacksize) |
| if a.co_stacksize > b.co_stacksize: |
| print "good code" |
| dis.dis(a) |
| print "bad code" |
| dis.dis(b) |
| assert 0 |
| |
| def main(files): |
| for file in files: |
| print file |
| buf = open(file).read() |
| try: |
| co1 = compile(buf, file, "exec") |
| except SyntaxError: |
| print "skipped" |
| continue |
| co2 = compiler.compile(buf, file, "exec") |
| co1l = extract_code_objects(co1) |
| co2l = extract_code_objects(co2) |
| for a, b in zip(co1l, co2l): |
| compare(a, b) |
| |
| if __name__ == "__main__": |
| import sys |
| main(sys.argv[1:]) |