| 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 |