OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 #include <cmath> | 5 #include <cmath> |
6 | 6 |
7 #include "src/allocation.h" | 7 #include "src/allocation.h" |
8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
9 #include "src/conversions-inl.h" | 9 #include "src/conversions-inl.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 | 71 |
72 PreParserIdentifier PreParserTraits::GetNumberAsSymbol(Scanner* scanner) { | 72 PreParserIdentifier PreParserTraits::GetNumberAsSymbol(Scanner* scanner) { |
73 return PreParserIdentifier::Default(); | 73 return PreParserIdentifier::Default(); |
74 } | 74 } |
75 | 75 |
76 | 76 |
77 PreParserExpression PreParserTraits::ExpressionFromString( | 77 PreParserExpression PreParserTraits::ExpressionFromString( |
78 int pos, Scanner* scanner, PreParserFactory* factory) { | 78 int pos, Scanner* scanner, PreParserFactory* factory) { |
79 if (scanner->UnescapedLiteralMatches("use strict", 10)) { | 79 if (scanner->UnescapedLiteralMatches("use strict", 10)) { |
80 return PreParserExpression::UseStrictStringLiteral(); | 80 return PreParserExpression::UseStrictStringLiteral(); |
81 } else if (scanner->UnescapedLiteralMatches("use strong", 10)) { | |
82 return PreParserExpression::UseStrongStringLiteral(); | |
83 } | 81 } |
84 return PreParserExpression::StringLiteral(); | 82 return PreParserExpression::StringLiteral(); |
85 } | 83 } |
86 | 84 |
87 | 85 |
88 PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) { | 86 PreParserExpression PreParserTraits::ParseV8Intrinsic(bool* ok) { |
89 return pre_parser_->ParseV8Intrinsic(ok); | 87 return pre_parser_->ParseV8Intrinsic(ok); |
90 } | 88 } |
91 | 89 |
92 | 90 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 } else if (stack_overflow()) { | 123 } else if (stack_overflow()) { |
126 return kPreParseStackOverflow; | 124 return kPreParseStackOverflow; |
127 } else if (!ok) { | 125 } else if (!ok) { |
128 ReportUnexpectedToken(scanner()->current_token()); | 126 ReportUnexpectedToken(scanner()->current_token()); |
129 } else { | 127 } else { |
130 DCHECK_EQ(Token::RBRACE, scanner()->peek()); | 128 DCHECK_EQ(Token::RBRACE, scanner()->peek()); |
131 if (is_strict(scope_->language_mode())) { | 129 if (is_strict(scope_->language_mode())) { |
132 int end_pos = scanner()->location().end_pos; | 130 int end_pos = scanner()->location().end_pos; |
133 CheckStrictOctalLiteral(start_position, end_pos, &ok); | 131 CheckStrictOctalLiteral(start_position, end_pos, &ok); |
134 if (!ok) return kPreParseSuccess; | 132 if (!ok) return kPreParseSuccess; |
135 | |
136 if (is_strong(scope_->language_mode()) && IsSubclassConstructor(kind)) { | |
137 if (!function_state.super_location().IsValid()) { | |
138 ReportMessageAt(Scanner::Location(start_position, start_position + 1), | |
139 MessageTemplate::kStrongSuperCallMissing, | |
140 kReferenceError); | |
141 return kPreParseSuccess; | |
142 } | |
143 } | |
144 } | 133 } |
145 } | 134 } |
146 return kPreParseSuccess; | 135 return kPreParseSuccess; |
147 } | 136 } |
148 | 137 |
149 | 138 |
150 PreParserExpression PreParserTraits::ParseClassLiteral( | 139 PreParserExpression PreParserTraits::ParseClassLiteral( |
151 PreParserIdentifier name, Scanner::Location class_name_location, | 140 PreParserIdentifier name, Scanner::Location class_name_location, |
152 bool name_is_strict_reserved, int pos, bool* ok) { | 141 bool name_is_strict_reserved, int pos, bool* ok) { |
153 return pre_parser_->ParseClassLiteral(name, class_name_location, | 142 return pre_parser_->ParseClassLiteral(name, class_name_location, |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 bool maybe_reset = bookmark != nullptr; | 208 bool maybe_reset = bookmark != nullptr; |
220 int count_statements = 0; | 209 int count_statements = 0; |
221 | 210 |
222 bool directive_prologue = true; | 211 bool directive_prologue = true; |
223 while (peek() != end_token) { | 212 while (peek() != end_token) { |
224 if (directive_prologue && peek() != Token::STRING) { | 213 if (directive_prologue && peek() != Token::STRING) { |
225 directive_prologue = false; | 214 directive_prologue = false; |
226 } | 215 } |
227 bool starts_with_identifier = peek() == Token::IDENTIFIER; | 216 bool starts_with_identifier = peek() == Token::IDENTIFIER; |
228 Scanner::Location token_loc = scanner()->peek_location(); | 217 Scanner::Location token_loc = scanner()->peek_location(); |
229 Scanner::Location old_this_loc = function_state_->this_location(); | |
230 Scanner::Location old_super_loc = function_state_->super_location(); | |
231 Statement statement = ParseStatementListItem(ok); | 218 Statement statement = ParseStatementListItem(ok); |
232 if (!*ok) return; | 219 if (!*ok) return; |
233 | 220 |
234 if (is_strong(language_mode()) && scope_->is_function_scope() && | |
235 IsClassConstructor(function_state_->kind())) { | |
236 Scanner::Location this_loc = function_state_->this_location(); | |
237 Scanner::Location super_loc = function_state_->super_location(); | |
238 if (this_loc.beg_pos != old_this_loc.beg_pos && | |
239 this_loc.beg_pos != token_loc.beg_pos) { | |
240 ReportMessageAt(this_loc, MessageTemplate::kStrongConstructorThis); | |
241 *ok = false; | |
242 return; | |
243 } | |
244 if (super_loc.beg_pos != old_super_loc.beg_pos && | |
245 super_loc.beg_pos != token_loc.beg_pos) { | |
246 ReportMessageAt(super_loc, MessageTemplate::kStrongConstructorSuper); | |
247 *ok = false; | |
248 return; | |
249 } | |
250 } | |
251 | |
252 if (directive_prologue) { | 221 if (directive_prologue) { |
253 bool use_strict_found = statement.IsUseStrictLiteral(); | 222 bool use_strict_found = statement.IsUseStrictLiteral(); |
254 bool use_strong_found = | |
255 statement.IsUseStrongLiteral() && allow_strong_mode(); | |
256 | 223 |
257 if (use_strict_found) { | 224 if (use_strict_found) { |
258 scope_->SetLanguageMode( | 225 scope_->SetLanguageMode( |
259 static_cast<LanguageMode>(scope_->language_mode() | STRICT)); | 226 static_cast<LanguageMode>(scope_->language_mode() | STRICT)); |
260 } else if (use_strong_found) { | |
261 scope_->SetLanguageMode(static_cast<LanguageMode>( | |
262 scope_->language_mode() | STRONG)); | |
263 if (IsClassConstructor(function_state_->kind())) { | |
264 // "use strong" cannot occur in a class constructor body, to avoid | |
265 // unintuitive strong class object semantics. | |
266 PreParserTraits::ReportMessageAt( | |
267 token_loc, MessageTemplate::kStrongConstructorDirective); | |
268 *ok = false; | |
269 return; | |
270 } | |
271 } else if (!statement.IsStringLiteral()) { | 227 } else if (!statement.IsStringLiteral()) { |
272 directive_prologue = false; | 228 directive_prologue = false; |
273 } | 229 } |
274 | 230 |
275 if ((use_strict_found || use_strong_found) && | 231 if (use_strict_found && !scope_->HasSimpleParameters()) { |
276 !scope_->HasSimpleParameters()) { | |
277 // TC39 deemed "use strict" directives to be an error when occurring | 232 // TC39 deemed "use strict" directives to be an error when occurring |
278 // in the body of a function with non-simple parameter list, on | 233 // in the body of a function with non-simple parameter list, on |
279 // 29/7/2015. https://goo.gl/ueA7Ln | 234 // 29/7/2015. https://goo.gl/ueA7Ln |
280 // | |
281 // In V8, this also applies to "use strong " directives. | |
282 PreParserTraits::ReportMessageAt( | 235 PreParserTraits::ReportMessageAt( |
283 token_loc, MessageTemplate::kIllegalLanguageModeDirective, | 236 token_loc, MessageTemplate::kIllegalLanguageModeDirective, |
284 use_strict_found ? "use strict" : "use strong"); | 237 "use strict"); |
285 *ok = false; | 238 *ok = false; |
286 return; | 239 return; |
287 } | 240 } |
288 } | 241 } |
289 | 242 |
290 // If we're allowed to reset to a bookmark, we will do so when we see a long | 243 // If we're allowed to reset to a bookmark, we will do so when we see a long |
291 // and trivial function. | 244 // and trivial function. |
292 // Our current definition of 'long and trivial' is: | 245 // Our current definition of 'long and trivial' is: |
293 // - over 200 statements | 246 // - over 200 statements |
294 // - all starting with an identifier (i.e., no if, for, while, etc.) | 247 // - all starting with an identifier (i.e., no if, for, while, etc.) |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 // labels can be simply ignored in all other cases; except for | 309 // labels can be simply ignored in all other cases; except for |
357 // trivial labeled break statements 'label: break label' which is | 310 // trivial labeled break statements 'label: break label' which is |
358 // parsed into an empty statement. | 311 // parsed into an empty statement. |
359 | 312 |
360 // Keep the source position of the statement | 313 // Keep the source position of the statement |
361 switch (peek()) { | 314 switch (peek()) { |
362 case Token::LBRACE: | 315 case Token::LBRACE: |
363 return ParseBlock(ok); | 316 return ParseBlock(ok); |
364 | 317 |
365 case Token::SEMICOLON: | 318 case Token::SEMICOLON: |
366 if (is_strong(language_mode())) { | |
367 PreParserTraits::ReportMessageAt(scanner()->peek_location(), | |
368 MessageTemplate::kStrongEmpty); | |
369 *ok = false; | |
370 return Statement::Default(); | |
371 } | |
372 Next(); | 319 Next(); |
373 return Statement::Default(); | 320 return Statement::Default(); |
374 | 321 |
375 case Token::IF: | 322 case Token::IF: |
376 return ParseIfStatement(ok); | 323 return ParseIfStatement(ok); |
377 | 324 |
378 case Token::DO: | 325 case Token::DO: |
379 return ParseDoWhileStatement(ok); | 326 return ParseDoWhileStatement(ok); |
380 | 327 |
381 case Token::WHILE: | 328 case Token::WHILE: |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 // ConstBinding :: | 473 // ConstBinding :: |
527 // Identifier '=' AssignmentExpression | 474 // Identifier '=' AssignmentExpression |
528 // | 475 // |
529 // TODO(ES6): | 476 // TODO(ES6): |
530 // ConstBinding :: | 477 // ConstBinding :: |
531 // BindingPattern '=' AssignmentExpression | 478 // BindingPattern '=' AssignmentExpression |
532 bool require_initializer = false; | 479 bool require_initializer = false; |
533 bool lexical = false; | 480 bool lexical = false; |
534 bool is_pattern = false; | 481 bool is_pattern = false; |
535 if (peek() == Token::VAR) { | 482 if (peek() == Token::VAR) { |
536 if (is_strong(language_mode())) { | |
537 Scanner::Location location = scanner()->peek_location(); | |
538 ReportMessageAt(location, MessageTemplate::kStrongVar); | |
539 *ok = false; | |
540 return Statement::Default(); | |
541 } | |
542 Consume(Token::VAR); | 483 Consume(Token::VAR); |
543 } else if (peek() == Token::CONST && allow_const()) { | 484 } else if (peek() == Token::CONST && allow_const()) { |
544 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: | 485 // TODO(ES6): The ES6 Draft Rev4 section 12.2.2 reads: |
545 // | 486 // |
546 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' | 487 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' |
547 // | 488 // |
548 // * It is a Syntax Error if the code that matches this production is not | 489 // * It is a Syntax Error if the code that matches this production is not |
549 // contained in extended code. | 490 // contained in extended code. |
550 // | 491 // |
551 // However disallowing const in sloppy mode will break compatibility with | 492 // However disallowing const in sloppy mode will break compatibility with |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 | 580 |
640 switch (peek()) { | 581 switch (peek()) { |
641 case Token::FUNCTION: | 582 case Token::FUNCTION: |
642 case Token::LBRACE: | 583 case Token::LBRACE: |
643 UNREACHABLE(); // Always handled by the callers. | 584 UNREACHABLE(); // Always handled by the callers. |
644 case Token::CLASS: | 585 case Token::CLASS: |
645 ReportUnexpectedToken(Next()); | 586 ReportUnexpectedToken(Next()); |
646 *ok = false; | 587 *ok = false; |
647 return Statement::Default(); | 588 return Statement::Default(); |
648 | 589 |
649 case Token::THIS: | |
650 if (!FLAG_strong_this) break; | |
651 // Fall through. | |
652 case Token::SUPER: | |
653 if (is_strong(language_mode()) && | |
654 IsClassConstructor(function_state_->kind())) { | |
655 bool is_this = peek() == Token::THIS; | |
656 Expression expr = Expression::Default(); | |
657 ExpressionClassifier classifier(this); | |
658 if (is_this) { | |
659 expr = ParseStrongInitializationExpression(&classifier, CHECK_OK); | |
660 } else { | |
661 expr = ParseStrongSuperCallExpression(&classifier, CHECK_OK); | |
662 } | |
663 ValidateExpression(&classifier, CHECK_OK); | |
664 switch (peek()) { | |
665 case Token::SEMICOLON: | |
666 Consume(Token::SEMICOLON); | |
667 break; | |
668 case Token::RBRACE: | |
669 case Token::EOS: | |
670 break; | |
671 default: | |
672 if (!scanner()->HasAnyLineTerminatorBeforeNext()) { | |
673 ReportMessageAt(function_state_->this_location(), | |
674 is_this | |
675 ? MessageTemplate::kStrongConstructorThis | |
676 : MessageTemplate::kStrongConstructorSuper); | |
677 *ok = false; | |
678 return Statement::Default(); | |
679 } | |
680 } | |
681 return Statement::ExpressionStatement(expr); | |
682 } | |
683 break; | |
684 | |
685 // TODO(arv): Handle `let [` | |
686 // https://code.google.com/p/v8/issues/detail?id=3847 | |
687 | |
688 default: | 590 default: |
689 break; | 591 break; |
690 } | 592 } |
691 | 593 |
692 bool starts_with_identifier = peek_any_identifier(); | 594 bool starts_with_identifier = peek_any_identifier(); |
693 ExpressionClassifier classifier(this); | 595 ExpressionClassifier classifier(this); |
694 Expression expr = ParseExpression(true, &classifier, CHECK_OK); | 596 Expression expr = ParseExpression(true, &classifier, CHECK_OK); |
695 ValidateExpression(&classifier, CHECK_OK); | 597 ValidateExpression(&classifier, CHECK_OK); |
696 | 598 |
697 // Even if the expression starts with an identifier, it is not necessarily an | 599 // Even if the expression starts with an identifier, it is not necessarily an |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
798 // An ECMAScript program is considered syntactically incorrect if it | 700 // An ECMAScript program is considered syntactically incorrect if it |
799 // contains a return statement that is not within the body of a | 701 // contains a return statement that is not within the body of a |
800 // function. See ECMA-262, section 12.9, page 67. | 702 // function. See ECMA-262, section 12.9, page 67. |
801 // This is not handled during preparsing. | 703 // This is not handled during preparsing. |
802 | 704 |
803 Token::Value tok = peek(); | 705 Token::Value tok = peek(); |
804 if (!scanner()->HasAnyLineTerminatorBeforeNext() && | 706 if (!scanner()->HasAnyLineTerminatorBeforeNext() && |
805 tok != Token::SEMICOLON && | 707 tok != Token::SEMICOLON && |
806 tok != Token::RBRACE && | 708 tok != Token::RBRACE && |
807 tok != Token::EOS) { | 709 tok != Token::EOS) { |
808 if (is_strong(language_mode()) && | |
809 IsClassConstructor(function_state_->kind())) { | |
810 int pos = peek_position(); | |
811 ReportMessageAt(Scanner::Location(pos, pos + 1), | |
812 MessageTemplate::kStrongConstructorReturnValue); | |
813 *ok = false; | |
814 return Statement::Default(); | |
815 } | |
816 ParseExpression(true, CHECK_OK); | 710 ParseExpression(true, CHECK_OK); |
817 } | 711 } |
818 ExpectSemicolon(CHECK_OK); | 712 ExpectSemicolon(CHECK_OK); |
819 return Statement::Jump(); | 713 return Statement::Jump(); |
820 } | 714 } |
821 | 715 |
822 | 716 |
823 PreParser::Statement PreParser::ParseWithStatement(bool* ok) { | 717 PreParser::Statement PreParser::ParseWithStatement(bool* ok) { |
824 // WithStatement :: | 718 // WithStatement :: |
825 // 'with' '(' Expression ')' Statement | 719 // 'with' '(' Expression ')' Statement |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 } | 754 } |
861 Expect(Token::COLON, CHECK_OK); | 755 Expect(Token::COLON, CHECK_OK); |
862 token = peek(); | 756 token = peek(); |
863 Statement statement = Statement::Jump(); | 757 Statement statement = Statement::Jump(); |
864 while (token != Token::CASE && | 758 while (token != Token::CASE && |
865 token != Token::DEFAULT && | 759 token != Token::DEFAULT && |
866 token != Token::RBRACE) { | 760 token != Token::RBRACE) { |
867 statement = ParseStatementListItem(CHECK_OK); | 761 statement = ParseStatementListItem(CHECK_OK); |
868 token = peek(); | 762 token = peek(); |
869 } | 763 } |
870 if (is_strong(language_mode()) && !statement.IsJumpStatement() && | |
871 token != Token::RBRACE) { | |
872 ReportMessageAt(scanner()->location(), | |
873 MessageTemplate::kStrongSwitchFallthrough); | |
874 *ok = false; | |
875 return Statement::Default(); | |
876 } | |
877 } | 764 } |
878 Expect(Token::RBRACE, ok); | 765 Expect(Token::RBRACE, ok); |
879 return Statement::Default(); | 766 return Statement::Default(); |
880 } | 767 } |
881 | 768 |
882 | 769 |
883 PreParser::Statement PreParser::ParseDoWhileStatement(bool* ok) { | 770 PreParser::Statement PreParser::ParseDoWhileStatement(bool* ok) { |
884 // DoStatement :: | 771 // DoStatement :: |
885 // 'do' Statement 'while' '(' Expression ')' ';' | 772 // 'do' Statement 'while' '(' Expression ')' ';' |
886 | 773 |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 const bool allow_duplicate_parameters = | 1046 const bool allow_duplicate_parameters = |
1160 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind); | 1047 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind); |
1161 ValidateFormalParameters(&formals_classifier, language_mode, | 1048 ValidateFormalParameters(&formals_classifier, language_mode, |
1162 allow_duplicate_parameters, CHECK_OK); | 1049 allow_duplicate_parameters, CHECK_OK); |
1163 | 1050 |
1164 if (is_strict(language_mode)) { | 1051 if (is_strict(language_mode)) { |
1165 int end_position = scanner()->location().end_pos; | 1052 int end_position = scanner()->location().end_pos; |
1166 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 1053 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
1167 } | 1054 } |
1168 | 1055 |
1169 if (is_strong(language_mode) && IsSubclassConstructor(kind)) { | |
1170 if (!function_state.super_location().IsValid()) { | |
1171 ReportMessageAt(function_name_location, | |
1172 MessageTemplate::kStrongSuperCallMissing, | |
1173 kReferenceError); | |
1174 *ok = false; | |
1175 return Expression::Default(); | |
1176 } | |
1177 } | |
1178 | |
1179 return Expression::Default(); | 1056 return Expression::Default(); |
1180 } | 1057 } |
1181 | 1058 |
1182 | 1059 |
1183 void PreParser::ParseLazyFunctionLiteralBody(bool* ok, | 1060 void PreParser::ParseLazyFunctionLiteralBody(bool* ok, |
1184 Scanner::BookmarkScope* bookmark) { | 1061 Scanner::BookmarkScope* bookmark) { |
1185 int body_start = position(); | 1062 int body_start = position(); |
1186 ParseStatementList(Token::RBRACE, ok, bookmark); | 1063 ParseStatementList(Token::RBRACE, ok, bookmark); |
1187 if (!*ok) return; | 1064 if (!*ok) return; |
1188 if (bookmark && bookmark->HasBeenReset()) return; | 1065 if (bookmark && bookmark->HasBeenReset()) return; |
(...skipping 16 matching lines...) Expand all Loading... |
1205 ReportMessageAt(class_name_location, | 1082 ReportMessageAt(class_name_location, |
1206 MessageTemplate::kUnexpectedStrictReserved); | 1083 MessageTemplate::kUnexpectedStrictReserved); |
1207 *ok = false; | 1084 *ok = false; |
1208 return EmptyExpression(); | 1085 return EmptyExpression(); |
1209 } | 1086 } |
1210 if (IsEvalOrArguments(name)) { | 1087 if (IsEvalOrArguments(name)) { |
1211 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | 1088 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
1212 *ok = false; | 1089 *ok = false; |
1213 return EmptyExpression(); | 1090 return EmptyExpression(); |
1214 } | 1091 } |
1215 LanguageMode class_language_mode = language_mode(); | |
1216 if (is_strong(class_language_mode) && IsUndefined(name)) { | |
1217 ReportMessageAt(class_name_location, MessageTemplate::kStrongUndefined); | |
1218 *ok = false; | |
1219 return EmptyExpression(); | |
1220 } | |
1221 | 1092 |
| 1093 LanguageMode class_language_mode = language_mode(); |
1222 Scope* scope = NewScope(scope_, BLOCK_SCOPE); | 1094 Scope* scope = NewScope(scope_, BLOCK_SCOPE); |
1223 BlockState block_state(&scope_, scope); | 1095 BlockState block_state(&scope_, scope); |
1224 scope_->SetLanguageMode( | 1096 scope_->SetLanguageMode( |
1225 static_cast<LanguageMode>(class_language_mode | STRICT)); | 1097 static_cast<LanguageMode>(class_language_mode | STRICT)); |
1226 // TODO(marja): Make PreParser use scope names too. | 1098 // TODO(marja): Make PreParser use scope names too. |
1227 // scope_->SetScopeName(name); | 1099 // scope_->SetScopeName(name); |
1228 | 1100 |
1229 bool has_extends = Check(Token::EXTENDS); | 1101 bool has_extends = Check(Token::EXTENDS); |
1230 if (has_extends) { | 1102 if (has_extends) { |
1231 ExpressionClassifier classifier(this); | 1103 ExpressionClassifier classifier(this); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 Expect(Token::RBRACE, CHECK_OK); | 1164 Expect(Token::RBRACE, CHECK_OK); |
1293 return PreParserExpression::Default(); | 1165 return PreParserExpression::Default(); |
1294 } | 1166 } |
1295 } | 1167 } |
1296 | 1168 |
1297 #undef CHECK_OK | 1169 #undef CHECK_OK |
1298 | 1170 |
1299 | 1171 |
1300 } // namespace internal | 1172 } // namespace internal |
1301 } // namespace v8 | 1173 } // namespace v8 |
OLD | NEW |