]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: simplify autotmpname
authorMatthew Dempsky <mdempsky@google.com>
Thu, 1 Jul 2021 07:28:05 +0000 (00:28 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 1 Jul 2021 08:26:25 +0000 (08:26 +0000)
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>
src/cmd/compile/internal/typecheck/dcl.go

index 5f8b8b3d417aedbf983bd807277b81fb1d95705d..f3ccbb4ac09985e8e111b4b3c63d81d4eb9e6447 100644 (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 {
-       // 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)
+       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.
+               s = fmt.Sprintf(".autotmp_%d", n)
+               autotmpnames[n] = s
+       }
+       return s
 }
 
 // f is method type, with receiver.