Skip to content

Commit caf405b

Browse files
committed
reflect: add Value.UnsafePointer method
This was added in Go 1.18.
1 parent bb65c5c commit caf405b

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

src/reflect/deepequal.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool {
7676
if v1.Len() != v2.Len() {
7777
return false
7878
}
79-
if v1.Pointer() == v2.Pointer() {
79+
if v1.UnsafePointer() == v2.UnsafePointer() {
8080
return true
8181
}
8282
for i := 0; i < v1.Len(); i++ {
@@ -91,7 +91,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool {
9191
}
9292
return deepValueEqual(v1.Elem(), v2.Elem(), visited)
9393
case Ptr:
94-
if v1.Pointer() == v2.Pointer() {
94+
if v1.UnsafePointer() == v2.UnsafePointer() {
9595
return true
9696
}
9797
return deepValueEqual(v1.Elem(), v2.Elem(), visited)
@@ -109,7 +109,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool {
109109
if v1.Len() != v2.Len() {
110110
return false
111111
}
112-
if v1.Pointer() == v2.Pointer() {
112+
if v1.UnsafePointer() == v2.UnsafePointer() {
113113
return true
114114
}
115115
for _, k := range v1.MapKeys() {

src/reflect/value.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,16 +135,22 @@ func (v Value) IsNil() bool {
135135
// Pointer returns the underlying pointer of the given value for the following
136136
// types: chan, map, pointer, unsafe.Pointer, slice, func.
137137
func (v Value) Pointer() uintptr {
138+
return uintptr(v.UnsafePointer())
139+
}
140+
141+
// UnsafePointer returns the underlying pointer of the given value for the
142+
// following types: chan, map, pointer, unsafe.Pointer, slice, func.
143+
func (v Value) UnsafePointer() unsafe.Pointer {
138144
switch v.Kind() {
139145
case Chan, Map, Ptr, UnsafePointer:
140-
return uintptr(v.pointer())
146+
return v.pointer()
141147
case Slice:
142148
slice := (*sliceHeader)(v.value)
143-
return uintptr(slice.data)
149+
return slice.data
144150
case Func:
145-
panic("unimplemented: (reflect.Value).Pointer()")
151+
panic("unimplemented: (reflect.Value).UnsafePointer()")
146152
default: // not implemented: Func
147-
panic(&ValueError{Method: "Pointer"})
153+
panic(&ValueError{Method: "UnsafePointer"})
148154
}
149155
}
150156

src/runtime/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func reflectValueEqual(x, y reflect.Value) bool {
5959
case reflect.String:
6060
return x.String() == y.String()
6161
case reflect.Chan, reflect.Ptr, reflect.UnsafePointer:
62-
return x.Pointer() == y.Pointer()
62+
return x.UnsafePointer() == y.UnsafePointer()
6363
case reflect.Array:
6464
for i := 0; i < x.Len(); i++ {
6565
if !reflectValueEqual(x.Index(i), y.Index(i)) {

0 commit comments

Comments
 (0)