From 03615a7872849dc63f0495e779b6ce6f6c09f11c Mon Sep 17 00:00:00 2001 From: Matthew Olsson Date: Thu, 28 May 2020 12:02:32 -0700 Subject: [PATCH] LibJS: Parse labels in continue and break statements --- Libraries/LibJS/AST.h | 18 ++++++++++++++++-- Libraries/LibJS/Parser.cpp | 20 ++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index 9f9b4faf9e..297f41884b 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -1048,22 +1048,36 @@ private: class BreakStatement final : public Statement { public: - BreakStatement() { } + BreakStatement(FlyString target_label) + : m_target_label(target_label) + { + } virtual Value execute(Interpreter&) const override; + const FlyString& target_label() const { return m_target_label; } + private: virtual const char* class_name() const override { return "BreakStatement"; } + + FlyString m_target_label; }; class ContinueStatement final : public Statement { public: - ContinueStatement() { } + ContinueStatement(FlyString target_label) + : m_target_label(target_label) + { + } virtual Value execute(Interpreter&) const override; + const FlyString& target_label() const { return m_target_label; } + private: virtual const char* class_name() const override { return "ContinueStatement"; } + + FlyString m_target_label; }; class DebuggerStatement final : public Statement { diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index dbb1db4215..86c7c70f1d 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -1112,17 +1112,29 @@ NonnullRefPtr Parser::parse_throw_statement() NonnullRefPtr Parser::parse_break_statement() { consume(TokenType::Break); + FlyString target_label; + if (match(TokenType::Semicolon)) { + consume(); + return create_ast_node(target_label); + } + if (match_identifier_name() && !m_parser_state.m_current_token.trivia().contains('\n')) + target_label = consume().value(); consume_or_insert_semicolon(); - // FIXME: Handle labels. When fixing this, take care to correctly implement semicolon insertion - return create_ast_node(); + return create_ast_node(target_label); } NonnullRefPtr Parser::parse_continue_statement() { consume(TokenType::Continue); + FlyString target_label; + if (match(TokenType::Semicolon)) { + consume(); + return create_ast_node(target_label); + } + if (match_identifier_name() && !m_parser_state.m_current_token.trivia().contains('\n')) + target_label = consume().value(); consume_or_insert_semicolon(); - // FIXME: Handle labels. When fixing this, take care to correctly implement semicolon insertion - return create_ast_node(); + return create_ast_node(target_label); } NonnullRefPtr Parser::parse_conditional_expression(NonnullRefPtr test)