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 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 } | 394 } |
395 | 395 |
396 | 396 |
397 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { | 397 PreParser::Statement PreParser::ParseClassDeclaration(bool* ok) { |
398 Expect(Token::CLASS, CHECK_OK); | 398 Expect(Token::CLASS, CHECK_OK); |
399 | 399 |
400 int pos = position(); | 400 int pos = position(); |
401 bool is_strict_reserved = false; | 401 bool is_strict_reserved = false; |
402 Identifier name = | 402 Identifier name = |
403 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); | 403 ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); |
404 ParseClassLiteral(nullptr, name, scanner()->location(), is_strict_reserved, | 404 ExpressionClassifier no_classifier(this); |
405 pos, CHECK_OK); | 405 ParseClassLiteral(name, scanner()->location(), is_strict_reserved, pos, |
| 406 CHECK_OK); |
406 return Statement::Default(); | 407 return Statement::Default(); |
407 } | 408 } |
408 | 409 |
409 | 410 |
410 PreParser::Statement PreParser::ParseBlock(bool* ok) { | 411 PreParser::Statement PreParser::ParseBlock(bool* ok) { |
411 // Block :: | 412 // Block :: |
412 // '{' StatementList '}' | 413 // '{' StatementList '}' |
413 | 414 |
414 Expect(Token::LBRACE, CHECK_OK); | 415 Expect(Token::LBRACE, CHECK_OK); |
415 Statement final = Statement::Default(); | 416 Statement final = Statement::Default(); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 // block. | 495 // block. |
495 int nvars = 0; // the number of variables declared | 496 int nvars = 0; // the number of variables declared |
496 int bindings_start = peek_position(); | 497 int bindings_start = peek_position(); |
497 do { | 498 do { |
498 // Parse binding pattern. | 499 // Parse binding pattern. |
499 if (nvars > 0) Consume(Token::COMMA); | 500 if (nvars > 0) Consume(Token::COMMA); |
500 int decl_pos = peek_position(); | 501 int decl_pos = peek_position(); |
501 PreParserExpression pattern = PreParserExpression::Default(); | 502 PreParserExpression pattern = PreParserExpression::Default(); |
502 { | 503 { |
503 ExpressionClassifier pattern_classifier(this); | 504 ExpressionClassifier pattern_classifier(this); |
504 pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); | 505 pattern = ParsePrimaryExpression(CHECK_OK); |
505 | 506 |
506 ValidateBindingPattern(&pattern_classifier, CHECK_OK); | 507 ValidateBindingPattern(CHECK_OK); |
507 if (lexical) { | 508 if (lexical) ValidateLetPattern(CHECK_OK); |
508 ValidateLetPattern(&pattern_classifier, CHECK_OK); | |
509 } | |
510 } | 509 } |
511 | 510 |
512 is_pattern = pattern.IsObjectLiteral() || pattern.IsArrayLiteral(); | 511 is_pattern = pattern.IsObjectLiteral() || pattern.IsArrayLiteral(); |
513 | 512 |
514 Scanner::Location variable_loc = scanner()->location(); | 513 Scanner::Location variable_loc = scanner()->location(); |
515 nvars++; | 514 nvars++; |
516 if (Check(Token::ASSIGN)) { | 515 if (Check(Token::ASSIGN)) { |
517 ExpressionClassifier classifier(this); | 516 ExpressionClassifier classifier(this); |
518 ParseAssignmentExpression(var_context != kForStatement, &classifier, | 517 ParseAssignmentExpression(var_context != kForStatement, CHECK_OK); |
519 CHECK_OK); | 518 ValidateExpression(CHECK_OK); |
520 ValidateExpression(&classifier, CHECK_OK); | |
521 | 519 |
522 variable_loc.end_pos = scanner()->location().end_pos; | 520 variable_loc.end_pos = scanner()->location().end_pos; |
523 if (first_initializer_loc && !first_initializer_loc->IsValid()) { | 521 if (first_initializer_loc && !first_initializer_loc->IsValid()) { |
524 *first_initializer_loc = variable_loc; | 522 *first_initializer_loc = variable_loc; |
525 } | 523 } |
526 } else if ((require_initializer || is_pattern) && | 524 } else if ((require_initializer || is_pattern) && |
527 (var_context != kForStatement || !PeekInOrOf())) { | 525 (var_context != kForStatement || !PeekInOrOf())) { |
528 ReportMessageAt( | 526 ReportMessageAt( |
529 Scanner::Location(decl_pos, scanner()->location().end_pos), | 527 Scanner::Location(decl_pos, scanner()->location().end_pos), |
530 MessageTemplate::kDeclarationMissingInitializer, | 528 MessageTemplate::kDeclarationMissingInitializer, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
575 ReportUnexpectedToken(Next()); | 573 ReportUnexpectedToken(Next()); |
576 *ok = false; | 574 *ok = false; |
577 return Statement::Default(); | 575 return Statement::Default(); |
578 | 576 |
579 default: | 577 default: |
580 break; | 578 break; |
581 } | 579 } |
582 | 580 |
583 bool starts_with_identifier = peek_any_identifier(); | 581 bool starts_with_identifier = peek_any_identifier(); |
584 ExpressionClassifier classifier(this); | 582 ExpressionClassifier classifier(this); |
585 Expression expr = ParseExpression(true, &classifier, CHECK_OK); | 583 Expression expr = ParseExpressionCoverGrammar(true, CHECK_OK); |
586 ValidateExpression(&classifier, CHECK_OK); | 584 ValidateExpression(CHECK_OK); |
587 | 585 |
588 // Even if the expression starts with an identifier, it is not necessarily an | 586 // Even if the expression starts with an identifier, it is not necessarily an |
589 // identifier. For example, "foo + bar" starts with an identifier but is not | 587 // identifier. For example, "foo + bar" starts with an identifier but is not |
590 // an identifier. | 588 // an identifier. |
591 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { | 589 if (starts_with_identifier && expr.IsIdentifier() && peek() == Token::COLON) { |
592 // Expression is a single identifier, and not, e.g., a parenthesized | 590 // Expression is a single identifier, and not, e.g., a parenthesized |
593 // identifier. | 591 // identifier. |
594 DCHECK(!expr.AsIdentifier().IsEnum()); | 592 DCHECK(!expr.AsIdentifier().IsEnum()); |
595 DCHECK(!parsing_module_ || !expr.AsIdentifier().IsAwait()); | 593 DCHECK(!parsing_module_ || !expr.AsIdentifier().IsAwait()); |
596 DCHECK(is_sloppy(language_mode()) || | 594 DCHECK(is_sloppy(language_mode()) || |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 } | 834 } |
837 ReportMessageAt(first_initializer_loc, | 835 ReportMessageAt(first_initializer_loc, |
838 MessageTemplate::kForInOfLoopInitializer, | 836 MessageTemplate::kForInOfLoopInitializer, |
839 ForEachStatement::VisitModeString(mode)); | 837 ForEachStatement::VisitModeString(mode)); |
840 *ok = false; | 838 *ok = false; |
841 return Statement::Default(); | 839 return Statement::Default(); |
842 } | 840 } |
843 | 841 |
844 if (mode == ForEachStatement::ITERATE) { | 842 if (mode == ForEachStatement::ITERATE) { |
845 ExpressionClassifier classifier(this); | 843 ExpressionClassifier classifier(this); |
846 ParseAssignmentExpression(true, &classifier, CHECK_OK); | 844 ParseAssignmentExpression(true, CHECK_OK); |
847 RewriteNonPattern(&classifier, CHECK_OK); | 845 RewriteNonPattern(CHECK_OK); |
848 } else { | 846 } else { |
849 ParseExpression(true, CHECK_OK); | 847 ParseExpression(true, CHECK_OK); |
850 } | 848 } |
851 | 849 |
852 Expect(Token::RPAREN, CHECK_OK); | 850 Expect(Token::RPAREN, CHECK_OK); |
853 { | 851 { |
854 ReturnExprScope no_tail_calls(function_state_, | 852 ReturnExprScope no_tail_calls(function_state_, |
855 ReturnExprContext::kInsideForInOfBody); | 853 ReturnExprContext::kInsideForInOfBody); |
856 ParseScopedStatement(true, CHECK_OK); | 854 ParseScopedStatement(true, CHECK_OK); |
857 } | 855 } |
858 return Statement::Default(); | 856 return Statement::Default(); |
859 } | 857 } |
860 } else { | 858 } else { |
861 int lhs_beg_pos = peek_position(); | 859 int lhs_beg_pos = peek_position(); |
862 ExpressionClassifier classifier(this); | 860 ExpressionClassifier classifier(this); |
863 Expression lhs = ParseExpression(false, &classifier, CHECK_OK); | 861 Expression lhs = ParseExpressionCoverGrammar(false, CHECK_OK); |
864 int lhs_end_pos = scanner()->location().end_pos; | 862 int lhs_end_pos = scanner()->location().end_pos; |
865 bool is_for_each = CheckInOrOf(&mode, CHECK_OK); | 863 bool is_for_each = CheckInOrOf(&mode, CHECK_OK); |
866 bool is_destructuring = is_for_each && | 864 bool is_destructuring = is_for_each && |
867 (lhs->IsArrayLiteral() || lhs->IsObjectLiteral()); | 865 (lhs->IsArrayLiteral() || lhs->IsObjectLiteral()); |
868 | 866 |
869 if (is_destructuring) { | 867 if (is_destructuring) { |
870 ValidateAssignmentPattern(&classifier, CHECK_OK); | 868 ValidateAssignmentPattern(CHECK_OK); |
871 } else { | 869 } else { |
872 ValidateExpression(&classifier, CHECK_OK); | 870 ValidateExpression(CHECK_OK); |
873 } | 871 } |
874 | 872 |
875 if (is_for_each) { | 873 if (is_for_each) { |
876 if (!is_destructuring) { | 874 if (!is_destructuring) { |
877 lhs = CheckAndRewriteReferenceExpression( | 875 lhs = CheckAndRewriteReferenceExpression( |
878 lhs, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor, | 876 lhs, lhs_beg_pos, lhs_end_pos, MessageTemplate::kInvalidLhsInFor, |
879 kSyntaxError, CHECK_OK); | 877 kSyntaxError, CHECK_OK); |
880 } | 878 } |
881 | 879 |
882 if (mode == ForEachStatement::ITERATE) { | 880 if (mode == ForEachStatement::ITERATE) { |
883 ExpressionClassifier classifier(this); | 881 ExpressionClassifier classifier(this); |
884 ParseAssignmentExpression(true, &classifier, CHECK_OK); | 882 ParseAssignmentExpression(true, CHECK_OK); |
885 RewriteNonPattern(&classifier, CHECK_OK); | 883 RewriteNonPattern(CHECK_OK); |
886 } else { | 884 } else { |
887 ParseExpression(true, CHECK_OK); | 885 ParseExpression(true, CHECK_OK); |
888 } | 886 } |
889 | 887 |
890 Expect(Token::RPAREN, CHECK_OK); | 888 Expect(Token::RPAREN, CHECK_OK); |
891 { | 889 { |
892 BlockState block_state(&scope_state_); | 890 BlockState block_state(&scope_state_); |
893 ParseScopedStatement(true, CHECK_OK); | 891 ParseScopedStatement(true, CHECK_OK); |
894 } | 892 } |
895 return Statement::Default(); | 893 return Statement::Default(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
967 *ok = false; | 965 *ok = false; |
968 return Statement::Default(); | 966 return Statement::Default(); |
969 } | 967 } |
970 TailCallExpressionList tail_call_expressions_in_catch_block(zone()); | 968 TailCallExpressionList tail_call_expressions_in_catch_block(zone()); |
971 bool catch_block_exists = false; | 969 bool catch_block_exists = false; |
972 if (tok == Token::CATCH) { | 970 if (tok == Token::CATCH) { |
973 Consume(Token::CATCH); | 971 Consume(Token::CATCH); |
974 Expect(Token::LPAREN, CHECK_OK); | 972 Expect(Token::LPAREN, CHECK_OK); |
975 Scope* catch_scope = NewScope(CATCH_SCOPE); | 973 Scope* catch_scope = NewScope(CATCH_SCOPE); |
976 ExpressionClassifier pattern_classifier(this); | 974 ExpressionClassifier pattern_classifier(this); |
977 ParsePrimaryExpression(&pattern_classifier, CHECK_OK); | 975 ParsePrimaryExpression(CHECK_OK); |
978 ValidateBindingPattern(&pattern_classifier, CHECK_OK); | 976 ValidateBindingPattern(CHECK_OK); |
979 Expect(Token::RPAREN, CHECK_OK); | 977 Expect(Token::RPAREN, CHECK_OK); |
980 { | 978 { |
981 CollectExpressionsInTailPositionToListScope | 979 CollectExpressionsInTailPositionToListScope |
982 collect_tail_call_expressions_scope( | 980 collect_tail_call_expressions_scope( |
983 function_state_, &tail_call_expressions_in_catch_block); | 981 function_state_, &tail_call_expressions_in_catch_block); |
984 BlockState block_state(&scope_state_, catch_scope); | 982 BlockState block_state(&scope_state_, catch_scope); |
985 { | 983 { |
986 BlockState block_state(&scope_state_); | 984 BlockState block_state(&scope_state_); |
987 ParseBlock(CHECK_OK); | 985 ParseBlock(CHECK_OK); |
988 } | 986 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1043 function_scope->SetLanguageMode(language_mode); | 1041 function_scope->SetLanguageMode(language_mode); |
1044 FunctionState function_state(&function_state_, &scope_state_, function_scope, | 1042 FunctionState function_state(&function_state_, &scope_state_, function_scope, |
1045 kind); | 1043 kind); |
1046 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); | 1044 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); |
1047 ExpressionClassifier formals_classifier(this, &duplicate_finder); | 1045 ExpressionClassifier formals_classifier(this, &duplicate_finder); |
1048 | 1046 |
1049 Expect(Token::LPAREN, CHECK_OK); | 1047 Expect(Token::LPAREN, CHECK_OK); |
1050 int start_position = scanner()->location().beg_pos; | 1048 int start_position = scanner()->location().beg_pos; |
1051 function_scope->set_start_position(start_position); | 1049 function_scope->set_start_position(start_position); |
1052 PreParserFormalParameters formals(function_scope); | 1050 PreParserFormalParameters formals(function_scope); |
1053 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); | 1051 ParseFormalParameterList(&formals, CHECK_OK); |
1054 Expect(Token::RPAREN, CHECK_OK); | 1052 Expect(Token::RPAREN, CHECK_OK); |
1055 int formals_end_position = scanner()->location().end_pos; | 1053 int formals_end_position = scanner()->location().end_pos; |
1056 | 1054 |
1057 CheckArityRestrictions(formals.arity, kind, formals.has_rest, start_position, | 1055 CheckArityRestrictions(formals.arity, kind, formals.has_rest, start_position, |
1058 formals_end_position, CHECK_OK); | 1056 formals_end_position, CHECK_OK); |
1059 | 1057 |
1060 // See Parser::ParseFunctionLiteral for more information about lazy parsing | 1058 // See Parser::ParseFunctionLiteral for more information about lazy parsing |
1061 // and lazy compilation. | 1059 // and lazy compilation. |
1062 bool is_lazily_parsed = (outer_is_script_scope && allow_lazy() && | 1060 bool is_lazily_parsed = (outer_is_script_scope && allow_lazy() && |
1063 !function_state_->this_function_is_parenthesized()); | 1061 !function_state_->this_function_is_parenthesized()); |
1064 | 1062 |
1065 Expect(Token::LBRACE, CHECK_OK); | 1063 Expect(Token::LBRACE, CHECK_OK); |
1066 if (is_lazily_parsed) { | 1064 if (is_lazily_parsed) { |
1067 ParseLazyFunctionLiteralBody(CHECK_OK); | 1065 ParseLazyFunctionLiteralBody(CHECK_OK); |
1068 } else { | 1066 } else { |
1069 ParseStatementList(Token::RBRACE, CHECK_OK); | 1067 ParseStatementList(Token::RBRACE, CHECK_OK); |
1070 } | 1068 } |
1071 Expect(Token::RBRACE, CHECK_OK); | 1069 Expect(Token::RBRACE, CHECK_OK); |
1072 | 1070 |
1073 // Parsing the body may change the language mode in our scope. | 1071 // Parsing the body may change the language mode in our scope. |
1074 language_mode = function_scope->language_mode(); | 1072 language_mode = function_scope->language_mode(); |
1075 | 1073 |
1076 // Validate name and parameter names. We can do this only after parsing the | 1074 // Validate name and parameter names. We can do this only after parsing the |
1077 // function, since the function can declare itself strict. | 1075 // function, since the function can declare itself strict. |
1078 CheckFunctionName(language_mode, function_name, function_name_validity, | 1076 CheckFunctionName(language_mode, function_name, function_name_validity, |
1079 function_name_location, CHECK_OK); | 1077 function_name_location, CHECK_OK); |
1080 const bool allow_duplicate_parameters = | 1078 const bool allow_duplicate_parameters = |
1081 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind); | 1079 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind); |
1082 ValidateFormalParameters(&formals_classifier, language_mode, | 1080 ValidateFormalParameters(language_mode, allow_duplicate_parameters, CHECK_OK); |
1083 allow_duplicate_parameters, CHECK_OK); | |
1084 | 1081 |
1085 if (is_strict(language_mode)) { | 1082 if (is_strict(language_mode)) { |
1086 int end_position = scanner()->location().end_pos; | 1083 int end_position = scanner()->location().end_pos; |
1087 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); | 1084 CheckStrictOctalLiteral(start_position, end_position, CHECK_OK); |
1088 CheckDecimalLiteralWithLeadingZero(use_counts_, start_position, | 1085 CheckDecimalLiteralWithLeadingZero(use_counts_, start_position, |
1089 end_position); | 1086 end_position); |
1090 } | 1087 } |
1091 | 1088 |
1092 return Expression::Default(); | 1089 return Expression::Default(); |
1093 } | 1090 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 int body_end = scanner()->peek_location().end_pos; | 1128 int body_end = scanner()->peek_location().end_pos; |
1132 DeclarationScope* scope = this->scope()->AsDeclarationScope(); | 1129 DeclarationScope* scope = this->scope()->AsDeclarationScope(); |
1133 DCHECK(scope->is_function_scope()); | 1130 DCHECK(scope->is_function_scope()); |
1134 log_->LogFunction(body_start, body_end, | 1131 log_->LogFunction(body_start, body_end, |
1135 function_state_->materialized_literal_count(), | 1132 function_state_->materialized_literal_count(), |
1136 function_state_->expected_property_count(), language_mode(), | 1133 function_state_->expected_property_count(), language_mode(), |
1137 scope->uses_super_property(), scope->calls_eval()); | 1134 scope->uses_super_property(), scope->calls_eval()); |
1138 } | 1135 } |
1139 | 1136 |
1140 PreParserExpression PreParser::ParseClassLiteral( | 1137 PreParserExpression PreParser::ParseClassLiteral( |
1141 ExpressionClassifier* classifier, PreParserIdentifier name, | 1138 PreParserIdentifier name, Scanner::Location class_name_location, |
1142 Scanner::Location class_name_location, bool name_is_strict_reserved, | 1139 bool name_is_strict_reserved, int pos, bool* ok) { |
1143 int pos, bool* ok) { | |
1144 // All parts of a ClassDeclaration and ClassExpression are strict code. | 1140 // All parts of a ClassDeclaration and ClassExpression are strict code. |
1145 if (name_is_strict_reserved) { | 1141 if (name_is_strict_reserved) { |
1146 ReportMessageAt(class_name_location, | 1142 ReportMessageAt(class_name_location, |
1147 MessageTemplate::kUnexpectedStrictReserved); | 1143 MessageTemplate::kUnexpectedStrictReserved); |
1148 *ok = false; | 1144 *ok = false; |
1149 return EmptyExpression(); | 1145 return EmptyExpression(); |
1150 } | 1146 } |
1151 if (IsEvalOrArguments(name)) { | 1147 if (IsEvalOrArguments(name)) { |
1152 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); | 1148 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); |
1153 *ok = false; | 1149 *ok = false; |
1154 return EmptyExpression(); | 1150 return EmptyExpression(); |
1155 } | 1151 } |
1156 | 1152 |
1157 LanguageMode class_language_mode = language_mode(); | 1153 LanguageMode class_language_mode = language_mode(); |
1158 BlockState block_state(&scope_state_); | 1154 BlockState block_state(&scope_state_); |
1159 scope()->SetLanguageMode( | 1155 scope()->SetLanguageMode( |
1160 static_cast<LanguageMode>(class_language_mode | STRICT)); | 1156 static_cast<LanguageMode>(class_language_mode | STRICT)); |
1161 // TODO(marja): Make PreParser use scope names too. | 1157 // TODO(marja): Make PreParser use scope names too. |
1162 // this->scope()->SetScopeName(name); | 1158 // this->scope()->SetScopeName(name); |
1163 | 1159 |
1164 bool has_extends = Check(Token::EXTENDS); | 1160 bool has_extends = Check(Token::EXTENDS); |
1165 if (has_extends) { | 1161 if (has_extends) { |
1166 ExpressionClassifier extends_classifier(this); | 1162 ExpressionClassifier extends_classifier(this); |
1167 ParseLeftHandSideExpression(&extends_classifier, CHECK_OK); | 1163 ParseLeftHandSideExpression(CHECK_OK); |
1168 CheckNoTailCallExpressions(&extends_classifier, CHECK_OK); | 1164 CheckNoTailCallExpressions(CHECK_OK); |
1169 ValidateExpression(&extends_classifier, CHECK_OK); | 1165 ValidateExpression(CHECK_OK); |
1170 if (classifier != nullptr) { | 1166 impl()->AccumulateFormalParameterContainmentErrors(); |
1171 classifier->AccumulateFormalParameterContainmentErrors( | |
1172 &extends_classifier); | |
1173 } | |
1174 } | 1167 } |
1175 | 1168 |
1176 ClassLiteralChecker checker(this); | 1169 ClassLiteralChecker checker(this); |
1177 bool has_seen_constructor = false; | 1170 bool has_seen_constructor = false; |
1178 | 1171 |
1179 Expect(Token::LBRACE, CHECK_OK); | 1172 Expect(Token::LBRACE, CHECK_OK); |
1180 while (peek() != Token::RBRACE) { | 1173 while (peek() != Token::RBRACE) { |
1181 if (Check(Token::SEMICOLON)) continue; | 1174 if (Check(Token::SEMICOLON)) continue; |
1182 const bool in_class = true; | 1175 const bool in_class = true; |
1183 bool is_computed_name = false; // Classes do not care about computed | 1176 bool is_computed_name = false; // Classes do not care about computed |
1184 // property names here. | 1177 // property names here. |
1185 Identifier name; | 1178 Identifier name; |
1186 ExpressionClassifier property_classifier(this); | 1179 ExpressionClassifier property_classifier(this); |
1187 ParsePropertyDefinition(&checker, in_class, has_extends, &is_computed_name, | 1180 ParsePropertyDefinition(&checker, in_class, has_extends, &is_computed_name, |
1188 &has_seen_constructor, &property_classifier, &name, | 1181 &has_seen_constructor, &name, CHECK_OK); |
1189 CHECK_OK); | 1182 ValidateExpression(CHECK_OK); |
1190 ValidateExpression(&property_classifier, CHECK_OK); | 1183 impl()->AccumulateFormalParameterContainmentErrors(); |
1191 if (classifier != nullptr) { | |
1192 classifier->AccumulateFormalParameterContainmentErrors( | |
1193 &property_classifier); | |
1194 } | |
1195 } | 1184 } |
1196 | 1185 |
1197 Expect(Token::RBRACE, CHECK_OK); | 1186 Expect(Token::RBRACE, CHECK_OK); |
1198 | 1187 |
1199 return Expression::Default(); | 1188 return Expression::Default(); |
1200 } | 1189 } |
1201 | 1190 |
1202 | 1191 |
1203 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { | 1192 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { |
1204 // CallRuntime :: | 1193 // CallRuntime :: |
1205 // '%' Identifier Arguments | 1194 // '%' Identifier Arguments |
1206 Expect(Token::MOD, CHECK_OK); | 1195 Expect(Token::MOD, CHECK_OK); |
1207 if (!allow_natives()) { | 1196 if (!allow_natives()) { |
1208 *ok = false; | 1197 *ok = false; |
1209 return Expression::Default(); | 1198 return Expression::Default(); |
1210 } | 1199 } |
1211 // Allow "eval" or "arguments" for backward compatibility. | 1200 // Allow "eval" or "arguments" for backward compatibility. |
1212 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); | 1201 ParseIdentifier(kAllowRestrictedIdentifiers, CHECK_OK); |
1213 Scanner::Location spread_pos; | 1202 Scanner::Location spread_pos; |
1214 ExpressionClassifier classifier(this); | 1203 ExpressionClassifier classifier(this); |
1215 ParseArguments(&spread_pos, &classifier, ok); | 1204 ParseArguments(&spread_pos, ok); |
1216 ValidateExpression(&classifier, CHECK_OK); | 1205 ValidateExpression(CHECK_OK); |
1217 | 1206 |
1218 DCHECK(!spread_pos.IsValid()); | 1207 DCHECK(!spread_pos.IsValid()); |
1219 | 1208 |
1220 return Expression::Default(); | 1209 return Expression::Default(); |
1221 } | 1210 } |
1222 | 1211 |
1223 | 1212 |
1224 PreParserExpression PreParser::ParseDoExpression(bool* ok) { | 1213 PreParserExpression PreParser::ParseDoExpression(bool* ok) { |
1225 // AssignmentExpression :: | 1214 // AssignmentExpression :: |
1226 // do '{' StatementList '}' | 1215 // do '{' StatementList '}' |
1227 Expect(Token::DO, CHECK_OK); | 1216 Expect(Token::DO, CHECK_OK); |
1228 Expect(Token::LBRACE, CHECK_OK); | 1217 Expect(Token::LBRACE, CHECK_OK); |
1229 while (peek() != Token::RBRACE) { | 1218 while (peek() != Token::RBRACE) { |
1230 ParseStatementListItem(CHECK_OK); | 1219 ParseStatementListItem(CHECK_OK); |
1231 } | 1220 } |
1232 Expect(Token::RBRACE, CHECK_OK); | 1221 Expect(Token::RBRACE, CHECK_OK); |
1233 return PreParserExpression::Default(); | 1222 return PreParserExpression::Default(); |
1234 } | 1223 } |
1235 | 1224 |
1236 void PreParser::ParseAsyncArrowSingleExpressionBody( | 1225 void PreParser::ParseAsyncArrowSingleExpressionBody(PreParserStatementList body, |
1237 PreParserStatementList body, bool accept_IN, | 1226 bool accept_IN, int pos, |
1238 ExpressionClassifier* classifier, int pos, bool* ok) { | 1227 bool* ok) { |
1239 scope()->ForceContextAllocation(); | 1228 scope()->ForceContextAllocation(); |
1240 | 1229 |
1241 PreParserExpression return_value = | 1230 PreParserExpression return_value = |
1242 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_CUSTOM(Void)); | 1231 ParseAssignmentExpression(accept_IN, CHECK_OK_CUSTOM(Void)); |
1243 | 1232 |
1244 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); | 1233 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); |
1245 } | 1234 } |
1246 | 1235 |
1247 #undef CHECK_OK | 1236 #undef CHECK_OK |
1248 #undef CHECK_OK_CUSTOM | 1237 #undef CHECK_OK_CUSTOM |
1249 | 1238 |
1250 | 1239 |
1251 } // namespace internal | 1240 } // namespace internal |
1252 } // namespace v8 | 1241 } // namespace v8 |
OLD | NEW |