Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: src/parsing/parser-base.h

Issue 2372733002: [parser] Refactor of (Parse|Desugar)*(Async|Arrow)* (Closed)
Patch Set: Rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 enum LazyParsingResult { 243 enum LazyParsingResult {
244 kLazyParsingComplete, 244 kLazyParsingComplete,
245 kLazyParsingAborted 245 kLazyParsingAborted
246 }; 246 };
247 247
248 enum VariableDeclarationContext { 248 enum VariableDeclarationContext {
249 kStatementListItem, 249 kStatementListItem,
250 kStatement, 250 kStatement,
251 kForStatement 251 kForStatement
252 }; 252 };
253
254 enum class FunctionBodyType {
255 kNormal,
256 kSingleExpression
257 };
253 // clang-format on 258 // clang-format on
254 259
255 class Checkpoint; 260 class Checkpoint;
256 class ClassLiteralChecker; 261 class ClassLiteralChecker;
257 class ObjectLiteralChecker; 262 class ObjectLiteralChecker;
258 263
259 // --------------------------------------------------------------------------- 264 // ---------------------------------------------------------------------------
260 // ScopeState and its subclasses implement the parser's scope stack. 265 // ScopeState and its subclasses implement the parser's scope stack.
261 // ScopeState keeps track of the current scope, and the outer ScopeState. The 266 // ScopeState keeps track of the current scope, and the outer ScopeState. The
262 // parser's scope_state_ points to the top ScopeState. ScopeState's 267 // parser's scope_state_ points to the top ScopeState. ScopeState's
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after
1184 ExpressionT ParseUnaryExpression(bool* ok); 1189 ExpressionT ParseUnaryExpression(bool* ok);
1185 ExpressionT ParsePostfixExpression(bool* ok); 1190 ExpressionT ParsePostfixExpression(bool* ok);
1186 ExpressionT ParseLeftHandSideExpression(bool* ok); 1191 ExpressionT ParseLeftHandSideExpression(bool* ok);
1187 ExpressionT ParseMemberWithNewPrefixesExpression(bool* is_async, bool* ok); 1192 ExpressionT ParseMemberWithNewPrefixesExpression(bool* is_async, bool* ok);
1188 ExpressionT ParseMemberExpression(bool* is_async, bool* ok); 1193 ExpressionT ParseMemberExpression(bool* is_async, bool* ok);
1189 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression, 1194 ExpressionT ParseMemberExpressionContinuation(ExpressionT expression,
1190 bool* is_async, bool* ok); 1195 bool* is_async, bool* ok);
1191 ExpressionT ParseArrowFunctionLiteral(bool accept_IN, 1196 ExpressionT ParseArrowFunctionLiteral(bool accept_IN,
1192 const FormalParametersT& parameters, 1197 const FormalParametersT& parameters,
1193 bool* ok); 1198 bool* ok);
1199 void ParseAsyncFunctionBody(Scope* scope, StatementListT body,
1200 FunctionKind kind, FunctionBodyType type,
1201 bool accept_IN, int pos, bool* ok);
1202 ExpressionT ParseAsyncFunctionLiteral(bool* ok);
1194 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok); 1203 ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, bool* ok);
1195 ExpressionT ParseSuperExpression(bool is_new, bool* ok); 1204 ExpressionT ParseSuperExpression(bool is_new, bool* ok);
1196 ExpressionT ParseNewTargetExpression(bool* ok); 1205 ExpressionT ParseNewTargetExpression(bool* ok);
1197 1206
1198 void ParseFormalParameter(FormalParametersT* parameters, bool* ok); 1207 void ParseFormalParameter(FormalParametersT* parameters, bool* ok);
1199 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok); 1208 void ParseFormalParameterList(FormalParametersT* parameters, bool* ok);
1200 void CheckArityRestrictions(int param_count, FunctionKind function_type, 1209 void CheckArityRestrictions(int param_count, FunctionKind function_type,
1201 bool has_rest, int formals_start_pos, 1210 bool has_rest, int formals_start_pos,
1202 int formals_end_pos, bool* ok); 1211 int formals_end_pos, bool* ok);
1203 1212
1204 BlockT ParseVariableDeclarations(VariableDeclarationContext var_context, 1213 BlockT ParseVariableDeclarations(VariableDeclarationContext var_context,
1205 DeclarationParsingResult* parsing_result, 1214 DeclarationParsingResult* parsing_result,
1206 ZoneList<const AstRawString*>* names, 1215 ZoneList<const AstRawString*>* names,
1207 bool* ok); 1216 bool* ok);
1217 StatementT ParseAsyncFunctionDeclaration(ZoneList<const AstRawString*>* names,
1218 bool default_export, bool* ok);
1208 StatementT ParseHoistableDeclaration(ZoneList<const AstRawString*>* names, 1219 StatementT ParseHoistableDeclaration(ZoneList<const AstRawString*>* names,
1209 bool default_export, bool* ok); 1220 bool default_export, bool* ok);
1210 StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags, 1221 StatementT ParseHoistableDeclaration(int pos, ParseFunctionFlags flags,
1211 ZoneList<const AstRawString*>* names, 1222 ZoneList<const AstRawString*>* names,
1212 bool default_export, bool* ok); 1223 bool default_export, bool* ok);
1213 1224
1214 // Under some circumstances, we allow preparsing to abort if the preparsed 1225 // Under some circumstances, we allow preparsing to abort if the preparsed
1215 // function is "long and trivial", and fully parse instead. Our current 1226 // function is "long and trivial", and fully parse instead. Our current
1216 // definition of "long and trivial" is: 1227 // definition of "long and trivial" is:
1217 // - over kLazyParseTrialLimit statements 1228 // - over kLazyParseTrialLimit statements
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1700 // Identifier 1711 // Identifier
1701 // Number 1712 // Number
1702 // String 1713 // String
1703 // ArrayLiteral 1714 // ArrayLiteral
1704 // ObjectLiteral 1715 // ObjectLiteral
1705 // RegExpLiteral 1716 // RegExpLiteral
1706 // ClassLiteral 1717 // ClassLiteral
1707 // '(' Expression ')' 1718 // '(' Expression ')'
1708 // TemplateLiteral 1719 // TemplateLiteral
1709 // do Block 1720 // do Block
1710 // AsyncFunctionExpression 1721 // AsyncFunctionLiteral
1711 1722
1712 int beg_pos = peek_position(); 1723 int beg_pos = peek_position();
1713 switch (peek()) { 1724 switch (peek()) {
1714 case Token::THIS: { 1725 case Token::THIS: {
1715 BindingPatternUnexpectedToken(); 1726 BindingPatternUnexpectedToken();
1716 Consume(Token::THIS); 1727 Consume(Token::THIS);
1717 return impl()->ThisExpression(beg_pos); 1728 return impl()->ThisExpression(beg_pos);
1718 } 1729 }
1719 1730
1720 case Token::NULL_LITERAL: 1731 case Token::NULL_LITERAL:
1721 case Token::TRUE_LITERAL: 1732 case Token::TRUE_LITERAL:
1722 case Token::FALSE_LITERAL: 1733 case Token::FALSE_LITERAL:
1723 case Token::SMI: 1734 case Token::SMI:
1724 case Token::NUMBER: 1735 case Token::NUMBER:
1725 BindingPatternUnexpectedToken(); 1736 BindingPatternUnexpectedToken();
1726 return impl()->ExpressionFromLiteral(Next(), beg_pos); 1737 return impl()->ExpressionFromLiteral(Next(), beg_pos);
1727 1738
1728 case Token::ASYNC: 1739 case Token::ASYNC:
1729 if (allow_harmony_async_await() && 1740 if (allow_harmony_async_await() &&
1730 !scanner()->HasAnyLineTerminatorAfterNext() && 1741 !scanner()->HasAnyLineTerminatorAfterNext() &&
1731 PeekAhead() == Token::FUNCTION) { 1742 PeekAhead() == Token::FUNCTION) {
1732 Consume(Token::ASYNC); 1743 Consume(Token::ASYNC);
1733 return impl()->ParseAsyncFunctionExpression(CHECK_OK); 1744 return ParseAsyncFunctionLiteral(CHECK_OK);
1734 } 1745 }
1735 // CoverCallExpressionAndAsyncArrowHead 1746 // CoverCallExpressionAndAsyncArrowHead
1736 *is_async = true; 1747 *is_async = true;
1737 /* falls through */ 1748 /* falls through */
1738 case Token::IDENTIFIER: 1749 case Token::IDENTIFIER:
1739 case Token::LET: 1750 case Token::LET:
1740 case Token::STATIC: 1751 case Token::STATIC:
1741 case Token::YIELD: 1752 case Token::YIELD:
1742 case Token::AWAIT: 1753 case Token::AWAIT:
1743 case Token::ESCAPED_STRICT_RESERVED_WORD: 1754 case Token::ESCAPED_STRICT_RESERVED_WORD:
(...skipping 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
2660 ValidateFormalParameterInitializer(ok); 2671 ValidateFormalParameterInitializer(ok);
2661 2672
2662 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos); 2673 Scanner::Location loc(lhs_beg_pos, scanner()->location().end_pos);
2663 DeclarationScope* scope = 2674 DeclarationScope* scope =
2664 NewFunctionScope(is_async ? FunctionKind::kAsyncArrowFunction 2675 NewFunctionScope(is_async ? FunctionKind::kAsyncArrowFunction
2665 : FunctionKind::kArrowFunction); 2676 : FunctionKind::kArrowFunction);
2666 // Because the arrow's parameters were parsed in the outer scope, any 2677 // Because the arrow's parameters were parsed in the outer scope, any
2667 // usage flags that might have been triggered there need to be copied 2678 // usage flags that might have been triggered there need to be copied
2668 // to the arrow scope. 2679 // to the arrow scope.
2669 this->scope()->PropagateUsageFlagsToScope(scope); 2680 this->scope()->PropagateUsageFlagsToScope(scope);
2681
2682 scope_snapshot.Reparent(scope);
2683
2670 FormalParametersT parameters(scope); 2684 FormalParametersT parameters(scope);
2671 if (!classifier()->is_simple_parameter_list()) { 2685 if (!classifier()->is_simple_parameter_list()) {
2672 scope->SetHasNonSimpleParameters(); 2686 scope->SetHasNonSimpleParameters();
2673 parameters.is_simple = false; 2687 parameters.is_simple = false;
2674 } 2688 }
2675 2689
2676 checkpoint.Restore(&parameters.materialized_literals_count); 2690 checkpoint.Restore(&parameters.materialized_literals_count);
2677 2691
2678 scope->set_start_position(lhs_beg_pos); 2692 scope->set_start_position(lhs_beg_pos);
2679 Scanner::Location duplicate_loc = Scanner::Location::invalid(); 2693 Scanner::Location duplicate_loc = Scanner::Location::invalid();
2680 impl()->ParseArrowFunctionFormalParameterList( 2694 impl()->DeclareArrowFunctionFormalParameters(&parameters, expression, loc,
2681 &parameters, expression, loc, &duplicate_loc, scope_snapshot, CHECK_OK); 2695 &duplicate_loc, CHECK_OK);
2682 if (duplicate_loc.IsValid()) { 2696 if (duplicate_loc.IsValid()) {
2683 classifier()->RecordDuplicateFormalParameterError(duplicate_loc); 2697 classifier()->RecordDuplicateFormalParameterError(duplicate_loc);
2684 } 2698 }
2685 expression = ParseArrowFunctionLiteral(accept_IN, parameters, CHECK_OK); 2699 expression = ParseArrowFunctionLiteral(accept_IN, parameters, CHECK_OK);
2686 impl()->Discard(); 2700 impl()->Discard();
2687 classifier()->RecordPatternError(arrow_loc, 2701 classifier()->RecordPatternError(arrow_loc,
2688 MessageTemplate::kUnexpectedToken, 2702 MessageTemplate::kUnexpectedToken,
2689 Token::String(Token::ARROW)); 2703 Token::String(Token::ARROW));
2690 2704
2691 if (fni_ != nullptr) fni_->Infer(); 2705 if (fni_ != nullptr) fni_->Infer();
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after
3799 : is_async ? FunctionKind::kAsyncFunction 3813 : is_async ? FunctionKind::kAsyncFunction
3800 : FunctionKind::kNormalFunction, 3814 : FunctionKind::kNormalFunction,
3801 pos, FunctionLiteral::kDeclaration, language_mode(), 3815 pos, FunctionLiteral::kDeclaration, language_mode(),
3802 CHECK_OK_CUSTOM(NullStatement)); 3816 CHECK_OK_CUSTOM(NullStatement));
3803 3817
3804 return impl()->DeclareFunction(variable_name, function, pos, is_generator, 3818 return impl()->DeclareFunction(variable_name, function, pos, is_generator,
3805 is_async, names, ok); 3819 is_async, names, ok);
3806 } 3820 }
3807 3821
3808 template <typename Impl> 3822 template <typename Impl>
3823 typename ParserBase<Impl>::StatementT
3824 ParserBase<Impl>::ParseAsyncFunctionDeclaration(
3825 ZoneList<const AstRawString*>* names, bool default_export, bool* ok) {
3826 // AsyncFunctionDeclaration ::
3827 // async [no LineTerminator here] function BindingIdentifier[Await]
3828 // ( FormalParameters[Await] ) { AsyncFunctionBody }
3829 DCHECK_EQ(scanner()->current_token(), Token::ASYNC);
3830 int pos = position();
3831 if (scanner()->HasAnyLineTerminatorBeforeNext()) {
3832 *ok = false;
3833 impl()->ReportUnexpectedToken(scanner()->current_token());
3834 return impl()->NullStatement();
3835 }
3836 Expect(Token::FUNCTION, CHECK_OK_CUSTOM(NullStatement));
3837 ParseFunctionFlags flags = ParseFunctionFlags::kIsAsync;
3838 return ParseHoistableDeclaration(pos, flags, names, default_export, ok);
3839 }
3840
3841 template <typename Impl>
3809 void ParserBase<Impl>::CheckArityRestrictions(int param_count, 3842 void ParserBase<Impl>::CheckArityRestrictions(int param_count,
3810 FunctionKind function_kind, 3843 FunctionKind function_kind,
3811 bool has_rest, 3844 bool has_rest,
3812 int formals_start_pos, 3845 int formals_start_pos,
3813 int formals_end_pos, bool* ok) { 3846 int formals_end_pos, bool* ok) {
3814 if (IsGetterFunction(function_kind)) { 3847 if (IsGetterFunction(function_kind)) {
3815 if (param_count != 0) { 3848 if (param_count != 0) {
3816 impl()->ReportMessageAt( 3849 impl()->ReportMessageAt(
3817 Scanner::Location(formals_start_pos, formals_end_pos), 3850 Scanner::Location(formals_start_pos, formals_end_pos),
3818 MessageTemplate::kBadGetterArity); 3851 MessageTemplate::kBadGetterArity);
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
3957 int pos = position(); 3990 int pos = position();
3958 DCHECK(ReturnExprContext::kInsideValidBlock == 3991 DCHECK(ReturnExprContext::kInsideValidBlock ==
3959 function_state_->return_expr_context()); 3992 function_state_->return_expr_context());
3960 ReturnExprScope allow_tail_calls( 3993 ReturnExprScope allow_tail_calls(
3961 function_state_, ReturnExprContext::kInsideValidReturnStatement); 3994 function_state_, ReturnExprContext::kInsideValidReturnStatement);
3962 body = impl()->NewStatementList(1); 3995 body = impl()->NewStatementList(1);
3963 impl()->AddParameterInitializationBlock( 3996 impl()->AddParameterInitializationBlock(
3964 formal_parameters, body, kind == kAsyncArrowFunction, CHECK_OK); 3997 formal_parameters, body, kind == kAsyncArrowFunction, CHECK_OK);
3965 ExpressionClassifier classifier(this); 3998 ExpressionClassifier classifier(this);
3966 if (kind == kAsyncArrowFunction) { 3999 if (kind == kAsyncArrowFunction) {
3967 impl()->ParseAsyncArrowSingleExpressionBody(body, accept_IN, pos, 4000 ParseAsyncFunctionBody(scope(), body, kAsyncArrowFunction,
3968 CHECK_OK); 4001 FunctionBodyType::kSingleExpression, accept_IN,
4002 pos, CHECK_OK);
3969 impl()->RewriteNonPattern(CHECK_OK); 4003 impl()->RewriteNonPattern(CHECK_OK);
3970 } else { 4004 } else {
3971 ExpressionT expression = ParseAssignmentExpression(accept_IN, CHECK_OK); 4005 ExpressionT expression = ParseAssignmentExpression(accept_IN, CHECK_OK);
3972 impl()->RewriteNonPattern(CHECK_OK); 4006 impl()->RewriteNonPattern(CHECK_OK);
3973 body->Add(factory()->NewReturnStatement(expression, pos), zone()); 4007 body->Add(factory()->NewReturnStatement(expression, pos), zone());
3974 if (allow_tailcalls() && !is_sloppy(language_mode())) { 4008 if (allow_tailcalls() && !is_sloppy(language_mode())) {
3975 // ES6 14.6.1 Static Semantics: IsInTailPosition 4009 // ES6 14.6.1 Static Semantics: IsInTailPosition
3976 impl()->MarkTailPosition(expression); 4010 impl()->MarkTailPosition(expression);
3977 } 4011 }
3978 } 4012 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4013 if (should_be_used_once_hint) { 4047 if (should_be_used_once_hint) {
4014 function_literal->set_should_be_used_once_hint(); 4048 function_literal->set_should_be_used_once_hint();
4015 } 4049 }
4016 4050
4017 impl()->InferFunctionName(function_literal); 4051 impl()->InferFunctionName(function_literal);
4018 4052
4019 return function_literal; 4053 return function_literal;
4020 } 4054 }
4021 4055
4022 template <typename Impl> 4056 template <typename Impl>
4057 void ParserBase<Impl>::ParseAsyncFunctionBody(Scope* scope, StatementListT body,
4058 FunctionKind kind,
4059 FunctionBodyType body_type,
4060 bool accept_IN, int pos,
4061 bool* ok) {
4062 scope->ForceContextAllocation();
4063
4064 impl()->PrepareAsyncFunctionBody(body, kind, pos);
4065
4066 BlockT block = factory()->NewBlock(nullptr, 8, true, kNoSourcePosition);
4067
4068 ExpressionT return_value = impl()->EmptyExpression();
4069 if (body_type == FunctionBodyType::kNormal) {
4070 ParseStatementList(block->statements(), Token::RBRACE,
4071 CHECK_OK_CUSTOM(Void));
4072 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition);
4073 } else {
4074 return_value = ParseAssignmentExpression(accept_IN, CHECK_OK_CUSTOM(Void));
4075 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(Void));
4076 }
4077
4078 impl()->RewriteAsyncFunctionBody(body, block, return_value,
4079 CHECK_OK_CUSTOM(Void));
4080 scope->set_end_position(scanner()->location().end_pos);
4081 }
4082
4083 template <typename Impl>
4084 typename ParserBase<Impl>::ExpressionT
4085 ParserBase<Impl>::ParseAsyncFunctionLiteral(bool* ok) {
4086 // AsyncFunctionLiteral ::
4087 // async [no LineTerminator here] function ( FormalParameters[Await] )
4088 // { AsyncFunctionBody }
4089 //
4090 // async [no LineTerminator here] function BindingIdentifier[Await]
4091 // ( FormalParameters[Await] ) { AsyncFunctionBody }
4092 DCHECK_EQ(scanner()->current_token(), Token::ASYNC);
4093 int pos = position();
4094 Expect(Token::FUNCTION, CHECK_OK);
4095 bool is_strict_reserved = false;
4096 IdentifierT name = impl()->EmptyIdentifier();
4097 FunctionLiteral::FunctionType type = FunctionLiteral::kAnonymousExpression;
4098
4099 if (peek_any_identifier()) {
4100 type = FunctionLiteral::kNamedExpression;
4101 name = ParseIdentifierOrStrictReservedWord(FunctionKind::kAsyncFunction,
4102 &is_strict_reserved, CHECK_OK);
4103 }
4104 return impl()->ParseFunctionLiteral(
4105 name, scanner()->location(),
4106 is_strict_reserved ? kFunctionNameIsStrictReserved
4107 : kFunctionNameValidityUnknown,
4108 FunctionKind::kAsyncFunction, pos, type, language_mode(), CHECK_OK);
4109 }
4110
4111 template <typename Impl>
4023 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral( 4112 typename ParserBase<Impl>::ExpressionT ParserBase<Impl>::ParseTemplateLiteral(
4024 ExpressionT tag, int start, bool* ok) { 4113 ExpressionT tag, int start, bool* ok) {
4025 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal 4114 // A TemplateLiteral is made up of 0 or more TEMPLATE_SPAN tokens (literal
4026 // text followed by a substitution expression), finalized by a single 4115 // text followed by a substitution expression), finalized by a single
4027 // TEMPLATE_TAIL. 4116 // TEMPLATE_TAIL.
4028 // 4117 //
4029 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or 4118 // In terms of draft language, TEMPLATE_SPAN may be either the TemplateHead or
4030 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or 4119 // TemplateMiddle productions, while TEMPLATE_TAIL is either TemplateTail, or
4031 // NoSubstitutionTemplate. 4120 // NoSubstitutionTemplate.
4032 // 4121 //
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
4322 return ParseVariableStatement(kStatementListItem, nullptr, ok); 4411 return ParseVariableStatement(kStatementListItem, nullptr, ok);
4323 case Token::LET: 4412 case Token::LET:
4324 if (IsNextLetKeyword()) { 4413 if (IsNextLetKeyword()) {
4325 return ParseVariableStatement(kStatementListItem, nullptr, ok); 4414 return ParseVariableStatement(kStatementListItem, nullptr, ok);
4326 } 4415 }
4327 break; 4416 break;
4328 case Token::ASYNC: 4417 case Token::ASYNC:
4329 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION && 4418 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION &&
4330 !scanner()->HasAnyLineTerminatorAfterNext()) { 4419 !scanner()->HasAnyLineTerminatorAfterNext()) {
4331 Consume(Token::ASYNC); 4420 Consume(Token::ASYNC);
4332 return impl()->ParseAsyncFunctionDeclaration(nullptr, false, ok); 4421 return ParseAsyncFunctionDeclaration(nullptr, false, ok);
4333 } 4422 }
4334 /* falls through */ 4423 /* falls through */
4335 default: 4424 default:
4336 break; 4425 break;
4337 } 4426 }
4338 return ParseStatement(nullptr, kAllowLabelledFunctionStatement, ok); 4427 return ParseStatement(nullptr, kAllowLabelledFunctionStatement, ok);
4339 } 4428 }
4340 4429
4341 template <typename Impl> 4430 template <typename Impl>
4342 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStatement( 4431 typename ParserBase<Impl>::StatementT ParserBase<Impl>::ParseStatement(
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after
5324 has_seen_constructor_ = true; 5413 has_seen_constructor_ = true;
5325 return; 5414 return;
5326 } 5415 }
5327 } 5416 }
5328 5417
5329 5418
5330 } // namespace internal 5419 } // namespace internal
5331 } // namespace v8 5420 } // namespace v8
5332 5421
5333 #endif // V8_PARSING_PARSER_BASE_H 5422 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « src/parsing/parser.cc ('k') | src/parsing/preparser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698