Browse Source

LibJS: Support numeric literal expressions in nullish object exceptions

Timothy Flynn 1 year ago
parent
commit
bfcfe6ce35

+ 3 - 0
Userland/Libraries/LibJS/AST.h

@@ -91,6 +91,7 @@ public:
     virtual bool is_import_call() const { return false; }
     virtual bool is_array_expression() const { return false; }
     virtual bool is_object_expression() const { return false; }
+    virtual bool is_numeric_literal() const { return false; }
     virtual bool is_string_literal() const { return false; }
     virtual bool is_update_expression() const { return false; }
     virtual bool is_call_expression() const { return false; }
@@ -1182,6 +1183,8 @@ public:
     virtual Value value() const override { return m_value; }
 
 private:
+    virtual bool is_numeric_literal() const override { return true; }
+
     Value m_value;
 };
 

+ 5 - 0
Userland/Libraries/LibJS/Bytecode/Generator.cpp

@@ -453,6 +453,11 @@ static Optional<ByteString> expression_identifier(Expression const& expression)
         return identifier.string();
     }
 
+    if (expression.is_numeric_literal()) {
+        auto const& literal = static_cast<NumericLiteral const&>(expression);
+        return literal.value().to_string_without_side_effects().to_byte_string();
+    }
+
     if (expression.is_member_expression()) {
         auto const& member_expression = static_cast<MemberExpression const&>(expression);
         StringBuilder builder;

+ 8 - 2
Userland/Libraries/LibJS/Tests/null-or-undefined-access.js

@@ -47,11 +47,17 @@ test("null/undefined array index", () => {
 
         expect(() => {
             foo[0].bar;
-        }).toThrowWithMessage(TypeError, `Cannot access property "bar" on ${value} object`);
+        }).toThrowWithMessage(
+            TypeError,
+            `Cannot access property "bar" on ${value} object "foo[0]"`
+        );
 
         expect(() => {
             foo[0].bar = 1;
-        }).toThrowWithMessage(TypeError, `Cannot access property "bar" on ${value} object`);
+        }).toThrowWithMessage(
+            TypeError,
+            `Cannot access property "bar" on ${value} object "foo[0]"`
+        );
 
         expect(() => {
             foo[index].bar;