diff --git a/Cython/Utility/Coroutine.c b/Cython/Utility/Coroutine.c index 1698756cc46836d8b4878bec129378a579249457..4255c65fd199184c7812048df5c4ff6b6c66aa71 100644 --- a/Cython/Utility/Coroutine.c +++ b/Cython/Utility/Coroutine.c @@ -5,6 +5,13 @@ static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject //////////////////// GeneratorYieldFrom //////////////////// //@requires: Generator +static void __PyxPyIter_CheckErrorAndDecref(PyObject *source) { + PyErr_Format(PyExc_TypeError, + "iter() returned non-iterator of type '%.100s'", + Py_TYPE(source)->tp_name); + Py_DECREF(source); +} + static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject *gen, PyObject *source) { PyObject *source_gen, *retval; #ifdef __Pyx_Coroutine_USED @@ -22,13 +29,11 @@ static CYTHON_INLINE PyObject* __Pyx_Generator_Yield_From(__pyx_CoroutineObject if (unlikely(!source_gen)) return NULL; if (unlikely(!PyIter_Check(source_gen))) { - PyErr_Format(PyExc_TypeError, - "iter() returned non-iterator of type '%.100s'", - Py_TYPE(source_gen)->tp_name); - Py_DECREF(source_gen); + __PyxPyIter_CheckErrorAndDecref(source_gen); return NULL; } } else + // CPython also allows non-iterable sequences to be iterated over #endif { source_gen = PyObject_GetIter(source);