It was converting *any* number to an i32 index, which obviously is not correct for negative ints, doubles, infinity and nan. Fixes #3712.
@@ -42,13 +42,13 @@ public:
static PropertyName from_value(GlobalObject& global_object, Value value)
{
+ if (value.is_empty())
+ return {};
if (value.is_symbol())
return &value.as_symbol();
- if (value.is_number())
+ if (value.is_integer() && value.as_i32() >= 0)
return value.as_i32();
- if (!value.is_empty())
- return value.to_string(global_object);
- return {};
+ return value.to_string(global_object);
}
PropertyName() { }
@@ -0,0 +1,12 @@
+test("Issue #3712, negative/non-int computed property in object expression", () => {
+ const o = {
+ [1.23]: "foo",
+ [-1]: "foo",
+ [NaN]: "foo",
+ [Infinity]: "foo",
+ };
+ expect(o[1.23]).toBe("foo");
+ expect(o[-1]).toBe("foo");
+ expect(o[NaN]).toBe("foo");
+ expect(o[Infinity]).toBe("foo");
+});