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

Christian Heimes christian at python.org
Thu Sep 8 07:09:48 EDT 2016


On 2016-09-07 17:47, benjamin.peterson wrote:
> 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);
> +        }

You don't check the return value of PyErr_WarnFormat(). It does not
signal an exception in case warnings are turned into exceptions.

Christian


More information about the Python-Dev mailing list