diff options
author | Mark Shannon <mark@hotpy.org> | 2023-02-08 09:31:12 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-08 09:31:12 +0000 |
commit | feec49c40736fc05626a183a8d14c4ebbea5ae28 (patch) | |
tree | 5af6110eca8c2a21a9f699b40a87e7567c603e98 /Python/traceback.c | |
parent | 027adf42cd85db41fee05b0a40d89ef822876c97 (diff) | |
download | cpython-git-feec49c40736fc05626a183a8d14c4ebbea5ae28.tar.gz |
GH-101578: Normalize the current exception (GH-101607)
* Make sure that the current exception is always normalized.
* Remove redundant type and traceback fields for the current exception.
* Add new API functions: PyErr_GetRaisedException, PyErr_SetRaisedException
* Add new API functions: PyException_GetArgs, PyException_SetArgs
Diffstat (limited to 'Python/traceback.c')
-rw-r--r-- | Python/traceback.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/Python/traceback.c b/Python/traceback.c index da26c9b260..31b85e7757 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -249,6 +249,8 @@ PyTraceBack_Here(PyFrameObject *frame) _PyErr_ChainExceptions(exc, val, tb); return -1; } + assert(PyExceptionInstance_Check(val)); + PyException_SetTraceback(val, newtb); PyErr_Restore(exc, val, newtb); Py_XDECREF(tb); return 0; @@ -260,13 +262,12 @@ void _PyTraceback_Add(const char *funcname, const char *filename, int lineno) PyObject *globals; PyCodeObject *code; PyFrameObject *frame; - PyObject *exc, *val, *tb; PyThreadState *tstate = _PyThreadState_GET(); /* Save and clear the current exception. Python functions must not be called with an exception set. Calling Python functions happens when the codec of the filesystem encoding is implemented in pure Python. */ - _PyErr_Fetch(tstate, &exc, &val, &tb); + PyObject *exc = _PyErr_GetRaisedException(tstate); globals = PyDict_New(); if (!globals) @@ -283,13 +284,13 @@ void _PyTraceback_Add(const char *funcname, const char *filename, int lineno) goto error; frame->f_lineno = lineno; - _PyErr_Restore(tstate, exc, val, tb); + _PyErr_SetRaisedException(tstate, exc); PyTraceBack_Here(frame); Py_DECREF(frame); return; error: - _PyErr_ChainExceptions(exc, val, tb); + _PyErr_ChainExceptions1(exc); } static PyObject * |