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:]) |