mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 22:02:44 +00:00 
			
		
		
		
	LibJS: Parse labels in continue and break statements
This commit is contained in:
		
							parent
							
								
									10bf4ba3dc
								
							
						
					
					
						commit
						03615a7872
					
				
					 2 changed files with 32 additions and 6 deletions
				
			
		|  | @ -1048,22 +1048,36 @@ private: | ||||||
| 
 | 
 | ||||||
| class BreakStatement final : public Statement { | class BreakStatement final : public Statement { | ||||||
| public: | public: | ||||||
|     BreakStatement() { } |     BreakStatement(FlyString target_label) | ||||||
|  |         : m_target_label(target_label) | ||||||
|  |     { | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     virtual Value execute(Interpreter&) const override; |     virtual Value execute(Interpreter&) const override; | ||||||
| 
 | 
 | ||||||
|  |     const FlyString& target_label() const { return m_target_label; } | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     virtual const char* class_name() const override { return "BreakStatement"; } |     virtual const char* class_name() const override { return "BreakStatement"; } | ||||||
|  | 
 | ||||||
|  |     FlyString m_target_label; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class ContinueStatement final : public Statement { | class ContinueStatement final : public Statement { | ||||||
| public: | public: | ||||||
|     ContinueStatement() { } |     ContinueStatement(FlyString target_label) | ||||||
|  |         : m_target_label(target_label) | ||||||
|  |     { | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     virtual Value execute(Interpreter&) const override; |     virtual Value execute(Interpreter&) const override; | ||||||
| 
 | 
 | ||||||
|  |     const FlyString& target_label() const { return m_target_label; } | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     virtual const char* class_name() const override { return "ContinueStatement"; } |     virtual const char* class_name() const override { return "ContinueStatement"; } | ||||||
|  | 
 | ||||||
|  |     FlyString m_target_label; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class DebuggerStatement final : public Statement { | class DebuggerStatement final : public Statement { | ||||||
|  |  | ||||||
|  | @ -1112,17 +1112,29 @@ NonnullRefPtr<ThrowStatement> Parser::parse_throw_statement() | ||||||
| NonnullRefPtr<BreakStatement> Parser::parse_break_statement() | NonnullRefPtr<BreakStatement> Parser::parse_break_statement() | ||||||
| { | { | ||||||
|     consume(TokenType::Break); |     consume(TokenType::Break); | ||||||
|  |     FlyString target_label; | ||||||
|  |     if (match(TokenType::Semicolon)) { | ||||||
|  |         consume(); | ||||||
|  |         return create_ast_node<BreakStatement>(target_label); | ||||||
|  |     } | ||||||
|  |     if (match_identifier_name() && !m_parser_state.m_current_token.trivia().contains('\n')) | ||||||
|  |         target_label = consume().value(); | ||||||
|     consume_or_insert_semicolon(); |     consume_or_insert_semicolon(); | ||||||
|     // FIXME: Handle labels. When fixing this, take care to correctly implement semicolon insertion
 |     return create_ast_node<BreakStatement>(target_label); | ||||||
|     return create_ast_node<BreakStatement>(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| NonnullRefPtr<ContinueStatement> Parser::parse_continue_statement() | NonnullRefPtr<ContinueStatement> Parser::parse_continue_statement() | ||||||
| { | { | ||||||
|     consume(TokenType::Continue); |     consume(TokenType::Continue); | ||||||
|  |     FlyString target_label; | ||||||
|  |     if (match(TokenType::Semicolon)) { | ||||||
|  |         consume(); | ||||||
|  |         return create_ast_node<ContinueStatement>(target_label); | ||||||
|  |     } | ||||||
|  |     if (match_identifier_name() && !m_parser_state.m_current_token.trivia().contains('\n')) | ||||||
|  |         target_label = consume().value(); | ||||||
|     consume_or_insert_semicolon(); |     consume_or_insert_semicolon(); | ||||||
|     // FIXME: Handle labels. When fixing this, take care to correctly implement semicolon insertion
 |     return create_ast_node<ContinueStatement>(target_label); | ||||||
|     return create_ast_node<ContinueStatement>(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| NonnullRefPtr<ConditionalExpression> Parser::parse_conditional_expression(NonnullRefPtr<Expression> test) | NonnullRefPtr<ConditionalExpression> Parser::parse_conditional_expression(NonnullRefPtr<Expression> test) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Matthew Olsson
						Matthew Olsson