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()
16
+ #include "pycore_pyerrors.h" // _PyErr_Fetch(), _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
@@ -105,8 +105,7 @@ static void
105
105
dump_stack (_PyInterpreterFrame * frame , PyObject * * stack_pointer )
106
106
{
107
107
PyObject * * stack_base = _PyFrame_Stackbase (frame );
108
- PyObject * type , * value , * traceback ;
109
- PyErr_Fetch (& type , & value , & traceback );
108
+ PyObject * exc = PyErr_GetRaisedException ();
110
109
printf (" stack=[" );
111
110
for (PyObject * * ptr = stack_base ; ptr < stack_pointer ; ptr ++ ) {
112
111
if (ptr != stack_base ) {
@@ -120,7 +119,7 @@ dump_stack(_PyInterpreterFrame *frame, PyObject **stack_pointer)
120
119
}
121
120
printf ("]\n" );
122
121
fflush (stdout );
123
- PyErr_Restore ( type , value , traceback );
122
+ PyErr_SetRaisedException ( exc );
124
123
}
125
124
126
125
static void
@@ -157,8 +156,7 @@ lltrace_resume_frame(_PyInterpreterFrame *frame)
157
156
return ;
158
157
}
159
158
PyFunctionObject * f = (PyFunctionObject * )fobj ;
160
- PyObject * type , * value , * traceback ;
161
- PyErr_Fetch (& type , & value , & traceback );
159
+ PyObject * exc = PyErr_GetRaisedException ();
162
160
PyObject * name = f -> func_qualname ;
163
161
if (name == NULL ) {
164
162
name = f -> func_name ;
@@ -178,7 +176,7 @@ lltrace_resume_frame(_PyInterpreterFrame *frame)
178
176
}
179
177
printf ("\n" );
180
178
fflush (stdout );
181
- PyErr_Restore ( type , value , traceback );
179
+ PyErr_SetRaisedException ( exc );
182
180
}
183
181
#endif
184
182
static int call_trace (Py_tracefunc , PyObject * ,
@@ -1032,7 +1030,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
1032
1030
PyObject * v = POP ();
1033
1031
Py_XDECREF (v );
1034
1032
}
1035
- PyObject * exc , * val , * tb ;
1036
1033
if (lasti ) {
1037
1034
int frame_lasti = _PyInterpreterFrame_LASTI (frame );
1038
1035
PyObject * lasti = PyLong_FromLong (frame_lasti );
@@ -1041,19 +1038,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
1041
1038
}
1042
1039
PUSH (lasti );
1043
1040
}
1044
- _PyErr_Fetch ( tstate , & exc , & val , & tb );
1041
+
1045
1042
/* Make the raw exception data
1046
1043
available to the handler,
1047
1044
so a program can emulate the
1048
1045
Python main loop. */
1049
- _PyErr_NormalizeException (tstate , & exc , & val , & tb );
1050
- if (tb != NULL )
1051
- PyException_SetTraceback (val , tb );
1052
- else
1053
- PyException_SetTraceback (val , Py_None );
1054
- Py_XDECREF (tb );
1055
- Py_XDECREF (exc );
1056
- PUSH (val );
1046
+ PUSH (_PyErr_GetRaisedException (tstate ));
1057
1047
JUMPTO (handler );
1058
1048
/* Resume normal execution */
1059
1049
DISPATCH ();
@@ -2075,19 +2065,15 @@ call_trace_protected(Py_tracefunc func, PyObject *obj,
2075
2065
PyThreadState * tstate , _PyInterpreterFrame * frame ,
2076
2066
int what , PyObject * arg )
2077
2067
{
2078
- PyObject * type , * value , * traceback ;
2079
- int err ;
2080
- _PyErr_Fetch (tstate , & type , & value , & traceback );
2081
- err = call_trace (func , obj , tstate , frame , what , arg );
2068
+ PyObject * exc = _PyErr_GetRaisedException (tstate );
2069
+ int err = call_trace (func , obj , tstate , frame , what , arg );
2082
2070
if (err == 0 )
2083
2071
{
2084
- _PyErr_Restore (tstate , type , value , traceback );
2072
+ _PyErr_SetRaisedException (tstate , exc );
2085
2073
return 0 ;
2086
2074
}
2087
2075
else {
2088
- Py_XDECREF (type );
2089
- Py_XDECREF (value );
2090
- Py_XDECREF (traceback );
2076
+ Py_XDECREF (exc );
2091
2077
return -1 ;
2092
2078
}
2093
2079
}
@@ -2935,18 +2921,15 @@ format_exc_check_arg(PyThreadState *tstate, PyObject *exc,
2935
2921
2936
2922
if (exc == PyExc_NameError ) {
2937
2923
// Include the name in the NameError exceptions to offer suggestions later.
2938
- PyObject * type , * value , * traceback ;
2939
- PyErr_Fetch (& type , & value , & traceback );
2940
- PyErr_NormalizeException (& type , & value , & traceback );
2941
- if (PyErr_GivenExceptionMatches (value , PyExc_NameError )) {
2942
- PyNameErrorObject * exc = (PyNameErrorObject * ) value ;
2943
- if (exc -> name == NULL ) {
2924
+ PyObject * exc = PyErr_GetRaisedException ();
2925
+ if (PyErr_GivenExceptionMatches (exc , PyExc_NameError )) {
2926
+ if (((PyNameErrorObject * )exc )-> name == NULL ) {
2944
2927
// We do not care if this fails because we are going to restore the
2945
2928
// NameError anyway.
2946
- (void )PyObject_SetAttr (value , & _Py_ID (name ), obj );
2929
+ (void )PyObject_SetAttr (exc , & _Py_ID (name ), obj );
2947
2930
}
2948
2931
}
2949
- PyErr_Restore ( type , value , traceback );
2932
+ PyErr_SetRaisedException ( exc );
2950
2933
}
2951
2934
}
2952
2935
0 commit comments