internal/gocore: handle unsafe.pointer case for sync.entry.p in sync.map Change-Id: I8c75440d8557d48cff039d228ba8a87f0fd215f2 GitHub-Last-Rev: 9448ffbeb3a1fd1cfa61bb1ed79640e41a432921 GitHub-Pull-Request: golang/debug#12 Reviewed-on: https://go-review.googlesource.com/c/debug/+/419177 Run-TryBot: Hyang-Ah Hana Kim <hyangah@gmail.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/internal/gocore/type.go b/internal/gocore/type.go index 6190b13..05d15b9 100644 --- a/internal/gocore/type.go +++ b/internal/gocore/type.go
@@ -661,6 +661,17 @@ } // TODO: also special case for channels? for _, f := range t.Fields { + // sync.entry.p(in sync.map) is an unsafe.pointer to an empty interface. + if t.Name == "sync.entry" && f.Name == "p" && f.Type.Kind == KindPtr && f.Type.Elem == nil { + ptr := r.ReadPtr(a.Add(f.Off)) + if ptr != 0 { + typ := &Type{ + Name: "sync.entry<interface{}>", + Kind: KindEface, + } + add(ptr, typ, 1) + } + } p.typeObject(a.Add(f.Off), f.Type, r, add) } default: