]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: use internal/abi itab type
authorKeith Randall <khr@golang.org>
Wed, 13 Dec 2023 20:46:39 +0000 (12:46 -0800)
committerKeith Randall <khr@golang.org>
Fri, 16 Feb 2024 20:24:57 +0000 (20:24 +0000)
Change-Id: I4a40d9cda41d3601169ef0daf0f25fb1509bdcb7
Reviewed-on: https://go-review.googlesource.com/c/go/+/549458
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: David Chase <drchase@google.com>
src/reflect/value.go

index 60ba79a6e68bab3a2d6f2af518134a977a3c7509..87e595155bcd4592b1e4308b57e7e993b7d836a2 100644 (file)
@@ -208,14 +208,7 @@ type emptyInterface struct {
 
 // nonEmptyInterface is the header for an interface value with methods.
 type nonEmptyInterface struct {
-       // see ../runtime/iface.go:/Itab
-       itab *struct {
-               ityp *abi.Type // static interface type
-               typ  *abi.Type // dynamic concrete type
-               hash uint32    // copy of typ.hash
-               _    [4]byte
-               fun  [100000]unsafe.Pointer // method table
-       }
+       itab *abi.ITab
        word unsafe.Pointer
 }
 
@@ -897,8 +890,8 @@ func methodReceiver(op string, v Value, methodIndex int) (rcvrtype *abi.Type, t
                if iface.itab == nil {
                        panic("reflect: " + op + " of method on nil interface value")
                }
-               rcvrtype = iface.itab.typ
-               fn = unsafe.Pointer(&iface.itab.fun[i])
+               rcvrtype = iface.itab.Type
+               fn = unsafe.Pointer(&unsafe.Slice(&iface.itab.Fun[0], i+1)[i])
                t = (*funcType)(unsafe.Pointer(tt.typeOff(m.Typ)))
        } else {
                rcvrtype = v.typ()