浏览代码

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
共有 2 个文件被更改,包括 16 次插入4 次删除
  1. 4 4
      Libraries/LibJS/Runtime/PropertyName.h
  2. 12 0
      Libraries/LibJS/Tests/object-expression-computed-property.js

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

@@ -42,13 +42,13 @@ public:
 
 
     static PropertyName from_value(GlobalObject& global_object, Value value)
     static PropertyName from_value(GlobalObject& global_object, Value value)
     {
     {
+        if (value.is_empty())
+            return {};
         if (value.is_symbol())
         if (value.is_symbol())
             return &value.as_symbol();
             return &value.as_symbol();
-        if (value.is_number())
+        if (value.is_integer() && value.as_i32() >= 0)
             return value.as_i32();
             return value.as_i32();
-        if (!value.is_empty())
-            return value.to_string(global_object);
-        return {};
+        return value.to_string(global_object);
     }
     }
 
 
     PropertyName() { }
     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");
+});