aboutsummaryrefslogtreecommitdiff
path: root/src/internal
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2020-10-22 00:25:17 +0700
committerRuss Cox <rsc@golang.org>2020-10-28 17:10:08 +0000
commit642329fdd55aabafc67b3a7c50902e29125621ab (patch)
tree391ec188d728cbc5578b07781d4e155e82f7c34c /src/internal
parente3c58bbeb8c76fa3abc0f7153edbab72208c1f88 (diff)
downloadgo-642329fdd55aabafc67b3a7c50902e29125621ab.tar.gz
go-642329fdd55aabafc67b3a7c50902e29125621ab.zip
Revert "cmd/compile: split exported/non-exported methods for interface type"
This reverts commit 8f26b57f9afc238bdecb9b7030bc2f4364093885. Reason for revert: break a bunch of code, include standard library. Fixes #42123 Change-Id: Ife90ecbafd2cb395623d1db555fbfc9c1b0098e0 Reviewed-on: https://go-review.googlesource.com/c/go/+/264026 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/reflectlite/type.go35
-rw-r--r--src/internal/reflectlite/value.go4
2 files changed, 13 insertions, 26 deletions
diff --git a/src/internal/reflectlite/type.go b/src/internal/reflectlite/type.go
index 37cf03594f..15ba30da36 100644
--- a/src/internal/reflectlite/type.go
+++ b/src/internal/reflectlite/type.go
@@ -234,13 +234,10 @@ type imethod struct {
// interfaceType represents an interface type.
type interfaceType struct {
rtype
- pkgPath name // import path
- expMethods []imethod // sorted by name, see runtime/type.go:interfacetype to see how it is encoded.
+ pkgPath name // import path
+ methods []imethod // sorted by hash
}
-func (t *interfaceType) methods() []imethod { return t.expMethods[:cap(t.expMethods)] }
-func (t *interfaceType) isEmpty() bool { return cap(t.expMethods) == 0 }
-
// mapType represents a map type.
type mapType struct {
rtype
@@ -698,7 +695,7 @@ func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer {
}
// NumMethod returns the number of interface methods in the type's method set.
-func (t *interfaceType) NumMethod() int { return len(t.expMethods) }
+func (t *interfaceType) NumMethod() int { return len(t.methods) }
// TypeOf returns the reflection Type that represents the dynamic type of i.
// If i is a nil interface value, TypeOf returns nil.
@@ -735,10 +732,9 @@ func implements(T, V *rtype) bool {
return false
}
t := (*interfaceType)(unsafe.Pointer(T))
- if t.isEmpty() {
+ if len(t.methods) == 0 {
return true
}
- tmethods := t.methods()
// The same algorithm applies in both cases, but the
// method tables for an interface type and a concrete type
@@ -755,11 +751,10 @@ func implements(T, V *rtype) bool {
if V.Kind() == Interface {
v := (*interfaceType)(unsafe.Pointer(V))
i := 0
- vmethods := v.methods()
- for j := 0; j < len(vmethods); j++ {
- tm := &tmethods[i]
+ for j := 0; j < len(v.methods); j++ {
+ tm := &t.methods[i]
tmName := t.nameOff(tm.name)
- vm := &vmethods[j]
+ vm := &v.methods[j]
vmName := V.nameOff(vm.name)
if vmName.name() == tmName.name() && V.typeOff(vm.typ) == t.typeOff(tm.typ) {
if !tmName.isExported() {
@@ -775,7 +770,7 @@ func implements(T, V *rtype) bool {
continue
}
}
- if i++; i >= len(tmethods) {
+ if i++; i >= len(t.methods) {
return true
}
}
@@ -790,7 +785,7 @@ func implements(T, V *rtype) bool {
i := 0
vmethods := v.methods()
for j := 0; j < int(v.mcount); j++ {
- tm := &tmethods[i]
+ tm := &t.methods[i]
tmName := t.nameOff(tm.name)
vm := vmethods[j]
vmName := V.nameOff(vm.name)
@@ -808,7 +803,7 @@ func implements(T, V *rtype) bool {
continue
}
}
- if i++; i >= len(tmethods) {
+ if i++; i >= len(t.methods) {
return true
}
}
@@ -902,7 +897,7 @@ func haveIdenticalUnderlyingType(T, V *rtype, cmpTags bool) bool {
case Interface:
t := (*interfaceType)(unsafe.Pointer(T))
v := (*interfaceType)(unsafe.Pointer(V))
- if t.isEmpty() && v.isEmpty() {
+ if len(t.methods) == 0 && len(v.methods) == 0 {
return true
}
// Might have the same methods but still
@@ -967,11 +962,3 @@ func toType(t *rtype) Type {
func ifaceIndir(t *rtype) bool {
return t.kind&kindDirectIface == 0
}
-
-func isEmptyIface(t *rtype) bool {
- if t.Kind() != Interface {
- return false
- }
- tt := (*interfaceType)(unsafe.Pointer(t))
- return tt.isEmpty()
-}
diff --git a/src/internal/reflectlite/value.go b/src/internal/reflectlite/value.go
index fb0ec77b58..0365eeeabf 100644
--- a/src/internal/reflectlite/value.go
+++ b/src/internal/reflectlite/value.go
@@ -228,7 +228,7 @@ func (v Value) Elem() Value {
switch k {
case Interface:
var eface interface{}
- if isEmptyIface(v.typ) {
+ if v.typ.NumMethod() == 0 {
eface = *(*interface{})(v.ptr)
} else {
eface = (interface{})(*(*interface {
@@ -433,7 +433,7 @@ func (v Value) assignTo(context string, dst *rtype, target unsafe.Pointer) Value
return Value{dst, nil, flag(Interface)}
}
x := valueInterface(v)
- if isEmptyIface(dst) {
+ if dst.NumMethod() == 0 {
*(*interface{})(target) = x
} else {
ifaceE2I(dst, x, target)