mirror of
https://github.com/golang/go
synced 2024-11-19 13:04:45 -07:00
cmd/compile: preserve escape information for map literals
While some map literals were marked non-escaping that information was lost when creating the corresponding OMAKE node which made map literals always heap allocated. Copying the escape information to the corresponding OMAKE node allows stack allocation of hmap and a map bucket for non escaping map literals. Fixes #21830 Change-Id: Ife0b020fffbc513f1ac009352f2ecb110d6889c9 Reviewed-on: https://go-review.googlesource.com/62790 Run-TryBot: Martin Möhrmann <moehrmann@google.com> Reviewed-by: Daniel Martí <mvdan@mvdan.cc> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
1a3230f281
commit
098126103e
@ -931,6 +931,7 @@ func slicelit(ctxt initContext, n *Node, var_ *Node, init *Nodes) {
|
||||
func maplit(n *Node, m *Node, init *Nodes) {
|
||||
// make the map var
|
||||
a := nod(OMAKE, nil, nil)
|
||||
a.Esc = n.Esc
|
||||
a.List.Set2(typenod(n.Type), nodintconst(int64(n.List.Len())))
|
||||
litas(m, a, init)
|
||||
|
||||
|
@ -650,6 +650,13 @@ var testNonEscapingMapVariable int = 8
|
||||
|
||||
func TestNonEscapingMap(t *testing.T) {
|
||||
n := testing.AllocsPerRun(1000, func() {
|
||||
m := map[int]int{}
|
||||
m[0] = 0
|
||||
})
|
||||
if n != 0 {
|
||||
t.Fatalf("mapliteral: want 0 allocs, got %v", n)
|
||||
}
|
||||
n = testing.AllocsPerRun(1000, func() {
|
||||
m := make(map[int]int)
|
||||
m[0] = 0
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user