From be9c2feff055e165b9083af98a87c60be07c99f2 Mon Sep 17 00:00:00 2001 From: Stephan Unverwerth Date: Mon, 19 Oct 2020 00:37:51 +0200 Subject: [PATCH] LibJS: Fix parsing of numeric object keys Numeric keys were interpreted as their source text, leading to something like {0x10:true} to end up as {"0x10":true} instead of {16:true} --- Libraries/LibJS/Parser.cpp | 6 ++---- Libraries/LibJS/Tests/object-basic.js | 7 +++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index ca7b8abe9a..d7896d9c32 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -743,11 +743,9 @@ NonnullRefPtr Parser::parse_property_key() if (match(TokenType::StringLiteral)) { return parse_string_literal(consume()); } else if (match(TokenType::NumericLiteral)) { - // FIXME: "evaluate" key to double value, see https://github.com/SerenityOS/serenity/issues/3717 - return create_ast_node(consume_and_validate_numeric_literal().value()); + return create_ast_node(consume().double_value()); } else if (match(TokenType::BigIntLiteral)) { - auto value = consume(TokenType::BigIntLiteral).value(); - return create_ast_node(value.substring_view(0, value.length() - 1)); + return create_ast_node(consume().value()); } else if (match(TokenType::BracketOpen)) { consume(TokenType::BracketOpen); auto result = parse_expression(0); diff --git a/Libraries/LibJS/Tests/object-basic.js b/Libraries/LibJS/Tests/object-basic.js index 37f5c6e4dd..2681ebc173 100644 --- a/Libraries/LibJS/Tests/object-basic.js +++ b/Libraries/LibJS/Tests/object-basic.js @@ -39,6 +39,13 @@ describe("correct behavior", () => { expect(object[symbol]).toBe(2); }); + test("numeric keys", () => { + expect({0x10:true}).toBe({16:true}); + expect({0b10:true}).toBe({2:true}); + expect({0o10:true}).toBe({8:true}); + expect({.5:true}).toBe({"0.5":true}); + }); + test("computed properties", () => { const foo = "bar"; const computed = "computed";