Skip to content

Commit 0ed7138

Browse files
committed
pythongh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives
1 parent f6ca71a commit 0ed7138

File tree

1 file changed

+19
-23
lines changed

1 file changed

+19
-23
lines changed

Python/ceval.c

+19-23
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)