1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 03:48:13 +00:00

LibJS: `save_state()' before creating a RulePosition

Fixes #4617.
This commit is contained in:
AnotherTest 2020-12-29 08:42:02 +03:30 committed by Andreas Kling
parent 620b73b3d5
commit d0363bca01
2 changed files with 14 additions and 3 deletions

View file

@ -361,12 +361,13 @@ NonnullRefPtr<Statement> Parser::parse_statement()
RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expect_parens) RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expect_parens)
{ {
auto rule_start = push_start();
save_state(); save_state();
m_parser_state.m_var_scopes.append(NonnullRefPtrVector<VariableDeclaration>()); m_parser_state.m_var_scopes.append(NonnullRefPtrVector<VariableDeclaration>());
auto rule_start = push_start();
ArmedScopeGuard state_rollback_guard = [&] { ArmedScopeGuard state_rollback_guard = [&] {
m_parser_state.m_var_scopes.take_last(); m_parser_state.m_var_scopes.take_last();
rule_start.disable();
load_state(); load_state();
}; };
@ -442,9 +443,10 @@ RefPtr<FunctionExpression> Parser::try_parse_arrow_function_expression(bool expe
RefPtr<Statement> Parser::try_parse_labelled_statement() RefPtr<Statement> Parser::try_parse_labelled_statement()
{ {
auto rule_start = push_start();
save_state(); save_state();
auto rule_start = push_start();
ArmedScopeGuard state_rollback_guard = [&] { ArmedScopeGuard state_rollback_guard = [&] {
rule_start.disable();
load_state(); load_state();
}; };
@ -466,9 +468,10 @@ RefPtr<Statement> Parser::try_parse_labelled_statement()
RefPtr<MetaProperty> Parser::try_parse_new_target_expression() RefPtr<MetaProperty> Parser::try_parse_new_target_expression()
{ {
auto rule_start = push_start();
save_state(); save_state();
auto rule_start = push_start();
ArmedScopeGuard state_rollback_guard = [&] { ArmedScopeGuard state_rollback_guard = [&] {
rule_start.disable();
load_state(); load_state();
}; };

View file

@ -172,6 +172,10 @@ private:
Position position() const; Position position() const;
struct RulePosition { struct RulePosition {
AK_MAKE_NONCOPYABLE(RulePosition);
AK_MAKE_NONMOVABLE(RulePosition);
public:
RulePosition(Parser& parser, Position position) RulePosition(Parser& parser, Position position)
: m_parser(parser) : m_parser(parser)
, m_position(position) , m_position(position)
@ -181,16 +185,20 @@ private:
~RulePosition() ~RulePosition()
{ {
if (!m_enabled)
return;
auto last = m_parser.m_parser_state.m_rule_starts.take_last(); auto last = m_parser.m_parser_state.m_rule_starts.take_last();
ASSERT(last.line == m_position.line); ASSERT(last.line == m_position.line);
ASSERT(last.column == m_position.column); ASSERT(last.column == m_position.column);
} }
const Position& position() const { return m_position; } const Position& position() const { return m_position; }
void disable() { m_enabled = false; }
private: private:
Parser& m_parser; Parser& m_parser;
Position m_position; Position m_position;
bool m_enabled { true };
}; };
[[nodiscard]] RulePosition push_start() { return { *this, position() }; } [[nodiscard]] RulePosition push_start() { return { *this, position() }; }