gen_getattr: make the gi_running and gi_frame members discoverable (but

not writable -- too dangerous!) from Python code.
This commit is contained in:
Tim Peters 2001-06-26 22:24:51 +00:00
parent 0ba70cc3c8
commit e77f2e2798
2 changed files with 39 additions and 6 deletions

View file

@ -115,8 +115,8 @@ typedef struct {
PyFrameObject *gi_frame;
/* True if generator is being executed. */
int gi_running;
/* True if generator is being executed. */
int gi_running;
} genobject;
static PyObject *
@ -207,14 +207,27 @@ gen_getiter(PyObject *gen)
static struct PyMethodDef gen_methods[] = {
{"next", (PyCFunction)gen_next, METH_VARARGS,
"next() -- get the next value, or raise StopIteration"},
"next() -- get the next value, or raise StopIteration"},
{NULL, NULL} /* Sentinel */
};
static PyObject *
gen_getattr(genobject *gen, char *name)
{
return Py_FindMethod(gen_methods, (PyObject *)gen, name);
PyObject *result;
if (strcmp(name, "gi_frame") == 0) {
result = (PyObject *)gen->gi_frame;
assert(result != NULL);
Py_INCREF(result);
}
else if (strcmp(name, "gi_running") == 0)
result = (PyObject *)PyInt_FromLong((long)gen->gi_running);
else if (strcmp(name, "__members__") == 0)
result = Py_BuildValue("[ss]", "gi_frame", "gi_running");
else
result = Py_FindMethod(gen_methods, (PyObject *)gen, name);
return result;
}
statichere PyTypeObject gentype = {