From 0ce5347409b0400ce83e4122075d1559188fc51a Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 10 Oct 2018 14:09:17 +0200 Subject: [PATCH] runtime: fix hashmap lookup of entries at position > 8 Bigger hashmaps (size > 8) use multiple buckets in a chain. The lookup code looked at multiple buckets for a lookup, but kept checking the first bucket for key equality. --- src/runtime/hashmap.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/hashmap.go b/src/runtime/hashmap.go index b88b86c9..fdd0cc04 100644 --- a/src/runtime/hashmap.go +++ b/src/runtime/hashmap.go @@ -139,9 +139,9 @@ func hashmapGet(m *hashmap, key unsafe.Pointer, value unsafe.Pointer, hash uint3 for bucket != nil { for i := uintptr(0); i < 8; i++ { slotKeyOffset := unsafe.Sizeof(hashmapBucket{}) + uintptr(m.keySize)*uintptr(i) - slotKey := unsafe.Pointer(bucketAddr + slotKeyOffset) + slotKey := unsafe.Pointer(uintptr(unsafe.Pointer(bucket)) + slotKeyOffset) slotValueOffset := unsafe.Sizeof(hashmapBucket{}) + uintptr(m.keySize)*8 + uintptr(m.valueSize)*uintptr(i) - slotValue := unsafe.Pointer(bucketAddr + slotValueOffset) + slotValue := unsafe.Pointer(uintptr(unsafe.Pointer(bucket)) + slotValueOffset) if bucket.tophash[i] == tophash { // This could be the key we're looking for. if keyEqual(key, slotKey, uintptr(m.keySize)) {