mirror of
https://github.com/golang/go
synced 2024-11-20 03:04:40 -07:00
cmd/compile: improve static map initialization
When static maps are large, we try to initialize them by iterating over an array of key/value pairs. Currently this optimization only works if the keys and values are of primitive type. This CL improves this optimization by allowing any static composite literals as well. Fixes #22010 Change-Id: Ie493e02ab8b8a228a3472b5c6025a33f7b92daf3 Reviewed-on: https://go-review.googlesource.com/66050 Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
c82ee79247
commit
91cb9edd5e
@ -941,7 +941,7 @@ func maplit(n *Node, m *Node, init *Nodes) {
|
||||
if r.Op != OKEY {
|
||||
Fatalf("maplit: rhs not OKEY: %v", r)
|
||||
}
|
||||
if isliteral(r.Left) && isliteral(r.Right) {
|
||||
if isStaticCompositeLiteral(r.Left) && isStaticCompositeLiteral(r.Right) {
|
||||
stat = append(stat, r)
|
||||
} else {
|
||||
dyn = append(dyn, r)
|
||||
@ -966,24 +966,14 @@ func maplit(n *Node, m *Node, init *Nodes) {
|
||||
vstatv := staticname(tv)
|
||||
vstatv.Name.SetReadonly(true)
|
||||
|
||||
for i, r := range stat {
|
||||
index := r.Left
|
||||
value := r.Right
|
||||
|
||||
// build vstatk[b] = index
|
||||
setlineno(index)
|
||||
lhs := nod(OINDEX, vstatk, nodintconst(int64(i)))
|
||||
as := nod(OAS, lhs, index)
|
||||
as = typecheck(as, Etop)
|
||||
genAsStatic(as)
|
||||
|
||||
// build vstatv[b] = value
|
||||
setlineno(value)
|
||||
lhs = nod(OINDEX, vstatv, nodintconst(int64(i)))
|
||||
as = nod(OAS, lhs, value)
|
||||
as = typecheck(as, Etop)
|
||||
genAsStatic(as)
|
||||
datak := nod(OARRAYLIT, nil, nil)
|
||||
datav := nod(OARRAYLIT, nil, nil)
|
||||
for _, r := range stat {
|
||||
datak.List.Append(r.Left)
|
||||
datav.List.Append(r.Right)
|
||||
}
|
||||
fixedlit(inInitFunction, initKindStatic, datak, vstatk, init)
|
||||
fixedlit(inInitFunction, initKindStatic, datav, vstatv, init)
|
||||
|
||||
// loop adding structure elements to map
|
||||
// for i = 0; i < len(vstatk); i++ {
|
||||
|
Loading…
Reference in New Issue
Block a user