]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-108082: Use PyErr_FormatUnraisable() (GH-111580)
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 2 Nov 2023 09:16:34 +0000 (11:16 +0200)
committerGitHub <noreply@github.com>
Thu, 2 Nov 2023 09:16:34 +0000 (09:16 +0000)
Replace most of calls of _PyErr_WriteUnraisableMsg() and some
calls of PyErr_WriteUnraisable(NULL) with PyErr_FormatUnraisable().

Co-authored-by: Victor Stinner <vstinner@python.org>
18 files changed:
Lib/test/test_capi/test_watchers.py
Lib/test/test_cmd_line.py
Modules/_ctypes/_ctypes.c
Modules/_lsprof.c
Modules/gcmodule.c
Modules/getpath.c
Modules/signalmodule.c
Objects/codeobject.c
Objects/dictobject.c
Objects/funcobject.c
Objects/moduleobject.c
Objects/typeobject.c
Python/ceval.c
Python/compile.c
Python/import.c
Python/perf_trampoline.c
Python/pylifecycle.c
Python/pythonrun.c

index 6b8855ec219d274b054583d6e763ecb8953bbfe9..5981712c80c3a96f8ab5246872dd2958aeb0e2b2 100644 (file)
@@ -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 <dict at",
-                    cm.unraisable.object
+                    "Exception ignored in "
+                    "PyDict_EVENT_ADDED watcher callback for <dict at ",
+                    cm.unraisable.err_msg
                 )
+                self.assertIsNone(cm.unraisable.object)
                 self.assertEqual(str(cm.unraisable.exc_value), "boom!")
             self.assert_events([])
 
@@ -278,7 +280,9 @@ class TestTypeWatchers(unittest.TestCase):
             self.watch(wid, C)
             with catch_unraisable_exception() as cm:
                 C.foo = "bar"
-                self.assertIs(cm.unraisable.object, C)
+                self.assertEqual(cm.unraisable.err_msg,
+                    f"Exception ignored in type watcher callback #0 for {C!r}")
+                self.assertIs(cm.unraisable.object, None)
                 self.assertEqual(str(cm.unraisable.exc_value), "boom!")
             self.assert_events([])
 
@@ -416,9 +420,11 @@ class TestCodeObjectWatchers(unittest.TestCase):
                 co = _testcapi.code_newempty("test_watchers", "dummy0", 0)
 
                 self.assertEqual(
-                    cm.unraisable.object,
+                    cm.unraisable.err_msg,
+                    f"Exception ignored in "
                     f"PY_CODE_EVENT_CREATE watcher callback for {co!r}"
                 )
+                self.assertIsNone(cm.unraisable.object)
                 self.assertEqual(str(cm.unraisable.exc_value), "boom!")
 
     def test_dealloc_error(self):
@@ -520,9 +526,11 @@ class TestFuncWatchers(unittest.TestCase):
                     pass
 
                 self.assertEqual(
-                    cm.unraisable.object,
-                    f"PyFunction_EVENT_CREATE watcher callback for {myfunc!r}"
+                    cm.unraisable.err_msg,
+                    f"Exception ignored in "
+                    f"PyFunction_EVENT_CREATE watcher callback for {repr(myfunc)[1:-1]}"
                 )
+                self.assertIsNone(cm.unraisable.object)
 
     def test_dealloc_watcher_raises_error(self):
         class MyError(Exception):
index 2e57e4e5b494bafbd71459ddd654ba35ab4ef12b..7a27952c345b9c3830d95585bef65f26d6413550 100644 (file)
@@ -479,8 +479,9 @@ class CmdLineTest(unittest.TestCase):
         rc, out, err = assert_python_failure('-c', code)
         self.assertEqual(b'', out)
         self.assertEqual(120, rc)
-        self.assertRegex(err.decode('ascii', 'ignore'),
-                         'Exception ignored in.*\nOSError: .*')
+        self.assertIn(b'Exception ignored on flushing sys.stdout:\n'
+                      b'OSError: '.replace(b'\n', os.linesep.encode()),
+                      err)
 
     def test_closed_stdout(self):
         # Issue #13444: if stdout has been explicitly closed, we should
index 3d2396713fbab6610698e2ae492f3dba9ec273b0..6e0709cc1e4a4db58329ef4db990197f389a3264 100644 (file)
@@ -113,7 +113,6 @@ bytes(cdata)
 #ifdef MS_WIN32
 #  include "pycore_modsupport.h"  // _PyArg_NoKeywords()
 #endif
-#include "pycore_pyerrors.h"      // _PyErr_WriteUnraisableMsg()
 
 
 #include <ffi.h>
@@ -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);
index d23a756ace887d1347e8e471f2c5cf6cf1b5eb10..8f09204097529f4cab6d84b6ad230468e11fdc0f 100644 (file)
@@ -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");
         }
     }
 
index 592d527f0bd6a20c0988d7722244675f27008787..3505b085f065d0da4e1cbfb513375cc0523778e0 100644 (file)
@@ -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;
     }
 
index 6f76a84e78bf62570246d5fe6608af4959a39646..50ba090ee548ca59751135b7bff5dcebc5682ebc 100644 (file)
@@ -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");
     }
index f3ba0915760f5ef47b6dd73f565fff48e52c3928..394a997b20c06de920badd55167ab6d08f09810d 100644 (file)
@@ -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;
 }
index f662b8e354bb1e11d8283bfb83c9d8ab6d057ace..48ff5b84de59d5ec82479ad316f45cfda233a6ff 100644 (file)
@@ -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++;
index 361f8e93064b25b8ec2f9d36f484cd9d0614cbef..5aa2c0d027fe67e00550eb22a188ac8420472d4f 100644 (file)
@@ -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 <dict at %p>",
+                PyErr_FormatUnraisable(
+                    "Exception ignored in %s watcher callback for <dict at %p>",
                     dict_event_name(event), mp);
-                if (context == NULL) {
-                    context = Py_NewRef(Py_None);
-                }
-                PyErr_WriteUnraisable(context);
-                Py_DECREF(context);
             }
         }
         watcher_bits >>= 1;
index 56c5af6de8989d21e6f11209dba29eb054344838..8ce1bff7660618e1e22197bab7f54560cf05a2db 100644 (file)
@@ -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++;
index 5b9f74dbddf031b46af768294638fd397bcecacc..a3d55b76aa10127ce8b57e87e49d89bef2136abd 100644 (file)
@@ -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;
index 250856930702210e271fc47d49ee46b4b7e7a348..f44e30cf0446a5e128729b96232bfe8d5c20f51e 100644 (file)
@@ -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);
index 6e156ab20094689abfef02d4f3f8ed997ce3e891..e07b282710eb4bd7b02c12213fa9a32f5a061e65 100644 (file)
@@ -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);
index 3ff64182ba2dff0bb0455040743827ddbe60e818..30005c3e7abf17fd91e84d2830306197da1fc355 100644 (file)
@@ -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 {
index 9aee7aa0e4d1f100c080719abf418770b6179c07..b6ffba5c5746e2df087fb75223fafb8e3c50f7c4 100644 (file)
@@ -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");
     }
 }
 
index 491223924ed7f2f8c9a8b5995701179a60f2c1d2..208ced6c101dce943ed68a17cb35984ccbc2e532 100644 (file)
@@ -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;
     }
 
index ea84ca0b9c3c2a0ff2f44de545afb529a50f556f..ac8d5208322882aa268ded84f93d13045e225b1e 100644 (file)
@@ -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);
index 79aeee1eb6f6b7231b6e801d8972c9b9b08e8b12..5f305aa00e08b9c32c093c16e6f9af851efc7e4e 100644 (file)
@@ -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();