summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidot <davidot@serenityos.org>2022-11-27 02:24:38 +0100
committerLinus Groh <mail@linusgroh.de>2022-11-27 12:31:37 +0100
commit2c26ee89acd183770907e58e231d2bc8a125d0df (patch)
tree6627b1b8454fbb46fa341746f12e55aeac0a5c9e
parent3acbd96851f8d42bac4b92071440161f5f591e62 (diff)
downloadserenity-2c26ee89acd183770907e58e231d2bc8a125d0df.zip
LibJS: Remove m_first_invalid_property_range from ObjectExpression
This was state only used by the parser to output an error with appropriate location. This shrinks the size of ObjectExpression from 120 bytes down to just 56. This saves roughly 2.5 MiB when loading twitter.
-rw-r--r--Userland/Libraries/LibJS/AST.h6
-rw-r--r--Userland/Libraries/LibJS/Parser.cpp14
-rw-r--r--Userland/Libraries/LibJS/Parser.h1
3 files changed, 12 insertions, 9 deletions
diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h
index 123905d6d8..e898132ba2 100644
--- a/Userland/Libraries/LibJS/AST.h
+++ b/Userland/Libraries/LibJS/AST.h
@@ -1691,10 +1691,9 @@ private:
class ObjectExpression final : public Expression {
public:
- explicit ObjectExpression(SourceRange source_range, NonnullRefPtrVector<ObjectProperty> properties = {}, Optional<SourceRange> first_invalid_property_range = {})
+ explicit ObjectExpression(SourceRange source_range, NonnullRefPtrVector<ObjectProperty> properties = {})
: Expression(source_range)
, m_properties(move(properties))
- , m_first_invalid_property_range(move(first_invalid_property_range))
{
}
@@ -1702,13 +1701,10 @@ public:
virtual void dump(int indent) const override;
virtual Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&) const override;
- Optional<SourceRange> const& invalid_property_range() const { return m_first_invalid_property_range; }
-
private:
virtual bool is_object_expression() const override { return true; }
NonnullRefPtrVector<ObjectProperty> m_properties;
- Optional<SourceRange> m_first_invalid_property_range;
};
class ArrayExpression final : public Expression {
diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp
index 8e41d8882f..6614094f4b 100644
--- a/Userland/Libraries/LibJS/Parser.cpp
+++ b/Userland/Libraries/LibJS/Parser.cpp
@@ -1799,10 +1799,16 @@ NonnullRefPtr<ObjectExpression> Parser::parse_object_expression()
}
consume(TokenType::CurlyClose);
+
+ if (invalid_object_literal_property_range.has_value()) {
+ size_t object_expression_offset = rule_start.position().offset;
+ VERIFY(!m_state.invalid_property_range_in_object_expression.contains(object_expression_offset));
+ m_state.invalid_property_range_in_object_expression.set(object_expression_offset, invalid_object_literal_property_range->start);
+ }
+
return create_ast_node<ObjectExpression>(
{ m_source_code, rule_start.position(), position() },
- move(properties),
- move(invalid_object_literal_property_range));
+ move(properties));
}
NonnullRefPtr<ArrayExpression> Parser::parse_array_expression()
@@ -1939,8 +1945,8 @@ NonnullRefPtr<Expression> Parser::parse_expression(int min_precedence, Associati
auto [expression, should_continue_parsing] = parse_primary_expression();
auto check_for_invalid_object_property = [&](auto& expression) {
if (is<ObjectExpression>(*expression)) {
- if (auto range = static_cast<ObjectExpression&>(*expression).invalid_property_range(); range.has_value())
- syntax_error("Invalid property in object literal", range->start);
+ if (auto start_offset = m_state.invalid_property_range_in_object_expression.get(expression->start_offset()); start_offset.has_value())
+ syntax_error("Invalid property in object literal", start_offset.value());
}
};
if (is<Identifier>(*expression) && m_state.current_scope_pusher) {
diff --git a/Userland/Libraries/LibJS/Parser.h b/Userland/Libraries/LibJS/Parser.h
index 2f0e73db68..25b7513cec 100644
--- a/Userland/Libraries/LibJS/Parser.h
+++ b/Userland/Libraries/LibJS/Parser.h
@@ -282,6 +282,7 @@ private:
ScopePusher* current_scope_pusher { nullptr };
HashMap<StringView, Optional<Position>> labels_in_scope;
+ HashMap<size_t, Position> invalid_property_range_in_object_expression;
HashTable<StringView>* referenced_private_names { nullptr };
bool strict_mode { false };