Issue 24581: Revert c9782a9ac031 pending a stronger test for mutation during iteration.

This commit is contained in:
Raymond Hettinger 2015-07-07 15:29:24 -07:00
parent 9f20bdb321
commit 9632a7d735

View file

@ -766,8 +766,8 @@ typedef struct {
PyObject_HEAD PyObject_HEAD
PySetObject *si_set; /* Set to NULL when iterator is exhausted */ PySetObject *si_set; /* Set to NULL when iterator is exhausted */
Py_ssize_t si_used; Py_ssize_t si_used;
Py_ssize_t si_pos;
Py_ssize_t len; Py_ssize_t len;
setentry *entry;
} setiterobject; } setiterobject;
static void static void
@ -845,6 +845,8 @@ static PyMethodDef setiter_methods[] = {
static PyObject *setiter_iternext(setiterobject *si) static PyObject *setiter_iternext(setiterobject *si)
{ {
PyObject *key;
Py_ssize_t i, mask;
setentry *entry; setentry *entry;
PySetObject *so = si->si_set; PySetObject *so = si->si_set;
@ -858,18 +860,25 @@ static PyObject *setiter_iternext(setiterobject *si)
si->si_used = -1; /* Make this state sticky */ si->si_used = -1; /* Make this state sticky */
return NULL; return NULL;
} }
if (si->len <= 0) {
Py_DECREF(so); i = si->si_pos;
si->si_set = NULL; assert(i>=0);
return NULL; entry = so->table;
} mask = so->mask;
entry = si->entry; while (i <= mask && (entry[i].key == NULL || entry[i].key == dummy))
while (entry->key == NULL || entry->key == dummy) i++;
entry++; si->si_pos = i+1;
if (i > mask)
goto fail;
si->len--; si->len--;
si->entry = entry + 1; key = entry[i].key;
Py_INCREF(entry->key); Py_INCREF(key);
return entry->key; return key;
fail:
Py_DECREF(so);
si->si_set = NULL;
return NULL;
} }
PyTypeObject PySetIter_Type = { PyTypeObject PySetIter_Type = {
@ -914,8 +923,8 @@ set_iter(PySetObject *so)
Py_INCREF(so); Py_INCREF(so);
si->si_set = so; si->si_set = so;
si->si_used = so->used; si->si_used = so->used;
si->si_pos = 0;
si->len = so->used; si->len = so->used;
si->entry = so->table;
_PyObject_GC_TRACK(si); _PyObject_GC_TRACK(si);
return (PyObject *)si; return (PyObject *)si;
} }