diff options
| author | Keith Randall <khr@golang.org> | 2025-12-05 14:45:38 -0800 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2026-01-23 20:58:26 -0800 |
| commit | 59ed0136210a276ff9574a9b7008bcb7b7f9cb8b (patch) | |
| tree | 280d5035bea2528ed3833a66c980b62ae6eccd92 /src/cmd/compile/internal | |
| parent | cca64d0f5ccc6ae88d36ee5ef388b8617d4d425d (diff) | |
| download | go-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.go | 102 |
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 |
