Commit b88db874 authored by Benjamin Peterson's avatar Benjamin Peterson

supress coroutine warning when an exception is pending (#27968)

parent 32d37421
...@@ -21,7 +21,7 @@ void ...@@ -21,7 +21,7 @@ void
_PyGen_Finalize(PyObject *self) _PyGen_Finalize(PyObject *self)
{ {
PyGenObject *gen = (PyGenObject *)self; PyGenObject *gen = (PyGenObject *)self;
PyObject *res; PyObject *res = NULL;
PyObject *error_type, *error_value, *error_traceback; PyObject *error_type, *error_value, *error_traceback;
if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL) if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL)
...@@ -33,23 +33,26 @@ _PyGen_Finalize(PyObject *self) ...@@ -33,23 +33,26 @@ _PyGen_Finalize(PyObject *self)
/* If `gen` is a coroutine, and if it was never awaited on, /* If `gen` is a coroutine, and if it was never awaited on,
issue a RuntimeWarning. */ issue a RuntimeWarning. */
if (gen->gi_code != NULL if (gen->gi_code != NULL &&
&& ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE &&
&& gen->gi_frame->f_lasti == -1 gen->gi_frame->f_lasti == -1) {
&& !PyErr_Occurred() if (!error_value) {
&& PyErr_WarnFormat(PyExc_RuntimeWarning, 1, PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
"coroutine '%.50S' was never awaited", "coroutine '%.50S' was never awaited",
gen->gi_qualname)) { gen->gi_qualname);
res = NULL; /* oops, exception */ }
} }
else { else {
res = gen_close(gen, NULL); res = gen_close(gen, NULL);
} }
if (res == NULL) if (res == NULL) {
if (PyErr_Occurred())
PyErr_WriteUnraisable(self); PyErr_WriteUnraisable(self);
else }
else {
Py_DECREF(res); Py_DECREF(res);
}
/* Restore the saved exception. */ /* Restore the saved exception. */
PyErr_Restore(error_type, error_value, error_traceback); PyErr_Restore(error_type, error_value, error_traceback);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment