]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-110912: Correctly display tracebacks for MemoryError exceptions using the tracebac...
authorPablo Galindo Salgado <Pablogsal@gmail.com>
Mon, 16 Oct 2023 14:39:23 +0000 (15:39 +0100)
committerGitHub <noreply@github.com>
Mon, 16 Oct 2023 14:39:23 +0000 (15:39 +0100)
Lib/test/test_traceback.py
Misc/NEWS.d/next/Core and Builtins/2023-10-16-12-12-48.gh-issue-110912.uEJGi_.rst [new file with mode: 0644]
Python/pythonrun.c

index 9bb1786c5472f54cc8782d93e32a0570b5644d53..a0f7ad81bd540d748ed9615475ed9b59de7dfd3b 100644 (file)
@@ -927,6 +927,17 @@ class TracebackErrorLocationCaretTestBase:
         ]
         self.assertEqual(actual, expected)
 
+    def test_memory_error(self):
+        def f():
+            raise MemoryError()
+
+        actual = self.get_exception(f)
+        expected = ['Traceback (most recent call last):',
+            f'  File "{__file__}", line {self.callable_line}, in get_exception',
+            '    callable()',
+            f'  File "{__file__}", line {f.__code__.co_firstlineno + 1}, in f',
+            '    raise MemoryError()']
+        self.assertEqual(actual, expected)
 
 
 @requires_debug_ranges()
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-10-16-12-12-48.gh-issue-110912.uEJGi_.rst b/Misc/NEWS.d/next/Core and Builtins/2023-10-16-12-12-48.gh-issue-110912.uEJGi_.rst
new file mode 100644 (file)
index 0000000..d70d45e
--- /dev/null
@@ -0,0 +1,2 @@
+Correctly display the traceback for :exc:`MemoryError` exceptions using the
+:mod:`traceback` module. Patch by Pablo Galindo
index 74994295a9b23aa8f79609fae6359a3cda7ec1a7..b915c063d0b456e862dba84a9ff4e9926cd4fcb7 100644 (file)
@@ -1031,6 +1031,7 @@ error:
 void
 _PyErr_Display(PyObject *file, PyObject *unused, PyObject *value, PyObject *tb)
 {
+    assert(value != NULL);
     assert(file != NULL && file != Py_None);
     if (PyExceptionInstance_Check(value)
         && tb != NULL && PyTraceBack_Check(tb)) {
@@ -1047,10 +1048,6 @@ _PyErr_Display(PyObject *file, PyObject *unused, PyObject *value, PyObject *tb)
 
     int unhandled_keyboard_interrupt = _PyRuntime.signals.unhandled_keyboard_interrupt;
 
-    if (!value || PyErr_GivenExceptionMatches(value, PyExc_MemoryError)) {
-        goto fallback;
-    }
-
     // Try first with the stdlib traceback module
     PyObject *traceback_module = PyImport_ImportModule("traceback");