From 044abb2e2833c65e74decb695a5907459d0bd7f8 Mon Sep 17 00:00:00 2001 From: visualfc Date: Fri, 3 Jul 2026 10:41:48 +0800 Subject: [PATCH] runtime/internal/lib/reflect: fix runtimeStructField func type to closure type --- .github/workflows/test_demo.sh | 2 ++ _demo/go/reflectstructof/main.go | 39 ++++++++++++++++++++++++++++ runtime/internal/lib/reflect/type.go | 6 ++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 _demo/go/reflectstructof/main.go diff --git a/.github/workflows/test_demo.sh b/.github/workflows/test_demo.sh index a4f1be84f5..e2d6b7a3a2 100755 --- a/.github/workflows/test_demo.sh +++ b/.github/workflows/test_demo.sh @@ -117,6 +117,7 @@ ignore_esp32=( "./_demo/go/reflectpkgpath" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/reflectslice" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/reflectsliceat" # panic: internal/bytealg selected .s files require plan9asm translation + "./_demo/go/reflectstructof" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/reflectvisiblefields" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/return-1605" # runtime output: fatal error "./_demo/go/runtime" # panic: internal/bytealg selected .s files require plan9asm translation @@ -197,6 +198,7 @@ ignore_esp32c3_basic=( "./_demo/go/reflectpkgpath" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/reflectslice" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/reflectsliceat" # panic: internal/bytealg selected .s files require plan9asm translation + "./_demo/go/reflectstructof" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/reflectvisiblefields" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/runtime" # panic: internal/bytealg selected .s files require plan9asm translation "./_demo/go/sync" # panic: internal/bytealg selected .s files require plan9asm translation diff --git a/_demo/go/reflectstructof/main.go b/_demo/go/reflectstructof/main.go new file mode 100644 index 0000000000..7e9dc0d322 --- /dev/null +++ b/_demo/go/reflectstructof/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "reflect" +) + +func add(a int, b int) int { + return a + b +} + +func sub(a int, b int) int { + return a - b +} + +func main() { + typ := reflect.StructOf([]reflect.StructField{ + { + Name: "Add", + PkgPath: "", + Type: reflect.TypeOf(add), + }, + { + Name: "Sub", + PkgPath: "", + Type: reflect.TypeOf(sub), + }, + }) + st := reflect.New(typ).Elem() + st.Field(0).Set(reflect.ValueOf(add)) + st.Field(1).Set(reflect.ValueOf(sub)) + r := st.Field(0).Call([]reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}) + if len(r) != 1 || r[0].Interface() != 3 { + panic("st.Add(1,2) error") + } + r = st.Field(1).Call([]reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}) + if len(r) != 1 || r[0].Interface() != -1 { + panic("st.Sub(1,2) error") + } +} diff --git a/runtime/internal/lib/reflect/type.go b/runtime/internal/lib/reflect/type.go index 2ed4b40e93..ce3066e919 100644 --- a/runtime/internal/lib/reflect/type.go +++ b/runtime/internal/lib/reflect/type.go @@ -2492,9 +2492,13 @@ func runtimeStructField(field StructField) (structField, string) { } // resolveReflectType(field.Type.common()) // install in runtime + typ := field.Type.common() + if typ.Kind() == abi.Func { + typ = closureOf(typ.FuncType()) + } f := structField{ Name_: field.Name, - Typ: field.Type.common(), + Typ: typ, Tag_: string(field.Tag), Offset: 0, Embedded_: field.Anonymous,