|
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 | return0; |
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 | return1; |
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 | | -interr; |
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 | +interr=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 |
|
|