gocore: the name of a type changed to varint in Go 1.17. refer: https://github.com/golang/go/commit/287025925f66f90ad9b30aea2e533928026a8376 Change-Id: I019e881db37a83a3ddcebb75143fbcb4414e8d6b GitHub-Last-Rev: ea77671385eca36d757162510b953451137a412a GitHub-Pull-Request: golang/debug#10 Reviewed-on: https://go-review.googlesource.com/c/debug/+/419016 Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> Reviewed-by: Keith Randall <khr@google.com>
diff --git a/internal/gocore/type.go b/internal/gocore/type.go index 4d1b8a5..6190b13 100644 --- a/internal/gocore/type.go +++ b/internal/gocore/type.go
@@ -110,6 +110,26 @@ } } +// return the number of bytes of the variable int and its value, +// which means the length of a name. +func readNameLen(p *Process, a core.Address) (int64, int64) { + if p.minorVersion >= 17 { + v := 0 + for i := 0; ; i++ { + x := p.proc.ReadUint8(a.Add(int64(i + 1))) + v += int(x&0x7f) << (7 * i) + if x&0x80 == 0 { + return int64(i + 1), int64(v) + } + } + } else { + n1 := p.proc.ReadUint8(a.Add(1)) + n2 := p.proc.ReadUint8(a.Add(2)) + n := uint16(n1)<<8 + uint16(n2) + return 2, int64(n) + } +} + // Convert the address of a runtime._type to a *Type. // Guaranteed to return a non-nil *Type. func (p *Process) runtimeType2Type(a core.Address) *Type { @@ -134,9 +154,9 @@ var name string if m != nil { x := m.types.Add(int64(r.Field("str").Int32())) - n := uint16(p.proc.ReadUint8(x.Add(1)))<<8 + uint16(p.proc.ReadUint8(x.Add(2))) + i, n := readNameLen(p, x) b := make([]byte, n) - p.proc.ReadAt(b, x.Add(3)) + p.proc.ReadAt(b, x.Add(i+1)) name = string(b) if r.Field("tflag").Uint8()&uint8(p.rtConstants["tflagExtraStar"]) != 0 { name = name[1:]