| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
| 7 | 7 |
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1227 // a pointer whereas the preparser does not really modify the body. | 1227 // a pointer whereas the preparser does not really modify the body. |
| 1228 V8_INLINE void ParseStatementList(StatementListT body, int end_token, | 1228 V8_INLINE void ParseStatementList(StatementListT body, int end_token, |
| 1229 bool* ok) { | 1229 bool* ok) { |
| 1230 LazyParsingResult result = ParseStatementList(body, end_token, false, ok); | 1230 LazyParsingResult result = ParseStatementList(body, end_token, false, ok); |
| 1231 USE(result); | 1231 USE(result); |
| 1232 DCHECK_EQ(result, kLazyParsingComplete); | 1232 DCHECK_EQ(result, kLazyParsingComplete); |
| 1233 } | 1233 } |
| 1234 LazyParsingResult ParseStatementList(StatementListT body, int end_token, | 1234 LazyParsingResult ParseStatementList(StatementListT body, int end_token, |
| 1235 bool may_abort, bool* ok); | 1235 bool may_abort, bool* ok); |
| 1236 StatementT ParseStatementListItem(bool* ok); | 1236 StatementT ParseStatementListItem(bool* ok); |
| 1237 StatementT ParseStatement(ZoneList<const AstRawString*>* labels, bool* ok) { |
| 1238 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); |
| 1239 } |
| 1237 StatementT ParseStatement(ZoneList<const AstRawString*>* labels, | 1240 StatementT ParseStatement(ZoneList<const AstRawString*>* labels, |
| 1238 AllowLabelledFunctionStatement allow_function, | 1241 AllowLabelledFunctionStatement allow_function, |
| 1239 bool* ok); | 1242 bool* ok); |
| 1240 StatementT ParseStatementAsUnlabelled(ZoneList<const AstRawString*>* labels, | 1243 StatementT ParseStatementAsUnlabelled(ZoneList<const AstRawString*>* labels, |
| 1241 bool* ok); | 1244 bool* ok); |
| 1242 BlockT ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); | 1245 BlockT ParseBlock(ZoneList<const AstRawString*>* labels, bool* ok); |
| 1243 | 1246 |
| 1244 // Parse a SubStatement in strict mode, or with an extra block scope in | 1247 // Parse a SubStatement in strict mode, or with an extra block scope in |
| 1245 // sloppy mode to handle | 1248 // sloppy mode to handle |
| 1246 // ES#sec-functiondeclarations-in-ifstatement-statement-clauses | 1249 // ES#sec-functiondeclarations-in-ifstatement-statement-clauses |
| 1247 // The legacy parameter indicates whether function declarations are | |
| 1248 // banned by the ES2015 specification in this location, and they are being | |
| 1249 // permitted here to match previous V8 behavior. | |
| 1250 StatementT ParseScopedStatement(ZoneList<const AstRawString*>* labels, | 1250 StatementT ParseScopedStatement(ZoneList<const AstRawString*>* labels, |
| 1251 bool legacy, bool* ok); | 1251 bool* ok); |
| 1252 | 1252 |
| 1253 StatementT ParseVariableStatement(VariableDeclarationContext var_context, | 1253 StatementT ParseVariableStatement(VariableDeclarationContext var_context, |
| 1254 ZoneList<const AstRawString*>* names, | 1254 ZoneList<const AstRawString*>* names, |
| 1255 bool* ok); | 1255 bool* ok); |
| 1256 | 1256 |
| 1257 // Magical syntax support. | 1257 // Magical syntax support. |
| 1258 ExpressionT ParseV8Intrinsic(bool* ok); | 1258 ExpressionT ParseV8Intrinsic(bool* ok); |
| 1259 | 1259 |
| 1260 ExpressionT ParseDoExpression(bool* ok); | 1260 ExpressionT ParseDoExpression(bool* ok); |
| 1261 | 1261 |
| (...skipping 3637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4899 | 4899 |
| 4900 Expect(Token::RBRACE, CHECK_OK_CUSTOM(NullBlock)); | 4900 Expect(Token::RBRACE, CHECK_OK_CUSTOM(NullBlock)); |
| 4901 block_state.set_end_position(scanner()->location().end_pos); | 4901 block_state.set_end_position(scanner()->location().end_pos); |
| 4902 body->set_scope(block_state.FinalizedBlockScope()); | 4902 body->set_scope(block_state.FinalizedBlockScope()); |
| 4903 } | 4903 } |
| 4904 return body; | 4904 return body; |
| 4905 } | 4905 } |
| 4906 | 4906 |
| 4907 template <typename Impl> | 4907 template <typename Impl> |
| 4908 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseScopedStatement( | 4908 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseScopedStatement( |
| 4909 ZoneList<const AstRawString*>* labels, bool legacy, bool* ok) { | 4909 ZoneList<const AstRawString*>* labels, bool* ok) { |
| 4910 if (is_strict(language_mode()) || peek() != Token::FUNCTION || legacy) { | 4910 if (is_strict(language_mode()) || peek() != Token::FUNCTION) { |
| 4911 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); | 4911 return ParseStatement(labels, ok); |
| 4912 } else { | 4912 } else { |
| 4913 if (legacy) { | |
| 4914 impl()->CountUsage(v8::Isolate::kLegacyFunctionDeclaration); | |
| 4915 } | |
| 4916 // Make a block around the statement for a lexical binding | 4913 // Make a block around the statement for a lexical binding |
| 4917 // is introduced by a FunctionDeclaration. | 4914 // is introduced by a FunctionDeclaration. |
| 4918 BlockState block_state(zone(), &scope_state_); | 4915 BlockState block_state(zone(), &scope_state_); |
| 4919 block_state.set_start_position(scanner()->location().beg_pos); | 4916 block_state.set_start_position(scanner()->location().beg_pos); |
| 4920 BlockT block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition); | 4917 BlockT block = factory()->NewBlock(NULL, 1, false, kNoSourcePosition); |
| 4921 StatementT body = ParseFunctionDeclaration(CHECK_OK); | 4918 StatementT body = ParseFunctionDeclaration(CHECK_OK); |
| 4922 block->statements()->Add(body, zone()); | 4919 block->statements()->Add(body, zone()); |
| 4923 block_state.set_end_position(scanner()->location().end_pos); | 4920 block_state.set_end_position(scanner()->location().end_pos); |
| 4924 block->set_scope(block_state.FinalizedBlockScope()); | 4921 block->set_scope(block_state.FinalizedBlockScope()); |
| 4925 return block; | 4922 return block; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4996 bool starts_with_identifier = peek_any_identifier(); | 4993 bool starts_with_identifier = peek_any_identifier(); |
| 4997 ExpressionT expr = ParseExpression(true, CHECK_OK); | 4994 ExpressionT expr = ParseExpression(true, CHECK_OK); |
| 4998 if (peek() == Token::COLON && starts_with_identifier && | 4995 if (peek() == Token::COLON && starts_with_identifier && |
| 4999 impl()->IsIdentifier(expr)) { | 4996 impl()->IsIdentifier(expr)) { |
| 5000 // The whole expression was a single identifier, and not, e.g., | 4997 // The whole expression was a single identifier, and not, e.g., |
| 5001 // something starting with an identifier or a parenthesized identifier. | 4998 // something starting with an identifier or a parenthesized identifier. |
| 5002 labels = impl()->DeclareLabel(labels, impl()->AsIdentifierExpression(expr), | 4999 labels = impl()->DeclareLabel(labels, impl()->AsIdentifierExpression(expr), |
| 5003 CHECK_OK); | 5000 CHECK_OK); |
| 5004 Consume(Token::COLON); | 5001 Consume(Token::COLON); |
| 5005 // ES#sec-labelled-function-declarations Labelled Function Declarations | 5002 // ES#sec-labelled-function-declarations Labelled Function Declarations |
| 5006 if (peek() == Token::FUNCTION && is_sloppy(language_mode())) { | 5003 if (peek() == Token::FUNCTION && is_sloppy(language_mode()) && |
| 5007 if (allow_function == kAllowLabelledFunctionStatement) { | 5004 allow_function == kAllowLabelledFunctionStatement) { |
| 5008 return ParseFunctionDeclaration(ok); | 5005 return ParseFunctionDeclaration(ok); |
| 5009 } else { | |
| 5010 return ParseScopedStatement(labels, true, ok); | |
| 5011 } | |
| 5012 } | 5006 } |
| 5013 return ParseStatement(labels, kDisallowLabelledFunctionStatement, ok); | 5007 return ParseStatement(labels, ok); |
| 5014 } | 5008 } |
| 5015 | 5009 |
| 5016 // If we have an extension, we allow a native function declaration. | 5010 // If we have an extension, we allow a native function declaration. |
| 5017 // A native function declaration starts with "native function" with | 5011 // A native function declaration starts with "native function" with |
| 5018 // no line-terminator between the two words. | 5012 // no line-terminator between the two words. |
| 5019 if (extension_ != nullptr && peek() == Token::FUNCTION && | 5013 if (extension_ != nullptr && peek() == Token::FUNCTION && |
| 5020 !scanner()->HasAnyLineTerminatorBeforeNext() && impl()->IsNative(expr) && | 5014 !scanner()->HasAnyLineTerminatorBeforeNext() && impl()->IsNative(expr) && |
| 5021 !scanner()->literal_contains_escapes()) { | 5015 !scanner()->literal_contains_escapes()) { |
| 5022 return ParseNativeDeclaration(ok); | 5016 return ParseNativeDeclaration(ok); |
| 5023 } | 5017 } |
| 5024 | 5018 |
| 5025 // Parsed expression statement, followed by semicolon. | 5019 // Parsed expression statement, followed by semicolon. |
| 5026 ExpectSemicolon(CHECK_OK); | 5020 ExpectSemicolon(CHECK_OK); |
| 5027 return factory()->NewExpressionStatement(expr, pos); | 5021 return factory()->NewExpressionStatement(expr, pos); |
| 5028 } | 5022 } |
| 5029 | 5023 |
| 5030 template <typename Impl> | 5024 template <typename Impl> |
| 5031 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseIfStatement( | 5025 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseIfStatement( |
| 5032 ZoneList<const AstRawString*>* labels, bool* ok) { | 5026 ZoneList<const AstRawString*>* labels, bool* ok) { |
| 5033 // IfStatement :: | 5027 // IfStatement :: |
| 5034 // 'if' '(' Expression ')' Statement ('else' Statement)? | 5028 // 'if' '(' Expression ')' Statement ('else' Statement)? |
| 5035 | 5029 |
| 5036 int pos = peek_position(); | 5030 int pos = peek_position(); |
| 5037 Expect(Token::IF, CHECK_OK); | 5031 Expect(Token::IF, CHECK_OK); |
| 5038 Expect(Token::LPAREN, CHECK_OK); | 5032 Expect(Token::LPAREN, CHECK_OK); |
| 5039 ExpressionT condition = ParseExpression(true, CHECK_OK); | 5033 ExpressionT condition = ParseExpression(true, CHECK_OK); |
| 5040 Expect(Token::RPAREN, CHECK_OK); | 5034 Expect(Token::RPAREN, CHECK_OK); |
| 5041 StatementT then_statement = ParseScopedStatement(labels, false, CHECK_OK); | 5035 StatementT then_statement = ParseScopedStatement(labels, CHECK_OK); |
| 5042 StatementT else_statement = impl()->NullStatement(); | 5036 StatementT else_statement = impl()->NullStatement(); |
| 5043 if (Check(Token::ELSE)) { | 5037 if (Check(Token::ELSE)) { |
| 5044 else_statement = ParseScopedStatement(labels, false, CHECK_OK); | 5038 else_statement = ParseScopedStatement(labels, CHECK_OK); |
| 5045 } else { | 5039 } else { |
| 5046 else_statement = factory()->NewEmptyStatement(kNoSourcePosition); | 5040 else_statement = factory()->NewEmptyStatement(kNoSourcePosition); |
| 5047 } | 5041 } |
| 5048 return factory()->NewIfStatement(condition, then_statement, else_statement, | 5042 return factory()->NewIfStatement(condition, then_statement, else_statement, |
| 5049 pos); | 5043 pos); |
| 5050 } | 5044 } |
| 5051 | 5045 |
| 5052 template <typename Impl> | 5046 template <typename Impl> |
| 5053 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseContinueStatement( | 5047 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseContinueStatement( |
| 5054 bool* ok) { | 5048 bool* ok) { |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5189 | 5183 |
| 5190 Expect(Token::LPAREN, CHECK_OK); | 5184 Expect(Token::LPAREN, CHECK_OK); |
| 5191 ExpressionT expr = ParseExpression(true, CHECK_OK); | 5185 ExpressionT expr = ParseExpression(true, CHECK_OK); |
| 5192 Expect(Token::RPAREN, CHECK_OK); | 5186 Expect(Token::RPAREN, CHECK_OK); |
| 5193 | 5187 |
| 5194 Scope* with_scope = NewScope(WITH_SCOPE); | 5188 Scope* with_scope = NewScope(WITH_SCOPE); |
| 5195 StatementT body = impl()->NullStatement(); | 5189 StatementT body = impl()->NullStatement(); |
| 5196 { | 5190 { |
| 5197 BlockState block_state(&scope_state_, with_scope); | 5191 BlockState block_state(&scope_state_, with_scope); |
| 5198 with_scope->set_start_position(scanner()->peek_location().beg_pos); | 5192 with_scope->set_start_position(scanner()->peek_location().beg_pos); |
| 5199 body = ParseScopedStatement(labels, true, CHECK_OK); | 5193 body = ParseStatement(labels, CHECK_OK); |
| 5200 with_scope->set_end_position(scanner()->location().end_pos); | 5194 with_scope->set_end_position(scanner()->location().end_pos); |
| 5201 } | 5195 } |
| 5202 return factory()->NewWithStatement(with_scope, expr, body, pos); | 5196 return factory()->NewWithStatement(with_scope, expr, body, pos); |
| 5203 } | 5197 } |
| 5204 | 5198 |
| 5205 template <typename Impl> | 5199 template <typename Impl> |
| 5206 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseDoWhileStatement( | 5200 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseDoWhileStatement( |
| 5207 ZoneList<const AstRawString*>* labels, bool* ok) { | 5201 ZoneList<const AstRawString*>* labels, bool* ok) { |
| 5208 // DoStatement :: | 5202 // DoStatement :: |
| 5209 // 'do' Statement 'while' '(' Expression ')' ';' | 5203 // 'do' Statement 'while' '(' Expression ')' ';' |
| 5210 | 5204 |
| 5211 auto loop = factory()->NewDoWhileStatement(labels, peek_position()); | 5205 auto loop = factory()->NewDoWhileStatement(labels, peek_position()); |
| 5212 typename Types::Target target(this, loop); | 5206 typename Types::Target target(this, loop); |
| 5213 | 5207 |
| 5214 Expect(Token::DO, CHECK_OK); | 5208 Expect(Token::DO, CHECK_OK); |
| 5215 StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK); | 5209 StatementT body = ParseStatement(nullptr, CHECK_OK); |
| 5216 Expect(Token::WHILE, CHECK_OK); | 5210 Expect(Token::WHILE, CHECK_OK); |
| 5217 Expect(Token::LPAREN, CHECK_OK); | 5211 Expect(Token::LPAREN, CHECK_OK); |
| 5218 | 5212 |
| 5219 ExpressionT cond = ParseExpression(true, CHECK_OK); | 5213 ExpressionT cond = ParseExpression(true, CHECK_OK); |
| 5220 Expect(Token::RPAREN, CHECK_OK); | 5214 Expect(Token::RPAREN, CHECK_OK); |
| 5221 | 5215 |
| 5222 // Allow do-statements to be terminated with and without | 5216 // Allow do-statements to be terminated with and without |
| 5223 // semi-colons. This allows code such as 'do;while(0)return' to | 5217 // semi-colons. This allows code such as 'do;while(0)return' to |
| 5224 // parse, which would not be the case if we had used the | 5218 // parse, which would not be the case if we had used the |
| 5225 // ExpectSemicolon() functionality here. | 5219 // ExpectSemicolon() functionality here. |
| 5226 Check(Token::SEMICOLON); | 5220 Check(Token::SEMICOLON); |
| 5227 | 5221 |
| 5228 loop->Initialize(cond, body); | 5222 loop->Initialize(cond, body); |
| 5229 return loop; | 5223 return loop; |
| 5230 } | 5224 } |
| 5231 | 5225 |
| 5232 template <typename Impl> | 5226 template <typename Impl> |
| 5233 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseWhileStatement( | 5227 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseWhileStatement( |
| 5234 ZoneList<const AstRawString*>* labels, bool* ok) { | 5228 ZoneList<const AstRawString*>* labels, bool* ok) { |
| 5235 // WhileStatement :: | 5229 // WhileStatement :: |
| 5236 // 'while' '(' Expression ')' Statement | 5230 // 'while' '(' Expression ')' Statement |
| 5237 | 5231 |
| 5238 auto loop = factory()->NewWhileStatement(labels, peek_position()); | 5232 auto loop = factory()->NewWhileStatement(labels, peek_position()); |
| 5239 typename Types::Target target(this, loop); | 5233 typename Types::Target target(this, loop); |
| 5240 | 5234 |
| 5241 Expect(Token::WHILE, CHECK_OK); | 5235 Expect(Token::WHILE, CHECK_OK); |
| 5242 Expect(Token::LPAREN, CHECK_OK); | 5236 Expect(Token::LPAREN, CHECK_OK); |
| 5243 ExpressionT cond = ParseExpression(true, CHECK_OK); | 5237 ExpressionT cond = ParseExpression(true, CHECK_OK); |
| 5244 Expect(Token::RPAREN, CHECK_OK); | 5238 Expect(Token::RPAREN, CHECK_OK); |
| 5245 StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK); | 5239 StatementT body = ParseStatement(nullptr, CHECK_OK); |
| 5246 | 5240 |
| 5247 loop->Initialize(cond, body); | 5241 loop->Initialize(cond, body); |
| 5248 return loop; | 5242 return loop; |
| 5249 } | 5243 } |
| 5250 | 5244 |
| 5251 template <typename Impl> | 5245 template <typename Impl> |
| 5252 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseThrowStatement( | 5246 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseThrowStatement( |
| 5253 bool* ok) { | 5247 bool* ok) { |
| 5254 // ThrowStatement :: | 5248 // ThrowStatement :: |
| 5255 // 'throw' Expression ';' | 5249 // 'throw' Expression ';' |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5532 | 5526 |
| 5533 Expect(Token::RPAREN, CHECK_OK); | 5527 Expect(Token::RPAREN, CHECK_OK); |
| 5534 | 5528 |
| 5535 StatementT final_loop = impl()->NullStatement(); | 5529 StatementT final_loop = impl()->NullStatement(); |
| 5536 { | 5530 { |
| 5537 ReturnExprScope no_tail_calls(function_state_, | 5531 ReturnExprScope no_tail_calls(function_state_, |
| 5538 ReturnExprContext::kInsideForInOfBody); | 5532 ReturnExprContext::kInsideForInOfBody); |
| 5539 BlockState block_state(zone(), &scope_state_); | 5533 BlockState block_state(zone(), &scope_state_); |
| 5540 block_state.set_start_position(scanner()->location().beg_pos); | 5534 block_state.set_start_position(scanner()->location().beg_pos); |
| 5541 | 5535 |
| 5542 StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK); | 5536 StatementT body = ParseStatement(nullptr, CHECK_OK); |
| 5543 | 5537 |
| 5544 BlockT body_block = impl()->NullBlock(); | 5538 BlockT body_block = impl()->NullBlock(); |
| 5545 ExpressionT each_variable = impl()->EmptyExpression(); | 5539 ExpressionT each_variable = impl()->EmptyExpression(); |
| 5546 impl()->DesugarBindingInForEachStatement(for_info, &body_block, | 5540 impl()->DesugarBindingInForEachStatement(for_info, &body_block, |
| 5547 &each_variable, CHECK_OK); | 5541 &each_variable, CHECK_OK); |
| 5548 body_block->statements()->Add(body, zone()); | 5542 body_block->statements()->Add(body, zone()); |
| 5549 final_loop = impl()->InitializeForEachStatement( | 5543 final_loop = impl()->InitializeForEachStatement( |
| 5550 loop, each_variable, enumerable, body_block, each_keyword_pos); | 5544 loop, each_variable, enumerable, body_block, each_keyword_pos); |
| 5551 | 5545 |
| 5552 block_state.set_end_position(scanner()->location().end_pos); | 5546 block_state.set_end_position(scanner()->location().end_pos); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5596 } | 5590 } |
| 5597 | 5591 |
| 5598 Expect(Token::RPAREN, CHECK_OK); | 5592 Expect(Token::RPAREN, CHECK_OK); |
| 5599 | 5593 |
| 5600 { | 5594 { |
| 5601 ReturnExprScope no_tail_calls(function_state_, | 5595 ReturnExprScope no_tail_calls(function_state_, |
| 5602 ReturnExprContext::kInsideForInOfBody); | 5596 ReturnExprContext::kInsideForInOfBody); |
| 5603 BlockState block_state(zone(), &scope_state_); | 5597 BlockState block_state(zone(), &scope_state_); |
| 5604 block_state.set_start_position(scanner()->location().beg_pos); | 5598 block_state.set_start_position(scanner()->location().beg_pos); |
| 5605 | 5599 |
| 5606 // For legacy compat reasons, give for loops similar treatment to | 5600 StatementT body = ParseStatement(nullptr, CHECK_OK); |
| 5607 // if statements in allowing a function declaration for a body | |
| 5608 StatementT body = ParseScopedStatement(nullptr, true, CHECK_OK); | |
| 5609 block_state.set_end_position(scanner()->location().end_pos); | 5601 block_state.set_end_position(scanner()->location().end_pos); |
| 5610 StatementT final_loop = impl()->InitializeForEachStatement( | 5602 StatementT final_loop = impl()->InitializeForEachStatement( |
| 5611 loop, expression, enumerable, body, each_keyword_pos); | 5603 loop, expression, enumerable, body, each_keyword_pos); |
| 5612 | 5604 |
| 5613 Scope* for_scope = for_state->FinalizedBlockScope(); | 5605 Scope* for_scope = for_state->FinalizedBlockScope(); |
| 5614 DCHECK_NULL(for_scope); | 5606 DCHECK_NULL(for_scope); |
| 5615 USE(for_scope); | 5607 USE(for_scope); |
| 5616 Scope* block_scope = block_state.FinalizedBlockScope(); | 5608 Scope* block_scope = block_state.FinalizedBlockScope(); |
| 5617 DCHECK_NULL(block_scope); | 5609 DCHECK_NULL(block_scope); |
| 5618 USE(block_scope); | 5610 USE(block_scope); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 5649 cond = ParseExpression(true, CHECK_OK); | 5641 cond = ParseExpression(true, CHECK_OK); |
| 5650 } | 5642 } |
| 5651 Expect(Token::SEMICOLON, CHECK_OK); | 5643 Expect(Token::SEMICOLON, CHECK_OK); |
| 5652 | 5644 |
| 5653 if (peek() != Token::RPAREN) { | 5645 if (peek() != Token::RPAREN) { |
| 5654 ExpressionT exp = ParseExpression(true, CHECK_OK); | 5646 ExpressionT exp = ParseExpression(true, CHECK_OK); |
| 5655 next = factory()->NewExpressionStatement(exp, exp->position()); | 5647 next = factory()->NewExpressionStatement(exp, exp->position()); |
| 5656 } | 5648 } |
| 5657 Expect(Token::RPAREN, CHECK_OK); | 5649 Expect(Token::RPAREN, CHECK_OK); |
| 5658 | 5650 |
| 5659 body = ParseScopedStatement(nullptr, true, CHECK_OK); | 5651 body = ParseStatement(nullptr, CHECK_OK); |
| 5660 } | 5652 } |
| 5661 | 5653 |
| 5662 if (bound_names_are_lexical && for_info->bound_names.length() > 0) { | 5654 if (bound_names_are_lexical && for_info->bound_names.length() > 0) { |
| 5663 auto result = impl()->DesugarLexicalBindingsInForStatement( | 5655 auto result = impl()->DesugarLexicalBindingsInForStatement( |
| 5664 loop, init, cond, next, body, inner_scope, *for_info, CHECK_OK); | 5656 loop, init, cond, next, body, inner_scope, *for_info, CHECK_OK); |
| 5665 for_state->set_end_position(scanner()->location().end_pos); | 5657 for_state->set_end_position(scanner()->location().end_pos); |
| 5666 inner_scope->set_end_position(scanner()->location().end_pos); | 5658 inner_scope->set_end_position(scanner()->location().end_pos); |
| 5667 return result; | 5659 return result; |
| 5668 } | 5660 } |
| 5669 | 5661 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5798 | 5790 |
| 5799 Expect(Token::RPAREN, CHECK_OK); | 5791 Expect(Token::RPAREN, CHECK_OK); |
| 5800 | 5792 |
| 5801 StatementT final_loop = impl()->NullStatement(); | 5793 StatementT final_loop = impl()->NullStatement(); |
| 5802 { | 5794 { |
| 5803 ReturnExprScope no_tail_calls(function_state_, | 5795 ReturnExprScope no_tail_calls(function_state_, |
| 5804 ReturnExprContext::kInsideForInOfBody); | 5796 ReturnExprContext::kInsideForInOfBody); |
| 5805 BlockState block_state(zone(), &scope_state_); | 5797 BlockState block_state(zone(), &scope_state_); |
| 5806 block_state.set_start_position(scanner()->location().beg_pos); | 5798 block_state.set_start_position(scanner()->location().beg_pos); |
| 5807 | 5799 |
| 5808 const bool kDisallowLabelledFunctionStatement = true; | 5800 StatementT body = ParseStatement(nullptr, CHECK_OK); |
| 5809 StatementT body = ParseScopedStatement( | |
| 5810 nullptr, kDisallowLabelledFunctionStatement, CHECK_OK); | |
| 5811 block_state.set_end_position(scanner()->location().end_pos); | 5801 block_state.set_end_position(scanner()->location().end_pos); |
| 5812 | 5802 |
| 5813 if (has_declarations) { | 5803 if (has_declarations) { |
| 5814 BlockT body_block = impl()->NullBlock(); | 5804 BlockT body_block = impl()->NullBlock(); |
| 5815 impl()->DesugarBindingInForEachStatement(&for_info, &body_block, | 5805 impl()->DesugarBindingInForEachStatement(&for_info, &body_block, |
| 5816 &each_variable, CHECK_OK); | 5806 &each_variable, CHECK_OK); |
| 5817 body_block->statements()->Add(body, zone()); | 5807 body_block->statements()->Add(body, zone()); |
| 5818 body_block->set_scope(block_state.FinalizedBlockScope()); | 5808 body_block->set_scope(block_state.FinalizedBlockScope()); |
| 5819 for_state.set_end_position(scanner()->location().end_pos); | 5809 for_state.set_end_position(scanner()->location().end_pos); |
| 5820 | 5810 |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5905 } | 5895 } |
| 5906 | 5896 |
| 5907 #undef CHECK_OK | 5897 #undef CHECK_OK |
| 5908 #undef CHECK_OK_CUSTOM | 5898 #undef CHECK_OK_CUSTOM |
| 5909 #undef CHECK_OK_VOID | 5899 #undef CHECK_OK_VOID |
| 5910 | 5900 |
| 5911 } // namespace internal | 5901 } // namespace internal |
| 5912 } // namespace v8 | 5902 } // namespace v8 |
| 5913 | 5903 |
| 5914 #endif // V8_PARSING_PARSER_BASE_H | 5904 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |