[Python-checkins] cpython: Issue 24581: Revert c9782a9ac031 pending a stronger test for mutation during

raymond.hettinger python-checkins at python.org
Wed Jul 8 00:29:30 CEST 2015


https://hg.python.org/cpython/rev/648c9fb3bdf5
changeset:   96878:648c9fb3bdf5
user:        Raymond Hettinger <python at rcn.com>
date:        Tue Jul 07 15:29:24 2015 -0700
summary:
  Issue 24581: Revert c9782a9ac031 pending a stronger test for mutation during iteration.

files:
  Objects/setobject.c |  35 ++++++++++++++++++++------------
  1 files changed, 22 insertions(+), 13 deletions(-)


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

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list