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