update, based on review comments

Change-Id: Iae78e5cc2ca10468d2084e9caa8918792af9be83
This commit is contained in:
Mateusz Poliwczak 2025-05-20 08:40:39 +02:00
parent 80a9bb4fce
commit c2b7923187
2 changed files with 7 additions and 7 deletions

View File

@ -1,2 +1,2 @@
The new [TypeAssert] function permits converting a [Value] directly to a Go type. The new [TypeAssert] function permits converting a [Value] directly to a Go value
This is like using a type assertion on the result of [Value.Interface]. of the given type. This is like using a type assertion on the result of [Value.Interface].

View File

@ -1219,7 +1219,7 @@ func (v Value) Elem() Value {
k := v.kind() k := v.kind()
switch k { switch k {
case Interface: case Interface:
x := unpackEface(packIntoEmptyIface(v)) x := unpackEface(packIfaceValueIntoEmptyIface(v))
if x.flag != 0 { if x.flag != 0 {
x.flag |= v.flag.ro() x.flag |= v.flag.ro()
} }
@ -1492,7 +1492,7 @@ func valueInterface(v Value, safe bool) any {
if v.kind() == Interface { if v.kind() == Interface {
// Special case: return the element inside the interface. // Special case: return the element inside the interface.
return packIntoEmptyIface(v) return packIfaceValueIntoEmptyIface(v)
} }
return packEface(v) return packEface(v)
@ -1540,7 +1540,7 @@ func TypeAssert[T any](v Value) (T, bool) {
// val := ValueOf(&v).Elem() // val := ValueOf(&v).Elem()
// TypeAssert[error](val) == val.Interface().(error) // TypeAssert[error](val) == val.Interface().(error)
if v.kind() == Interface { if v.kind() == Interface {
v, ok := packIntoEmptyIface(v).(T) v, ok := packIfaceValueIntoEmptyIface(v).(T)
return v, ok return v, ok
} }
@ -1563,10 +1563,10 @@ func TypeAssert[T any](v Value) (T, bool) {
return *(*T)(v.ptr), true return *(*T)(v.ptr), true
} }
// packIntoEmptyIface converts an interface Value into an empty interface. // packIfaceValueIntoEmptyIface converts an interface Value into an empty interface.
// //
// Precondition: v.kind() == Interface // Precondition: v.kind() == Interface
func packIntoEmptyIface(v Value) any { func packIfaceValueIntoEmptyIface(v Value) any {
// Empty interface has one layout, all interfaces with // Empty interface has one layout, all interfaces with
// methods have a second layout. // methods have a second layout.
if v.NumMethod() == 0 { if v.NumMethod() == 0 {