Browse Source

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}
Stephan Unverwerth 4 years ago
parent
commit
be9c2feff0
2 changed files with 9 additions and 4 deletions
  1. 2 4
      Libraries/LibJS/Parser.cpp
  2. 7 0
      Libraries/LibJS/Tests/object-basic.js

+ 2 - 4
Libraries/LibJS/Parser.cpp

@@ -743,11 +743,9 @@ NonnullRefPtr<Expression> 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<StringLiteral>(consume_and_validate_numeric_literal().value());
+        return create_ast_node<NumericLiteral>(consume().double_value());
     } else if (match(TokenType::BigIntLiteral)) {
-        auto value = consume(TokenType::BigIntLiteral).value();
-        return create_ast_node<StringLiteral>(value.substring_view(0, value.length() - 1));
+        return create_ast_node<BigIntLiteral>(consume().value());
     } else if (match(TokenType::BracketOpen)) {
         consume(TokenType::BracketOpen);
         auto result = parse_expression(0);

+ 7 - 0
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";