Переглянути джерело

LibJS: Fix PropertyName::from_value() for negative and non-int numbers

It was converting *any* number to an i32 index, which obviously is not
correct for negative ints, doubles, infinity and nan.

Fixes #3712.
Linus Groh 4 роки тому
батько
коміт
bc78e4b7da

+ 4 - 4
Libraries/LibJS/Runtime/PropertyName.h

@@ -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() { }

+ 12 - 0
Libraries/LibJS/Tests/object-expression-computed-property.js

@@ -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");
+});