|
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
|
@@ -1783,18 +1783,15 @@ do_raise(PyThreadState *tstate, PyObject *exc, PyObject *cause)
|
1783 | 1783 | if (exc == NULL) {
|
1784 | 1784 | /* Reraise */
|
1785 | 1785 | _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) { |
1788 | 1788 | _PyErr_SetString(tstate, PyExc_RuntimeError,
|
1789 | 1789 | "No active exception to reraise");
|
1790 | 1790 | return 0;
|
1791 | 1791 | }
|
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); |
1798 | 1795 | return 1;
|
1799 | 1796 | }
|
1800 | 1797 |
|
@@ -2035,28 +2032,27 @@ call_exc_trace(Py_tracefunc func, PyObject *self,
|
2035 | 2032 | PyThreadState *tstate,
|
2036 | 2033 | _PyInterpreterFrame *f)
|
2037 | 2034 | {
|
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); |
2043 | 2041 | }
|
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 | + |
2047 | 2045 | if (arg == NULL) {
|
2048 |
| - _PyErr_Restore(tstate, type, value, orig_traceback); |
| 2046 | + _PyErr_SetRaisedException(tstate, exc); |
2049 | 2047 | return;
|
2050 | 2048 | }
|
2051 |
| - err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); |
| 2049 | + int err = call_trace(func, self, tstate, f, PyTrace_EXCEPTION, arg); |
2052 | 2050 | Py_DECREF(arg);
|
2053 | 2051 | if (err == 0) {
|
2054 |
| - _PyErr_Restore(tstate, type, value, orig_traceback); |
| 2052 | + _PyErr_SetRaisedException(tstate, exc); |
2055 | 2053 | }
|
2056 | 2054 | else {
|
2057 |
| - Py_XDECREF(type); |
2058 |
| - Py_XDECREF(value); |
2059 |
| - Py_XDECREF(orig_traceback); |
| 2055 | + Py_XDECREF(exc); |
2060 | 2056 | }
|
2061 | 2057 | }
|
2062 | 2058 |
|
|
0 commit comments