]> Cypherpunks.ru repositories - gostls13.git/commit
reflect: remove broken support for embedding of interfaces from StructOf.
authorDominique Lefevre <domingolefevre@gmail.com>
Wed, 6 Sep 2023 12:58:13 +0000 (15:58 +0300)
committerCherry Mui <cherryyz@google.com>
Fri, 22 Sep 2023 16:25:10 +0000 (16:25 +0000)
commit6d5c9f2f266aa32e3efb98c8e48350d8306f7d43
treead4e1496d5e857411ef2a660ca1b1d93c701ec9a
parent9b883484a8c1c0fb556ac0d04cf24e54dff7eb47
reflect: remove broken support for embedding of interfaces from StructOf.

When reviewing https://go-review.googlesource.com/c/go/+/522435,
Cherry Mui cherryyz@google.com noticed that the implementation of
StructOf was broken, and produced junk if an interface was embedded
into a struct. For example, StructOf messed up the calling convention
for methods of the embedded interface:

> The main problem is that the method wrappers created by reflect.MakeFunc
> expects to be called with a closure calling convention, with a closure
> context passed in the context register. But methods are called with
> a different calling convention, without setting the closure register,
> because (besides this case) all methods are top level functions.
> So there is no way to pass that makefunc closure context.

It is curious that StructOf did not break in go 1.17 which introduced
the regabi. I've tried to run the following example program, and it
fails even in 1.7 which introduced StructOf.

As the embedding of interfaces has been broken since forever,
let us not perpetuate the complexity that this feature brings,
and just remove the support for embedding altogether.

The test program:

package main

import (
"fmt"
"reflect"
)

type I interface {
F()
}

type T int

func (t T) F() { println(t) }

func main() {
var i I
t := reflect.StructOf([]reflect.StructField{
{
Anonymous: true,
Name:      "I",
Type:      reflect.TypeOf(&i).Elem(),
},
})
v := reflect.New(t).Elem()
v.Field(0).Set(reflect.ValueOf(T(42)))
fmt.Println(v)
v.Interface().(interface{ F() }).F() // fatal error
}

Change-Id: I7b2115c22d66ea4ed746f0f9d22b2c94f604e185
Reviewed-on: https://go-review.googlesource.com/c/go/+/526075
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/walk/expr.go
src/reflect/type.go
src/reflect/type_test.go