1
0
mirror of https://github.com/golang/go synced 2024-11-11 23:40:22 -07:00

[dev.typeparams] cmd/compile: simplify autotmpname

Rather than manually formatting a byte-string and then using a map
lookup to convert it to string, we can just use a slice. This avoids
both the overhead of formatting the byte slice and the map lookup.

Change-Id: Ia7b883632ea990ce9ee848dd4b4e4cdfbd611212
Reviewed-on: https://go-review.googlesource.com/c/go/+/332191
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
Matthew Dempsky 2021-07-01 00:28:05 -07:00
parent 372b312735
commit 706c580ee1

View File

@ -6,7 +6,7 @@ package typecheck
import (
"fmt"
"strconv"
"sync"
"cmd/compile/internal/base"
"cmd/compile/internal/ir"
@ -430,15 +430,30 @@ func TempAt(pos src.XPos, curfn *ir.Func, t *types.Type) *ir.Name {
return n
}
var (
autotmpnamesmu sync.Mutex
autotmpnames []string
)
// autotmpname returns the name for an autotmp variable numbered n.
func autotmpname(n int) string {
autotmpnamesmu.Lock()
defer autotmpnamesmu.Unlock()
// Grow autotmpnames, if needed.
if n >= len(autotmpnames) {
autotmpnames = append(autotmpnames, make([]string, n+1-len(autotmpnames))...)
autotmpnames = autotmpnames[:cap(autotmpnames)]
}
s := autotmpnames[n]
if s == "" {
// Give each tmp a different name so that they can be registerized.
// Add a preceding . to avoid clashing with legal names.
const prefix = ".autotmp_"
// Start with a buffer big enough to hold a large n.
b := []byte(prefix + " ")[:len(prefix)]
b = strconv.AppendInt(b, int64(n), 10)
return types.InternString(b)
s = fmt.Sprintf(".autotmp_%d", n)
autotmpnames[n] = s
}
return s
}
// f is method type, with receiver.