From 970e719a7a829bddc647bbaa668dd8603abdddef Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 2 Nov 2023 11:16:34 +0200 Subject: gh-108082: Use PyErr_FormatUnraisable() (GH-111580) Replace most of calls of _PyErr_WriteUnraisableMsg() and some calls of PyErr_WriteUnraisable(NULL) with PyErr_FormatUnraisable(). Co-authored-by: Victor Stinner --- Lib/test/test_capi/test_watchers.py | 20 ++++++++++++++------ Lib/test/test_cmd_line.py | 5 +++-- Modules/_ctypes/_ctypes.c | 3 +-- Modules/_lsprof.c | 3 +-- Modules/gcmodule.c | 10 +++++----- Modules/getpath.c | 7 +++---- Modules/signalmodule.c | 5 ++--- Objects/codeobject.c | 20 +++----------------- Objects/dictobject.c | 9 ++------- Objects/funcobject.c | 20 +++----------------- Objects/moduleobject.c | 11 +++++------ Objects/typeobject.c | 10 ++++++---- Python/ceval.c | 8 ++++---- Python/compile.c | 5 ++--- Python/import.c | 10 +++++----- Python/perf_trampoline.c | 12 ++++-------- Python/pylifecycle.c | 34 +++++++++++++++++----------------- Python/pythonrun.c | 5 +++-- 18 files changed, 83 insertions(+), 114 deletions(-) diff --git a/Lib/test/test_capi/test_watchers.py b/Lib/test/test_capi/test_watchers.py index 6b8855e..5981712 100644 --- a/Lib/test/test_capi/test_watchers.py +++ b/Lib/test/test_capi/test_watchers.py @@ -110,9 +110,11 @@ class TestDictWatchers(unittest.TestCase): with catch_unraisable_exception() as cm: d["foo"] = "bar" self.assertIn( - "PyDict_EVENT_ADDED watcher callback for @@ -185,7 +184,7 @@ _DictRemover_call(PyObject *myself, PyObject *args, PyObject *kw) DictRemoverObject *self = (DictRemoverObject *)myself; if (self->key && self->dict) { if (-1 == PyDict_DelItem(self->dict, self->key)) { - _PyErr_WriteUnraisableMsg("on calling _ctypes.DictRemover", NULL); + PyErr_FormatUnraisable("Exception ignored on calling _ctypes.DictRemover"); } Py_CLEAR(self->key); Py_CLEAR(self->dict); diff --git a/Modules/_lsprof.c b/Modules/_lsprof.c index d23a756..8f09204 100644 --- a/Modules/_lsprof.c +++ b/Modules/_lsprof.c @@ -5,7 +5,6 @@ #include "Python.h" #include "pycore_call.h" // _PyObject_CallNoArgs() #include "pycore_ceval.h" // _PyEval_SetProfile() -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pystate.h" // _PyThreadState_GET() #include "rotatingtree.h" @@ -847,7 +846,7 @@ profiler_dealloc(ProfilerObject *op) if (op->flags & POF_ENABLED) { PyThreadState *tstate = _PyThreadState_GET(); if (_PyEval_SetProfile(tstate, NULL, NULL) < 0) { - _PyErr_WriteUnraisableMsg("When destroying _lsprof profiler", NULL); + PyErr_FormatUnraisable("Exception ignored when destroying _lsprof profiler"); } } diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index 592d527..3505b08 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1032,8 +1032,8 @@ delete_garbage(PyThreadState *tstate, GCState *gcstate, Py_INCREF(op); (void) clear(op); if (_PyErr_Occurred(tstate)) { - _PyErr_WriteUnraisableMsg("in tp_clear of", - (PyObject*)Py_TYPE(op)); + PyErr_FormatUnraisable("Exception ignored in tp_clear of %s", + Py_TYPE(op)->tp_name); } Py_DECREF(op); } @@ -1344,7 +1344,7 @@ gc_collect_main(PyThreadState *tstate, int generation, _PyErr_Clear(tstate); } else { - _PyErr_WriteUnraisableMsg("in garbage collection", NULL); + PyErr_FormatUnraisable("Exception ignored in garbage collection"); } } @@ -1403,7 +1403,7 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase, "collected", collected, "uncollectable", uncollectable); if (info == NULL) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on invoking gc callbacks"); return; } } @@ -1411,7 +1411,7 @@ invoke_gc_callback(PyThreadState *tstate, const char *phase, PyObject *phase_obj = PyUnicode_FromString(phase); if (phase_obj == NULL) { Py_XDECREF(info); - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on invoking gc callbacks"); return; } diff --git a/Modules/getpath.c b/Modules/getpath.c index 6f76a84..50ba090 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -4,7 +4,6 @@ #include "pycore_fileutils.h" // _Py_abspath() #include "pycore_initconfig.h" // _PyStatus_EXCEPTION() #include "pycore_pathconfig.h" // _PyPathConfig_ReadGlobal() -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pymem.h" // _PyMem_RawWcsdup() #include "pycore_pystate.h" // _PyThreadState_GET() @@ -911,7 +910,7 @@ _PyConfig_InitPathConfig(PyConfig *config, int compute_path_config) ) { Py_DECREF(co); Py_DECREF(dict); - _PyErr_WriteUnraisableMsg("error evaluating initial values", NULL); + PyErr_FormatUnraisable("Exception ignored in preparing getpath"); return PyStatus_Error("error evaluating initial values"); } @@ -920,13 +919,13 @@ _PyConfig_InitPathConfig(PyConfig *config, int compute_path_config) if (!r) { Py_DECREF(dict); - _PyErr_WriteUnraisableMsg("error evaluating path", NULL); + PyErr_FormatUnraisable("Exception ignored in running getpath"); return PyStatus_Error("error evaluating path"); } Py_DECREF(r); if (_PyConfig_FromDict(config, configDict) < 0) { - _PyErr_WriteUnraisableMsg("reading getpath results", NULL); + PyErr_FormatUnraisable("Exception ignored in reading getpath results"); Py_DECREF(dict); return PyStatus_Error("error getting getpath results"); } diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index f3ba091..394a997 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -244,8 +244,7 @@ report_wakeup_write_error(void *data) errno = (int) (intptr_t) data; PyObject *exc = PyErr_GetRaisedException(); PyErr_SetFromErrno(PyExc_OSError); - _PyErr_WriteUnraisableMsg("when trying to write to the signal wakeup fd", - NULL); + PyErr_FormatUnraisable("Exception ignored when trying to write to the signal wakeup fd"); PyErr_SetRaisedException(exc); errno = save_errno; return 0; @@ -262,7 +261,7 @@ report_wakeup_send_error(void* data) recognizes the error codes used by both GetLastError() and WSAGetLastError */ PyErr_SetExcFromWindowsErr(PyExc_OSError, send_errno); - _PyErr_WriteUnraisableMsg("when trying to send to the signal wakeup fd", NULL); + PyErr_FormatUnraisable("Exception ignored when trying to send to the signal wakeup fd"); PyErr_SetRaisedException(exc); return 0; } diff --git a/Objects/codeobject.c b/Objects/codeobject.c index f662b8e..48ff5b8 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -12,8 +12,6 @@ #include "pycore_tuple.h" // _PyTuple_ITEMS() #include "clinic/codeobject.c.h" -static PyObject* code_repr(PyCodeObject *co); - static const char * code_event_name(PyCodeEvent event) { switch (event) { @@ -41,21 +39,9 @@ notify_code_watchers(PyCodeEvent event, PyCodeObject *co) // callback must be non-null if the watcher bit is set assert(cb != NULL); if (cb(event, co) < 0) { - // Don't risk resurrecting the object if an unraisablehook keeps - // a reference; pass a string as context. - PyObject *context = NULL; - PyObject *repr = code_repr(co); - if (repr) { - context = PyUnicode_FromFormat( - "%s watcher callback for %U", - code_event_name(event), repr); - Py_DECREF(repr); - } - if (context == NULL) { - context = Py_NewRef(Py_None); - } - PyErr_WriteUnraisable(context); - Py_DECREF(context); + PyErr_FormatUnraisable( + "Exception ignored in %s watcher callback for %R", + code_event_name(event), co); } } i++; diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 361f8e9..5aa2c0d 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -5912,14 +5912,9 @@ _PyDict_SendEvent(int watcher_bits, // unraisablehook keep a reference to it, so we don't pass the // dict as context, just an informative string message. Dict // repr can call arbitrary code, so we invent a simpler version. - PyObject *context = PyUnicode_FromFormat( - "%s watcher callback for ", + PyErr_FormatUnraisable( + "Exception ignored in %s watcher callback for ", dict_event_name(event), mp); - if (context == NULL) { - context = Py_NewRef(Py_None); - } - PyErr_WriteUnraisable(context); - Py_DECREF(context); } } watcher_bits >>= 1; diff --git a/Objects/funcobject.c b/Objects/funcobject.c index 56c5af6..8ce1bff 100644 --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -8,8 +8,6 @@ #include "pycore_pyerrors.h" // _PyErr_Occurred() -static PyObject* func_repr(PyFunctionObject *op); - static const char * func_event_name(PyFunction_WatchEvent event) { switch (event) { @@ -35,21 +33,9 @@ notify_func_watchers(PyInterpreterState *interp, PyFunction_WatchEvent event, // callback must be non-null if the watcher bit is set assert(cb != NULL); if (cb(event, func, new_value) < 0) { - // Don't risk resurrecting the func if an unraisablehook keeps a - // reference; pass a string as context. - PyObject *context = NULL; - PyObject *repr = func_repr(func); - if (repr != NULL) { - context = PyUnicode_FromFormat( - "%s watcher callback for %U", - func_event_name(event), repr); - Py_DECREF(repr); - } - if (context == NULL) { - context = Py_NewRef(Py_None); - } - PyErr_WriteUnraisable(context); - Py_DECREF(context); + PyErr_FormatUnraisable( + "Exception ignored in %s watcher callback for function %U at %p", + func_event_name(event), func->func_qualname, func); } } i++; diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c index 5b9f74d..a3d55b7 100644 --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -647,7 +647,7 @@ _PyModule_ClearDict(PyObject *d) PyErr_Clear(); } if (PyDict_SetItem(d, key, Py_None) != 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing module dict"); } } } @@ -668,7 +668,7 @@ _PyModule_ClearDict(PyObject *d) PyErr_Clear(); } if (PyDict_SetItem(d, key, Py_None) != 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing module dict"); } } } @@ -902,10 +902,9 @@ module_clear(PyModuleObject *m) { int res = m->md_def->m_clear((PyObject*)m); if (PyErr_Occurred()) { - PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n", - m->md_name ? " " : "", - m->md_name, ""); - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored in m_clear of module%s%V", + m->md_name ? " " : "", + m->md_name, ""); } if (res) return res; diff --git a/Objects/typeobject.c b/Objects/typeobject.c index 2508569..f44e30c 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -828,7 +828,9 @@ PyType_Modified(PyTypeObject *type) if (bits & 1) { PyType_WatchCallback cb = interp->type_watchers[i]; if (cb && (cb(type) < 0)) { - PyErr_WriteUnraisable((PyObject *)type); + PyErr_FormatUnraisable( + "Exception ignored in type watcher callback #%d for %R", + i, type); } } i++; @@ -9291,7 +9293,7 @@ releasebuffer_call_python(PyObject *self, Py_buffer *buffer) // from a Python __buffer__ function. mv = PyMemoryView_FromBuffer(buffer); if (mv == NULL) { - PyErr_WriteUnraisable(self); + PyErr_FormatUnraisable("Exception ignored in bf_releasebuffer of %s", Py_TYPE(self)->tp_name); goto end; } // Set the memoryview to restricted mode, which forbids @@ -9304,7 +9306,7 @@ releasebuffer_call_python(PyObject *self, Py_buffer *buffer) PyObject *stack[2] = {self, mv}; PyObject *ret = vectorcall_method(&_Py_ID(__release_buffer__), stack, 2); if (ret == NULL) { - PyErr_WriteUnraisable(self); + PyErr_FormatUnraisable("Exception ignored in __release_buffer__ of %s", Py_TYPE(self)->tp_name); } else { Py_DECREF(ret); @@ -9312,7 +9314,7 @@ releasebuffer_call_python(PyObject *self, Py_buffer *buffer) if (!is_buffer_wrapper) { PyObject *res = PyObject_CallMethodNoArgs(mv, &_Py_ID(release)); if (res == NULL) { - PyErr_WriteUnraisable(self); + PyErr_FormatUnraisable("Exception ignored in bf_releasebuffer of %s", Py_TYPE(self)->tp_name); } else { Py_DECREF(res); diff --git a/Python/ceval.c b/Python/ceval.c index 6e156ab..e07b282 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2235,7 +2235,7 @@ PyEval_SetProfile(Py_tracefunc func, PyObject *arg) PyThreadState *tstate = _PyThreadState_GET(); if (_PyEval_SetProfile(tstate, func, arg) < 0) { /* Log _PySys_Audit() error */ - _PyErr_WriteUnraisableMsg("in PyEval_SetProfile", NULL); + PyErr_FormatUnraisable("Exception ignored in PyEval_SetProfile"); } } @@ -2252,7 +2252,7 @@ PyEval_SetProfileAllThreads(Py_tracefunc func, PyObject *arg) while (ts) { if (_PyEval_SetProfile(ts, func, arg) < 0) { - _PyErr_WriteUnraisableMsg("in PyEval_SetProfileAllThreads", NULL); + PyErr_FormatUnraisable("Exception ignored in PyEval_SetProfileAllThreads"); } HEAD_LOCK(runtime); ts = PyThreadState_Next(ts); @@ -2266,7 +2266,7 @@ PyEval_SetTrace(Py_tracefunc func, PyObject *arg) PyThreadState *tstate = _PyThreadState_GET(); if (_PyEval_SetTrace(tstate, func, arg) < 0) { /* Log _PySys_Audit() error */ - _PyErr_WriteUnraisableMsg("in PyEval_SetTrace", NULL); + PyErr_FormatUnraisable("Exception ignored in PyEval_SetTrace"); } } @@ -2283,7 +2283,7 @@ PyEval_SetTraceAllThreads(Py_tracefunc func, PyObject *arg) while (ts) { if (_PyEval_SetTrace(ts, func, arg) < 0) { - _PyErr_WriteUnraisableMsg("in PyEval_SetTraceAllThreads", NULL); + PyErr_FormatUnraisable("Exception ignored in PyEval_SetTraceAllThreads"); } HEAD_LOCK(runtime); ts = PyThreadState_Next(ts); diff --git a/Python/compile.c b/Python/compile.c index 3ff6418..30005c3 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -34,7 +34,6 @@ #include "pycore_flowgraph.h" #include "pycore_intrinsics.h" #include "pycore_long.h" // _PyLong_GetZero() -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #include "pycore_pystate.h" // _Py_GetConfig() #include "pycore_setobject.h" // _PySet_NextEntry() #include "pycore_symtable.h" // PySTEntryObject, _PyFuture_FromAST() @@ -1407,8 +1406,8 @@ compiler_exit_scope(struct compiler *c) assert(c->u); /* we are deleting from a list so this really shouldn't fail */ if (PySequence_DelItem(c->c_stack, n) < 0) { - _PyErr_WriteUnraisableMsg("on removing the last compiler " - "stack item", NULL); + PyErr_FormatUnraisable("Exception ignored on removing " + "the last compiler stack item"); } } else { diff --git a/Python/import.c b/Python/import.c index 9aee7aa..b6ffba5 100644 --- a/Python/import.c +++ b/Python/import.c @@ -584,7 +584,7 @@ _PyImport_ClearModulesByIndex(PyInterpreterState *interp) if (PyList_SetSlice(MODULES_BY_INDEX(interp), 0, PyList_GET_SIZE(MODULES_BY_INDEX(interp)), NULL)) { - PyErr_WriteUnraisable(MODULES_BY_INDEX(interp)); + PyErr_FormatUnraisable("Exception ignored on clearing interpreters module list"); } } @@ -3156,13 +3156,13 @@ _PyImport_FiniCore(PyInterpreterState *interp) int verbose = _PyInterpreterState_GetConfig(interp)->verbose; if (_PySys_ClearAttrString(interp, "meta_path", verbose) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing sys.meta_path"); } // XXX Pull in most of finalize_modules() in pylifecycle.c. if (_PySys_ClearAttrString(interp, "modules", verbose) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing sys.modules"); } if (IMPORT_LOCK(interp) != NULL) { @@ -3242,10 +3242,10 @@ _PyImport_FiniExternal(PyInterpreterState *interp) // XXX Uninstall importlib metapath importers here? if (_PySys_ClearAttrString(interp, "path_importer_cache", verbose) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing sys.path_importer_cache"); } if (_PySys_ClearAttrString(interp, "path_hooks", verbose) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing sys.path_hooks"); } } diff --git a/Python/perf_trampoline.c b/Python/perf_trampoline.c index 4912239..208ced6 100644 --- a/Python/perf_trampoline.c +++ b/Python/perf_trampoline.c @@ -133,7 +133,6 @@ any DWARF information available for them). #include "pycore_ceval.h" // _PyPerf_Callbacks #include "pycore_frame.h" #include "pycore_interp.h" -#include "pycore_pyerrors.h" // _PyErr_WriteUnraisableMsg() #ifdef PY_HAVE_PERF_TRAMPOLINE @@ -236,8 +235,7 @@ new_code_arena(void) 0); // offset (not used here) if (!memory) { PyErr_SetFromErrno(PyExc_OSError); - _PyErr_WriteUnraisableMsg( - "Failed to create new mmap for perf trampoline", NULL); + PyErr_FormatUnraisable("Failed to create new mmap for perf trampoline"); perf_status = PERF_STATUS_FAILED; return -1; } @@ -261,9 +259,8 @@ new_code_arena(void) if (res == -1) { PyErr_SetFromErrno(PyExc_OSError); munmap(memory, mem_size); - _PyErr_WriteUnraisableMsg( - "Failed to set mmap for perf trampoline to PROT_READ | PROT_EXEC", - NULL); + PyErr_FormatUnraisable("Failed to set mmap for perf trampoline to " + "PROT_READ | PROT_EXEC"); return -1; } @@ -277,8 +274,7 @@ new_code_arena(void) if (new_arena == NULL) { PyErr_NoMemory(); munmap(memory, mem_size); - _PyErr_WriteUnraisableMsg("Failed to allocate new code arena struct", - NULL); + PyErr_FormatUnraisable("Failed to allocate new code arena struct for perf trampoline"); return -1; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index ea84ca0..ac8d520 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1419,13 +1419,13 @@ finalize_modules_delete_special(PyThreadState *tstate, int verbose) PySys_WriteStderr("# clear builtins._\n"); } if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on setting builtin variable _"); } const char * const *p; for (p = sys_deletes; *p != NULL; p++) { if (_PySys_ClearAttrString(interp, *p, verbose) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing sys.%s", *p); } } for (p = sys_files; *p != NULL; p+=2) { @@ -1436,13 +1436,13 @@ finalize_modules_delete_special(PyThreadState *tstate, int verbose) } PyObject *value; if (PyDict_GetItemStringRef(interp->sysdict, orig_name, &value) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on restoring sys.%s", name); } if (value == NULL) { value = Py_NewRef(Py_None); } if (PyDict_SetItemString(interp->sysdict, name, value) < 0) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on restoring sys.%s", name); } Py_DECREF(value); } @@ -1454,7 +1454,7 @@ finalize_remove_modules(PyObject *modules, int verbose) { PyObject *weaklist = PyList_New(0); if (weaklist == NULL) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on removing modules"); } #define STORE_MODULE_WEAKREF(name, mod) \ @@ -1463,13 +1463,13 @@ finalize_remove_modules(PyObject *modules, int verbose) if (wr) { \ PyObject *tup = PyTuple_Pack(2, name, wr); \ if (!tup || PyList_Append(weaklist, tup) < 0) { \ - PyErr_WriteUnraisable(NULL); \ + PyErr_FormatUnraisable("Exception ignored on removing modules"); \ } \ Py_XDECREF(tup); \ Py_DECREF(wr); \ } \ else { \ - PyErr_WriteUnraisable(NULL); \ + PyErr_FormatUnraisable("Exception ignored on removing modules"); \ } \ } @@ -1480,7 +1480,7 @@ finalize_remove_modules(PyObject *modules, int verbose) } \ STORE_MODULE_WEAKREF(name, mod); \ if (PyObject_SetItem(modules, name, Py_None) < 0) { \ - PyErr_WriteUnraisable(NULL); \ + PyErr_FormatUnraisable("Exception ignored on removing modules"); \ } \ } @@ -1494,14 +1494,14 @@ finalize_remove_modules(PyObject *modules, int verbose) else { PyObject *iterator = PyObject_GetIter(modules); if (iterator == NULL) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on removing modules"); } else { PyObject *key; while ((key = PyIter_Next(iterator))) { PyObject *value = PyObject_GetItem(modules, key); if (value == NULL) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on removing modules"); continue; } CLEAR_MODULE(key, value); @@ -1509,7 +1509,7 @@ finalize_remove_modules(PyObject *modules, int verbose) Py_DECREF(key); } if (PyErr_Occurred()) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on removing modules"); } Py_DECREF(iterator); } @@ -1529,7 +1529,7 @@ finalize_clear_modules_dict(PyObject *modules) } else { if (PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)) == NULL) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on clearing sys.modules"); } } } @@ -1541,11 +1541,11 @@ finalize_restore_builtins(PyThreadState *tstate) PyInterpreterState *interp = tstate->interp; PyObject *dict = PyDict_Copy(interp->builtins); if (dict == NULL) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on restoring builtins"); } PyDict_Clear(interp->builtins); if (PyDict_Update(interp->builtins, interp->builtins_copy)) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on restoring builtins"); } Py_XDECREF(dict); } @@ -1707,7 +1707,7 @@ flush_std_files(void) if (fout != NULL && fout != Py_None && !file_is_closed(fout)) { if (_PyFile_Flush(fout) < 0) { - PyErr_WriteUnraisable(fout); + PyErr_FormatUnraisable("Exception ignored on flushing sys.stdout"); status = -1; } } @@ -3037,14 +3037,14 @@ wait_for_thread_shutdown(PyThreadState *tstate) PyObject *threading = PyImport_GetModule(&_Py_ID(threading)); if (threading == NULL) { if (_PyErr_Occurred(tstate)) { - PyErr_WriteUnraisable(NULL); + PyErr_FormatUnraisable("Exception ignored on threading shutdown"); } /* else: threading not imported */ return; } result = PyObject_CallMethodNoArgs(threading, &_Py_ID(_shutdown)); if (result == NULL) { - PyErr_WriteUnraisable(threading); + PyErr_FormatUnraisable("Exception ignored on threading shutdown"); } else { Py_DECREF(result); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 79aeee1..5f305aa 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -650,7 +650,7 @@ _PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars) PyErr_Clear(); goto done; } - _PyErr_WriteUnraisableMsg("in audit hook", NULL); + PyErr_FormatUnraisable("Exception ignored in audit hook"); } if (hook) { PyObject* args[3] = {typ, exc, tb}; @@ -1093,7 +1093,8 @@ fallback: _PyRuntime.signals.unhandled_keyboard_interrupt = unhandled_keyboard_interrupt; #ifdef Py_DEBUG if (PyErr_Occurred()) { - _PyErr_WriteUnraisableMsg("in the internal traceback machinery", NULL); + PyErr_FormatUnraisable( + "Exception ignored in the internal traceback machinery"); } #endif PyErr_Clear(); -- cgit v0.12