]> granicus.if.org Git - python/commitdiff
Issue 18772: Restore set dummy object back to unicode and restore the identity check...
authorRaymond Hettinger <python@rcn.com>
Wed, 21 Aug 2013 05:28:24 +0000 (22:28 -0700)
committerRaymond Hettinger <python@rcn.com>
Wed, 21 Aug 2013 05:28:24 +0000 (22:28 -0700)
The Gdb prettyprint plugin depended on the dummy object being displayable.
Other solutions besides a unicode object are possible.  For now, get it
back up and running.

The identity checks in lookkey() need to be there to prevent the dummy
object from leaking through Py_RichCompareBool() into user code in the
rare circumstance where the dummy's hash value exactly matches the hash
value of the actual key being looked up.

Objects/setobject.c

index 6327a312c9cfc8b3698f6a0e795650a33a5ecb0a..3d9deac096f172ded9d57144d0751aea5857f7b2 100644 (file)
@@ -95,7 +95,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
     entry = &table[i];
     if (entry->key == NULL || entry->key == key)
         return entry;
-    if (entry->hash == hash) {
+    if (entry->hash == hash && entry->key != dummy) {
         startkey = entry->key;
         Py_INCREF(startkey);
         cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -127,7 +127,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
         }
         if (entry->key == key)
             break;
-        if (entry->hash == hash) {
+        if (entry->hash == hash && entry->key != dummy) {
             startkey = entry->key;
             Py_INCREF(startkey);
             cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -157,7 +157,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
         }
         if (entry->key == key)
             break;
-        if (entry->hash == hash) {
+        if (entry->hash == hash && entry->key != dummy) {
             startkey = entry->key;
             Py_INCREF(startkey);
             cmp = PyObject_RichCompareBool(startkey, key, Py_EQ);
@@ -1090,7 +1090,7 @@ make_new_set(PyTypeObject *type, PyObject *iterable)
     PySetObject *so = NULL;
 
     if (dummy == NULL) { /* Auto-initialize dummy */
-        dummy = _PyObject_New(&PyBaseObject_Type);
+        dummy = PyUnicode_FromString("<dummy key>");
         if (dummy == NULL)
             return NULL;
     }