]> granicus.if.org Git - python/commitdiff
Use a known unique object for the dummy entry.
authorRaymond Hettinger <python@rcn.com>
Sat, 17 Aug 2013 09:31:53 +0000 (02:31 -0700)
committerRaymond Hettinger <python@rcn.com>
Sat, 17 Aug 2013 09:31:53 +0000 (02:31 -0700)
This lets us run PyObject_RichCompareBool() without
first needing to check whether the entry is a dummy.

Objects/setobject.c

index ac501b6000374afe8c8d65852bd756367f70bb9d..da3b95555f0eed6489e8e6c90c75a845770ab087 100644 (file)
@@ -91,32 +91,27 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
     if (entry->key == NULL || entry->key == key)
         return entry;
 
-    if (entry->key == dummy)
-        freeslot = entry;
-    else {
-        if (entry->hash == hash) {
-            startkey = entry->key;
-            Py_INCREF(startkey);
-            cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
-            Py_DECREF(startkey);
-            if (cmp < 0)
-                return NULL;
-            if (table == so->table && entry->key == startkey) {
-                if (cmp > 0)
-                    return entry;
-            }
-            else {
-                /* The compare did major nasty stuff to the
-                 * set:  start over.
-                 */
-                return set_lookkey(so, key, hash);
-            }
+    if (entry->hash == hash) {
+        startkey = entry->key;
+        Py_INCREF(startkey);
+        cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
+        Py_DECREF(startkey);
+        if (cmp < 0)
+            return NULL;
+        if (table == so->table && entry->key == startkey) {
+            if (cmp > 0)
+                return entry;
+        }
+        else {
+            /* Start over if the compare altered the set */
+            return set_lookkey(so, key, hash);
         }
-        freeslot = NULL;
     }
 
-    /* In the loop, key == dummy is by far (factor of 100s) the
-       least likely outcome, so test for that last. */
+    freeslot = (entry->key == dummy) ? entry : NULL;
+
+    /* In the loop, key == dummy is by far (factor of 100s)
+       the least likely outcome, so test for that last. */
     for (perturb = hash; ; perturb >>= PERTURB_SHIFT) {
         i = i * 5 + perturb + 1;
         entry = &table[i & mask];
@@ -127,7 +122,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
         }
         if (entry->key == key)
             break;
-        if (entry->hash == hash && entry->key != dummy) {
+        if (entry->hash == hash) {
             startkey = entry->key;
             Py_INCREF(startkey);
             cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -1029,7 +1024,7 @@ make_new_set(PyTypeObject *type, PyObject *iterable)
     PySetObject *so = NULL;
 
     if (dummy == NULL) { /* Auto-initialize dummy */
-        dummy = PyUnicode_FromString("<dummy key>");
+        dummy = _PyObject_New(&PyBaseObject_Type);
         if (dummy == NULL)
             return NULL;
     }