mirror of
https://github.com/golang/go.git
synced 2026-01-29 07:02:05 +03:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user