Răsfoiți Sursa

Always use container's address, if we can. Fixes #620.

Dmitry Panov 1 an în urmă
părinte
comite
21e33551e7
2 a modificat fișierele cu 23 adăugiri și 0 ștergeri
  1. 3 0
      object_goreflect.go
  2. 20 0
      object_goreflect_test.go

+ 3 - 0
object_goreflect.go

@@ -221,6 +221,9 @@ func (o *objectGoReflect) _getMethod(jsName string) reflect.Value {
 
 func (o *objectGoReflect) elemToValue(ev reflect.Value) (Value, reflectValueWrapper) {
 	if isContainer(ev.Kind()) {
+		if ev.CanAddr() {
+			ev = ev.Addr()
+		}
 		ret := o.val.runtime.toValue(ev.Interface(), ev)
 		if obj, ok := ret.(*Object); ok {
 			if w, ok := obj.self.(reflectValueWrapper); ok {

+ 20 - 0
object_goreflect_test.go

@@ -1665,3 +1665,23 @@ func TestGoReflectUnexportedEmbedStruct(t *testing.T) {
 		})
 	}
 }
+
+func TestNestedSliceAddr(t *testing.T) {
+	type document struct {
+		Items []any
+	}
+
+	var d document
+	runtime := New()
+	runtime.Set("d", &d)
+
+	_, err := runtime.RunString(`
+	d.Items.push("Hello");
+	`)
+	if err != nil {
+		t.Fatal(err)
+	}
+	if len(d.Items) != 1 || d.Items[0] != "Hello" {
+		t.Fatal(d.Items)
+	}
+}