test_exceptions.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. """Test runner for exception handling transform test cases.
  2. The transform inserts exception handling branch operations to IR.
  3. """
  4. from __future__ import annotations
  5. import os.path
  6. from mypy.errors import CompileError
  7. from mypy.test.config import test_temp_dir
  8. from mypy.test.data import DataDrivenTestCase
  9. from mypyc.analysis.blockfreq import frequently_executed_blocks
  10. from mypyc.common import TOP_LEVEL_NAME
  11. from mypyc.ir.pprint import format_func
  12. from mypyc.test.testutil import (
  13. ICODE_GEN_BUILTINS,
  14. MypycDataSuite,
  15. assert_test_output,
  16. build_ir_for_single_file,
  17. remove_comment_lines,
  18. use_custom_builtins,
  19. )
  20. from mypyc.transform.exceptions import insert_exception_handling
  21. from mypyc.transform.refcount import insert_ref_count_opcodes
  22. from mypyc.transform.uninit import insert_uninit_checks
  23. files = ["exceptions.test", "exceptions-freq.test"]
  24. class TestExceptionTransform(MypycDataSuite):
  25. files = files
  26. base_path = test_temp_dir
  27. def run_case(self, testcase: DataDrivenTestCase) -> None:
  28. """Perform a runtime checking transformation test case."""
  29. with use_custom_builtins(os.path.join(self.data_prefix, ICODE_GEN_BUILTINS), testcase):
  30. expected_output = remove_comment_lines(testcase.output)
  31. try:
  32. ir = build_ir_for_single_file(testcase.input)
  33. except CompileError as e:
  34. actual = e.messages
  35. else:
  36. actual = []
  37. for fn in ir:
  38. if fn.name == TOP_LEVEL_NAME and not testcase.name.endswith("_toplevel"):
  39. continue
  40. insert_uninit_checks(fn)
  41. insert_exception_handling(fn)
  42. insert_ref_count_opcodes(fn)
  43. actual.extend(format_func(fn))
  44. if testcase.name.endswith("_freq"):
  45. common = frequently_executed_blocks(fn.blocks[0])
  46. actual.append("hot blocks: %s" % sorted(b.label for b in common))
  47. assert_test_output(testcase, actual, "Invalid source code output", expected_output)