From: Raymond Hettinger Date: Wed, 21 Aug 2013 05:28:24 +0000 (-0700) Subject: Issue 18772: Restore set dummy object back to unicode and restore the identity check... X-Git-Tag: v3.4.0a2~172 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae9e616a00e0a288c31dc053db40353302823e88;p=python Issue 18772: Restore set dummy object back to unicode and restore the identity checks in lookkey(). 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. --- diff --git a/Objects/setobject.c b/Objects/setobject.c index 6327a312c9..3d9deac096 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -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(""); if (dummy == NULL) return NULL; }