Skip to content

Commit 47a8662

Browse files
committed
gh-129354: Use PyErr_FormatUnraisable() function
Replace PyErr_WriteUnraisable() with PyErr_FormatUnraisable(). Update tests: * test_coroutines * test_exceptions * test_generators * test_struct
1 parent 79f85a0 commit 47a8662

File tree

10 files changed

+30
-20
lines changed

10 files changed

+30
-20
lines changed

Lib/test/test_coroutines.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2137,7 +2137,6 @@ async def func(): pass
21372137
support.gc_collect()
21382138

21392139
self.assertIn("was never awaited", str(cm.unraisable.exc_value))
2140-
self.assertEqual(repr(cm.unraisable.object), coro_repr)
21412140

21422141
def test_for_assign_raising_stop_async_iteration(self):
21432142
class BadTarget:
@@ -2414,7 +2413,6 @@ async def corofn():
24142413
del coro
24152414
support.gc_collect()
24162415

2417-
self.assertEqual(repr(cm.unraisable.object), coro_repr)
24182416
self.assertEqual(cm.unraisable.exc_type, ZeroDivisionError)
24192417

24202418
del warnings._warn_unawaited_coroutine

Lib/test/test_exceptions.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1681,7 +1681,6 @@ def __del__(self):
16811681
del obj
16821682

16831683
gc_collect() # For PyPy or other GCs.
1684-
self.assertEqual(cm.unraisable.object, BrokenDel.__del__)
16851684
self.assertIsNotNone(cm.unraisable.exc_traceback)
16861685

16871686
def test_unhandled(self):

Lib/test/test_generators.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2779,14 +2779,12 @@ def printsolution(self, x):
27792779
... l = Leaker()
27802780
... del l
27812781
...
2782-
... cm.unraisable.object == Leaker.__del__
27832782
... cm.unraisable.exc_type == RuntimeError
27842783
... str(cm.unraisable.exc_value) == "del failed"
27852784
... cm.unraisable.exc_traceback is not None
27862785
True
27872786
True
27882787
True
2789-
True
27902788
27912789
27922790
These refleak tests should perhaps be in a testfile of their own,

Lib/test/test_struct.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ def __del__(self):
694694
rc, stdout, stderr = assert_python_ok("-c", code)
695695
self.assertEqual(rc, 0)
696696
self.assertEqual(stdout.rstrip(), b"")
697-
self.assertIn(b"Exception ignored in:", stderr)
697+
self.assertIn(b"Exception ignored while calling deallocator", stderr)
698698
self.assertIn(b"C.__del__", stderr)
699699

700700
def test__struct_reference_cycle_cleaned_up(self):

Modules/_io/fileio.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,10 @@ fileio_dealloc_warn(PyObject *op, PyObject *source)
105105
PyObject *exc = PyErr_GetRaisedException();
106106
if (PyErr_ResourceWarning(source, 1, "unclosed file %R", source)) {
107107
/* Spurious errors can appear at shutdown */
108-
if (PyErr_ExceptionMatches(PyExc_Warning))
109-
PyErr_WriteUnraisable((PyObject *) self);
108+
if (PyErr_ExceptionMatches(PyExc_Warning)) {
109+
PyErr_FormatUnraisable("Exception ignored "
110+
"while closing file %R", self);
111+
}
110112
}
111113
PyErr_SetRaisedException(exc);
112114
}

Modules/_io/iobase.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,8 @@ iobase_finalize(PyObject *self)
314314
PyErr_Clear();
315315
res = PyObject_CallMethodNoArgs((PyObject *)self, &_Py_ID(close));
316316
if (res == NULL) {
317-
PyErr_WriteUnraisable(self);
317+
PyErr_FormatUnraisable("Exception ignored "
318+
"while closing file %R", self);
318319
}
319320
else {
320321
Py_DECREF(res);

Modules/socketmodule.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5359,7 +5359,8 @@ sock_finalize(PyObject *self)
53595359
if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
53605360
/* Spurious errors can appear at shutdown */
53615361
if (PyErr_ExceptionMatches(PyExc_Warning)) {
5362-
PyErr_WriteUnraisable((PyObject *)s);
5362+
PyErr_FormatUnraisable("Exception ignored while "
5363+
"finalizing socket %R", s);
53635364
}
53645365
}
53655366

Objects/genobject.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ _PyGen_Finalize(PyObject *self)
9797

9898
PyObject *res = PyObject_CallOneArg(finalizer, self);
9999
if (res == NULL) {
100-
PyErr_WriteUnraisable(self);
101-
} else {
100+
PyErr_FormatUnraisable("Exception ignored while "
101+
"finalizing generator %R", self);
102+
}
103+
else {
102104
Py_DECREF(res);
103105
}
104106
/* Restore the saved exception. */
@@ -122,7 +124,8 @@ _PyGen_Finalize(PyObject *self)
122124
PyObject *res = gen_close((PyObject*)gen, NULL);
123125
if (res == NULL) {
124126
if (PyErr_Occurred()) {
125-
PyErr_WriteUnraisable(self);
127+
PyErr_FormatUnraisable("Exception ignored while "
128+
"closing generator %R", self);
126129
}
127130
}
128131
else {
@@ -338,7 +341,8 @@ gen_close_iter(PyObject *yf)
338341
else {
339342
PyObject *meth;
340343
if (PyObject_GetOptionalAttr(yf, &_Py_ID(close), &meth) < 0) {
341-
PyErr_WriteUnraisable(yf);
344+
PyErr_FormatUnraisable("Exception ignored while "
345+
"closing generator %R", yf);
342346
}
343347
if (meth) {
344348
retval = _PyObject_CallNoArgs(meth);

Objects/typeobject.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10288,10 +10288,13 @@ slot_tp_finalize(PyObject *self)
1028810288
del = lookup_maybe_method(self, &_Py_ID(__del__), &unbound);
1028910289
if (del != NULL) {
1029010290
res = call_unbound_noarg(unbound, del, self);
10291-
if (res == NULL)
10292-
PyErr_WriteUnraisable(del);
10293-
else
10291+
if (res == NULL) {
10292+
PyErr_FormatUnraisable("Exception ignored while "
10293+
"calling deallocator %R", del);
10294+
}
10295+
else {
1029410296
Py_DECREF(res);
10297+
}
1029510298
Py_DECREF(del);
1029610299
}
1029710300

Python/_warnings.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,7 +1445,8 @@ _PyErr_WarnUnawaitedAgenMethod(PyAsyncGenObject *agen, PyObject *method)
14451445
"coroutine method %R of %R was never awaited",
14461446
method, agen->ag_qualname) < 0)
14471447
{
1448-
PyErr_WriteUnraisable((PyObject *)agen);
1448+
PyErr_FormatUnraisable("Exception ignored while "
1449+
"finalizing async generator %R", agen);
14491450
}
14501451
PyErr_SetRaisedException(exc);
14511452
}
@@ -1487,14 +1488,17 @@ _PyErr_WarnUnawaitedCoroutine(PyObject *coro)
14871488
}
14881489

14891490
if (PyErr_Occurred()) {
1490-
PyErr_WriteUnraisable(coro);
1491+
PyErr_FormatUnraisable("Exception ignored while "
1492+
"finalizing coroutine %R", coro);
14911493
}
1494+
14921495
if (!warned) {
14931496
if (_PyErr_WarnFormat(coro, PyExc_RuntimeWarning, 1,
14941497
"coroutine '%S' was never awaited",
14951498
((PyCoroObject *)coro)->cr_qualname) < 0)
14961499
{
1497-
PyErr_WriteUnraisable(coro);
1500+
PyErr_FormatUnraisable("Exception ignored while "
1501+
"finalizing coroutine %R", coro);
14981502
}
14991503
}
15001504
}

0 commit comments

Comments
 (0)