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