[Python-checkins] cpython (3.5): supress coroutine warning when an exception is pending (#27968)

benjamin.peterson python-checkins at python.org
Wed Sep 7 11:47:51 EDT 2016


https://hg.python.org/cpython/rev/234f758449f8
changeset:   103223:234f758449f8
branch:      3.5
parent:      103213:7537ca1c2aaf
user:        Benjamin Peterson <benjamin at python.org>
date:        Wed Sep 07 08:46:59 2016 -0700
summary:
  supress coroutine warning when an exception is pending (#27968)

files:
  Objects/genobject.c |  27 +++++++++++++++------------
  1 files changed, 15 insertions(+), 12 deletions(-)


diff --git a/Objects/genobject.c b/Objects/genobject.c
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -21,7 +21,7 @@
 _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 @@
 
     /* 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);

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list