mirror of
https://github.com/python/cpython.git
synced 2025-10-11 17:32:49 +00:00
Issue 24581: Revert c9782a9ac031 pending a stronger test for mutation during iteration.
This commit is contained in:
parent
9f20bdb321
commit
9632a7d735
1 changed files with 22 additions and 13 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue