From ca5ed5b8753e71c15e1acbd753c4fd65cd3813a0 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 16 Jul 2002 21:02:42 +0000 Subject: [PATCH] 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. --- Objects/enumobject.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/Objects/enumobject.c b/Objects/enumobject.c index 148ac3c7420..f69a002a2ce 100644 --- a/Objects/enumobject.c +++ b/Objects/enumobject.c @@ -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 */