Commit 5088f600 authored by Raymond Hettinger's avatar Raymond Hettinger

Hoist constant expressions (so->table and so->mask) out of the inner-loop.

parent 9fdaff30
...@@ -260,16 +260,13 @@ The caller is responsible for updating the key's reference count and ...@@ -260,16 +260,13 @@ The caller is responsible for updating the key's reference count and
the setobject's fill and used fields. the setobject's fill and used fields.
*/ */
static void static void
set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash) set_insert_clean(setentry *table, size_t mask, PyObject *key, Py_hash_t hash)
{ {
setentry *table = so->table;
setentry *entry; setentry *entry;
size_t perturb = hash; size_t perturb = hash;
size_t mask = (size_t)so->mask;
size_t i = (size_t)hash & mask; size_t i = (size_t)hash & mask;
size_t j; size_t j;
assert(so->fill == so->used);
while (1) { while (1) {
entry = &table[i]; entry = &table[i];
if (entry->key == NULL) if (entry->key == NULL)
...@@ -285,8 +282,8 @@ set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash) ...@@ -285,8 +282,8 @@ set_insert_clean(PySetObject *so, PyObject *key, Py_hash_t hash)
i = (i * 5 + 1 + perturb) & mask; i = (i * 5 + 1 + perturb) & mask;
} }
found_null: found_null:
entry->key = key;
entry->hash = hash; entry->hash = hash;
entry->key = key;
} }
/* ======== End logic for probing the hash table ========================== */ /* ======== End logic for probing the hash table ========================== */
...@@ -304,6 +301,8 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) ...@@ -304,6 +301,8 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
setentry *oldtable, *newtable, *entry; setentry *oldtable, *newtable, *entry;
Py_ssize_t oldfill = so->fill; Py_ssize_t oldfill = so->fill;
Py_ssize_t oldused = so->used; Py_ssize_t oldused = so->used;
Py_ssize_t oldmask = so->mask;
size_t newmask;
int is_oldtable_malloced; int is_oldtable_malloced;
setentry small_copy[PySet_MINSIZE]; setentry small_copy[PySet_MINSIZE];
...@@ -363,18 +362,17 @@ set_table_resize(PySetObject *so, Py_ssize_t minused) ...@@ -363,18 +362,17 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
/* Copy the data over; this is refcount-neutral for active entries; /* Copy the data over; this is refcount-neutral for active entries;
dummy entries aren't copied over, of course */ dummy entries aren't copied over, of course */
newmask = (size_t)so->mask;
if (oldfill == oldused) { if (oldfill == oldused) {
for (entry = oldtable; oldused > 0; entry++) { for (entry = oldtable; entry <= oldtable + oldmask; entry++) {
if (entry->key != NULL) { if (entry->key != NULL) {
oldused--; set_insert_clean(newtable, newmask, entry->key, entry->hash);
set_insert_clean(so, entry->key, entry->hash);
} }
} }
} else { } else {
for (entry = oldtable; oldused > 0; entry++) { for (entry = oldtable; entry <= oldtable + oldmask; entry++) {
if (entry->key != NULL && entry->key != dummy) { if (entry->key != NULL && entry->key != dummy) {
oldused--; set_insert_clean(newtable, newmask, entry->key, entry->hash);
set_insert_clean(so, entry->key, entry->hash);
} }
} }
} }
...@@ -676,13 +674,15 @@ set_merge(PySetObject *so, PyObject *otherset) ...@@ -676,13 +674,15 @@ set_merge(PySetObject *so, PyObject *otherset)
/* If our table is empty, we can use set_insert_clean() */ /* If our table is empty, we can use set_insert_clean() */
if (so->fill == 0) { if (so->fill == 0) {
setentry *newtable = so->table;
size_t newmask = (size_t)so->mask;
so->fill = other->used; so->fill = other->used;
so->used = other->used; so->used = other->used;
for (i = 0; i <= other->mask; i++, other_entry++) { for (i = 0; i <= other->mask; i++, other_entry++) {
key = other_entry->key; key = other_entry->key;
if (key != NULL && key != dummy) { if (key != NULL && key != dummy) {
Py_INCREF(key); Py_INCREF(key);
set_insert_clean(so, key, other_entry->hash); set_insert_clean(newtable, newmask, key, other_entry->hash);
} }
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment