[Python-checkins] cpython: Remove unneeded dummy test from the set search loop (when the hashes match we
raymond.hettinger
python-checkins at python.org
Tue Jan 27 06:54:48 CET 2015
https://hg.python.org/cpython/rev/ed8cc03eed9c
changeset: 94333:ed8cc03eed9c
user: Raymond Hettinger <python at rcn.com>
date: Mon Jan 26 21:54:35 2015 -0800
summary:
Remove unneeded dummy test from the set search loop (when the hashes match we know the key is not a dummy).
files:
Include/setobject.h | 5 ++++-
Objects/setobject.c | 15 +++++++++++----
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/Include/setobject.h b/Include/setobject.h
--- a/Include/setobject.h
+++ b/Include/setobject.h
@@ -14,7 +14,10 @@
2. Active: key != NULL and key != dummy
3. Dummy: key == dummy
-The hash field of Unused or Dummy slots have no meaning.
+The hash field of Unused slots have no meaning.
+The hash field of Dummny slots are set to -1
+meaning that dummy entries can be detected by
+either entry->key==dummy or by entry->hash==-1.
*/
#define PySet_MINSIZE 8
diff --git a/Objects/setobject.c b/Objects/setobject.c
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -65,8 +65,10 @@
return entry;
while (1) {
- if (entry->hash == hash && entry->key != dummy) { /* dummy match unlikely */
+ if (entry->hash == hash) {
PyObject *startkey = entry->key;
+ /* startkey cannot be a dummy because the dummy hash field is -1 */
+ assert(startkey != dummy);
if (startkey == key)
return entry;
if (PyUnicode_CheckExact(startkey)
@@ -83,15 +85,18 @@
if (cmp > 0) /* likely */
return entry;
}
- if (entry->key == dummy && freeslot == NULL)
+ if (entry->hash == -1 && freeslot == NULL) {
+ assert(entry->key == dummy);
freeslot = entry;
+ }
for (j = 1 ; j <= LINEAR_PROBES ; j++) {
entry = &table[(i + j) & mask];
if (entry->key == NULL)
goto found_null;
- if (entry->hash == hash && entry->key != dummy) {
+ if (entry->hash == hash) {
PyObject *startkey = entry->key;
+ assert(startkey != dummy);
if (startkey == key)
return entry;
if (PyUnicode_CheckExact(startkey)
@@ -108,8 +113,10 @@
if (cmp > 0)
return entry;
}
- if (entry->key == dummy && freeslot == NULL)
+ if (entry->hash == -1 && freeslot == NULL) {
+ assert(entry->key == dummy);
freeslot = entry;
+ }
}
perturb >>= PERTURB_SHIFT;
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list