diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index f70ac3b2fa..e0d0e33b3e 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -367,7 +367,6 @@ RefPtr Parser::try_parse_arrow_function_expression(bool expe ArmedScopeGuard state_rollback_guard = [&] { m_parser_state.m_var_scopes.take_last(); - rule_start.disable(); load_state(); }; @@ -434,6 +433,7 @@ RefPtr Parser::try_parse_arrow_function_expression(bool expe if (!function_body_result.is_null()) { state_rollback_guard.disarm(); + discard_saved_state(); auto body = function_body_result.release_nonnull(); return create_ast_node({ rule_start.position(), position() }, "", move(body), move(parameters), function_length, m_parser_state.m_var_scopes.take_last(), is_strict, true); } @@ -446,7 +446,6 @@ RefPtr Parser::try_parse_labelled_statement() save_state(); auto rule_start = push_start(); ArmedScopeGuard state_rollback_guard = [&] { - rule_start.disable(); load_state(); }; @@ -463,6 +462,7 @@ RefPtr Parser::try_parse_labelled_statement() statement->set_label(identifier); state_rollback_guard.disarm(); + discard_saved_state(); return statement; } @@ -471,7 +471,6 @@ RefPtr Parser::try_parse_new_target_expression() save_state(); auto rule_start = push_start(); ArmedScopeGuard state_rollback_guard = [&] { - rule_start.disable(); load_state(); }; @@ -485,6 +484,7 @@ RefPtr Parser::try_parse_new_target_expression() return {}; state_rollback_guard.disarm(); + discard_saved_state(); return create_ast_node({ rule_start.position(), position() }, MetaProperty::Type::NewTarget); } @@ -2041,4 +2041,9 @@ void Parser::load_state() m_parser_state = m_saved_state.take_last(); } +void Parser::discard_saved_state() +{ + m_saved_state.take_last(); +} + } diff --git a/Libraries/LibJS/Parser.h b/Libraries/LibJS/Parser.h index 22776ae959..6d6c4a57a6 100644 --- a/Libraries/LibJS/Parser.h +++ b/Libraries/LibJS/Parser.h @@ -169,6 +169,7 @@ private: void consume_or_insert_semicolon(); void save_state(); void load_state(); + void discard_saved_state(); Position position() const; struct RulePosition { @@ -180,25 +181,21 @@ private: : m_parser(parser) , m_position(position) { - m_parser.m_parser_state.m_rule_starts.append(position); + m_parser.m_rule_starts.append(position); } ~RulePosition() { - if (!m_enabled) - return; - auto last = m_parser.m_parser_state.m_rule_starts.take_last(); + auto last = m_parser.m_rule_starts.take_last(); ASSERT(last.line == m_position.line); ASSERT(last.column == m_position.column); } const Position& position() const { return m_position; } - void disable() { m_enabled = false; } private: Parser& m_parser; Position m_position; - bool m_enabled { true }; }; [[nodiscard]] RulePosition push_start() { return { *this, position() }; } @@ -210,7 +207,6 @@ private: Vector> m_var_scopes; Vector> m_let_scopes; Vector> m_function_scopes; - Vector m_rule_starts; HashTable m_labels_in_scope; bool m_strict_mode { false }; bool m_allow_super_property_lookup { false }; @@ -224,6 +220,7 @@ private: explicit ParserState(Lexer); }; + Vector m_rule_starts; ParserState m_parser_state; Vector m_saved_state; };