From f7d253050b9f737052a8ae6978fd494c26a927bd Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 2 Nov 2023 13:46:04 +0200 Subject: [PATCH] gh-108082: Remove _PyErr_WriteUnraisableMsg() Replace the remaining calls with PyErr_FormatUnraisable(). --- Include/internal/pycore_pyerrors.h | 5 ---- Modules/_ctypes/callbacks.c | 20 ++++++++-------- Modules/_testinternalcapi.c | 32 -------------------------- Modules/_threadmodule.c | 4 ++-- Modules/atexitmodule.c | 4 ++-- Modules/clinic/_testinternalcapi.c.h | 34 +--------------------------- Python/errors.c | 11 --------- 7 files changed, 16 insertions(+), 94 deletions(-) diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 67ef71c2616541..a953d2bb18d4ad 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -194,11 +194,6 @@ Py_DEPRECATED(3.12) extern void _PyErr_ChainExceptions(PyObject *, PyObject *, P // Export for '_zoneinfo' shared extension PyAPI_FUNC(void) _PyErr_ChainExceptions1(PyObject *); -// Export for '_lsprof' shared extension -PyAPI_FUNC(void) _PyErr_WriteUnraisableMsg( - const char *err_msg, - PyObject *obj); - #ifdef __cplusplus } #endif diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index 1bd8fec97179e9..154e9f43983cdb 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -9,7 +9,6 @@ #endif #include "pycore_call.h" // _PyObject_CallNoArgs() -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_runtime.h" // _Py_ID() #include @@ -216,8 +215,9 @@ static void _CallPythonObject(void *mem, result = PyObject_Vectorcall(callable, args, nargs, NULL); if (result == NULL) { - _PyErr_WriteUnraisableMsg("on calling ctypes callback function", - callable); + PyErr_FormatUnraisable( + "Exception ignored on calling ctypes callback function %R", + callable); } #ifdef MS_WIN32 @@ -258,9 +258,10 @@ static void _CallPythonObject(void *mem, if (keep == NULL) { /* Could not convert callback result. */ - _PyErr_WriteUnraisableMsg("on converting result " - "of ctypes callback function", - callable); + PyErr_FormatUnraisable( + "Exception ignored on converting result " + "of ctypes callback function %R", + callable); } else if (setfunc != _ctypes_get_fielddesc("O")->setfunc) { if (keep == Py_None) { @@ -270,9 +271,10 @@ static void _CallPythonObject(void *mem, else if (PyErr_WarnEx(PyExc_RuntimeWarning, "memory leak in callback function.", 1) == -1) { - _PyErr_WriteUnraisableMsg("on converting result " - "of ctypes callback function", - callable); + PyErr_FormatUnraisable( + "Exception ignored on converting result " + "of ctypes callback function %R", + callable); } } } diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c index a71e7e1dcc1256..7dba29a54d79b7 100644 --- a/Modules/_testinternalcapi.c +++ b/Modules/_testinternalcapi.c @@ -1518,37 +1518,6 @@ restore_crossinterp_data(PyObject *self, PyObject *args) } -/*[clinic input] -_testinternalcapi.write_unraisable_exc - exception as exc: object - err_msg: object - obj: object - / -[clinic start generated code]*/ - -static PyObject * -_testinternalcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, - PyObject *err_msg, PyObject *obj) -/*[clinic end generated code: output=a0f063cdd04aad83 input=274381b1a3fa5cd6]*/ -{ - - const char *err_msg_utf8; - if (err_msg != Py_None) { - err_msg_utf8 = PyUnicode_AsUTF8(err_msg); - if (err_msg_utf8 == NULL) { - return NULL; - } - } - else { - err_msg_utf8 = NULL; - } - - PyErr_SetObject((PyObject *)Py_TYPE(exc), exc); - _PyErr_WriteUnraisableMsg(err_msg_utf8, obj); - Py_RETURN_NONE; -} - - static PyObject * raiseTestError(const char* test_name, const char* msg) { @@ -1699,7 +1668,6 @@ static PyMethodDef module_functions[] = { {"perf_trampoline_set_persist_after_fork", perf_trampoline_set_persist_after_fork, METH_VARARGS}, {"get_crossinterp_data", get_crossinterp_data, METH_VARARGS}, {"restore_crossinterp_data", restore_crossinterp_data, METH_VARARGS}, - _TESTINTERNALCAPI_WRITE_UNRAISABLE_EXC_METHODDEF _TESTINTERNALCAPI_TEST_LONG_NUMBITS_METHODDEF {NULL, NULL} /* sentinel */ }; diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c index a849a200df625c..9eecebddb723a4 100644 --- a/Modules/_threadmodule.c +++ b/Modules/_threadmodule.c @@ -5,7 +5,6 @@ #include "Python.h" #include "pycore_interp.h" // _PyInterpreterState.threads.count #include "pycore_moduleobject.h" // _PyModule_GetState() -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pylifecycle.h" #include "pycore_pystate.h" // _PyThreadState_SetCurrent() #include "pycore_sysmodule.h" // _PySys_GetAttr() @@ -1071,7 +1070,8 @@ thread_run(void *boot_raw) /* SystemExit is ignored silently */ PyErr_Clear(); else { - _PyErr_WriteUnraisableMsg("in thread started by", boot->func); + PyErr_FormatUnraisable( + "Exception ignored in thread started by %R", boot->func); } } else { diff --git a/Modules/atexitmodule.c b/Modules/atexitmodule.c index 57e2ea67450453..b6f1bcbca67916 100644 --- a/Modules/atexitmodule.c +++ b/Modules/atexitmodule.c @@ -10,7 +10,6 @@ #include "pycore_atexit.h" // export _Py_AtExit() #include "pycore_initconfig.h" // _PyStatus_NO_MEMORY #include "pycore_interp.h" // PyInterpreterState.atexit -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pystate.h" // _PyInterpreterState_GET /* ===================================================================== */ @@ -137,7 +136,8 @@ atexit_callfuncs(struct atexit_state *state) PyObject* the_func = Py_NewRef(cb->func); PyObject *res = PyObject_Call(cb->func, cb->args, cb->kwargs); if (res == NULL) { - _PyErr_WriteUnraisableMsg("in atexit callback", the_func); + PyErr_FormatUnraisable( + "Exception ignored in atexit callback %R", the_func); } else { Py_DECREF(res); diff --git a/Modules/clinic/_testinternalcapi.c.h b/Modules/clinic/_testinternalcapi.c.h index 10374e0211ff03..cba2a943d03456 100644 --- a/Modules/clinic/_testinternalcapi.c.h +++ b/Modules/clinic/_testinternalcapi.c.h @@ -266,38 +266,6 @@ _testinternalcapi_assemble_code_object(PyObject *module, PyObject *const *args, return return_value; } -PyDoc_STRVAR(_testinternalcapi_write_unraisable_exc__doc__, -"write_unraisable_exc($module, exception, err_msg, obj, /)\n" -"--\n" -"\n"); - -#define _TESTINTERNALCAPI_WRITE_UNRAISABLE_EXC_METHODDEF \ - {"write_unraisable_exc", _PyCFunction_CAST(_testinternalcapi_write_unraisable_exc), METH_FASTCALL, _testinternalcapi_write_unraisable_exc__doc__}, - -static PyObject * -_testinternalcapi_write_unraisable_exc_impl(PyObject *module, PyObject *exc, - PyObject *err_msg, PyObject *obj); - -static PyObject * -_testinternalcapi_write_unraisable_exc(PyObject *module, PyObject *const *args, Py_ssize_t nargs) -{ - PyObject *return_value = NULL; - PyObject *exc; - PyObject *err_msg; - PyObject *obj; - - if (!_PyArg_CheckPositional("write_unraisable_exc", nargs, 3, 3)) { - goto exit; - } - exc = args[0]; - err_msg = args[1]; - obj = args[2]; - return_value = _testinternalcapi_write_unraisable_exc_impl(module, exc, err_msg, obj); - -exit: - return return_value; -} - PyDoc_STRVAR(_testinternalcapi_test_long_numbits__doc__, "test_long_numbits($module, /)\n" "--\n" @@ -314,4 +282,4 @@ _testinternalcapi_test_long_numbits(PyObject *module, PyObject *Py_UNUSED(ignore { return _testinternalcapi_test_long_numbits_impl(module); } -/*[clinic end generated code: output=3425f97821fc7462 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=679bf53bbae20085 input=a9049054013a1b77]*/ diff --git a/Python/errors.c b/Python/errors.c index 30be7faea55a6e..c55ebfdb502d61 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1698,17 +1698,6 @@ format_unraisable(PyObject *obj, const char *format, ...) va_end(va); } -void -_PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) -{ - if (err_msg_str) { - format_unraisable(obj, "Exception ignored %s", err_msg_str); - } - else { - format_unraisable(obj, NULL); - } -} - void PyErr_WriteUnraisable(PyObject *obj) {