mirror of https://github.com/python/cpython
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:
parent
86d593e110
commit
ca5ed5b875
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue