https://github.com/python/cpython/commit/3447f4a56a71a4017e55d8f46160a63f111ec373
commit: 3447f4a56a71a4017e55d8f46160a63f111ec373
branch: main
author: Victor Stinner <[email protected]>
committer: vstinner <[email protected]>
date: 2025-01-31T14:20:35+01:00
summary:
gh-129354: Use PyErr_FormatUnraisable() function (#129514)
Replace PyErr_WriteUnraisable() with PyErr_FormatUnraisable().
files:
M Modules/_asynciomodule.c
M Modules/_testcapi/gc.c
M Modules/posixmodule.c
M Modules/pyexpat.c
M Python/gc.c
M Python/gc_free_threading.c
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index d5d49658555f1a..b488fd92aa6817 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -1715,7 +1715,8 @@ FutureObj_finalize(FutureObj *fut)
if (func != NULL) {
PyObject *res = PyObject_CallOneArg(func, context);
if (res == NULL) {
- PyErr_WriteUnraisable(func);
+ PyErr_FormatUnraisable("Exception ignored while calling asyncio "
+ "function %R", func);
}
else {
Py_DECREF(res);
@@ -2978,7 +2979,8 @@ TaskObj_finalize(TaskObj *task)
if (func != NULL) {
PyObject *res = PyObject_CallOneArg(func, context);
if (res == NULL) {
- PyErr_WriteUnraisable(func);
+ PyErr_FormatUnraisable("Exception ignored while calling asyncio "
+ "function %R", func);
}
else {
Py_DECREF(res);
diff --git a/Modules/_testcapi/gc.c b/Modules/_testcapi/gc.c
index 7e33e0d4861e84..3691796302e500 100644
--- a/Modules/_testcapi/gc.c
+++ b/Modules/_testcapi/gc.c
@@ -94,7 +94,7 @@ slot_tp_del(PyObject *self)
PyObject *tp_del = PyUnicode_InternFromString("__tp_del__");
if (tp_del == NULL) {
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored while deallocating");
PyErr_SetRaisedException(exc);
return;
}
@@ -104,10 +104,13 @@ slot_tp_del(PyObject *self)
if (del != NULL) {
res = PyObject_CallOneArg(del, self);
Py_DECREF(del);
- if (res == NULL)
- PyErr_WriteUnraisable(del);
- else
+ if (res == NULL) {
+ PyErr_FormatUnraisable("Exception ignored while calling "
+ "deallocator %R", del);
+ }
+ else {
Py_DECREF(res);
+ }
}
/* Restore the saved exception. */
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 6d9b365ea9ceb2..b3b5572e1cfa30 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -606,8 +606,10 @@ run_at_forkers(PyObject *lst, int reverse)
* one of the callbacks.
*/
cpy = PyList_GetSlice(lst, 0, PyList_GET_SIZE(lst));
- if (cpy == NULL)
- PyErr_WriteUnraisable(lst);
+ if (cpy == NULL) {
+ PyErr_FormatUnraisable("Exception ignored in atfork callback "
+ "while copying list %R", lst);
+ }
else {
if (reverse)
PyList_Reverse(cpy);
@@ -615,10 +617,13 @@ run_at_forkers(PyObject *lst, int reverse)
PyObject *func, *res;
func = PyList_GET_ITEM(cpy, i);
res = _PyObject_CallNoArgs(func);
- if (res == NULL)
- PyErr_WriteUnraisable(func);
- else
+ if (res == NULL) {
+ PyErr_FormatUnraisable("Exception ignored "
+ "in atfork callback %R", func);
+ }
+ else {
Py_DECREF(res);
+ }
}
Py_DECREF(cpy);
}
@@ -16330,7 +16335,8 @@ ScandirIterator_finalize(ScandirIterator *iterator)
"unclosed scandir iterator %R", iterator)) {
/* Spurious errors can appear at shutdown */
if (PyErr_ExceptionMatches(PyExc_Warning)) {
- PyErr_WriteUnraisable((PyObject *) iterator);
+ PyErr_FormatUnraisable("Exception ignored while finalizing "
+ "scandir iterator %R", iterator);
}
}
}
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index 9931ca2a8d4749..3290706f143b9a 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -1948,7 +1948,8 @@ pyexpat_capsule_destructor(PyObject *capsule)
{
void *p = PyCapsule_GetPointer(capsule, PyExpat_CAPSULE_NAME);
if (p == NULL) {
- PyErr_WriteUnraisable(capsule);
+ PyErr_FormatUnraisable("Exception ignored while destroying "
+ "pyexact capsule");
return;
}
PyMem_Free(p);
diff --git a/Python/gc.c b/Python/gc.c
index 420240fc3020be..0fb2f03b0406ad 100644
--- a/Python/gc.c
+++ b/Python/gc.c
@@ -994,7 +994,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
/* copy-paste of weakrefobject.c's handle_callback() */
temp = PyObject_CallOneArg(callback, (PyObject *)wr);
if (temp == NULL) {
- PyErr_WriteUnraisable(callback);
+ PyErr_FormatUnraisable("Exception ignored on "
+ "calling weakref callback %R", callback);
}
else {
Py_DECREF(temp);
@@ -1797,7 +1798,8 @@ do_gc_callback(GCState *gcstate, const char *phase,
Py_INCREF(cb); /* make sure cb doesn't go away */
r = PyObject_Vectorcall(cb, stack, 2, NULL);
if (r == NULL) {
- PyErr_WriteUnraisable(cb);
+ PyErr_FormatUnraisable("Exception ignored while "
+ "calling GC callback %R", cb);
}
else {
Py_DECREF(r);
@@ -2086,13 +2088,14 @@ _PyGC_DumpShutdownStats(PyInterpreterState *interp)
"gc", NULL, message,
PyList_GET_SIZE(gcstate->garbage)))
{
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored in GC shutdown");
}
if (gcstate->debug & _PyGC_DEBUG_UNCOLLECTABLE) {
PyObject *repr = NULL, *bytes = NULL;
repr = PyObject_Repr(gcstate->garbage);
if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr))) {
- PyErr_WriteUnraisable(gcstate->garbage);
+ PyErr_FormatUnraisable("Exception ignored in GC shutdown "
+ "while formatting garbage");
}
else {
PySys_WriteStderr(
@@ -2344,9 +2347,12 @@ PyObject_GC_Del(void *op)
#ifdef Py_DEBUG
PyObject *exc = PyErr_GetRaisedException();
if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0,
- "gc", NULL, "Object of type %s is not
untracked before destruction",
- Py_TYPE(op)->tp_name)) {
- PyErr_WriteUnraisable(NULL);
+ "gc", NULL,
+ "Object of type %s is not untracked "
+ "before destruction",
+ Py_TYPE(op)->tp_name))
+ {
+ PyErr_FormatUnraisable("Exception ignored on object deallocation");
}
PyErr_SetRaisedException(exc);
#endif
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index 905a14f660ec6c..5d264e407e1cc8 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -1128,7 +1128,8 @@ call_weakref_callbacks(struct collection_state *state)
/* copy-paste of weakrefobject.c's handle_callback() */
PyObject *temp = PyObject_CallOneArg(callback, (PyObject *)wr);
if (temp == NULL) {
- PyErr_WriteUnraisable(callback);
+ PyErr_FormatUnraisable("Exception ignored while "
+ "calling weakref callback %R", callback);
}
else {
Py_DECREF(temp);
@@ -1447,7 +1448,8 @@ invoke_gc_callback(PyThreadState *tstate, const char
*phase,
Py_INCREF(cb); /* make sure cb doesn't go away */
r = PyObject_Vectorcall(cb, stack, 2, NULL);
if (r == NULL) {
- PyErr_WriteUnraisable(cb);
+ PyErr_FormatUnraisable("Exception ignored while "
+ "calling GC callback %R", cb);
}
else {
Py_DECREF(r);
@@ -2029,13 +2031,14 @@ _PyGC_DumpShutdownStats(PyInterpreterState *interp)
"gc", NULL, message,
PyList_GET_SIZE(gcstate->garbage)))
{
- PyErr_WriteUnraisable(NULL);
+ PyErr_FormatUnraisable("Exception ignored in GC shutdown");
}
if (gcstate->debug & _PyGC_DEBUG_UNCOLLECTABLE) {
PyObject *repr = NULL, *bytes = NULL;
repr = PyObject_Repr(gcstate->garbage);
if (!repr || !(bytes = PyUnicode_EncodeFSDefault(repr))) {
- PyErr_WriteUnraisable(gcstate->garbage);
+ PyErr_FormatUnraisable("Exception ignored in GC shutdown "
+ "while formatting garbage");
}
else {
PySys_WriteStderr(
@@ -2243,9 +2246,12 @@ PyObject_GC_Del(void *op)
#ifdef Py_DEBUG
PyObject *exc = PyErr_GetRaisedException();
if (PyErr_WarnExplicitFormat(PyExc_ResourceWarning, "gc", 0,
- "gc", NULL, "Object of type %s is not
untracked before destruction",
- ((PyObject*)op)->ob_type->tp_name)) {
- PyErr_WriteUnraisable(NULL);
+ "gc", NULL,
+ "Object of type %s is not untracked "
+ "before destruction",
+ Py_TYPE(op)->tp_name))
+ {
+ PyErr_FormatUnraisable("Exception ignored on object deallocation");
}
PyErr_SetRaisedException(exc);
#endif
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]