From 59ed0136210a276ff9574a9b7008bcb7b7f9cb8b Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Fri, 5 Dec 2025 14:45:38 -0800 Subject: [PATCH] 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 LUCI-TryBot-Result: Go LUCI Reviewed-by: Carlos Amedee Reviewed-by: Cuong Manh Le --- src/cmd/compile/internal/reflectdata/alg.go | 102 +++++++------------- 1 file changed, 33 insertions(+), 69 deletions(-) diff --git a/src/cmd/compile/internal/reflectdata/alg.go b/src/cmd/compile/internal/reflectdata/alg.go index b281b4c37f0..c87cd8e257a 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