From b88db8745b4f3e20471f729e34c941344a9d8b34 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Wed, 7 Sep 2016 08:46:59 -0700 Subject: [PATCH] supress coroutine warning when an exception is pending (#27968) --- Objects/genobject.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Objects/genobject.c b/Objects/genobject.c index 01c59c24a96..9172e6a0102 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -21,7 +21,7 @@ void _PyGen_Finalize(PyObject *self) { PyGenObject *gen = (PyGenObject *)self; - PyObject *res; + PyObject *res = NULL; PyObject *error_type, *error_value, *error_traceback; if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL) @@ -33,23 +33,26 @@ _PyGen_Finalize(PyObject *self) /* 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 */ + if (gen->gi_code != NULL && + ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE && + gen->gi_frame->f_lasti == -1) { + if (!error_value) { + PyErr_WarnFormat(PyExc_RuntimeWarning, 1, + "coroutine '%.50S' was never awaited", + gen->gi_qualname); + } } else { res = gen_close(gen, NULL); } - if (res == NULL) - PyErr_WriteUnraisable(self); - else + if (res == NULL) { + if (PyErr_Occurred()) + PyErr_WriteUnraisable(self); + } + else { Py_DECREF(res); + } /* Restore the saved exception. */ PyErr_Restore(error_type, error_value, error_traceback);