From ec2dc5ec24262a470fa4e558663a6a13853d31b2 Mon Sep 17 00:00:00 2001 From: Steven Hartland Date: Mon, 28 Nov 2022 17:21:20 +0000 Subject: [PATCH] fix: map export (#467) When exporting a map check for values which are otto.Value and process them. This is a one level export and no additional traversal is done. Fixes #252 --- issue_test.go | 31 +++++++++++++++++++++++++++++++ value.go | 7 +++++++ 2 files changed, 38 insertions(+) diff --git a/issue_test.go b/issue_test.go index cc6d5ead..2d661099 100644 --- a/issue_test.go +++ b/issue_test.go @@ -3,6 +3,7 @@ package otto import ( "database/sql" "database/sql/driver" + "encoding/json" "errors" "fmt" "testing" @@ -1074,3 +1075,33 @@ func Test_issue317(t *testing.T) { }) } } + +func Test_issue252(t *testing.T) { + in := map[string]interface{}{ + "attr": []interface{}{"string"}, + } + expected := map[string]interface{}{ + "attr": []string{"changed"}, + } + + vm := New() + err := vm.Set("In", in) + require.NoError(t, err) + + result, err := vm.Run(`(function fn() { + var tmp = In; + tmp.attr = ["changed"]; + return tmp; + })()`) + require.NoError(t, err) + + actual, err := result.Export() + require.NoError(t, err) + require.Equal(t, expected, actual) + + expBs, err := json.Marshal(expected) + require.NoError(t, err) + actBs, err := json.Marshal(actual) + require.NoError(t, err) + require.Equal(t, expBs, actBs) +} diff --git a/value.go b/value.go index b4442279..7c5cba3c 100644 --- a/value.go +++ b/value.go @@ -645,6 +645,13 @@ func (self Value) export() interface{} { case *_goStructObject: return value.value.Interface() case *_goMapObject: + iter := value.value.MapRange() + for iter.Next() { + v := iter.Value() + if ov, ok := v.Interface().(Value); ok { + value.value.SetMapIndex(iter.Key(), reflect.ValueOf(ov.export())) + } + } return value.value.Interface() case *_goArrayObject: return value.value.Interface()