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: