]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: simplify array parsing in equality signatures
authorKeith Randall <khr@golang.org>
Fri, 5 Dec 2025 22:45:38 +0000 (14:45 -0800)
committerKeith Randall <khr@golang.org>
Sat, 24 Jan 2026 04:58:26 +0000 (20:58 -0800)
Change-Id: I166586a1f75165cd17df371f9af7cd5b6b3ddc32
Reviewed-on: https://go-review.googlesource.com/c/go/+/727502
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Carlos Amedee <carlos@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
src/cmd/compile/internal/reflectdata/alg.go

index b281b4c37f0fcc655b34c128d0410d464e969ef6..c87cd8e257a68f0c8b43b28861f5d9531e4ae6bc 100644 (file)
@@ -125,7 +125,6 @@ func hashFunc(sig string) *ir.Func {
        if sym.Def != nil {
                return sym.Def.(*ir.Name).Func
        }
-       sig0 := sig
 
        pos := base.AutogeneratedPos // less confusing than end of input
        base.Pos = pos
@@ -211,29 +210,9 @@ func hashFunc(sig string) *ir.Func {
                        off += n
                case sigArrayStart:
                        var n int64
-                       n, sig = parseNum(sig)
-                       // Find matching closing brace.
-                       i := 0
-                       depth := 1
-               findEndSquareBracket:
-                       for {
-                               if i == len(sig) {
-                                       base.Fatalf("mismatched brackets in %s", sig0)
-                               }
-                               switch sig[i] {
-                               case sigArrayStart:
-                                       depth++
-                               case sigArrayEnd:
-                                       depth--
-                                       if depth == 0 {
-                                               break findEndSquareBracket
-                                       }
-                               }
-                               i++
-                       }
-                       elemSig := sig[:i]
+                       var elemSig string
+                       n, elemSig, sig = parseArray(sig)
                        elemSize := sigSize(elemSig)
-                       sig = sig[i+1:] // remaining signature after array
 
                        // Loop N times, calling hash function for the element.
                        //     for i := off; i < off + N*elemSize; i += elemSize {
@@ -381,7 +360,6 @@ func eqFunc(sig string) *ir.Func {
        if sym.Def != nil {
                return sym.Def.(*ir.Name).Func
        }
-       sig0 := sig
 
        pos := base.AutogeneratedPos // less confusing than end of input
        base.Pos = pos
@@ -553,29 +531,9 @@ func eqFunc(sig string) *ir.Func {
                        }
 
                        var n int64
-                       n, sig = parseNum(sig)
-                       // Find matching closing brace.
-                       i := 0
-                       depth := 1
-               findEndSquareBracket:
-                       for {
-                               if i == len(sig) {
-                                       base.Fatalf("mismatched brackets in %s", sig0)
-                               }
-                               switch sig[i] {
-                               case sigArrayStart:
-                                       depth++
-                               case sigArrayEnd:
-                                       depth--
-                                       if depth == 0 {
-                                               break findEndSquareBracket
-                                       }
-                               }
-                               i++
-                       }
-                       elemSig := sig[:i]
+                       var elemSig string
+                       n, elemSig, sig = parseArray(sig)
                        elemSize := sigSize(elemSig)
-                       sig = sig[i+1:] // remaining signature after array
 
                        // Loop N times, calling comparison function for the element.
                        //     for i := off; i < off + N*elemSize; i += elemSize {
@@ -898,9 +856,34 @@ func parseNum(s string) (int64, string) {
        return x, s[n:]
 }
 
+// parseArray parses "%d%s]" from the front of a signature.
+// Returns the repeat count (the %d), the element signature
+// (the %s), and any remaining signature after the closing ']'.
+func parseArray(sig string) (int64, string, string) {
+       var n int64
+       n, sig = parseNum(sig)
+       // Find matching closing brace.
+       i := 0
+       depth := 1
+       for {
+               if i == len(sig) {
+                       base.Fatalf("mismatched brackets in %s", sig)
+               }
+               switch sig[i] {
+               case sigArrayStart:
+                       depth++
+               case sigArrayEnd:
+                       depth--
+                       if depth == 0 {
+                               return n, sig[:i], sig[i+1:]
+                       }
+               }
+               i++
+       }
+}
+
 // sigSize returns the size of the type described by the signature.
 func sigSize(sig string) int64 {
-       sig0 := sig
        var size int64
        for len(sig) > 0 {
                kind := sig[0]
@@ -918,28 +901,9 @@ func sigSize(sig string) int64 {
                        size += 2 * int64(types.PtrSize)
                case sigArrayStart:
                        var n int64
-                       n, sig = parseNum(sig)
-                       // Find matching closing brace.
-                       i := 0
-                       depth := 1
-               findEndSquareBracket:
-                       for {
-                               if i == len(sig) {
-                                       base.Fatalf("mismatched brackets in %s", sig0)
-                               }
-                               switch sig[i] {
-                               case sigArrayStart:
-                                       depth++
-                               case sigArrayEnd:
-                                       depth--
-                                       if depth == 0 {
-                                               break findEndSquareBracket
-                                       }
-                               }
-                               i++
-                       }
-                       size += n * sigSize(sig[:i])
-                       sig = sig[i+1:]
+                       var elemSig string
+                       n, elemSig, sig = parseArray(sig)
+                       size += n * sigSize(elemSig)
                }
        }
        return size