OILS / mycpp / crash.py View on Github | oilshell.org

38 lines, 28 significant
1# Our copy of mypy/mypyc/crash.py, patched to write to stderr
2
3from typing import Iterator
4
5MYPY = False
6if MYPY:
7 from typing import NoReturn
8
9import sys
10import traceback
11from contextlib import contextmanager
12
13
14@contextmanager
15def catch_errors(module_path: str, line: int) -> Iterator[None]:
16 try:
17 yield
18 except Exception:
19 crash_report(module_path, line)
20
21
22def crash_report(module_path: str, line: int) -> 'NoReturn':
23 # Adapted from report_internal_error in mypy
24 err = sys.exc_info()[1]
25 tb = traceback.extract_stack()[:-4]
26 # Excise all the traceback from the test runner
27 for i, x in enumerate(tb):
28 if x.name == 'pytest_runtest_call':
29 tb = tb[i + 1:]
30 break
31 tb2 = traceback.extract_tb(sys.exc_info()[2])[1:]
32 print('Traceback (most recent call last):', file=sys.stderr)
33 for s in traceback.format_list(tb + tb2):
34 print(s.rstrip('\n'), file=sys.stderr)
35 print('{}:{}: {}: {}'.format(module_path, line,
36 type(err).__name__, err),
37 file=sys.stderr)
38 raise SystemExit(2)