diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -54,13 +54,13 @@ setentry *table = so->table; setentry *freeslot = NULL; setentry *entry; + setentry *limit; size_t perturb = hash; size_t mask = so->mask; - size_t i = (size_t)hash; /* Unsigned for defined overflow behavior. */ - size_t j; + size_t i = (size_t)hash & mask; /* Unsigned for defined overflow behavior. */ int cmp; - entry = &table[i & mask]; + entry = &table[i]; if (entry->key == NULL) return entry; @@ -82,8 +82,9 @@ if (entry->key == dummy && freeslot == NULL) freeslot = entry; - for (j = 1 ; j <= LINEAR_PROBES ; j++) { - entry = &table[(i + j) & mask]; + limit = (i + LINEAR_PROBES > mask) ? table + mask : table + i + LINEAR_PROBES; + entry++; + for ( ; entry <= limit ; entry++) { if (entry->key == NULL) goto found_null; if (entry->hash == hash && entry->key != dummy) { @@ -105,9 +106,9 @@ } perturb >>= PERTURB_SHIFT; - i = i * 5 + 1 + perturb; + i = (i * 5 + 1 + perturb) & mask; - entry = &table[i & mask]; + entry = &table[i]; if (entry->key == NULL) goto found_null; } @@ -126,10 +127,10 @@ setentry *table = so->table; setentry *freeslot = NULL; setentry *entry; + setentry *limit; size_t perturb = hash; size_t mask = so->mask; - size_t i = (size_t)hash; - size_t j; + size_t i = (size_t)hash & mask; /* Make sure this function doesn't have to handle non-unicode keys, including subclasses of str; e.g., one reason to subclass @@ -140,7 +141,7 @@ return set_lookkey(so, key, hash); } - entry = &table[i & mask]; + entry = &table[i]; if (entry->key == NULL) return entry; @@ -153,8 +154,9 @@ if (entry->key == dummy && freeslot == NULL) freeslot = entry; - for (j = 1 ; j <= LINEAR_PROBES ; j++) { - entry = &table[(i + j) & mask]; + limit = (i + LINEAR_PROBES > mask) ? table + mask : table + i + LINEAR_PROBES; + entry++; + for ( ; entry <= limit ; entry++) { if (entry->key == NULL) goto found_null; if (entry->hash == hash @@ -167,9 +169,9 @@ } perturb >>= PERTURB_SHIFT; - i = i * 5 + 1 + perturb; + i = (i * 5 + 1 + perturb) & mask; - entry = &table[i & mask]; + entry = &table[i]; if (entry->key == NULL) goto found_null; } @@ -190,19 +192,19 @@ { setentry *table = so->table; setentry *entry; + setentry *limit; size_t perturb = hash; size_t mask = (size_t)so->mask; - size_t i = (size_t)hash; - size_t j; - + size_t i = (size_t)hash & mask; + while (1) { - for (j = 0 ; j <= LINEAR_PROBES ; j++) { - entry = &table[(i + j) & mask]; + limit = (i + LINEAR_PROBES > mask) ? table + mask : table + i + LINEAR_PROBES; + for (entry = &table[i] ; entry <= limit ; entry++) { if (entry->key == NULL) goto found_null; } perturb >>= PERTURB_SHIFT; - i = i * 5 + 1 + perturb; + i = (i * 5 + 1 + perturb) & mask; } found_null: entry->key = key;