Remove the next() method -- one is supplied automatically by

PyType_Ready() because the tp_iternext slot is set (fortunately,
because using the tp_iternext implementation for the the next()
implementation is buggy).  Also changed the allocation order in
enum_next() so that the underlying iterator is only moved ahead when
we have successfully allocated the result tuple and index.
This commit is contained in:
Guido van Rossum 2002-07-16 21:02:42 +00:00
parent 86d593e110
commit ca5ed5b875
1 changed files with 12 additions and 17 deletions

View File

@ -54,25 +54,26 @@ enum_next(enumobject *en)
{
PyObject *result;
PyObject *next_index;
PyObject *next_item = PyIter_Next(en->en_sit);
if (next_item == NULL)
return NULL;
PyObject *next_item;
result = PyTuple_New(2);
if (result == NULL) {
Py_DECREF(next_item);
if (result == NULL)
return NULL;
next_index = PyInt_FromLong(en->en_index);
if (next_index == NULL) {
Py_DECREF(result);
return NULL;
}
PyTuple_SET_ITEM(result, 0, next_index);
next_index = PyInt_FromLong(en->en_index++);
if (next_index == NULL) {
Py_DECREF(next_item);
next_item = PyIter_Next(en->en_sit);
if (next_item == NULL) {
Py_DECREF(result);
return NULL;
}
PyTuple_SET_ITEM(result, 0, next_index);
en->en_index++;
PyTuple_SET_ITEM(result, 1, next_item);
return result;
}
@ -84,12 +85,6 @@ enum_getiter(PyObject *en)
return en;
}
static PyMethodDef enum_methods[] = {
{"next", (PyCFunction)enum_next, METH_NOARGS,
"return the next (index, value) pair, or raise StopIteration"},
{NULL, NULL} /* sentinel */
};
PyDoc_STRVAR(enum_doc,
"enumerate(iterable) -> create an enumerating-iterator");
@ -124,7 +119,7 @@ PyTypeObject PyEnum_Type = {
0, /* tp_weaklistoffset */
(getiterfunc)enum_getiter, /* tp_iter */
(iternextfunc)enum_next, /* tp_iternext */
enum_methods, /* tp_methods */
0, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */