Skip to content

Commit

Permalink
gh-129354: Use PyErr_FormatUnraisable() function (#129514)
Browse files Browse the repository at this point in the history
Replace PyErr_WriteUnraisable() with PyErr_FormatUnraisable().
  • Loading branch information
vstinner authored Jan 31, 2025
1 parent 8b70ff5 commit 3447f4a
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 27 deletions.
6 changes: 4 additions & 2 deletions Modules/_asynciomodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
11 changes: 7 additions & 4 deletions Modules/_testcapi/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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. */
Expand Down
18 changes: 12 additions & 6 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -606,19 +606,24 @@ 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);
for (i = 0; i < PyList_GET_SIZE(cpy); i++) {
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);
}
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion Modules/pyexpat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
20 changes: 13 additions & 7 deletions Python/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down
20 changes: 13 additions & 7 deletions Python/gc_free_threading.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3447f4a

Please sign in to comment.