I_getiter(): Function for the tp_iter slot of Itype so that

cStringIO's can participate in the iterator protocol.

Fill the Itype.tp_iter slot with I_getiter()
This commit is contained in:
Barry Warsaw 2001-09-22 04:36:49 +00:00
parent bdefa0b3de
commit 3e8be722d9
1 changed files with 45 additions and 20 deletions

View File

@ -653,33 +653,58 @@ I_getattr(Iobject *self, char *name) {
return Py_FindMethod(I_methods, (PyObject *)self, name); return Py_FindMethod(I_methods, (PyObject *)self, name);
} }
static PyObject *
I_getiter(Iobject *self)
{
PyObject *myreadline = PyObject_GetAttrString((PyObject*)self,
"readline");
PyObject *emptystring = PyString_FromString("");
PyObject *iter = NULL;
if (!myreadline || !emptystring)
goto finally;
iter = PyCallIter_New(myreadline, emptystring);
finally:
Py_XDECREF(myreadline);
Py_XDECREF(emptystring);
return iter;
}
static char Itype__doc__[] = static char Itype__doc__[] =
"Simple type for treating strings as input file streams" "Simple type for treating strings as input file streams"
; ;
static PyTypeObject Itype = { static PyTypeObject Itype = {
PyObject_HEAD_INIT(NULL) PyObject_HEAD_INIT(NULL)
0, /*ob_size*/ 0, /*ob_size*/
"StringI", /*tp_name*/ "StringI", /*tp_name*/
sizeof(Iobject), /*tp_basicsize*/ sizeof(Iobject), /*tp_basicsize*/
0, /*tp_itemsize*/ 0, /*tp_itemsize*/
/* methods */ /* methods */
(destructor)I_dealloc, /*tp_dealloc*/ (destructor)I_dealloc, /*tp_dealloc*/
(printfunc)0, /*tp_print*/ (printfunc)0, /*tp_print*/
(getattrfunc)I_getattr, /*tp_getattr*/ (getattrfunc)I_getattr, /*tp_getattr*/
(setattrfunc)0, /*tp_setattr*/ (setattrfunc)0, /*tp_setattr*/
(cmpfunc)0, /*tp_compare*/ (cmpfunc)0, /*tp_compare*/
(reprfunc)0, /*tp_repr*/ (reprfunc)0, /*tp_repr*/
0, /*tp_as_number*/ 0, /*tp_as_number*/
0, /*tp_as_sequence*/ 0, /*tp_as_sequence*/
0, /*tp_as_mapping*/ 0, /*tp_as_mapping*/
(hashfunc)0, /*tp_hash*/ (hashfunc)0, /*tp_hash*/
(ternaryfunc)0, /*tp_call*/ (ternaryfunc)0, /*tp_call*/
(reprfunc)0, /*tp_str*/ (reprfunc)0, /*tp_str*/
0, /* tp_getattro */
/* Space for future expansion */ 0, /* tp_setattro */
0L,0L,0L,0L, 0, /* tp_as_buffer */
Itype__doc__ /* Documentation string */ Py_TPFLAGS_DEFAULT, /* tp_flags */
Itype__doc__, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
(getiterfunc)I_getiter, /* tp_iter */
0, /* tp_iternext */
}; };
static PyObject * static PyObject *