Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/parsing/parser-base.h

Issue 1691653002: Remove kIsPossibleArrowFormals option from ParseAssignmentExpression (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@smaller-cleanup
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_PARSING_PARSER_BASE_H 5 #ifndef V8_PARSING_PARSER_BASE_H
6 #define V8_PARSING_PARSER_BASE_H 6 #define V8_PARSING_PARSER_BASE_H
7 7
8 #include "src/ast/scopes.h" 8 #include "src/ast/scopes.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/hashmap.h" 10 #include "src/hashmap.h"
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 IdentifierT ParseIdentifierName(bool* ok); 721 IdentifierT ParseIdentifierName(bool* ok);
722 722
723 ExpressionT ParseRegExpLiteral(bool seen_equal, 723 ExpressionT ParseRegExpLiteral(bool seen_equal,
724 ExpressionClassifier* classifier, bool* ok); 724 ExpressionClassifier* classifier, bool* ok);
725 725
726 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier, 726 ExpressionT ParsePrimaryExpression(ExpressionClassifier* classifier,
727 bool* ok); 727 bool* ok);
728 ExpressionT ParseExpression(bool accept_IN, bool* ok); 728 ExpressionT ParseExpression(bool accept_IN, bool* ok);
729 ExpressionT ParseExpression(bool accept_IN, ExpressionClassifier* classifier, 729 ExpressionT ParseExpression(bool accept_IN, ExpressionClassifier* classifier,
730 bool* ok); 730 bool* ok);
731 ExpressionT ParseExpression(bool accept_IN, int flags,
732 ExpressionClassifier* classifier, bool* ok);
733 ExpressionT ParseArrayLiteral(ExpressionClassifier* classifier, bool* ok); 731 ExpressionT ParseArrayLiteral(ExpressionClassifier* classifier, bool* ok);
734 ExpressionT ParsePropertyName(IdentifierT* name, bool* is_get, bool* is_set, 732 ExpressionT ParsePropertyName(IdentifierT* name, bool* is_get, bool* is_set,
735 bool* is_computed_name, 733 bool* is_computed_name,
736 ExpressionClassifier* classifier, bool* ok); 734 ExpressionClassifier* classifier, bool* ok);
737 ExpressionT ParseObjectLiteral(ExpressionClassifier* classifier, bool* ok); 735 ExpressionT ParseObjectLiteral(ExpressionClassifier* classifier, bool* ok);
738 ObjectLiteralPropertyT ParsePropertyDefinition( 736 ObjectLiteralPropertyT ParsePropertyDefinition(
739 ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends, 737 ObjectLiteralCheckerBase* checker, bool in_class, bool has_extends,
740 bool is_static, bool* is_computed_name, bool* has_seen_constructor, 738 bool is_static, bool* is_computed_name, bool* has_seen_constructor,
741 ExpressionClassifier* classifier, IdentifierT* name, bool* ok); 739 ExpressionClassifier* classifier, IdentifierT* name, bool* ok);
742 typename Traits::Type::ExpressionList ParseArguments( 740 typename Traits::Type::ExpressionList ParseArguments(
743 Scanner::Location* first_spread_pos, ExpressionClassifier* classifier, 741 Scanner::Location* first_spread_pos, ExpressionClassifier* classifier,
744 bool* ok); 742 bool* ok);
745 743
746 enum AssignmentExpressionFlags { 744 enum AssignmentExpressionFlags {
747 kIsNormalAssignment = 0, 745 kIsNormalAssignment,
748 kIsPossiblePatternElement = 1 << 0, 746 kIsPossiblePatternElement
749 kIsPossibleArrowFormals = 1 << 1
750 }; 747 };
751 748
752 ExpressionT ParseAssignmentExpression(bool accept_IN, int flags, 749 ExpressionT ParseAssignmentExpression(bool accept_IN,
750 AssignmentExpressionFlags flags,
753 ExpressionClassifier* classifier, 751 ExpressionClassifier* classifier,
754 bool* ok); 752 bool* ok);
755 ExpressionT ParseAssignmentExpression(bool accept_IN, 753 ExpressionT ParseAssignmentExpression(bool accept_IN,
756 ExpressionClassifier* classifier, 754 ExpressionClassifier* classifier,
757 bool* ok) { 755 bool* ok) {
758 return ParseAssignmentExpression(accept_IN, kIsNormalAssignment, classifier, 756 return ParseAssignmentExpression(accept_IN, kIsNormalAssignment, classifier,
759 ok); 757 ok);
760 } 758 }
761 ExpressionT ParseYieldExpression(ExpressionClassifier* classifier, bool* ok); 759 ExpressionT ParseYieldExpression(ExpressionClassifier* classifier, bool* ok);
762 ExpressionT ParseConditionalExpression(bool accept_IN, 760 ExpressionT ParseConditionalExpression(bool accept_IN,
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 return factory()->NewEmptyParentheses(beg_pos); 1318 return factory()->NewEmptyParentheses(beg_pos);
1321 } else if (Check(Token::ELLIPSIS)) { 1319 } else if (Check(Token::ELLIPSIS)) {
1322 // (...x)=>x. The continuation that looks for the => is in 1320 // (...x)=>x. The continuation that looks for the => is in
1323 // ParseAssignmentExpression. 1321 // ParseAssignmentExpression.
1324 int ellipsis_pos = position(); 1322 int ellipsis_pos = position();
1325 int expr_pos = peek_position(); 1323 int expr_pos = peek_position();
1326 classifier->RecordExpressionError(scanner()->location(), 1324 classifier->RecordExpressionError(scanner()->location(),
1327 MessageTemplate::kUnexpectedToken, 1325 MessageTemplate::kUnexpectedToken,
1328 Token::String(Token::ELLIPSIS)); 1326 Token::String(Token::ELLIPSIS));
1329 classifier->RecordNonSimpleParameter(); 1327 classifier->RecordNonSimpleParameter();
1330 ExpressionT expr = this->ParseAssignmentExpression( 1328 ExpressionT expr =
1331 true, kIsPossibleArrowFormals, classifier, CHECK_OK); 1329 this->ParseAssignmentExpression(true, classifier, CHECK_OK);
1332 if (!this->IsIdentifier(expr) && !expr->IsObjectLiteral() && 1330 if (!this->IsIdentifier(expr) && !expr->IsObjectLiteral() &&
1333 !expr->IsArrayLiteral()) { 1331 !expr->IsArrayLiteral()) {
1334 classifier->RecordArrowFormalParametersError( 1332 classifier->RecordArrowFormalParametersError(
1335 Scanner::Location(ellipsis_pos, scanner()->location().end_pos), 1333 Scanner::Location(ellipsis_pos, scanner()->location().end_pos),
1336 MessageTemplate::kInvalidRestParameter); 1334 MessageTemplate::kInvalidRestParameter);
1337 } 1335 }
1338 if (peek() == Token::COMMA) { 1336 if (peek() == Token::COMMA) {
1339 ReportMessageAt(scanner()->peek_location(), 1337 ReportMessageAt(scanner()->peek_location(),
1340 MessageTemplate::kParamAfterRest); 1338 MessageTemplate::kParamAfterRest);
1341 *ok = false; 1339 *ok = false;
1342 return this->EmptyExpression(); 1340 return this->EmptyExpression();
1343 } 1341 }
1344 Expect(Token::RPAREN, CHECK_OK); 1342 Expect(Token::RPAREN, CHECK_OK);
1345 return factory()->NewSpread(expr, ellipsis_pos, expr_pos); 1343 return factory()->NewSpread(expr, ellipsis_pos, expr_pos);
1346 } 1344 }
1347 // Heuristically try to detect immediately called functions before 1345 // Heuristically try to detect immediately called functions before
1348 // seeing the call parentheses. 1346 // seeing the call parentheses.
1349 parenthesized_function_ = (peek() == Token::FUNCTION); 1347 parenthesized_function_ = (peek() == Token::FUNCTION);
1350 ExpressionT expr = this->ParseExpression(true, kIsPossibleArrowFormals, 1348 ExpressionT expr = this->ParseExpression(true, classifier, CHECK_OK);
1351 classifier, CHECK_OK);
1352 Expect(Token::RPAREN, CHECK_OK); 1349 Expect(Token::RPAREN, CHECK_OK);
1353 return expr; 1350 return expr;
1354 } 1351 }
1355 1352
1356 case Token::CLASS: { 1353 case Token::CLASS: {
1357 BindingPatternUnexpectedToken(classifier); 1354 BindingPatternUnexpectedToken(classifier);
1358 Consume(Token::CLASS); 1355 Consume(Token::CLASS);
1359 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) { 1356 if (!allow_harmony_sloppy() && is_sloppy(language_mode())) {
1360 ReportMessage(MessageTemplate::kSloppyLexical); 1357 ReportMessage(MessageTemplate::kSloppyLexical);
1361 *ok = false; 1358 *ok = false;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1411 ExpressionClassifier classifier; 1408 ExpressionClassifier classifier;
1412 ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK); 1409 ExpressionT result = ParseExpression(accept_IN, &classifier, CHECK_OK);
1413 result = Traits::RewriteNonPattern(result, &classifier, CHECK_OK); 1410 result = Traits::RewriteNonPattern(result, &classifier, CHECK_OK);
1414 return result; 1411 return result;
1415 } 1412 }
1416 1413
1417 1414
1418 template <class Traits> 1415 template <class Traits>
1419 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression( 1416 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
1420 bool accept_IN, ExpressionClassifier* classifier, bool* ok) { 1417 bool accept_IN, ExpressionClassifier* classifier, bool* ok) {
1421 return ParseExpression(accept_IN, kIsNormalAssignment, classifier, ok);
1422 }
1423
1424
1425 template <class Traits>
1426 typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseExpression(
1427 bool accept_IN, int flags, ExpressionClassifier* classifier, bool* ok) {
1428 // Expression :: 1418 // Expression ::
1429 // AssignmentExpression 1419 // AssignmentExpression
1430 // Expression ',' AssignmentExpression 1420 // Expression ',' AssignmentExpression
1431 1421
1432 ExpressionClassifier binding_classifier; 1422 ExpressionClassifier binding_classifier;
1433 ExpressionT result = this->ParseAssignmentExpression( 1423 ExpressionT result =
1434 accept_IN, flags, &binding_classifier, CHECK_OK); 1424 this->ParseAssignmentExpression(accept_IN, &binding_classifier, CHECK_OK);
1435 classifier->Accumulate(binding_classifier, 1425 classifier->Accumulate(binding_classifier,
1436 ExpressionClassifier::AllProductions); 1426 ExpressionClassifier::AllProductions);
1437 bool is_simple_parameter_list = this->IsIdentifier(result); 1427 bool is_simple_parameter_list = this->IsIdentifier(result);
1438 bool seen_rest = false; 1428 bool seen_rest = false;
1439 while (peek() == Token::COMMA) { 1429 while (peek() == Token::COMMA) {
1440 if (seen_rest) { 1430 if (seen_rest) {
1441 // At this point the production can't possibly be valid, but we don't know 1431 // At this point the production can't possibly be valid, but we don't know
1442 // which error to signal. 1432 // which error to signal.
1443 classifier->RecordArrowFormalParametersError( 1433 classifier->RecordArrowFormalParametersError(
1444 scanner()->peek_location(), MessageTemplate::kParamAfterRest); 1434 scanner()->peek_location(), MessageTemplate::kParamAfterRest);
1445 } 1435 }
1446 Consume(Token::COMMA); 1436 Consume(Token::COMMA);
1447 bool is_rest = false; 1437 bool is_rest = false;
1448 if (peek() == Token::ELLIPSIS) { 1438 if (peek() == Token::ELLIPSIS) {
1449 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only 1439 // 'x, y, ...z' in CoverParenthesizedExpressionAndArrowParameterList only
1450 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a 1440 // as the formal parameters of'(x, y, ...z) => foo', and is not itself a
1451 // valid expression or binding pattern. 1441 // valid expression or binding pattern.
1452 ExpressionUnexpectedToken(classifier); 1442 ExpressionUnexpectedToken(classifier);
1453 BindingPatternUnexpectedToken(classifier); 1443 BindingPatternUnexpectedToken(classifier);
1454 Consume(Token::ELLIPSIS); 1444 Consume(Token::ELLIPSIS);
1455 seen_rest = is_rest = true; 1445 seen_rest = is_rest = true;
1456 } 1446 }
1457 int pos = position(), expr_pos = peek_position(); 1447 int pos = position(), expr_pos = peek_position();
1458 ExpressionT right = this->ParseAssignmentExpression( 1448 ExpressionT right = this->ParseAssignmentExpression(
1459 accept_IN, flags, &binding_classifier, CHECK_OK); 1449 accept_IN, &binding_classifier, CHECK_OK);
1460 if (is_rest) { 1450 if (is_rest) {
1461 if (!this->IsIdentifier(right) && !right->IsObjectLiteral() && 1451 if (!this->IsIdentifier(right) && !right->IsObjectLiteral() &&
1462 !right->IsArrayLiteral()) { 1452 !right->IsArrayLiteral()) {
1463 classifier->RecordArrowFormalParametersError( 1453 classifier->RecordArrowFormalParametersError(
1464 Scanner::Location(pos, scanner()->location().end_pos), 1454 Scanner::Location(pos, scanner()->location().end_pos),
1465 MessageTemplate::kInvalidRestParameter); 1455 MessageTemplate::kInvalidRestParameter);
1466 } 1456 }
1467 right = factory()->NewSpread(right, pos, expr_pos); 1457 right = factory()->NewSpread(right, pos, expr_pos);
1468 } 1458 }
1469 is_simple_parameter_list = 1459 is_simple_parameter_list =
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 // the parser and preparser 1918 // the parser and preparser
1929 Traits::MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); 1919 Traits::MaterializeUnspreadArgumentsLiterals(unspread_sequences_count);
1930 } 1920 }
1931 1921
1932 return result; 1922 return result;
1933 } 1923 }
1934 1924
1935 // Precedence = 2 1925 // Precedence = 2
1936 template <class Traits> 1926 template <class Traits>
1937 typename ParserBase<Traits>::ExpressionT 1927 typename ParserBase<Traits>::ExpressionT
1938 ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN, int flags, 1928 ParserBase<Traits>::ParseAssignmentExpression(bool accept_IN,
1929 AssignmentExpressionFlags flags,
1939 ExpressionClassifier* classifier, 1930 ExpressionClassifier* classifier,
1940 bool* ok) { 1931 bool* ok) {
1941 // AssignmentExpression :: 1932 // AssignmentExpression ::
1942 // ConditionalExpression 1933 // ConditionalExpression
1943 // ArrowFunction 1934 // ArrowFunction
1944 // YieldExpression 1935 // YieldExpression
1945 // LeftHandSideExpression AssignmentOperator AssignmentExpression 1936 // LeftHandSideExpression AssignmentOperator AssignmentExpression
1946 bool maybe_pattern_element = flags & kIsPossiblePatternElement; 1937 bool maybe_pattern_element = flags == kIsPossiblePatternElement;
1947 bool maybe_arrow_formals = flags & kIsPossibleArrowFormals;
1948 bool is_destructuring_assignment = false; 1938 bool is_destructuring_assignment = false;
1949 int lhs_beg_pos = peek_position(); 1939 int lhs_beg_pos = peek_position();
1950 1940
1951 if (peek() == Token::YIELD && is_generator()) { 1941 if (peek() == Token::YIELD && is_generator()) {
1952 return this->ParseYieldExpression(classifier, ok); 1942 return this->ParseYieldExpression(classifier, ok);
1953 } 1943 }
1954 1944
1955 FuncNameInferrer::State fni_state(fni_); 1945 FuncNameInferrer::State fni_state(fni_);
1956 ParserBase<Traits>::Checkpoint checkpoint(this); 1946 ParserBase<Traits>::Checkpoint checkpoint(this);
1957 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder()); 1947 ExpressionClassifier arrow_formals_classifier(classifier->duplicate_finder());
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2025 if (!(allow_harmony_destructuring_bind() || 2015 if (!(allow_harmony_destructuring_bind() ||
2026 allow_harmony_default_parameters())) { 2016 allow_harmony_default_parameters())) {
2027 BindingPatternUnexpectedToken(classifier); 2017 BindingPatternUnexpectedToken(classifier);
2028 } 2018 }
2029 2019
2030 if (allow_harmony_destructuring_assignment() && maybe_pattern && 2020 if (allow_harmony_destructuring_assignment() && maybe_pattern &&
2031 peek() == Token::ASSIGN) { 2021 peek() == Token::ASSIGN) {
2032 classifier->ForgiveCoverInitializedNameError(); 2022 classifier->ForgiveCoverInitializedNameError();
2033 ValidateAssignmentPattern(classifier, CHECK_OK); 2023 ValidateAssignmentPattern(classifier, CHECK_OK);
2034 is_destructuring_assignment = true; 2024 is_destructuring_assignment = true;
2035 } else if (maybe_arrow_formals) { 2025 } else if (allow_harmony_default_parameters() &&
2026 !allow_harmony_destructuring_assignment()) {
2027 // TODO(adamk): This branch should be removed once the destructuring
2028 // assignment and default parameter flags are removed.
2036 expression = this->ClassifyAndRewriteReferenceExpression( 2029 expression = this->ClassifyAndRewriteReferenceExpression(
2037 classifier, expression, lhs_beg_pos, scanner()->location().end_pos, 2030 classifier, expression, lhs_beg_pos, scanner()->location().end_pos,
2038 MessageTemplate::kInvalidLhsInAssignment); 2031 MessageTemplate::kInvalidLhsInAssignment);
2039 } else { 2032 } else {
2040 if (maybe_pattern_element) { 2033 if (maybe_pattern_element) {
2041 CheckDestructuringElement(expression, classifier, lhs_beg_pos, 2034 CheckDestructuringElement(expression, classifier, lhs_beg_pos,
2042 scanner()->location().end_pos); 2035 scanner()->location().end_pos);
2043 } 2036 }
2044 expression = this->CheckAndRewriteReferenceExpression( 2037 expression = this->CheckAndRewriteReferenceExpression(
2045 expression, lhs_beg_pos, scanner()->location().end_pos, 2038 expression, lhs_beg_pos, scanner()->location().end_pos,
(...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after
3355 return; 3348 return;
3356 } 3349 }
3357 has_seen_constructor_ = true; 3350 has_seen_constructor_ = true;
3358 return; 3351 return;
3359 } 3352 }
3360 } 3353 }
3361 } // namespace internal 3354 } // namespace internal
3362 } // namespace v8 3355 } // namespace v8
3363 3356
3364 #endif // V8_PARSING_PARSER_BASE_H 3357 #endif // V8_PARSING_PARSER_BASE_H
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698