diff options
Diffstat (limited to 'src/runtime/iface.go')
-rw-r--r-- | src/runtime/iface.go | 28 |
1 files changed, 9 insertions, 19 deletions
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)) { |