| 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 232 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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(¶meters.materialized_literals_count); |  2690     checkpoint.Restore(¶meters.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(¶meters, expression, loc, | 
|  2681         ¶meters, 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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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  Loading... | 
|  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 | 
| OLD | NEW |