/Tools/compiler/stacktest.py

http://unladen-swallow.googlecode.com/ · Python · 43 lines · 39 code · 4 blank · 0 comment · 11 complexity · 0f809bca31ef9b71f5d542e32779e356 MD5 · raw file

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