mirror of https://github.com/python/cpython
do not allow _PyGen_Finalize to fail (closes #27811)
Patch from Armin Rigo.
This commit is contained in:
parent
fb5ce7eea1
commit
2f40ed4b94
|
@ -1565,6 +1565,14 @@ class CoroutineTest(unittest.TestCase):
|
||||||
finally:
|
finally:
|
||||||
aw.close()
|
aw.close()
|
||||||
|
|
||||||
|
def test_fatal_coro_warning(self):
|
||||||
|
# Issue 27811
|
||||||
|
async def func(): pass
|
||||||
|
with warnings.catch_warnings():
|
||||||
|
warnings.filterwarnings("error")
|
||||||
|
func()
|
||||||
|
support.gc_collect()
|
||||||
|
|
||||||
|
|
||||||
class CoroAsyncIOCompatTest(unittest.TestCase):
|
class CoroAsyncIOCompatTest(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,9 @@ Release date: TBA
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #27811: Fix a crash when a coroutine that has not been awaited is
|
||||||
|
finalized with warnings-as-errors enabled.
|
||||||
|
|
||||||
- Issue #27587: Fix another issue found by PVS-Studio: Null pointer check
|
- Issue #27587: Fix another issue found by PVS-Studio: Null pointer check
|
||||||
after use of 'def' in _PyState_AddModule().
|
after use of 'def' in _PyState_AddModule().
|
||||||
Initial patch by Christian Heimes.
|
Initial patch by Christian Heimes.
|
||||||
|
|
|
@ -24,18 +24,6 @@ _PyGen_Finalize(PyObject *self)
|
||||||
PyObject *res;
|
PyObject *res;
|
||||||
PyObject *error_type, *error_value, *error_traceback;
|
PyObject *error_type, *error_value, *error_traceback;
|
||||||
|
|
||||||
/* If `gen` is a coroutine, and if it was never awaited on,
|
|
||||||
issue a RuntimeWarning. */
|
|
||||||
if (gen->gi_code != NULL
|
|
||||||
&& ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE
|
|
||||||
&& gen->gi_frame != NULL
|
|
||||||
&& gen->gi_frame->f_lasti == -1
|
|
||||||
&& !PyErr_Occurred()
|
|
||||||
&& PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
|
|
||||||
"coroutine '%.50S' was never awaited",
|
|
||||||
gen->gi_qualname))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL)
|
if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL)
|
||||||
/* Generator isn't paused, so no need to close */
|
/* Generator isn't paused, so no need to close */
|
||||||
return;
|
return;
|
||||||
|
@ -43,7 +31,20 @@ _PyGen_Finalize(PyObject *self)
|
||||||
/* Save the current exception, if any. */
|
/* Save the current exception, if any. */
|
||||||
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
||||||
|
|
||||||
|
/* If `gen` is a coroutine, and if it was never awaited on,
|
||||||
|
issue a RuntimeWarning. */
|
||||||
|
if (gen->gi_code != NULL
|
||||||
|
&& ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE
|
||||||
|
&& gen->gi_frame->f_lasti == -1
|
||||||
|
&& !PyErr_Occurred()
|
||||||
|
&& PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
|
||||||
|
"coroutine '%.50S' was never awaited",
|
||||||
|
gen->gi_qualname)) {
|
||||||
|
res = NULL; /* oops, exception */
|
||||||
|
}
|
||||||
|
else {
|
||||||
res = gen_close(gen, NULL);
|
res = gen_close(gen, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (res == NULL)
|
if (res == NULL)
|
||||||
PyErr_WriteUnraisable(self);
|
PyErr_WriteUnraisable(self);
|
||||||
|
|
Loading…
Reference in New Issue