runtime: use real type size in map keys and values functions

We were using the size stored in the map, which is the smaller
of the real type size and 128.

As of CL 61538 we don't use these functions, but we expect to
use them again in the future after #61626 is resolved.

Change-Id: I7bfb4af5f0e3a56361d4019a8ed7c1ec59ff31fd
Reviewed-on: https://go-review.googlesource.com/c/go/+/535215
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
Ian Lance Taylor 2023-10-13 10:34:30 -07:00 committed by Gopher Robot
parent dc12cb179a
commit cc47df017d
3 changed files with 35 additions and 2 deletions

View file

@ -53,6 +53,9 @@ var CgoCheckPointer = cgoCheckPointer
const TracebackInnerFrames = tracebackInnerFrames const TracebackInnerFrames = tracebackInnerFrames
const TracebackOuterFrames = tracebackOuterFrames const TracebackOuterFrames = tracebackOuterFrames
var MapKeys = keys
var MapValues = values
var LockPartialOrder = lockPartialOrder var LockPartialOrder = lockPartialOrder
type LockRank lockRank type LockRank lockRank

View file

@ -1651,7 +1651,7 @@ func copyKeys(t *maptype, h *hmap, b *bmap, s *slice, offset uint8) {
if s.len >= s.cap { if s.len >= s.cap {
fatal("concurrent map read and map write") fatal("concurrent map read and map write")
} }
typedmemmove(t.Key, add(s.array, uintptr(s.len)*uintptr(t.KeySize)), k) typedmemmove(t.Key, add(s.array, uintptr(s.len)*uintptr(t.Key.Size())), k)
s.len++ s.len++
} }
b = b.overflow(t) b = b.overflow(t)
@ -1716,7 +1716,7 @@ func copyValues(t *maptype, h *hmap, b *bmap, s *slice, offset uint8) {
if s.len >= s.cap { if s.len >= s.cap {
fatal("concurrent map read and map write") fatal("concurrent map read and map write")
} }
typedmemmove(t.Elem, add(s.array, uintptr(s.len)*uintptr(t.ValueSize)), ele) typedmemmove(t.Elem, add(s.array, uintptr(s.len)*uintptr(t.Elem.Size())), ele)
s.len++ s.len++
} }
b = b.overflow(t) b = b.overflow(t)

View file

@ -1434,3 +1434,33 @@ func TestLoadFactor(t *testing.T) {
} }
} }
} }
func TestMapKeys(t *testing.T) {
type key struct {
s string
pad [128]byte // sizeof(key) > abi.MapMaxKeyBytes
}
m := map[key]int{{s: "a"}: 1, {s: "b"}: 2}
keys := make([]key, 0, len(m))
runtime.MapKeys(m, unsafe.Pointer(&keys))
for _, k := range keys {
if len(k.s) != 1 {
t.Errorf("len(k.s) == %d, want 1", len(k.s))
}
}
}
func TestMapValues(t *testing.T) {
type val struct {
s string
pad [128]byte // sizeof(val) > abi.MapMaxElemBytes
}
m := map[int]val{1: {s: "a"}, 2: {s: "b"}}
vals := make([]val, 0, len(m))
runtime.MapValues(m, unsafe.Pointer(&vals))
for _, v := range vals {
if len(v.s) != 1 {
t.Errorf("len(v.s) == %d, want 1", len(v.s))
}
}
}