summaryrefslogtreecommitdiff
path: root/ht.c
diff options
context:
space:
mode:
Diffstat (limited to 'ht.c')
-rw-r--r--ht.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/ht.c b/ht.c
index 09eec3e..a2845f0 100644
--- a/ht.c
+++ b/ht.c
@@ -24,15 +24,17 @@ Ht ht_new() {
}
static HtEntry *find(HtEntry *b, size_t cap, ObjString *k) {
- size_t ix = k->hash % cap;
+ // cap is guaranteed to be power of 2
+ size_t mask = cap - 1;
+ size_t ix = k->hash & mask;
if (cap == 0) return NULL;
for (;;) {
HtEntry *ent = &b[ix];
// XXX tombstones
- if (ent->k == k || ent->k == NULL) {
+ if (ent->k == NULL || ent->k == k) {
return ent;
}
- ix = (ix+1)%cap;
+ ix = (ix+1) & mask;
}
}