gh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives in sub interpreters module (#102472)

This commit is contained in:
Irit Katriel 2023-03-06 17:49:31 +00:00 committed by GitHub
parent d3ca042c99
commit f105fe4f0a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -61,9 +61,9 @@ add_new_exception(PyObject *mod, const char *name, PyObject *base)
static int static int
_release_xid_data(_PyCrossInterpreterData *data, int ignoreexc) _release_xid_data(_PyCrossInterpreterData *data, int ignoreexc)
{ {
PyObject *exctype, *excval, *exctb; PyObject *exc;
if (ignoreexc) { if (ignoreexc) {
PyErr_Fetch(&exctype, &excval, &exctb); exc = PyErr_GetRaisedException();
} }
int res = _PyCrossInterpreterData_Release(data); int res = _PyCrossInterpreterData_Release(data);
if (res < 0) { if (res < 0) {
@ -84,7 +84,7 @@ _release_xid_data(_PyCrossInterpreterData *data, int ignoreexc)
} }
} }
if (ignoreexc) { if (ignoreexc) {
PyErr_Restore(exctype, excval, exctb); PyErr_SetRaisedException(exc);
} }
return res; return res;
} }
@ -294,9 +294,9 @@ _sharedexception_free(_sharedexception *exc)
} }
static _sharedexception * static _sharedexception *
_sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb) _sharedexception_bind(PyObject *exc)
{ {
assert(exctype != NULL); assert(exc != NULL);
char *failure = NULL; char *failure = NULL;
_sharedexception *err = _sharedexception_new(); _sharedexception *err = _sharedexception_new();
@ -304,7 +304,7 @@ _sharedexception_bind(PyObject *exctype, PyObject *exc, PyObject *tb)
goto finally; goto finally;
} }
PyObject *name = PyUnicode_FromFormat("%S", exctype); PyObject *name = PyUnicode_FromFormat("%S", Py_TYPE(exc));
if (name == NULL) { if (name == NULL) {
failure = "unable to format exception type name"; failure = "unable to format exception type name";
goto finally; goto finally;
@ -432,10 +432,7 @@ static int
_run_script(PyInterpreterState *interp, const char *codestr, _run_script(PyInterpreterState *interp, const char *codestr,
_sharedns *shared, _sharedexception **exc) _sharedns *shared, _sharedexception **exc)
{ {
PyObject *exctype = NULL;
PyObject *excval = NULL; PyObject *excval = NULL;
PyObject *tb = NULL;
PyObject *main_mod = _PyInterpreterState_GetMainModule(interp); PyObject *main_mod = _PyInterpreterState_GetMainModule(interp);
if (main_mod == NULL) { if (main_mod == NULL) {
goto error; goto error;
@ -469,12 +466,9 @@ _run_script(PyInterpreterState *interp, const char *codestr,
return 0; return 0;
error: error:
PyErr_Fetch(&exctype, &excval, &tb); excval = PyErr_GetRaisedException();
_sharedexception *sharedexc = _sharedexception_bind(excval);
_sharedexception *sharedexc = _sharedexception_bind(exctype, excval, tb);
Py_XDECREF(exctype);
Py_XDECREF(excval); Py_XDECREF(excval);
Py_XDECREF(tb);
if (sharedexc == NULL) { if (sharedexc == NULL) {
fprintf(stderr, "RunFailedError: script raised an uncaught exception"); fprintf(stderr, "RunFailedError: script raised an uncaught exception");
PyErr_Clear(); PyErr_Clear();