aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-12-05 14:45:38 -0800
committerKeith Randall <khr@golang.org>2026-01-23 20:58:26 -0800
commit59ed0136210a276ff9574a9b7008bcb7b7f9cb8b (patch)
tree280d5035bea2528ed3833a66c980b62ae6eccd92 /src/cmd/compile/internal
parentcca64d0f5ccc6ae88d36ee5ef388b8617d4d425d (diff)
downloadgo-59ed0136210a276ff9574a9b7008bcb7b7f9cb8b.tar.xz
cmd/compile: simplify array parsing in equality signatures
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>
Diffstat (limited to 'src/cmd/compile/internal')
-rw-r--r--src/cmd/compile/internal/reflectdata/alg.go102
1 files changed, 33 insertions, 69 deletions
diff --git a/src/cmd/compile/internal/reflectdata/alg.go b/src/cmd/compile/internal/reflectdata/alg.go
index b281b4c37f..c87cd8e257 100644
--- a/src/cmd/compile/internal/reflectdata/alg.go
+++ b/src/cmd/compile/internal/reflectdata/alg.go
@@ -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