diff --git a/type_go_map.go b/type_go_map.go index aa7b7801..43845ea0 100644 --- a/type_go_map.go +++ b/type_go_map.go @@ -47,7 +47,21 @@ func (o goMapObject) toValue(value Value) reflect.Value { func goMapGetOwnProperty(obj *object, name string) *property { goObj := obj.value.(*goMapObject) - value := goObj.value.MapIndex(goObj.toKey(name)) + + // an error here means that the key referenced by `name` could not possibly + // be a property of this object, so it should be safe to ignore this error + // + // TODO: figure out if any cases from + // https://go.dev/ref/spec#Comparison_operators meet the criteria of 1) + // being possible to represent as a string, 2) being possible to reconstruct + // from a string, and 3) having a meaningful failure case in this context + // other than "key does not exist" + key, err := stringToReflectValue(name, goObj.keyType.Kind()) + if err != nil { + return nil + } + + value := goObj.value.MapIndex(key) if value.IsValid() { return &property{obj.runtime.toValue(value.Interface()), 0o111} } diff --git a/value_test.go b/value_test.go index a94c01a0..85ea373d 100644 --- a/value_test.go +++ b/value_test.go @@ -77,6 +77,42 @@ func TestToValue(t *testing.T) { value, _ = vm.ToValue(&tmp2) is(value, "undefined") } + + { + m := map[int64]string{0: "foo", 1: "bar"} + value, err := vm.ToValue(m) + is(err, nil) + v0, err := value.Object().Get("0") + is(err, nil) + is(v0, m[0]) + v1, err := value.Object().Get("1") + is(err, nil) + is(v1, m[1]) + missing, err := value.Object().Get("2") + is(err, nil) + is(missing, UndefinedValue()) + invalid, err := value.Object().Get("xxx") + is(err, nil) + is(invalid, UndefinedValue()) + } + + { + m := map[uint64]string{0: "foo", 1: "bar"} + value, err := vm.ToValue(m) + is(err, nil) + v0, err := value.Object().Get("0") + is(err, nil) + is(v0, m[0]) + v1, err := value.Object().Get("1") + is(err, nil) + is(v1, m[1]) + missing, err := value.Object().Get("2") + is(err, nil) + is(missing, UndefinedValue()) + invalid, err := value.Object().Get("xxx") + is(err, nil) + is(invalid, UndefinedValue()) + } }) } @@ -295,6 +331,18 @@ func TestExport(t *testing.T) { vm.Set("abc", abc) is(test(`abc;`).export(), abc) } + + { + abc := map[int64]string{0: "foo", 1: "bar"} + vm.Set("abc", abc) + is(test(`abc;`).export(), abc) + } + + { + abc := map[uint64]string{0: "foo", 1: "bar"} + vm.Set("abc", abc) + is(test(`abc;`).export(), abc) + } }) }