From bc78e4b7da2ccdad6e4368b90baa4830e64c4384 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 7 Oct 2020 19:53:30 +0100 Subject: [PATCH] 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. --- Libraries/LibJS/Runtime/PropertyName.h | 8 ++++---- .../Tests/object-expression-computed-property.js | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 Libraries/LibJS/Tests/object-expression-computed-property.js 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"); +});