Skip to content

Commit 80fa4ed

Browse files
iritkatrielFidget-Spinner
authored andcommitted
pythongh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives (python#102631)
1 parent 1359271 commit 80fa4ed

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
@@ -1791,18 +1791,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
17911791
if (exc == NULL) {
17921792
/* Reraise */
17931793
_PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
1794-
value = exc_info->exc_value;
1795-
if (Py_IsNone(value) || value == NULL) {
1794+
exc = exc_info->exc_value;
1795+
if (Py_IsNone(exc) || exc == NULL) {
17961796
_PyErr_SetString(tstate, PyExc_RuntimeError,
17971797
"No active exception to reraise");
17981798
return 0;
17991799
}
1800-
assert(PyExceptionInstance_Check(value));
1801-
type = PyExceptionInstance_Class(value);
1802-
Py_XINCREF(type);
1803-
Py_XINCREF(value);
1804-
PyObject *tb = PyException_GetTraceback(value); /* new ref */
1805-
_PyErr_Restore(tstate, type, value, tb);
1800+
Py_INCREF(exc);
1801+
assert(PyExceptionInstance_Check(exc));
1802+
_PyErr_SetRaisedException(tstate, exc);
18061803
return 1;
18071804
}
18081805

@@ -2043,28 +2040,27 @@ call_exc_trace(Py_tracefunc func, PyObject *self,
20432040
PyThreadState *tstate,
20442041
_PyInterpreterFrame *f)
20452042
{
2046-
PyObject *type, *value, *traceback, *orig_traceback, *arg;
2047-
int err;
2048-
_PyErr_Fetch(tstate, &type, &value, &orig_traceback);
2049-
if (value == NULL) {
2050-
value = Py_NewRef(Py_None);
2043+
PyObject *exc = _PyErr_GetRaisedException(tstate);
2044+
assert(exc && PyExceptionInstance_Check(exc));
2045+
PyObject *type = PyExceptionInstance_Class(exc);
2046+
PyObject *traceback = PyException_GetTraceback(exc);
2047+
if (traceback == NULL) {
2048+
traceback = Py_NewRef(Py_None);
20512049
}
2052-
_PyErr_NormalizeException(tstate, &type, &value, &orig_traceback);
2053-
traceback = (orig_traceback != NULL) ? orig_traceback : Py_None;
2054-
arg = PyTuple_Pack(3, type, value, traceback);
2050+
PyObject *arg = PyTuple_Pack(3, type, exc, traceback);
2051+
Py_XDECREF(traceback);
2052+
20552053
if (arg == NULL) {
2056-
_PyErr_Restore(tstate, type, value, orig_traceback);
2054+
_PyErr_SetRaisedException(tstate, exc);
20572055
return;
20582056
}
2059-
err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
2057+
int err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg);
20602058
Py_DECREF(arg);
20612059
if (err == 0) {
2062-
_PyErr_Restore(tstate, type, value, orig_traceback);
2060+
_PyErr_SetRaisedException(tstate, exc);
20632061
}
20642062
else {
2065-
Py_XDECREF(type);
2066-
Py_XDECREF(value);
2067-
Py_XDECREF(orig_traceback);
2063+
Py_XDECREF(exc);
20682064
}
20692065
}
20702066

0 commit comments

Comments
 (0)