diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py index 4742eb1d2309b4..c87ce7245335a8 100644 --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -121,6 +121,31 @@ def test_no_caret_with_no_debug_ranges_flag_python_traceback(self): finally: unlink(TESTFN) + def test_recursion_error_during_traceback(self): + code = textwrap.dedent(""" + import sys + from weakref import ref + + sys.setrecursionlimit(15) + + def f(): + ref(lambda: 0, []) + f() + + try: + f() + except RecursionError: + pass + """) + try: + with open(TESTFN, 'w') as f: + f.write(code) + + rc, _, _ = assert_python_ok(TESTFN) + self.assertEqual(rc, 0) + finally: + unlink(TESTFN) + def test_bad_indentation(self): err = self.get_exception_format(self.syntax_error_bad_indentation, IndentationError) diff --git a/Python/traceback.c b/Python/traceback.c index e02caef6f9bce7..9418236abbf518 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -699,11 +699,11 @@ tb_displayline(PyTracebackObject* tb, PyObject *f, PyObject *filename, int linen Py_DECREF(line); if (err != 0) return err; + int truncation = _TRACEBACK_SOURCE_LINE_INDENT; PyObject* source_line = NULL; - if (_Py_DisplaySourceLine(f, filename, lineno, _TRACEBACK_SOURCE_LINE_INDENT, - &truncation, &source_line) != 0) { + &truncation, &source_line) != 0 || !source_line) { /* ignore errors since we can't report them, can we? */ err = ignore_source_errors(); goto done;