]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39164: Add private _PyErr_GetExcInfo() function (GH-17752)
authorJulien Danjou <julien@danjou.info>
Mon, 13 Jan 2020 16:30:14 +0000 (17:30 +0100)
committerVictor Stinner <vstinner@python.org>
Mon, 13 Jan 2020 16:30:14 +0000 (17:30 +0100)
This adds a new function named _PyErr_GetExcInfo() that is a variation of the
original PyErr_GetExcInfo() taking a PyThreadState as its first argument.
That function allows to retrieve the exceptions information of any Python
thread -- not only the current one.

Include/cpython/pyerrors.h
Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst [new file with mode: 0644]
Python/errors.c

index e3098b3925bd7949e863cd3a30c700123707d3fc..f8480fb79e55753c1005c743ed2be5b297873138 100644 (file)
@@ -76,6 +76,7 @@ typedef PyOSErrorObject PyWindowsErrorObject;
 
 PyAPI_FUNC(void) _PyErr_SetKeyError(PyObject *);
 _PyErr_StackItem *_PyErr_GetTopmostException(PyThreadState *tstate);
+PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, PyObject **);
 
 /* Context manipulation (PEP 3134) */
 
diff --git a/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst b/Misc/NEWS.d/next/C API/2019-12-30-10-43-52.bpo-39164.WEV0uu.rst
new file mode 100644 (file)
index 0000000..bb72ac7
--- /dev/null
@@ -0,0 +1 @@
+Add a private ``_PyErr_GetExcInfo()`` function to retrieve exception information of the specified Python thread state.
index d65707e7f97f5963b69d38f4f53c6cb61df0fb63..cdb44605056a5fec3e0ad0688908d4d80ea598e1 100644 (file)
@@ -433,21 +433,27 @@ PyErr_Clear(void)
 
 
 void
-PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
+_PyErr_GetExcInfo(PyThreadState *tstate,
+                  PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
 {
-    PyThreadState *tstate = _PyThreadState_GET();
-
     _PyErr_StackItem *exc_info = _PyErr_GetTopmostException(tstate);
     *p_type = exc_info->exc_type;
     *p_value = exc_info->exc_value;
     *p_traceback = exc_info->exc_traceback;
 
-
     Py_XINCREF(*p_type);
     Py_XINCREF(*p_value);
     Py_XINCREF(*p_traceback);
 }
 
+
+void
+PyErr_GetExcInfo(PyObject **p_type, PyObject **p_value, PyObject **p_traceback)
+{
+    PyThreadState *tstate = _PyThreadState_GET();
+    return _PyErr_GetExcInfo(tstate, p_type, p_value, p_traceback);
+}
+
 void
 PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
 {