@@ -389,8 +389,7 @@ PyImport_AddModule(const char *name)
389
389
static void
390
390
remove_module (PyThreadState * tstate , PyObject * name )
391
391
{
392
- PyObject * type , * value , * traceback ;
393
- _PyErr_Fetch (tstate , & type , & value , & traceback );
392
+ PyObject * exc = _PyErr_GetRaisedException (tstate );
394
393
395
394
PyObject * modules = MODULES (tstate -> interp );
396
395
if (PyDict_CheckExact (modules )) {
@@ -403,7 +402,7 @@ remove_module(PyThreadState *tstate, PyObject *name)
403
402
}
404
403
}
405
404
406
- _PyErr_ChainExceptions ( type , value , traceback );
405
+ _PyErr_ChainExceptions1 ( exc );
407
406
}
408
407
409
408
@@ -2324,32 +2323,34 @@ remove_importlib_frames(PyThreadState *tstate)
2324
2323
const char * remove_frames = "_call_with_frames_removed" ;
2325
2324
int always_trim = 0 ;
2326
2325
int in_importlib = 0 ;
2327
- PyObject * exception , * value , * base_tb , * tb ;
2328
2326
PyObject * * prev_link , * * outer_link = NULL ;
2327
+ PyObject * base_tb = NULL ;
2329
2328
2330
2329
/* Synopsis: if it's an ImportError, we trim all importlib chunks
2331
2330
from the traceback. We always trim chunks
2332
2331
which end with a call to "_call_with_frames_removed". */
2333
2332
2334
- _PyErr_Fetch ( tstate , & exception , & value , & base_tb );
2335
- if (! exception || _PyInterpreterState_GetConfig (tstate -> interp )-> verbose ) {
2333
+ PyObject * exc = _PyErr_GetRaisedException ( tstate );
2334
+ if (exc == NULL || _PyInterpreterState_GetConfig (tstate -> interp )-> verbose ) {
2336
2335
goto done ;
2337
2336
}
2338
2337
2339
- if (PyType_IsSubtype ((PyTypeObject * ) exception ,
2340
- (PyTypeObject * ) PyExc_ImportError ))
2338
+ if (PyType_IsSubtype (Py_TYPE (exc ), (PyTypeObject * ) PyExc_ImportError )) {
2341
2339
always_trim = 1 ;
2340
+ }
2342
2341
2342
+ assert (PyExceptionInstance_Check (exc ));
2343
+ base_tb = PyException_GetTraceback (exc );
2343
2344
prev_link = & base_tb ;
2344
- tb = base_tb ;
2345
+ PyObject * tb = base_tb ;
2345
2346
while (tb != NULL ) {
2347
+ assert (PyTraceBack_Check (tb ));
2346
2348
PyTracebackObject * traceback = (PyTracebackObject * )tb ;
2347
2349
PyObject * next = (PyObject * ) traceback -> tb_next ;
2348
2350
PyFrameObject * frame = traceback -> tb_frame ;
2349
2351
PyCodeObject * code = PyFrame_GetCode (frame );
2350
2352
int now_in_importlib ;
2351
2353
2352
- assert (PyTraceBack_Check (tb ));
2353
2354
now_in_importlib = _PyUnicode_EqualToASCIIString (code -> co_filename , importlib_filename ) ||
2354
2355
_PyUnicode_EqualToASCIIString (code -> co_filename , external_filename );
2355
2356
if (now_in_importlib && !in_importlib ) {
@@ -2370,15 +2371,14 @@ remove_importlib_frames(PyThreadState *tstate)
2370
2371
Py_DECREF (code );
2371
2372
tb = next ;
2372
2373
}
2373
- assert (PyExceptionInstance_Check (value ));
2374
- assert ((PyObject * )Py_TYPE (value ) == exception );
2375
2374
if (base_tb == NULL ) {
2376
2375
base_tb = Py_None ;
2377
2376
Py_INCREF (Py_None );
2378
2377
}
2379
- PyException_SetTraceback (value , base_tb );
2378
+ PyException_SetTraceback (exc , base_tb );
2380
2379
done :
2381
- _PyErr_Restore (tstate , exception , value , base_tb );
2380
+ Py_XDECREF (base_tb );
2381
+ _PyErr_SetRaisedException (tstate , exc );
2382
2382
}
2383
2383
2384
2384
0 commit comments