diff -r f2c7f771bf6a Objects/genobject.c --- a/Objects/genobject.c Tue Dec 03 19:17:25 2013 +0100 +++ b/Objects/genobject.c Wed Dec 04 00:06:21 2013 +0100 @@ -67,6 +67,7 @@ gen_send_ex(PyGenObject *gen, PyObject * PyThreadState *tstate = PyThreadState_GET(); PyFrameObject *f = gen->gi_frame; PyObject *result; + _Py_IDENTIFIER(clear); if (gen->gi_running) { PyErr_SetString(PyExc_ValueError, @@ -130,7 +131,7 @@ gen_send_ex(PyGenObject *gen, PyObject * if (!result || f->f_stacktop == NULL) { /* generator can't be rerun, so release the frame */ /* first clean reference cycle through stored exception traceback */ - PyObject *t, *v, *tb; + PyObject *t, *v, *tb, *res; t = f->f_exc_type; v = f->f_exc_value; tb = f->f_exc_traceback; @@ -142,6 +143,14 @@ gen_send_ex(PyGenObject *gen, PyObject * Py_XDECREF(tb); gen->gi_frame->f_gen = NULL; gen->gi_frame = NULL; + + /* explicitly clear local variables of the frame to break + reference cycles */ + assert(!f->f_executing); + res = _PyObject_CallMethodId((PyObject*)f, &PyId_clear, NULL); + assert(res == Py_None); + Py_DECREF(res); + Py_DECREF(f); }