#1473257: add generator.gi_code attribute that refers to

the original code object backing the generator. Patch by Collin Winter.
This commit is contained in:
Georg Brandl 2008-01-26 14:14:20 +00:00
parent 29604a1b4c
commit 0cdf9a36ec
4 changed files with 32 additions and 2 deletions

View file

@ -11,6 +11,7 @@ static int
gen_traverse(PyGenObject *gen, visitproc visit, void *arg)
{
Py_VISIT((PyObject *)gen->gi_frame);
Py_VISIT(gen->gi_code);
return 0;
}
@ -35,6 +36,7 @@ gen_dealloc(PyGenObject *gen)
_PyObject_GC_UNTRACK(self);
Py_CLEAR(gen->gi_frame);
Py_CLEAR(gen->gi_code);
PyObject_GC_Del(gen);
}
@ -282,6 +284,7 @@ gen_iternext(PyGenObject *gen)
static PyMemberDef gen_memberlist[] = {
{"gi_frame", T_OBJECT, offsetof(PyGenObject, gi_frame), RO},
{"gi_running", T_INT, offsetof(PyGenObject, gi_running), RO},
{"gi_code", T_OBJECT, offsetof(PyGenObject, gi_code), RO},
{NULL} /* Sentinel */
};
@ -352,6 +355,8 @@ PyGen_New(PyFrameObject *f)
return NULL;
}
gen->gi_frame = f;
Py_INCREF(f->f_code);
gen->gi_code = (PyObject *)(f->f_code);
gen->gi_running = 0;
gen->gi_weakreflist = NULL;
_PyObject_GC_TRACK(gen);