| 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_PREPARSER_H |     5 #ifndef V8_PREPARSER_H | 
|     6 #define V8_PREPARSER_H |     6 #define V8_PREPARSER_H | 
|     7  |     7  | 
|     8 #include "src/v8.h" |     8 #include "src/v8.h" | 
|     9  |     9  | 
|    10 #include "src/bailout-reason.h" |    10 #include "src/bailout-reason.h" | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|    90         scanner_(scanner), |    90         scanner_(scanner), | 
|    91         stack_overflow_(false), |    91         stack_overflow_(false), | 
|    92         allow_lazy_(false), |    92         allow_lazy_(false), | 
|    93         allow_natives_(false), |    93         allow_natives_(false), | 
|    94         allow_harmony_arrow_functions_(false), |    94         allow_harmony_arrow_functions_(false), | 
|    95         allow_harmony_object_literals_(false), |    95         allow_harmony_object_literals_(false), | 
|    96         allow_harmony_sloppy_(false), |    96         allow_harmony_sloppy_(false), | 
|    97         allow_harmony_computed_property_names_(false), |    97         allow_harmony_computed_property_names_(false), | 
|    98         allow_harmony_rest_params_(false), |    98         allow_harmony_rest_params_(false), | 
|    99         allow_harmony_spreadcalls_(false), |    99         allow_harmony_spreadcalls_(false), | 
|   100         allow_harmony_destructuring_(false), |  | 
|   101         allow_harmony_spread_arrays_(false), |  | 
|   102         allow_harmony_new_target_(false), |  | 
|   103         allow_strong_mode_(false) {} |   100         allow_strong_mode_(false) {} | 
|   104  |   101  | 
|   105 #define ALLOW_ACCESSORS(name)                           \ |   102   // Getters that indicate whether certain syntactical constructs are | 
|   106   bool allow_##name() const { return allow_##name##_; } \ |   103   // allowed to be parsed by this instance of the parser. | 
|   107   void set_allow_##name(bool allow) { allow_##name##_ = allow; } |   104   bool allow_lazy() const { return allow_lazy_; } | 
|   108  |   105   bool allow_natives() const { return allow_natives_; } | 
|   109   ALLOW_ACCESSORS(lazy); |   106   bool allow_harmony_arrow_functions() const { | 
|   110   ALLOW_ACCESSORS(natives); |   107     return allow_harmony_arrow_functions_; | 
|   111   ALLOW_ACCESSORS(harmony_arrow_functions); |   108   } | 
|   112   ALLOW_ACCESSORS(harmony_object_literals); |  | 
|   113   ALLOW_ACCESSORS(harmony_sloppy); |  | 
|   114   ALLOW_ACCESSORS(harmony_computed_property_names); |  | 
|   115   ALLOW_ACCESSORS(harmony_rest_params); |  | 
|   116   ALLOW_ACCESSORS(harmony_spreadcalls); |  | 
|   117   ALLOW_ACCESSORS(harmony_destructuring); |  | 
|   118   ALLOW_ACCESSORS(harmony_spread_arrays); |  | 
|   119   ALLOW_ACCESSORS(harmony_new_target); |  | 
|   120   ALLOW_ACCESSORS(strong_mode); |  | 
|   121 #undef ALLOW_ACCESSORS |  | 
|   122  |  | 
|   123   bool allow_harmony_modules() const { return scanner()->HarmonyModules(); } |   109   bool allow_harmony_modules() const { return scanner()->HarmonyModules(); } | 
|   124   bool allow_harmony_classes() const { return scanner()->HarmonyClasses(); } |   110   bool allow_harmony_classes() const { return scanner()->HarmonyClasses(); } | 
 |   111   bool allow_harmony_object_literals() const { | 
 |   112     return allow_harmony_object_literals_; | 
 |   113   } | 
 |   114   bool allow_harmony_sloppy() const { return allow_harmony_sloppy_; } | 
|   125   bool allow_harmony_unicode() const { return scanner()->HarmonyUnicode(); } |   115   bool allow_harmony_unicode() const { return scanner()->HarmonyUnicode(); } | 
 |   116   bool allow_harmony_computed_property_names() const { | 
 |   117     return allow_harmony_computed_property_names_; | 
 |   118   } | 
 |   119   bool allow_harmony_rest_params() const { | 
 |   120     return allow_harmony_rest_params_; | 
 |   121   } | 
 |   122   bool allow_harmony_spreadcalls() const { return allow_harmony_spreadcalls_; } | 
 |   123   bool allow_harmony_destructuring() const { | 
 |   124     return allow_harmony_destructuring_; | 
 |   125   } | 
 |   126   bool allow_harmony_spread_arrays() const { | 
 |   127     return allow_harmony_spread_arrays_; | 
 |   128   } | 
|   126  |   129  | 
|   127   void set_allow_harmony_modules(bool a) { scanner()->SetHarmonyModules(a); } |   130   bool allow_strong_mode() const { return allow_strong_mode_; } | 
|   128   void set_allow_harmony_classes(bool a) { scanner()->SetHarmonyClasses(a); } |   131  | 
|   129   void set_allow_harmony_unicode(bool a) { scanner()->SetHarmonyUnicode(a); } |   132   // Setters that determine whether certain syntactical constructs are | 
 |   133   // allowed to be parsed by this instance of the parser. | 
 |   134   void set_allow_lazy(bool allow) { allow_lazy_ = allow; } | 
 |   135   void set_allow_natives(bool allow) { allow_natives_ = allow; } | 
 |   136   void set_allow_harmony_arrow_functions(bool allow) { | 
 |   137     allow_harmony_arrow_functions_ = allow; | 
 |   138   } | 
 |   139   void set_allow_harmony_modules(bool allow) { | 
 |   140     scanner()->SetHarmonyModules(allow); | 
 |   141   } | 
 |   142   void set_allow_harmony_classes(bool allow) { | 
 |   143     scanner()->SetHarmonyClasses(allow); | 
 |   144   } | 
 |   145   void set_allow_harmony_object_literals(bool allow) { | 
 |   146     allow_harmony_object_literals_ = allow; | 
 |   147   } | 
 |   148   void set_allow_harmony_sloppy(bool allow) { | 
 |   149     allow_harmony_sloppy_ = allow; | 
 |   150   } | 
 |   151   void set_allow_harmony_unicode(bool allow) { | 
 |   152     scanner()->SetHarmonyUnicode(allow); | 
 |   153   } | 
 |   154   void set_allow_harmony_computed_property_names(bool allow) { | 
 |   155     allow_harmony_computed_property_names_ = allow; | 
 |   156   } | 
 |   157   void set_allow_harmony_rest_params(bool allow) { | 
 |   158     allow_harmony_rest_params_ = allow; | 
 |   159   } | 
 |   160   void set_allow_harmony_spreadcalls(bool allow) { | 
 |   161     allow_harmony_spreadcalls_ = allow; | 
 |   162   } | 
 |   163   void set_allow_strong_mode(bool allow) { allow_strong_mode_ = allow; } | 
 |   164   void set_allow_harmony_destructuring(bool allow) { | 
 |   165     allow_harmony_destructuring_ = allow; | 
 |   166   } | 
 |   167   void set_allow_harmony_spread_arrays(bool allow) { | 
 |   168     allow_harmony_spread_arrays_ = allow; | 
 |   169   } | 
|   130  |   170  | 
|   131  protected: |   171  protected: | 
|   132   enum AllowRestrictedIdentifiers { |   172   enum AllowRestrictedIdentifiers { | 
|   133     kAllowRestrictedIdentifiers, |   173     kAllowRestrictedIdentifiers, | 
|   134     kDontAllowRestrictedIdentifiers |   174     kDontAllowRestrictedIdentifiers | 
|   135   }; |   175   }; | 
|   136  |   176  | 
|   137   enum Mode { |   177   enum Mode { | 
|   138     PARSE_LAZILY, |   178     PARSE_LAZILY, | 
|   139     PARSE_EAGERLY |   179     PARSE_EAGERLY | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   302   Scope* NewScope(Scope* parent, ScopeType scope_type) { |   342   Scope* NewScope(Scope* parent, ScopeType scope_type) { | 
|   303     // Must always pass the function kind for FUNCTION_SCOPE and ARROW_SCOPE. |   343     // Must always pass the function kind for FUNCTION_SCOPE and ARROW_SCOPE. | 
|   304     DCHECK(scope_type != FUNCTION_SCOPE); |   344     DCHECK(scope_type != FUNCTION_SCOPE); | 
|   305     DCHECK(scope_type != ARROW_SCOPE); |   345     DCHECK(scope_type != ARROW_SCOPE); | 
|   306     return NewScope(parent, scope_type, kNormalFunction); |   346     return NewScope(parent, scope_type, kNormalFunction); | 
|   307   } |   347   } | 
|   308  |   348  | 
|   309   Scope* NewScope(Scope* parent, ScopeType scope_type, FunctionKind kind) { |   349   Scope* NewScope(Scope* parent, ScopeType scope_type, FunctionKind kind) { | 
|   310     DCHECK(ast_value_factory()); |   350     DCHECK(ast_value_factory()); | 
|   311     DCHECK(scope_type != MODULE_SCOPE || allow_harmony_modules()); |   351     DCHECK(scope_type != MODULE_SCOPE || allow_harmony_modules()); | 
|   312     DCHECK(!IsArrowFunction(kind) || scope_type == ARROW_SCOPE); |   352     DCHECK(scope_type != ARROW_SCOPE || IsArrowFunction(kind)); | 
|   313     Scope* result = new (zone()) |   353     Scope* result = new (zone()) | 
|   314         Scope(zone(), parent, scope_type, ast_value_factory(), kind); |   354         Scope(zone(), parent, scope_type, ast_value_factory(), kind); | 
|   315     result->Initialize(); |   355     result->Initialize(); | 
|   316     return result; |   356     return result; | 
|   317   } |   357   } | 
|   318  |   358  | 
|   319   Scanner* scanner() const { return scanner_; } |   359   Scanner* scanner() const { return scanner_; } | 
|   320   AstValueFactory* ast_value_factory() const { return ast_value_factory_; } |   360   AstValueFactory* ast_value_factory() const { return ast_value_factory_; } | 
|   321   int position() { return scanner_->location().beg_pos; } |   361   int position() { return scanner_->location().beg_pos; } | 
|   322   int peek_position() { return scanner_->peek_location().beg_pos; } |   362   int peek_position() { return scanner_->peek_location().beg_pos; } | 
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   865   ExpressionT ParseMemberExpressionContinuation( |   905   ExpressionT ParseMemberExpressionContinuation( | 
|   866       ExpressionT expression, ExpressionClassifier* classifier, bool* ok); |   906       ExpressionT expression, ExpressionClassifier* classifier, bool* ok); | 
|   867   ExpressionT ParseArrowFunctionLiteral(Scope* function_scope, bool has_rest, |   907   ExpressionT ParseArrowFunctionLiteral(Scope* function_scope, bool has_rest, | 
|   868                                         const ExpressionClassifier& classifier, |   908                                         const ExpressionClassifier& classifier, | 
|   869                                         bool* ok); |   909                                         bool* ok); | 
|   870   ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, |   910   ExpressionT ParseTemplateLiteral(ExpressionT tag, int start, | 
|   871                                    ExpressionClassifier* classifier, bool* ok); |   911                                    ExpressionClassifier* classifier, bool* ok); | 
|   872   void AddTemplateExpression(ExpressionT); |   912   void AddTemplateExpression(ExpressionT); | 
|   873   ExpressionT ParseSuperExpression(bool is_new, |   913   ExpressionT ParseSuperExpression(bool is_new, | 
|   874                                    ExpressionClassifier* classifier, bool* ok); |   914                                    ExpressionClassifier* classifier, bool* ok); | 
|   875   ExpressionT ParseNewTargetExpression(bool* ok); |  | 
|   876   ExpressionT ParseStrongInitializationExpression( |   915   ExpressionT ParseStrongInitializationExpression( | 
|   877       ExpressionClassifier* classifier, bool* ok); |   916       ExpressionClassifier* classifier, bool* ok); | 
|   878   ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, |   917   ExpressionT ParseStrongSuperCallExpression(ExpressionClassifier* classifier, | 
|   879                                              bool* ok); |   918                                              bool* ok); | 
|   880  |   919  | 
|   881   void ParseFormalParameter(FormalParameterScopeT* scope, bool is_rest, |   920   void ParseFormalParameter(FormalParameterScopeT* scope, bool is_rest, | 
|   882                             ExpressionClassifier* classifier, bool* ok); |   921                             ExpressionClassifier* classifier, bool* ok); | 
|   883   int ParseFormalParameterList(FormalParameterScopeT* scope, bool* has_rest, |   922   int ParseFormalParameterList(FormalParameterScopeT* scope, bool* has_rest, | 
|   884                                ExpressionClassifier* classifier, bool* ok); |   923                                ExpressionClassifier* classifier, bool* ok); | 
|   885   void CheckArityRestrictions( |   924   void CheckArityRestrictions( | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   976   bool allow_lazy_; |  1015   bool allow_lazy_; | 
|   977   bool allow_natives_; |  1016   bool allow_natives_; | 
|   978   bool allow_harmony_arrow_functions_; |  1017   bool allow_harmony_arrow_functions_; | 
|   979   bool allow_harmony_object_literals_; |  1018   bool allow_harmony_object_literals_; | 
|   980   bool allow_harmony_sloppy_; |  1019   bool allow_harmony_sloppy_; | 
|   981   bool allow_harmony_computed_property_names_; |  1020   bool allow_harmony_computed_property_names_; | 
|   982   bool allow_harmony_rest_params_; |  1021   bool allow_harmony_rest_params_; | 
|   983   bool allow_harmony_spreadcalls_; |  1022   bool allow_harmony_spreadcalls_; | 
|   984   bool allow_harmony_destructuring_; |  1023   bool allow_harmony_destructuring_; | 
|   985   bool allow_harmony_spread_arrays_; |  1024   bool allow_harmony_spread_arrays_; | 
|   986   bool allow_harmony_new_target_; |  | 
|   987   bool allow_strong_mode_; |  1025   bool allow_strong_mode_; | 
|   988 }; |  1026 }; | 
|   989  |  1027  | 
|   990  |  1028  | 
|   991 class PreParserIdentifier { |  1029 class PreParserIdentifier { | 
|   992  public: |  1030  public: | 
|   993   PreParserIdentifier() : type_(kUnknownIdentifier) {} |  1031   PreParserIdentifier() : type_(kUnknownIdentifier) {} | 
|   994   static PreParserIdentifier Default() { |  1032   static PreParserIdentifier Default() { | 
|   995     return PreParserIdentifier(kUnknownIdentifier); |  1033     return PreParserIdentifier(kUnknownIdentifier); | 
|   996   } |  1034   } | 
| (...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1686                                                     int pos) { |  1724                                                     int pos) { | 
|  1687     return PreParserExpression::Default(); |  1725     return PreParserExpression::Default(); | 
|  1688   } |  1726   } | 
|  1689  |  1727  | 
|  1690   static PreParserExpression SuperCallReference(Scope* scope, |  1728   static PreParserExpression SuperCallReference(Scope* scope, | 
|  1691                                                 PreParserFactory* factory, |  1729                                                 PreParserFactory* factory, | 
|  1692                                                 int pos) { |  1730                                                 int pos) { | 
|  1693     return PreParserExpression::Default(); |  1731     return PreParserExpression::Default(); | 
|  1694   } |  1732   } | 
|  1695  |  1733  | 
|  1696   static PreParserExpression NewTargetExpression(Scope* scope, |  | 
|  1697                                                  PreParserFactory* factory, |  | 
|  1698                                                  int pos) { |  | 
|  1699     return PreParserExpression::Default(); |  | 
|  1700   } |  | 
|  1701  |  | 
|  1702   static PreParserExpression DefaultConstructor(bool call_super, Scope* scope, |  1734   static PreParserExpression DefaultConstructor(bool call_super, Scope* scope, | 
|  1703                                                 int pos, int end_pos) { |  1735                                                 int pos, int end_pos) { | 
|  1704     return PreParserExpression::Default(); |  1736     return PreParserExpression::Default(); | 
|  1705   } |  1737   } | 
|  1706  |  1738  | 
|  1707   static PreParserExpression ExpressionFromLiteral( |  1739   static PreParserExpression ExpressionFromLiteral( | 
|  1708       Token::Value token, int pos, Scanner* scanner, |  1740       Token::Value token, int pos, Scanner* scanner, | 
|  1709       PreParserFactory* factory) { |  1741       PreParserFactory* factory) { | 
|  1710     return PreParserExpression::Default(); |  1742     return PreParserExpression::Default(); | 
|  1711   } |  1743   } | 
| (...skipping 1581 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3293   } |  3325   } | 
|  3294 } |  3326 } | 
|  3295  |  3327  | 
|  3296  |  3328  | 
|  3297 template <class Traits> |  3329 template <class Traits> | 
|  3298 typename ParserBase<Traits>::ExpressionT |  3330 typename ParserBase<Traits>::ExpressionT | 
|  3299 ParserBase<Traits>::ParseMemberWithNewPrefixesExpression( |  3331 ParserBase<Traits>::ParseMemberWithNewPrefixesExpression( | 
|  3300     ExpressionClassifier* classifier, bool* ok) { |  3332     ExpressionClassifier* classifier, bool* ok) { | 
|  3301   // NewExpression :: |  3333   // NewExpression :: | 
|  3302   //   ('new')+ MemberExpression |  3334   //   ('new')+ MemberExpression | 
|  3303   // |  | 
|  3304   // NewTarget :: |  | 
|  3305   //   'new' '.' 'target' |  | 
|  3306  |  3335  | 
|  3307   // The grammar for new expressions is pretty warped. We can have several 'new' |  3336   // The grammar for new expressions is pretty warped. We can have several 'new' | 
|  3308   // keywords following each other, and then a MemberExpression. When we see '(' |  3337   // keywords following each other, and then a MemberExpression. When we see '(' | 
|  3309   // after the MemberExpression, it's associated with the rightmost unassociated |  3338   // after the MemberExpression, it's associated with the rightmost unassociated | 
|  3310   // 'new' to create a NewExpression with arguments. However, a NewExpression |  3339   // 'new' to create a NewExpression with arguments. However, a NewExpression | 
|  3311   // can also occur without arguments. |  3340   // can also occur without arguments. | 
|  3312  |  3341  | 
|  3313   // Examples of new expression: |  3342   // Examples of new expression: | 
|  3314   // new foo.bar().baz means (new (foo.bar)()).baz |  3343   // new foo.bar().baz means (new (foo.bar)()).baz | 
|  3315   // new foo()() means (new foo())() |  3344   // new foo()() means (new foo())() | 
|  3316   // new new foo()() means (new (new foo())()) |  3345   // new new foo()() means (new (new foo())()) | 
|  3317   // new new foo means new (new foo) |  3346   // new new foo means new (new foo) | 
|  3318   // new new foo() means new (new foo()) |  3347   // new new foo() means new (new foo()) | 
|  3319   // new new foo().bar().baz means (new (new foo()).bar()).baz |  3348   // new new foo().bar().baz means (new (new foo()).bar()).baz | 
|  3320  |  3349  | 
|  3321   if (peek() == Token::NEW) { |  3350   if (peek() == Token::NEW) { | 
|  3322     BindingPatternUnexpectedToken(classifier); |  3351     BindingPatternUnexpectedToken(classifier); | 
|  3323     Consume(Token::NEW); |  3352     Consume(Token::NEW); | 
|  3324     int new_pos = position(); |  3353     int new_pos = position(); | 
|  3325     ExpressionT result = this->EmptyExpression(); |  3354     ExpressionT result = this->EmptyExpression(); | 
|  3326     if (peek() == Token::SUPER) { |  3355     if (peek() == Token::SUPER) { | 
|  3327       const bool is_new = true; |  3356       const bool is_new = true; | 
|  3328       result = ParseSuperExpression(is_new, classifier, CHECK_OK); |  3357       result = ParseSuperExpression(is_new, classifier, CHECK_OK); | 
|  3329     } else if (allow_harmony_new_target() && peek() == Token::PERIOD) { |  | 
|  3330       return ParseNewTargetExpression(CHECK_OK); |  | 
|  3331     } else { |  3358     } else { | 
|  3332       result = this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); |  3359       result = this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); | 
|  3333     } |  3360     } | 
|  3334     if (peek() == Token::LPAREN) { |  3361     if (peek() == Token::LPAREN) { | 
|  3335       // NewExpression with arguments. |  3362       // NewExpression with arguments. | 
|  3336       Scanner::Location spread_pos; |  3363       Scanner::Location spread_pos; | 
|  3337       typename Traits::Type::ExpressionList args = |  3364       typename Traits::Type::ExpressionList args = | 
|  3338           this->ParseArguments(&spread_pos, classifier, CHECK_OK); |  3365           this->ParseArguments(&spread_pos, classifier, CHECK_OK); | 
|  3339  |  3366  | 
|  3340       if (spread_pos.IsValid()) { |  3367       if (spread_pos.IsValid()) { | 
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3544  |  3571  | 
|  3545 template <class Traits> |  3572 template <class Traits> | 
|  3546 typename ParserBase<Traits>::ExpressionT |  3573 typename ParserBase<Traits>::ExpressionT | 
|  3547 ParserBase<Traits>::ParseSuperExpression(bool is_new, |  3574 ParserBase<Traits>::ParseSuperExpression(bool is_new, | 
|  3548                                          ExpressionClassifier* classifier, |  3575                                          ExpressionClassifier* classifier, | 
|  3549                                          bool* ok) { |  3576                                          bool* ok) { | 
|  3550   int pos = position(); |  3577   int pos = position(); | 
|  3551   Expect(Token::SUPER, CHECK_OK); |  3578   Expect(Token::SUPER, CHECK_OK); | 
|  3552  |  3579  | 
|  3553   Scope* scope = scope_->DeclarationScope(); |  3580   Scope* scope = scope_->DeclarationScope(); | 
 |  3581  | 
|  3554   while (scope->is_eval_scope() || scope->is_arrow_scope()) { |  3582   while (scope->is_eval_scope() || scope->is_arrow_scope()) { | 
|  3555     scope = scope->outer_scope(); |  3583     scope = scope->outer_scope(); | 
|  3556     DCHECK_NOT_NULL(scope); |  3584     DCHECK_NOT_NULL(scope); | 
|  3557     scope = scope->DeclarationScope(); |  3585     scope = scope->DeclarationScope(); | 
|  3558   } |  3586   } | 
|  3559  |  3587  | 
|  3560   FunctionKind kind = scope->function_kind(); |  3588   FunctionKind kind = scope->function_kind(); | 
|  3561   if (IsConciseMethod(kind) || IsAccessorFunction(kind) || |  3589   if (IsConciseMethod(kind) || IsAccessorFunction(kind) || | 
|  3562       i::IsConstructor(kind)) { |  3590       i::IsConstructor(kind)) { | 
|  3563     if (peek() == Token::PERIOD || peek() == Token::LBRACK) { |  3591     if (peek() == Token::PERIOD || peek() == Token::LBRACK) { | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  3580       return this->SuperCallReference(scope_, factory(), pos); |  3608       return this->SuperCallReference(scope_, factory(), pos); | 
|  3581     } |  3609     } | 
|  3582   } |  3610   } | 
|  3583  |  3611  | 
|  3584   ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); |  3612   ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); | 
|  3585   *ok = false; |  3613   *ok = false; | 
|  3586   return this->EmptyExpression(); |  3614   return this->EmptyExpression(); | 
|  3587 } |  3615 } | 
|  3588  |  3616  | 
|  3589  |  3617  | 
|  3590 template <class Traits> |  | 
|  3591 typename ParserBase<Traits>::ExpressionT |  | 
|  3592 ParserBase<Traits>::ParseNewTargetExpression(bool* ok) { |  | 
|  3593   int pos = position(); |  | 
|  3594   Consume(Token::PERIOD); |  | 
|  3595   ExpectContextualKeyword(CStrVector("target"), CHECK_OK); |  | 
|  3596  |  | 
|  3597   Scope* scope = scope_->DeclarationScope(); |  | 
|  3598   while (scope->is_eval_scope() || scope->is_arrow_scope()) { |  | 
|  3599     scope = scope->outer_scope(); |  | 
|  3600     DCHECK_NOT_NULL(scope); |  | 
|  3601     scope = scope->DeclarationScope(); |  | 
|  3602   } |  | 
|  3603  |  | 
|  3604   if (!scope->is_function_scope()) { |  | 
|  3605     ReportMessageAt(scanner()->location(), |  | 
|  3606                     MessageTemplate::kUnexpectedNewTarget); |  | 
|  3607     *ok = false; |  | 
|  3608     return this->EmptyExpression(); |  | 
|  3609   } |  | 
|  3610  |  | 
|  3611   return this->NewTargetExpression(scope_, factory(), pos); |  | 
|  3612 } |  | 
|  3613  |  | 
|  3614  |  | 
|  3615 template <class Traits> |  3618 template <class Traits> | 
|  3616 typename ParserBase<Traits>::ExpressionT |  3619 typename ParserBase<Traits>::ExpressionT | 
|  3617 ParserBase<Traits>::ParseMemberExpressionContinuation( |  3620 ParserBase<Traits>::ParseMemberExpressionContinuation( | 
|  3618     ExpressionT expression, ExpressionClassifier* classifier, bool* ok) { |  3621     ExpressionT expression, ExpressionClassifier* classifier, bool* ok) { | 
|  3619   // Parses this part of MemberExpression: |  3622   // Parses this part of MemberExpression: | 
|  3620   // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* |  3623   // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* | 
|  3621   while (true) { |  3624   while (true) { | 
|  3622     switch (peek()) { |  3625     switch (peek()) { | 
|  3623       case Token::LBRACK: { |  3626       case Token::LBRACK: { | 
|  3624         BindingPatternUnexpectedToken(classifier); |  3627         BindingPatternUnexpectedToken(classifier); | 
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4046       *ok = false; |  4049       *ok = false; | 
|  4047       return; |  4050       return; | 
|  4048     } |  4051     } | 
|  4049     has_seen_constructor_ = true; |  4052     has_seen_constructor_ = true; | 
|  4050     return; |  4053     return; | 
|  4051   } |  4054   } | 
|  4052 } |  4055 } | 
|  4053 } }  // v8::internal |  4056 } }  // v8::internal | 
|  4054  |  4057  | 
|  4055 #endif  // V8_PREPARSER_H |  4058 #endif  // V8_PREPARSER_H | 
| OLD | NEW |