|
13 | 13 | #include "pycore_object.h" // _PyObject_GC_TRACK()
|
14 | 14 | #include "pycore_moduleobject.h" // PyModuleObject
|
15 | 15 | #include "pycore_opcode.h" // EXTRA_CASES
|
16 |
| -#include "pycore_pyerrors.h" // _PyErr_Fetch(), _PyErr_GetRaisedException() |
| 16 | +#include "pycore_pyerrors.h" // _PyErr_GetRaisedException() |
17 | 17 | #include "pycore_pymem.h" // _PyMem_IsPtrFreed()
|
18 | 18 | #include "pycore_pystate.h" // _PyInterpreterState_GET()
|
19 | 19 | #include "pycore_range.h" // _PyRangeIterObject
|
@@ -1791,18 +1791,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
|
1791 | 1791 | if (exc == NULL) {
|
1792 | 1792 | /* Reraise */
|
1793 | 1793 | _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) { |
1796 | 1796 | _PyErr_SetString(tstate, PyExc_RuntimeError,
|
1797 | 1797 | "No active exception to reraise");
|
1798 | 1798 | return 0;
|
1799 | 1799 | }
|
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); |
1806 | 1803 | return 1;
|
1807 | 1804 | }
|
1808 | 1805 |
|
@@ -2043,28 +2040,27 @@ call_exc_trace(Py_tracefunc func, PyObject *self,
|
2043 | 2040 | PyThreadState *tstate,
|
2044 | 2041 | _PyInterpreterFrame *f)
|
2045 | 2042 | {
|
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); |
2051 | 2049 | }
|
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 | + |
2055 | 2053 | if (arg == NULL) {
|
2056 |
| - _PyErr_Restore(tstate, type, value, orig_traceback); |
| 2054 | + _PyErr_SetRaisedException(tstate, exc); |
2057 | 2055 | return;
|
2058 | 2056 | }
|
2059 |
| - err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); |
| 2057 | + int err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); |
2060 | 2058 | Py_DECREF(arg);
|
2061 | 2059 | if (err == 0) {
|
2062 |
| - _PyErr_Restore(tstate, type, value, orig_traceback); |
| 2060 | + _PyErr_SetRaisedException(tstate, exc); |
2063 | 2061 | }
|
2064 | 2062 | else {
|
2065 |
| - Py_XDECREF(type); |
2066 |
| - Py_XDECREF(value); |
2067 |
| - Py_XDECREF(orig_traceback); |
| 2063 | + Py_XDECREF(exc); |
2068 | 2064 | }
|
2069 | 2065 | }
|
2070 | 2066 |
|
|
0 commit comments