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>
This commit is contained in:
Keith Randall
2025-12-05 14:45:38 -08:00
parent cca64d0f5c
commit 59ed013621

View 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