From caf405b01d150de33ed55cec6ec60731885551d4 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Sat, 11 Jun 2022 17:51:57 +0200 Subject: [PATCH] reflect: add Value.UnsafePointer method This was added in Go 1.18. --- src/reflect/deepequal.go | 6 +++--- src/reflect/value.go | 14 ++++++++++---- src/runtime/interface.go | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/reflect/deepequal.go b/src/reflect/deepequal.go index 5bd132d6c1..49dac165d9 100644 --- a/src/reflect/deepequal.go +++ b/src/reflect/deepequal.go @@ -76,7 +76,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool { if v1.Len() != v2.Len() { return false } - if v1.Pointer() == v2.Pointer() { + if v1.UnsafePointer() == v2.UnsafePointer() { return true } for i := 0; i < v1.Len(); i++ { @@ -91,7 +91,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool { } return deepValueEqual(v1.Elem(), v2.Elem(), visited) case Ptr: - if v1.Pointer() == v2.Pointer() { + if v1.UnsafePointer() == v2.UnsafePointer() { return true } return deepValueEqual(v1.Elem(), v2.Elem(), visited) @@ -109,7 +109,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool { if v1.Len() != v2.Len() { return false } - if v1.Pointer() == v2.Pointer() { + if v1.UnsafePointer() == v2.UnsafePointer() { return true } for _, k := range v1.MapKeys() { diff --git a/src/reflect/value.go b/src/reflect/value.go index 2ed9e51352..2c310bc1e3 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -135,16 +135,22 @@ func (v Value) IsNil() bool { // Pointer returns the underlying pointer of the given value for the following // types: chan, map, pointer, unsafe.Pointer, slice, func. func (v Value) Pointer() uintptr { + return uintptr(v.UnsafePointer()) +} + +// UnsafePointer returns the underlying pointer of the given value for the +// following types: chan, map, pointer, unsafe.Pointer, slice, func. +func (v Value) UnsafePointer() unsafe.Pointer { switch v.Kind() { case Chan, Map, Ptr, UnsafePointer: - return uintptr(v.pointer()) + return v.pointer() case Slice: slice := (*sliceHeader)(v.value) - return uintptr(slice.data) + return slice.data case Func: - panic("unimplemented: (reflect.Value).Pointer()") + panic("unimplemented: (reflect.Value).UnsafePointer()") default: // not implemented: Func - panic(&ValueError{Method: "Pointer"}) + panic(&ValueError{Method: "UnsafePointer"}) } } diff --git a/src/runtime/interface.go b/src/runtime/interface.go index 97ab5439f5..63fd69ec81 100644 --- a/src/runtime/interface.go +++ b/src/runtime/interface.go @@ -59,7 +59,7 @@ func reflectValueEqual(x, y reflect.Value) bool { case reflect.String: return x.String() == y.String() case reflect.Chan, reflect.Ptr, reflect.UnsafePointer: - return x.Pointer() == y.Pointer() + return x.UnsafePointer() == y.UnsafePointer() case reflect.Array: for i := 0; i < x.Len(); i++ { if !reflectValueEqual(x.Index(i), y.Index(i)) {