Commit d1514638 authored by Guido van Rossum's avatar Guido van Rossum

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.
parent 7fa9227e
......@@ -54,25 +54,26 @@ enum_next(enumobject *en)
{
PyObject *result;
PyObject *next_index;
PyObject *next_item;
PyObject *next_item = PyIter_Next(en->en_sit);
if (next_item == NULL)
result = PyTuple_New(2);
if (result == NULL)
return NULL;
result = PyTuple_New(2);
if (result == NULL) {
Py_DECREF(next_item);
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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment