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_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/base/hashmap.h" | 10 #include "src/base/hashmap.h" |
(...skipping 1532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 // '(' Expression ')' | 1543 // '(' Expression ')' |
1544 // TemplateLiteral | 1544 // TemplateLiteral |
1545 // do Block | 1545 // do Block |
1546 // AsyncFunctionExpression | 1546 // AsyncFunctionExpression |
1547 | 1547 |
1548 int beg_pos = peek_position(); | 1548 int beg_pos = peek_position(); |
1549 switch (peek()) { | 1549 switch (peek()) { |
1550 case Token::THIS: { | 1550 case Token::THIS: { |
1551 BindingPatternUnexpectedToken(classifier); | 1551 BindingPatternUnexpectedToken(classifier); |
1552 Consume(Token::THIS); | 1552 Consume(Token::THIS); |
1553 return this->ThisExpression(factory(), beg_pos); | 1553 return this->ThisExpression(beg_pos); |
1554 } | 1554 } |
1555 | 1555 |
1556 case Token::NULL_LITERAL: | 1556 case Token::NULL_LITERAL: |
1557 case Token::TRUE_LITERAL: | 1557 case Token::TRUE_LITERAL: |
1558 case Token::FALSE_LITERAL: | 1558 case Token::FALSE_LITERAL: |
1559 BindingPatternUnexpectedToken(classifier); | 1559 BindingPatternUnexpectedToken(classifier); |
1560 return this->ExpressionFromLiteral(Next(), beg_pos, scanner(), factory()); | 1560 return this->ExpressionFromLiteral(Next(), beg_pos, scanner(), factory()); |
1561 case Token::SMI: | 1561 case Token::SMI: |
1562 case Token::NUMBER: | 1562 case Token::NUMBER: |
1563 BindingPatternUnexpectedToken(classifier); | 1563 BindingPatternUnexpectedToken(classifier); |
(...skipping 11 matching lines...) Expand all Loading... |
1575 /* falls through */ | 1575 /* falls through */ |
1576 case Token::IDENTIFIER: | 1576 case Token::IDENTIFIER: |
1577 case Token::LET: | 1577 case Token::LET: |
1578 case Token::STATIC: | 1578 case Token::STATIC: |
1579 case Token::YIELD: | 1579 case Token::YIELD: |
1580 case Token::AWAIT: | 1580 case Token::AWAIT: |
1581 case Token::ESCAPED_STRICT_RESERVED_WORD: | 1581 case Token::ESCAPED_STRICT_RESERVED_WORD: |
1582 case Token::FUTURE_STRICT_RESERVED_WORD: { | 1582 case Token::FUTURE_STRICT_RESERVED_WORD: { |
1583 // Using eval or arguments in this context is OK even in strict mode. | 1583 // Using eval or arguments in this context is OK even in strict mode. |
1584 IdentifierT name = ParseAndClassifyIdentifier(classifier, CHECK_OK); | 1584 IdentifierT name = ParseAndClassifyIdentifier(classifier, CHECK_OK); |
1585 return this->ExpressionFromIdentifier( | 1585 return this->ExpressionFromIdentifier(name, beg_pos, |
1586 name, beg_pos, scanner()->location().end_pos, factory()); | 1586 scanner()->location().end_pos); |
1587 } | 1587 } |
1588 | 1588 |
1589 case Token::STRING: { | 1589 case Token::STRING: { |
1590 BindingPatternUnexpectedToken(classifier); | 1590 BindingPatternUnexpectedToken(classifier); |
1591 Consume(Token::STRING); | 1591 Consume(Token::STRING); |
1592 return this->ExpressionFromString(beg_pos, scanner(), factory()); | 1592 return this->ExpressionFromString(beg_pos, scanner(), factory()); |
1593 } | 1593 } |
1594 | 1594 |
1595 case Token::ASSIGN_DIV: | 1595 case Token::ASSIGN_DIV: |
1596 classifier->RecordBindingPatternError( | 1596 classifier->RecordBindingPatternError( |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2000 if (is_async_function()) { | 2000 if (is_async_function()) { |
2001 classifier->RecordPatternError( | 2001 classifier->RecordPatternError( |
2002 Scanner::Location(next_beg_pos, next_end_pos), | 2002 Scanner::Location(next_beg_pos, next_end_pos), |
2003 MessageTemplate::kAwaitBindingIdentifier); | 2003 MessageTemplate::kAwaitBindingIdentifier); |
2004 } else { | 2004 } else { |
2005 classifier->RecordAsyncArrowFormalParametersError( | 2005 classifier->RecordAsyncArrowFormalParametersError( |
2006 Scanner::Location(next_beg_pos, next_end_pos), | 2006 Scanner::Location(next_beg_pos, next_end_pos), |
2007 MessageTemplate::kAwaitBindingIdentifier); | 2007 MessageTemplate::kAwaitBindingIdentifier); |
2008 } | 2008 } |
2009 } | 2009 } |
2010 ExpressionT lhs = this->ExpressionFromIdentifier(*name, next_beg_pos, | 2010 ExpressionT lhs = |
2011 next_end_pos, factory()); | 2011 this->ExpressionFromIdentifier(*name, next_beg_pos, next_end_pos); |
2012 CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); | 2012 CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); |
2013 | 2013 |
2014 ExpressionT value; | 2014 ExpressionT value; |
2015 if (peek() == Token::ASSIGN) { | 2015 if (peek() == Token::ASSIGN) { |
2016 Consume(Token::ASSIGN); | 2016 Consume(Token::ASSIGN); |
2017 ExpressionClassifier rhs_classifier(this); | 2017 ExpressionClassifier rhs_classifier(this); |
2018 ExpressionT rhs = this->ParseAssignmentExpression( | 2018 ExpressionT rhs = this->ParseAssignmentExpression( |
2019 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2019 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
2020 Traits::RewriteNonPattern(&rhs_classifier, | 2020 Traits::RewriteNonPattern(&rhs_classifier, |
2021 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2021 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2310 if (!is_async && !parenthesized_formals) { | 2310 if (!is_async && !parenthesized_formals) { |
2311 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); | 2311 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); |
2312 } | 2312 } |
2313 ExpressionT expression = this->ParseConditionalExpression( | 2313 ExpressionT expression = this->ParseConditionalExpression( |
2314 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2314 accept_IN, &arrow_formals_classifier, CHECK_OK); |
2315 | 2315 |
2316 if (is_async && peek_any_identifier() && PeekAhead() == Token::ARROW) { | 2316 if (is_async && peek_any_identifier() && PeekAhead() == Token::ARROW) { |
2317 // async Identifier => AsyncConciseBody | 2317 // async Identifier => AsyncConciseBody |
2318 IdentifierT name = | 2318 IdentifierT name = |
2319 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); | 2319 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); |
2320 expression = this->ExpressionFromIdentifier( | 2320 expression = this->ExpressionFromIdentifier(name, position(), |
2321 name, position(), scanner()->location().end_pos, factory()); | 2321 scanner()->location().end_pos); |
2322 } | 2322 } |
2323 | 2323 |
2324 if (peek() == Token::ARROW) { | 2324 if (peek() == Token::ARROW) { |
2325 Scanner::Location arrow_loc = scanner()->peek_location(); | 2325 Scanner::Location arrow_loc = scanner()->peek_location(); |
2326 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, | 2326 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, |
2327 parenthesized_formals, is_async, CHECK_OK); | 2327 parenthesized_formals, is_async, CHECK_OK); |
2328 // This reads strangely, but is correct: it checks whether any | 2328 // This reads strangely, but is correct: it checks whether any |
2329 // sub-expression of the parameter list failed to be a valid formal | 2329 // sub-expression of the parameter list failed to be a valid formal |
2330 // parameter initializer. Since YieldExpressions are banned anywhere | 2330 // parameter initializer. Since YieldExpressions are banned anywhere |
2331 // in an arrow parameter list, this is correct. | 2331 // in an arrow parameter list, this is correct. |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2755 | 2755 |
2756 // Possibly async arrow formals --- record ExpressionError just in case. | 2756 // Possibly async arrow formals --- record ExpressionError just in case. |
2757 ExpressionUnexpectedToken(classifier); | 2757 ExpressionUnexpectedToken(classifier); |
2758 classifier->RecordAsyncBindingPatternError( | 2758 classifier->RecordAsyncBindingPatternError( |
2759 Scanner::Location(beg_pos, scanner()->location().end_pos), | 2759 Scanner::Location(beg_pos, scanner()->location().end_pos), |
2760 MessageTemplate::kAwaitBindingIdentifier); | 2760 MessageTemplate::kAwaitBindingIdentifier); |
2761 classifier->RecordAsyncArrowFormalParametersError( | 2761 classifier->RecordAsyncArrowFormalParametersError( |
2762 Scanner::Location(beg_pos, scanner()->location().end_pos), | 2762 Scanner::Location(beg_pos, scanner()->location().end_pos), |
2763 MessageTemplate::kAwaitBindingIdentifier); | 2763 MessageTemplate::kAwaitBindingIdentifier); |
2764 | 2764 |
2765 return this->ExpressionFromIdentifier( | 2765 return this->ExpressionFromIdentifier(name, beg_pos, |
2766 name, beg_pos, scanner()->location().end_pos, factory()); | 2766 scanner()->location().end_pos); |
2767 } | 2767 } |
2768 default: | 2768 default: |
2769 break; | 2769 break; |
2770 } | 2770 } |
2771 | 2771 |
2772 int await_pos = peek_position(); | 2772 int await_pos = peek_position(); |
2773 Consume(Token::AWAIT); | 2773 Consume(Token::AWAIT); |
2774 | 2774 |
2775 ExpressionT value = ParseUnaryExpression(classifier, CHECK_OK); | 2775 ExpressionT value = ParseUnaryExpression(classifier, CHECK_OK); |
2776 | 2776 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2914 if (spread_pos.IsValid()) { | 2914 if (spread_pos.IsValid()) { |
2915 args = Traits::PrepareSpreadArguments(args); | 2915 args = Traits::PrepareSpreadArguments(args); |
2916 result = Traits::SpreadCall(result, args, pos); | 2916 result = Traits::SpreadCall(result, args, pos); |
2917 } else { | 2917 } else { |
2918 result = factory()->NewCall(result, args, pos); | 2918 result = factory()->NewCall(result, args, pos); |
2919 } | 2919 } |
2920 | 2920 |
2921 // Explicit calls to the super constructor using super() perform an | 2921 // Explicit calls to the super constructor using super() perform an |
2922 // implicit binding assignment to the 'this' variable. | 2922 // implicit binding assignment to the 'this' variable. |
2923 if (is_super_call) { | 2923 if (is_super_call) { |
2924 ExpressionT this_expr = this->ThisExpression(factory(), pos); | 2924 ExpressionT this_expr = this->ThisExpression(pos); |
2925 result = | 2925 result = |
2926 factory()->NewAssignment(Token::INIT, this_expr, result, pos); | 2926 factory()->NewAssignment(Token::INIT, this_expr, result, pos); |
2927 } | 2927 } |
2928 | 2928 |
2929 if (fni_ != NULL) fni_->RemoveLastFunction(); | 2929 if (fni_ != NULL) fni_->RemoveLastFunction(); |
2930 break; | 2930 break; |
2931 } | 2931 } |
2932 | 2932 |
2933 case Token::PERIOD: { | 2933 case Token::PERIOD: { |
2934 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2934 CheckNoTailCallExpressions(classifier, CHECK_OK); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3141 int pos = position(); | 3141 int pos = position(); |
3142 ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); | 3142 ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); |
3143 | 3143 |
3144 if (!GetReceiverScope()->is_function_scope()) { | 3144 if (!GetReceiverScope()->is_function_scope()) { |
3145 ReportMessageAt(scanner()->location(), | 3145 ReportMessageAt(scanner()->location(), |
3146 MessageTemplate::kUnexpectedNewTarget); | 3146 MessageTemplate::kUnexpectedNewTarget); |
3147 *ok = false; | 3147 *ok = false; |
3148 return this->EmptyExpression(); | 3148 return this->EmptyExpression(); |
3149 } | 3149 } |
3150 | 3150 |
3151 return this->NewTargetExpression(factory(), pos); | 3151 return this->NewTargetExpression(pos); |
3152 } | 3152 } |
3153 | 3153 |
3154 template <class Traits> | 3154 template <class Traits> |
3155 typename ParserBase<Traits>::ExpressionT | 3155 typename ParserBase<Traits>::ExpressionT |
3156 ParserBase<Traits>::ParseMemberExpressionContinuation( | 3156 ParserBase<Traits>::ParseMemberExpressionContinuation( |
3157 ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, | 3157 ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, |
3158 bool* ok) { | 3158 bool* ok) { |
3159 // Parses this part of MemberExpression: | 3159 // Parses this part of MemberExpression: |
3160 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* | 3160 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* |
3161 while (true) { | 3161 while (true) { |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3696 has_seen_constructor_ = true; | 3696 has_seen_constructor_ = true; |
3697 return; | 3697 return; |
3698 } | 3698 } |
3699 } | 3699 } |
3700 | 3700 |
3701 | 3701 |
3702 } // namespace internal | 3702 } // namespace internal |
3703 } // namespace v8 | 3703 } // namespace v8 |
3704 | 3704 |
3705 #endif // V8_PARSING_PARSER_BASE_H | 3705 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |