From e52149822b54811cedaaa87013de3fa4bc634e95 Mon Sep 17 00:00:00 2001 From: Cuong Manh Le Date: Wed, 17 Feb 2021 15:14:21 +0700 Subject: cmd/compile: simplify assert{E,I}2I{,2} calling conventions This CL rebases CL 273694 on top of master with @mdempsky's permission. For assertE2I and assertI2I, there's no need to pass through the interface's data pointer: it's always going to come back unmodified. For assertE2I2 and assertI2I2, there's no need for an extra bool result parameter: it's redundant with testing the returned interface value for nil. Change-Id: Ic92d4409ad381952f875d3d74b8cf11c32702fa6 Reviewed-on: https://go-review.googlesource.com/c/go/+/292892 Trust: Cuong Manh Le Run-TryBot: Cuong Manh Le TryBot-Result: Go Bot Reviewed-by: Matthew Dempsky --- src/runtime/iface.go | 28 +++++++++------------------- src/runtime/mfinal.go | 4 ++-- 2 files changed, 11 insertions(+), 21 deletions(-) (limited to 'src/runtime') diff --git a/src/runtime/iface.go b/src/runtime/iface.go index 0504b89363..02b18dabff 100644 --- a/src/runtime/iface.go +++ b/src/runtime/iface.go @@ -447,23 +447,18 @@ func convI2I(inter *interfacetype, i iface) (r iface) { return } -func assertI2I(inter *interfacetype, i iface) (r iface) { - tab := i.tab +func assertI2I(inter *interfacetype, tab *itab) *itab { if tab == nil { // explicit conversions require non-nil interface value. panic(&TypeAssertionError{nil, nil, &inter.typ, ""}) } if tab.inter == inter { - r.tab = tab - r.data = i.data - return + return tab } - r.tab = getitab(inter, tab._type, false) - r.data = i.data - return + return getitab(inter, tab._type, false) } -func assertI2I2(inter *interfacetype, i iface) (r iface, b bool) { +func assertI2I2(inter *interfacetype, i iface) (r iface) { tab := i.tab if tab == nil { return @@ -476,22 +471,18 @@ func assertI2I2(inter *interfacetype, i iface) (r iface, b bool) { } r.tab = tab r.data = i.data - b = true return } -func assertE2I(inter *interfacetype, e eface) (r iface) { - t := e._type +func assertE2I(inter *interfacetype, t *_type) *itab { if t == nil { // explicit conversions require non-nil interface value. panic(&TypeAssertionError{nil, nil, &inter.typ, ""}) } - r.tab = getitab(inter, t, false) - r.data = e.data - return + return getitab(inter, t, false) } -func assertE2I2(inter *interfacetype, e eface) (r iface, b bool) { +func assertE2I2(inter *interfacetype, e eface) (r iface) { t := e._type if t == nil { return @@ -502,18 +493,17 @@ func assertE2I2(inter *interfacetype, e eface) (r iface, b bool) { } r.tab = tab r.data = e.data - b = true return } //go:linkname reflect_ifaceE2I reflect.ifaceE2I func reflect_ifaceE2I(inter *interfacetype, e eface, dst *iface) { - *dst = assertE2I(inter, e) + *dst = iface{assertE2I(inter, e._type), e.data} } //go:linkname reflectlite_ifaceE2I internal/reflectlite.ifaceE2I func reflectlite_ifaceE2I(inter *interfacetype, e eface, dst *iface) { - *dst = assertE2I(inter, e) + *dst = iface{assertE2I(inter, e._type), e.data} } func iterate_itabs(fn func(*itab)) { diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go index 7d0313be12..e92ec80e3c 100644 --- a/src/runtime/mfinal.go +++ b/src/runtime/mfinal.go @@ -214,7 +214,7 @@ func runfinq() { if len(ityp.mhdr) != 0 { // convert to interface with methods // this conversion is guaranteed to succeed - we checked in SetFinalizer - *(*iface)(frame) = assertE2I(ityp, *(*eface)(frame)) + (*iface)(frame).tab = assertE2I(ityp, (*eface)(frame)._type) } default: throw("bad kind in runfinq") @@ -403,7 +403,7 @@ func SetFinalizer(obj interface{}, finalizer interface{}) { // ok - satisfies empty interface goto okarg } - if _, ok := assertE2I2(ityp, *efaceOf(&obj)); ok { + if iface := assertE2I2(ityp, *efaceOf(&obj)); iface.tab != nil { goto okarg } } -- cgit v1.3