diff options
author | Benjamin Peterson <benjamin@python.org> | 2016-09-07 08:47:18 -0700 |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2016-09-07 08:47:18 -0700 |
commit | b375db5eb6fe026536ed720cb8cd645e55eb3e81 (patch) | |
tree | 899fff818f6cf8ad50510a2f3f143dcc51ff4a59 /Objects/genobject.c | |
parent | 1803968ed2035e28cbe1e9136e79a8da7929466d (diff) | |
parent | fb19cd13c6d051631ebe04ee294c663f3a6cb443 (diff) | |
download | cpython-b375db5eb6fe026536ed720cb8cd645e55eb3e81.tar.gz |
merge 3.5 (#27968)
Diffstat (limited to 'Objects/genobject.c')
-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 104d90b3e6..562d41d674 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); |