summaryrefslogtreecommitdiffstats
path: root/Objects/object.c
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-03-08 17:03:18 (GMT)
committerGitHub <noreply@github.com>2023-03-08 17:03:18 (GMT)
commit11a2c6ce516b24b2435cb627742a6c4df92d411c (patch)
tree56d6359741570d46994530d5098318c0046e089d /Objects/object.c
parentb097925858c6975c73e989226cf278cc382c0416 (diff)
downloadcpython-11a2c6ce516b24b2435cb627742a6c4df92d411c.zip
cpython-11a2c6ce516b24b2435cb627742a6c4df92d411c.tar.gz
cpython-11a2c6ce516b24b2435cb627742a6c4df92d411c.tar.bz2
gh-102192: Replace PyErr_Fetch/Restore etc by more efficient alternatives (in Objects/) (#102218)
Diffstat (limited to 'Objects/object.c')
-rw-r--r--Objects/object.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/Objects/object.c b/Objects/object.c
index 446c7b1..5db2b6a 100644
--- a/Objects/object.c
+++ b/Objects/object.c
@@ -370,13 +370,12 @@ _PyObject_Dump(PyObject* op)
fflush(stderr);
PyGILState_STATE gil = PyGILState_Ensure();
- PyObject *error_type, *error_value, *error_traceback;
- PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyObject *exc = PyErr_GetRaisedException();
(void)PyObject_Print(op, stderr, 0);
fflush(stderr);
- PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_SetRaisedException(exc);
PyGILState_Release(gil);
fprintf(stderr, "\n");
@@ -860,25 +859,22 @@ set_attribute_error_context(PyObject* v, PyObject* name)
return 0;
}
// Intercept AttributeError exceptions and augment them to offer suggestions later.
- PyObject *type, *value, *traceback;
- PyErr_Fetch(&type, &value, &traceback);
- PyErr_NormalizeException(&type, &value, &traceback);
- // Check if the normalized exception is indeed an AttributeError
- if (!PyErr_GivenExceptionMatches(value, PyExc_AttributeError)) {
+ PyObject *exc = PyErr_GetRaisedException();
+ if (!PyErr_GivenExceptionMatches(exc, PyExc_AttributeError)) {
goto restore;
}
- PyAttributeErrorObject* the_exc = (PyAttributeErrorObject*) value;
+ PyAttributeErrorObject* the_exc = (PyAttributeErrorObject*) exc;
// Check if this exception was already augmented
if (the_exc->name || the_exc->obj) {
goto restore;
}
// Augment the exception with the name and object
- if (PyObject_SetAttr(value, &_Py_ID(name), name) ||
- PyObject_SetAttr(value, &_Py_ID(obj), v)) {
+ if (PyObject_SetAttr(exc, &_Py_ID(name), name) ||
+ PyObject_SetAttr(exc, &_Py_ID(obj), v)) {
return 1;
}
restore:
- PyErr_Restore(type, value, traceback);
+ PyErr_SetRaisedException(exc);
return 0;
}
@@ -2190,9 +2186,8 @@ Py_ReprLeave(PyObject *obj)
PyObject *dict;
PyObject *list;
Py_ssize_t i;
- PyObject *error_type, *error_value, *error_traceback;
- PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyObject *exc = PyErr_GetRaisedException();
dict = PyThreadState_GetDict();
if (dict == NULL)
@@ -2213,7 +2208,7 @@ Py_ReprLeave(PyObject *obj)
finally:
/* ignore exceptions because there is no way to report them. */
- PyErr_Restore(error_type, error_value, error_traceback);
+ PyErr_SetRaisedException(exc);
}
/* Trashcan support. */