]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives (#102760)
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>
Thu, 16 Mar 2023 19:03:52 +0000 (19:03 +0000)
committerGitHub <noreply@github.com>
Thu, 16 Mar 2023 19:03:52 +0000 (19:03 +0000)
Python/traceback.c

index 31b85e77575efaeb59284015c6e4f59a8de2ac7e..097f69c76abfe1b109d2df389559a0d8168ab5fd 100644 (file)
@@ -11,7 +11,7 @@
 #include "pycore_interp.h"        // PyInterpreterState.gc
 #include "pycore_parser.h"        // _PyParser_ASTFromString
 #include "pycore_pyarena.h"       // _PyArena_Free()
-#include "pycore_pyerrors.h"      // _PyErr_Fetch()
+#include "pycore_pyerrors.h"      // _PyErr_GetRaisedException()
 #include "pycore_pystate.h"       // _PyThreadState_GET()
 #include "pycore_traceback.h"     // EXCEPTION_TB_HEADER
 
@@ -242,17 +242,18 @@ _PyTraceBack_FromFrame(PyObject *tb_next, PyFrameObject *frame)
 int
 PyTraceBack_Here(PyFrameObject *frame)
 {
-    PyObject *exc, *val, *tb, *newtb;
-    PyErr_Fetch(&exc, &val, &tb);
-    newtb = _PyTraceBack_FromFrame(tb, frame);
+    PyObject *exc = PyErr_GetRaisedException();
+    assert(PyExceptionInstance_Check(exc));
+    PyObject *tb = PyException_GetTraceback(exc);
+    PyObject *newtb = _PyTraceBack_FromFrame(tb, frame);
+    Py_XDECREF(tb);
     if (newtb == NULL) {
-        _PyErr_ChainExceptions(exc, val, tb);
+        _PyErr_ChainExceptions1(exc);
         return -1;
     }
-    assert(PyExceptionInstance_Check(val));
-    PyException_SetTraceback(val, newtb);
-    PyErr_Restore(exc, val, newtb);
-    Py_XDECREF(tb);
+    PyException_SetTraceback(exc, newtb);
+    Py_XDECREF(newtb);
+    PyErr_SetRaisedException(exc);
     return 0;
 }