if sym.Def != nil {
return sym.Def.(*ir.Name).Func
}
- sig0 := sig
pos := base.AutogeneratedPos // less confusing than end of input
base.Pos = pos
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 {
if sym.Def != nil {
return sym.Def.(*ir.Name).Func
}
- sig0 := sig
pos := base.AutogeneratedPos // less confusing than end of input
base.Pos = pos
}
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 {
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]
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