ref: 9ec1a07af2537e5485524c8d079a07abfee6f96d
dir: /sys/src/cmd/python/Tools/compiler/stacktest.py/
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:])