diff options
author | Benjamin Peterson <benjamin@python.org> | 2016-09-07 15:46:59 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2016-09-07 15:46:59 (GMT) |
commit | b88db8745b4f3e20471f729e34c941344a9d8b34 (patch) | |
tree | 9fe85f4a7297de08cbb6f12ae8be449363a7c460 | |
parent | 32d374215a514915eca892e5c58a61e9494f37af (diff) | |
download | cpython-b88db8745b4f3e20471f729e34c941344a9d8b34.zip cpython-b88db8745b4f3e20471f729e34c941344a9d8b34.tar.gz cpython-b88db8745b4f3e20471f729e34c941344a9d8b34.tar.bz2 |
supress coroutine warning when an exception is pending (#27968)
-rw-r--r-- | Objects/genobject.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/Objects/genobject.c b/Objects/genobject.c index 01c59c2..9172e6a 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); |