diff --git a/Libraries/LibJS/Runtime/PropertyName.h b/Libraries/LibJS/Runtime/PropertyName.h index 4c74c9de9f..ab31b0fa4c 100644 --- a/Libraries/LibJS/Runtime/PropertyName.h +++ b/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() { } diff --git a/Libraries/LibJS/Tests/object-expression-computed-property.js b/Libraries/LibJS/Tests/object-expression-computed-property.js new file mode 100644 index 0000000000..7fa579d21e --- /dev/null +++ b/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"); +});