Skip to content

Commit ca01cae

Browse files
authored
gh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives (#102631)
1 parent 9a8b66b commit ca01cae

File tree

1 file changed

+19
-23
lines changed

1 file changed

+19
-23
lines changed

Python/ceval.c

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#include "pycore_object.h" // _PyObject_GC_TRACK()
1414
#include "pycore_moduleobject.h" // PyModuleObject
1515
#include "pycore_opcode.h" // EXTRA_CASES
16-
#include "pycore_pyerrors.h" // _PyErr_Fetch(), _PyErr_GetRaisedException()
16+
#include "pycore_pyerrors.h" // _PyErr_GetRaisedException()
1717
#include "pycore_pymem.h" // _PyMem_IsPtrFreed()
1818
#include "pycore_pystate.h" // _PyInterpreterState_GET()
1919
#include "pycore_range.h" // _PyRangeIterObject
@@ -1783,18 +1783,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
17831783
if (exc == NULL) {
17841784
/* Reraise */
17851785
_PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
1786-
value = exc_info->exc_value;
1787-
if (Py_IsNone(value) || value == NULL) {
1786+
exc = exc_info->exc_value;
1787+
if (Py_IsNone(exc) || exc == NULL) {
17881788
_PyErr_SetString(tstate, PyExc_RuntimeError,
17891789
"No active exception to reraise");
17901790
return 0;
17911791
}
1792-
assert(PyExceptionInstance_Check(value));
1793-
type = PyExceptionInstance_Class(value);
1794-
Py_XINCREF(type);
1795-
Py_XINCREF(value);
1796-
PyObject *tb = PyException_GetTraceback(value); /* new ref */
1797-
_PyErr_Restore(tstate, type, value, tb);
1792+
Py_INCREF(exc);
1793+
assert(PyExceptionInstance_Check(exc));
1794+
_PyErr_SetRaisedException(tstate, exc);
17981795
return 1;
17991796
}
18001797

@@ -2035,28 +2032,27 @@ call_exc_trace(Py_tracefunc func, PyObject *self,
20352032
PyThreadState *tstate,
20362033
_PyInterpreterFrame *f)
20372034
{
2038-
PyObject *type, *value, *traceback, *orig_traceback, *arg;
2039-
int err;
2040-
_PyErr_Fetch(tstate, &type, &value, &orig_traceback);
2041-
if (value == NULL) {
2042-
value = Py_NewRef(Py_None);
2035+
PyObject *exc = _PyErr_GetRaisedException(tstate);
2036+
assert(exc && PyExceptionInstance_Check(exc));
2037+
PyObject *type = PyExceptionInstance_Class(exc);
2038+
PyObject *traceback = PyException_GetTraceback(exc);
2039+
if (traceback == NULL) {
2040+
traceback = Py_NewRef(Py_None);
20432041
}
2044-
_PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
2045-
traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
2046-
arg = PyTuple_Pack(3, type, value, traceback);
2042+
PyObject *arg = PyTuple_Pack(3, type, exc, traceback);
2043+
Py_XDECREF(traceback);
2044+
20472045
if (arg == NULL) {
2048-
_PyErr_Restore(tstate, type, value, orig_traceback);
2046+
_PyErr_SetRaisedException(tstate, exc);
20492047
return;
20502048
}
2051-
err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
2049+
int err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
20522050
Py_DECREF(arg);
20532051
if (err == 0) {
2054-
_PyErr_Restore(tstate, type, value, orig_traceback);
2052+
_PyErr_SetRaisedException(tstate, exc);
20552053
}
20562054
else {
2057-
Py_XDECREF(type);
2058-
Py_XDECREF(value);
2059-
Py_XDECREF(orig_traceback);
2055+
Py_XDECREF(exc);
20602056
}
20612057
}
20622058

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy