@@ -3921,7 +3921,6 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
39213921
39223922 if (co -> co_flags & CO_GENERATOR ) {
39233923 PyObject * gen ;
3924- PyObject * coroutine_wrapper ;
39253924
39263925 /* Don't need to keep the reference to f_back, it will be set
39273926 * when the generator is resumed. */
@@ -3935,14 +3934,9 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
39353934 if (gen == NULL )
39363935 return NULL ;
39373936
3938- if (co -> co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE )) {
3939- coroutine_wrapper = _PyEval_GetCoroutineWrapper ();
3940- if (coroutine_wrapper != NULL ) {
3941- PyObject * wrapped =
3942- PyObject_CallFunction (coroutine_wrapper , "N" , gen );
3943- gen = wrapped ;
3944- }
3945- }
3937+ if (co -> co_flags & (CO_COROUTINE | CO_ITERABLE_COROUTINE ))
3938+ return _PyEval_ApplyCoroutineWrapper (gen );
3939+
39463940 return gen ;
39473941 }
39483942
@@ -4407,6 +4401,33 @@ _PyEval_GetCoroutineWrapper(void)
44074401 return tstate -> coroutine_wrapper ;
44084402}
44094403
4404+ PyObject *
4405+ _PyEval_ApplyCoroutineWrapper (PyObject * gen )
4406+ {
4407+ PyObject * wrapped ;
4408+ PyThreadState * tstate = PyThreadState_GET ();
4409+ PyObject * wrapper = tstate -> coroutine_wrapper ;
4410+
4411+ if (tstate -> in_coroutine_wrapper ) {
4412+ assert (wrapper != NULL );
4413+ PyErr_Format (PyExc_RuntimeError ,
4414+ "coroutine wrapper %.150R attempted "
4415+ "to recursively wrap %.150R" ,
4416+ wrapper ,
4417+ gen );
4418+ return NULL ;
4419+ }
4420+
4421+ if (wrapper == NULL ) {
4422+ return gen ;
4423+ }
4424+
4425+ tstate -> in_coroutine_wrapper = 1 ;
4426+ wrapped = PyObject_CallFunction (wrapper , "N" , gen );
4427+ tstate -> in_coroutine_wrapper = 0 ;
4428+ return wrapped ;
4429+ }
4430+
44104431PyObject *
44114432PyEval_GetBuiltins (void )
44124433{
0 commit comments