Skip to content

gh-129354: Use PyErr_FormatUnraisable() function #129514

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading