]> granicus.if.org Git - python/commitdiff
Issue #23269: Tighten search_loop in set_insert_clean()
authorRaymond Hettinger <python@rcn.com>
Tue, 27 Jan 2015 05:33:48 +0000 (21:33 -0800)
committerRaymond Hettinger <python@rcn.com>
Tue, 27 Jan 2015 05:33:48 +0000 (21:33 -0800)
Instead of masking and shifting every loopup, move the wrap-around
test outside of the inner-loop.

Objects/setobject.c

index f44f56251c5de61b5e502d031a6efca006232c27..dc33a34294d0c3405244b5ee81c93c6748544d25 100644 (file)
@@ -138,17 +138,28 @@ set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash)
     setentry *entry;
     size_t perturb = hash;
     size_t mask = (size_t)so->mask;
-    size_t i = (size_t)hash;
+    size_t i = (size_t)hash & mask;
     size_t j;
 
     while (1) {
-        for (j = 0 ; j <= LINEAR_PROBES ; j++) {
-            entry = &table[(i + j) & mask];
-            if (entry->key == NULL)
-                goto found_null;
+        entry = &table[i];
+        if (entry->key == NULL)
+            goto found_null;
+        if (i + LINEAR_PROBES <= mask) {
+            for (j = 1; j <= LINEAR_PROBES; j++) {
+                entry = &table[i + j];
+                if (entry->key == NULL)
+                    goto found_null;
+            }
+        } else {
+            for (j = 1; j <= LINEAR_PROBES; j++) {
+                entry = &table[(i + j) & mask];
+                if (entry->key == NULL)
+                    goto found_null;
+            }
         }
         perturb >>= PERTURB_SHIFT;
-        i = i * 5 + 1 + perturb;
+        i = (i * 5 + 1 + perturb) & mask;
     }
   found_null:
     entry->key = key;