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 1529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 // '(' Expression ')' | 1540 // '(' Expression ')' |
1541 // TemplateLiteral | 1541 // TemplateLiteral |
1542 // do Block | 1542 // do Block |
1543 // AsyncFunctionExpression | 1543 // AsyncFunctionExpression |
1544 | 1544 |
1545 int beg_pos = peek_position(); | 1545 int beg_pos = peek_position(); |
1546 switch (peek()) { | 1546 switch (peek()) { |
1547 case Token::THIS: { | 1547 case Token::THIS: { |
1548 BindingPatternUnexpectedToken(classifier); | 1548 BindingPatternUnexpectedToken(classifier); |
1549 Consume(Token::THIS); | 1549 Consume(Token::THIS); |
1550 return this->ThisExpression(scope(), factory(), beg_pos); | 1550 return this->ThisExpression(factory(), beg_pos); |
1551 } | 1551 } |
1552 | 1552 |
1553 case Token::NULL_LITERAL: | 1553 case Token::NULL_LITERAL: |
1554 case Token::TRUE_LITERAL: | 1554 case Token::TRUE_LITERAL: |
1555 case Token::FALSE_LITERAL: | 1555 case Token::FALSE_LITERAL: |
1556 BindingPatternUnexpectedToken(classifier); | 1556 BindingPatternUnexpectedToken(classifier); |
1557 return this->ExpressionFromLiteral(Next(), beg_pos, scanner(), factory()); | 1557 return this->ExpressionFromLiteral(Next(), beg_pos, scanner(), factory()); |
1558 case Token::SMI: | 1558 case Token::SMI: |
1559 case Token::NUMBER: | 1559 case Token::NUMBER: |
1560 BindingPatternUnexpectedToken(classifier); | 1560 BindingPatternUnexpectedToken(classifier); |
(...skipping 12 matching lines...) Expand all Loading... |
1573 case Token::IDENTIFIER: | 1573 case Token::IDENTIFIER: |
1574 case Token::LET: | 1574 case Token::LET: |
1575 case Token::STATIC: | 1575 case Token::STATIC: |
1576 case Token::YIELD: | 1576 case Token::YIELD: |
1577 case Token::AWAIT: | 1577 case Token::AWAIT: |
1578 case Token::ESCAPED_STRICT_RESERVED_WORD: | 1578 case Token::ESCAPED_STRICT_RESERVED_WORD: |
1579 case Token::FUTURE_STRICT_RESERVED_WORD: { | 1579 case Token::FUTURE_STRICT_RESERVED_WORD: { |
1580 // Using eval or arguments in this context is OK even in strict mode. | 1580 // Using eval or arguments in this context is OK even in strict mode. |
1581 IdentifierT name = ParseAndClassifyIdentifier(classifier, CHECK_OK); | 1581 IdentifierT name = ParseAndClassifyIdentifier(classifier, CHECK_OK); |
1582 return this->ExpressionFromIdentifier( | 1582 return this->ExpressionFromIdentifier( |
1583 name, beg_pos, scanner()->location().end_pos, scope(), factory()); | 1583 name, beg_pos, scanner()->location().end_pos, factory()); |
1584 } | 1584 } |
1585 | 1585 |
1586 case Token::STRING: { | 1586 case Token::STRING: { |
1587 BindingPatternUnexpectedToken(classifier); | 1587 BindingPatternUnexpectedToken(classifier); |
1588 Consume(Token::STRING); | 1588 Consume(Token::STRING); |
1589 return this->ExpressionFromString(beg_pos, scanner(), factory()); | 1589 return this->ExpressionFromString(beg_pos, scanner(), factory()); |
1590 } | 1590 } |
1591 | 1591 |
1592 case Token::ASSIGN_DIV: | 1592 case Token::ASSIGN_DIV: |
1593 classifier->RecordBindingPatternError( | 1593 classifier->RecordBindingPatternError( |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1997 if (is_async_function()) { | 1997 if (is_async_function()) { |
1998 classifier->RecordPatternError( | 1998 classifier->RecordPatternError( |
1999 Scanner::Location(next_beg_pos, next_end_pos), | 1999 Scanner::Location(next_beg_pos, next_end_pos), |
2000 MessageTemplate::kAwaitBindingIdentifier); | 2000 MessageTemplate::kAwaitBindingIdentifier); |
2001 } else { | 2001 } else { |
2002 classifier->RecordAsyncArrowFormalParametersError( | 2002 classifier->RecordAsyncArrowFormalParametersError( |
2003 Scanner::Location(next_beg_pos, next_end_pos), | 2003 Scanner::Location(next_beg_pos, next_end_pos), |
2004 MessageTemplate::kAwaitBindingIdentifier); | 2004 MessageTemplate::kAwaitBindingIdentifier); |
2005 } | 2005 } |
2006 } | 2006 } |
2007 ExpressionT lhs = this->ExpressionFromIdentifier( | 2007 ExpressionT lhs = this->ExpressionFromIdentifier(*name, next_beg_pos, |
2008 *name, next_beg_pos, next_end_pos, scope(), factory()); | 2008 next_end_pos, factory()); |
2009 CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); | 2009 CheckDestructuringElement(lhs, classifier, next_beg_pos, next_end_pos); |
2010 | 2010 |
2011 ExpressionT value; | 2011 ExpressionT value; |
2012 if (peek() == Token::ASSIGN) { | 2012 if (peek() == Token::ASSIGN) { |
2013 Consume(Token::ASSIGN); | 2013 Consume(Token::ASSIGN); |
2014 ExpressionClassifier rhs_classifier(this); | 2014 ExpressionClassifier rhs_classifier(this); |
2015 ExpressionT rhs = this->ParseAssignmentExpression( | 2015 ExpressionT rhs = this->ParseAssignmentExpression( |
2016 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2016 true, &rhs_classifier, CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
2017 Traits::RewriteNonPattern(&rhs_classifier, | 2017 Traits::RewriteNonPattern(&rhs_classifier, |
2018 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); | 2018 CHECK_OK_CUSTOM(EmptyObjectLiteralProperty)); |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2308 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); | 2308 ArrowFormalParametersUnexpectedToken(&arrow_formals_classifier); |
2309 } | 2309 } |
2310 ExpressionT expression = this->ParseConditionalExpression( | 2310 ExpressionT expression = this->ParseConditionalExpression( |
2311 accept_IN, &arrow_formals_classifier, CHECK_OK); | 2311 accept_IN, &arrow_formals_classifier, CHECK_OK); |
2312 | 2312 |
2313 if (is_async && peek_any_identifier() && PeekAhead() == Token::ARROW) { | 2313 if (is_async && peek_any_identifier() && PeekAhead() == Token::ARROW) { |
2314 // async Identifier => AsyncConciseBody | 2314 // async Identifier => AsyncConciseBody |
2315 IdentifierT name = | 2315 IdentifierT name = |
2316 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); | 2316 ParseAndClassifyIdentifier(&arrow_formals_classifier, CHECK_OK); |
2317 expression = this->ExpressionFromIdentifier( | 2317 expression = this->ExpressionFromIdentifier( |
2318 name, position(), scanner()->location().end_pos, scope(), factory()); | 2318 name, position(), scanner()->location().end_pos, factory()); |
2319 } | 2319 } |
2320 | 2320 |
2321 if (peek() == Token::ARROW) { | 2321 if (peek() == Token::ARROW) { |
2322 Scanner::Location arrow_loc = scanner()->peek_location(); | 2322 Scanner::Location arrow_loc = scanner()->peek_location(); |
2323 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, | 2323 ValidateArrowFormalParameters(&arrow_formals_classifier, expression, |
2324 parenthesized_formals, is_async, CHECK_OK); | 2324 parenthesized_formals, is_async, CHECK_OK); |
2325 // This reads strangely, but is correct: it checks whether any | 2325 // This reads strangely, but is correct: it checks whether any |
2326 // sub-expression of the parameter list failed to be a valid formal | 2326 // sub-expression of the parameter list failed to be a valid formal |
2327 // parameter initializer. Since YieldExpressions are banned anywhere | 2327 // parameter initializer. Since YieldExpressions are banned anywhere |
2328 // in an arrow parameter list, this is correct. | 2328 // in an arrow parameter list, this is correct. |
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2753 // Possibly async arrow formals --- record ExpressionError just in case. | 2753 // Possibly async arrow formals --- record ExpressionError just in case. |
2754 ExpressionUnexpectedToken(classifier); | 2754 ExpressionUnexpectedToken(classifier); |
2755 classifier->RecordAsyncBindingPatternError( | 2755 classifier->RecordAsyncBindingPatternError( |
2756 Scanner::Location(beg_pos, scanner()->location().end_pos), | 2756 Scanner::Location(beg_pos, scanner()->location().end_pos), |
2757 MessageTemplate::kAwaitBindingIdentifier); | 2757 MessageTemplate::kAwaitBindingIdentifier); |
2758 classifier->RecordAsyncArrowFormalParametersError( | 2758 classifier->RecordAsyncArrowFormalParametersError( |
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 | 2761 |
2762 return this->ExpressionFromIdentifier( | 2762 return this->ExpressionFromIdentifier( |
2763 name, beg_pos, scanner()->location().end_pos, scope(), factory()); | 2763 name, beg_pos, scanner()->location().end_pos, factory()); |
2764 } | 2764 } |
2765 default: | 2765 default: |
2766 break; | 2766 break; |
2767 } | 2767 } |
2768 | 2768 |
2769 int await_pos = peek_position(); | 2769 int await_pos = peek_position(); |
2770 Consume(Token::AWAIT); | 2770 Consume(Token::AWAIT); |
2771 | 2771 |
2772 ExpressionT value = ParseUnaryExpression(classifier, CHECK_OK); | 2772 ExpressionT value = ParseUnaryExpression(classifier, CHECK_OK); |
2773 | 2773 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2911 if (spread_pos.IsValid()) { | 2911 if (spread_pos.IsValid()) { |
2912 args = Traits::PrepareSpreadArguments(args); | 2912 args = Traits::PrepareSpreadArguments(args); |
2913 result = Traits::SpreadCall(result, args, pos); | 2913 result = Traits::SpreadCall(result, args, pos); |
2914 } else { | 2914 } else { |
2915 result = factory()->NewCall(result, args, pos); | 2915 result = factory()->NewCall(result, args, pos); |
2916 } | 2916 } |
2917 | 2917 |
2918 // Explicit calls to the super constructor using super() perform an | 2918 // Explicit calls to the super constructor using super() perform an |
2919 // implicit binding assignment to the 'this' variable. | 2919 // implicit binding assignment to the 'this' variable. |
2920 if (is_super_call) { | 2920 if (is_super_call) { |
2921 ExpressionT this_expr = this->ThisExpression(scope(), factory(), pos); | 2921 ExpressionT this_expr = this->ThisExpression(factory(), pos); |
2922 result = | 2922 result = |
2923 factory()->NewAssignment(Token::INIT, this_expr, result, pos); | 2923 factory()->NewAssignment(Token::INIT, this_expr, result, pos); |
2924 } | 2924 } |
2925 | 2925 |
2926 if (fni_ != NULL) fni_->RemoveLastFunction(); | 2926 if (fni_ != NULL) fni_->RemoveLastFunction(); |
2927 break; | 2927 break; |
2928 } | 2928 } |
2929 | 2929 |
2930 case Token::PERIOD: { | 2930 case Token::PERIOD: { |
2931 CheckNoTailCallExpressions(classifier, CHECK_OK); | 2931 CheckNoTailCallExpressions(classifier, CHECK_OK); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3049 ExpectMetaProperty(CStrVector("sent"), "function.sent", pos, CHECK_OK); | 3049 ExpectMetaProperty(CStrVector("sent"), "function.sent", pos, CHECK_OK); |
3050 | 3050 |
3051 if (!is_generator()) { | 3051 if (!is_generator()) { |
3052 // TODO(neis): allow escaping into closures? | 3052 // TODO(neis): allow escaping into closures? |
3053 ReportMessageAt(scanner()->location(), | 3053 ReportMessageAt(scanner()->location(), |
3054 MessageTemplate::kUnexpectedFunctionSent); | 3054 MessageTemplate::kUnexpectedFunctionSent); |
3055 *ok = false; | 3055 *ok = false; |
3056 return this->EmptyExpression(); | 3056 return this->EmptyExpression(); |
3057 } | 3057 } |
3058 | 3058 |
3059 return this->FunctionSentExpression(scope(), factory(), pos); | 3059 return this->FunctionSentExpression(factory(), pos); |
3060 } | 3060 } |
3061 | 3061 |
3062 bool is_generator = Check(Token::MUL); | 3062 bool is_generator = Check(Token::MUL); |
3063 IdentifierT name = this->EmptyIdentifier(); | 3063 IdentifierT name = this->EmptyIdentifier(); |
3064 bool is_strict_reserved_name = false; | 3064 bool is_strict_reserved_name = false; |
3065 Scanner::Location function_name_location = Scanner::Location::invalid(); | 3065 Scanner::Location function_name_location = Scanner::Location::invalid(); |
3066 FunctionLiteral::FunctionType function_type = | 3066 FunctionLiteral::FunctionType function_type = |
3067 FunctionLiteral::kAnonymousExpression; | 3067 FunctionLiteral::kAnonymousExpression; |
3068 if (peek_any_identifier()) { | 3068 if (peek_any_identifier()) { |
3069 name = ParseIdentifierOrStrictReservedWord( | 3069 name = ParseIdentifierOrStrictReservedWord( |
(...skipping 25 matching lines...) Expand all Loading... |
3095 ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { | 3095 ParserBase<Traits>::ParseSuperExpression(bool is_new, bool* ok) { |
3096 Expect(Token::SUPER, CHECK_OK); | 3096 Expect(Token::SUPER, CHECK_OK); |
3097 int pos = position(); | 3097 int pos = position(); |
3098 | 3098 |
3099 DeclarationScope* scope = this->scope()->GetReceiverScope(); | 3099 DeclarationScope* scope = this->scope()->GetReceiverScope(); |
3100 FunctionKind kind = scope->function_kind(); | 3100 FunctionKind kind = scope->function_kind(); |
3101 if (IsConciseMethod(kind) || IsAccessorFunction(kind) || | 3101 if (IsConciseMethod(kind) || IsAccessorFunction(kind) || |
3102 IsClassConstructor(kind)) { | 3102 IsClassConstructor(kind)) { |
3103 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { | 3103 if (peek() == Token::PERIOD || peek() == Token::LBRACK) { |
3104 scope->RecordSuperPropertyUsage(); | 3104 scope->RecordSuperPropertyUsage(); |
3105 return this->NewSuperPropertyReference(this->scope(), factory(), pos); | 3105 return this->NewSuperPropertyReference(factory(), pos); |
3106 } | 3106 } |
3107 // new super() is never allowed. | 3107 // new super() is never allowed. |
3108 // super() is only allowed in derived constructor | 3108 // super() is only allowed in derived constructor |
3109 if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) { | 3109 if (!is_new && peek() == Token::LPAREN && IsSubclassConstructor(kind)) { |
3110 // TODO(rossberg): This might not be the correct FunctionState for the | 3110 // TODO(rossberg): This might not be the correct FunctionState for the |
3111 // method here. | 3111 // method here. |
3112 return this->NewSuperCallReference(this->scope(), factory(), pos); | 3112 return this->NewSuperCallReference(factory(), pos); |
3113 } | 3113 } |
3114 } | 3114 } |
3115 | 3115 |
3116 ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); | 3116 ReportMessageAt(scanner()->location(), MessageTemplate::kUnexpectedSuper); |
3117 *ok = false; | 3117 *ok = false; |
3118 return this->EmptyExpression(); | 3118 return this->EmptyExpression(); |
3119 } | 3119 } |
3120 | 3120 |
3121 template <class Traits> | 3121 template <class Traits> |
3122 void ParserBase<Traits>::ExpectMetaProperty(Vector<const char> property_name, | 3122 void ParserBase<Traits>::ExpectMetaProperty(Vector<const char> property_name, |
(...skipping 15 matching lines...) Expand all Loading... |
3138 int pos = position(); | 3138 int pos = position(); |
3139 ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); | 3139 ExpectMetaProperty(CStrVector("target"), "new.target", pos, CHECK_OK); |
3140 | 3140 |
3141 if (!scope()->GetReceiverScope()->is_function_scope()) { | 3141 if (!scope()->GetReceiverScope()->is_function_scope()) { |
3142 ReportMessageAt(scanner()->location(), | 3142 ReportMessageAt(scanner()->location(), |
3143 MessageTemplate::kUnexpectedNewTarget); | 3143 MessageTemplate::kUnexpectedNewTarget); |
3144 *ok = false; | 3144 *ok = false; |
3145 return this->EmptyExpression(); | 3145 return this->EmptyExpression(); |
3146 } | 3146 } |
3147 | 3147 |
3148 return this->NewTargetExpression(scope(), factory(), pos); | 3148 return this->NewTargetExpression(factory(), pos); |
3149 } | 3149 } |
3150 | 3150 |
3151 template <class Traits> | 3151 template <class Traits> |
3152 typename ParserBase<Traits>::ExpressionT | 3152 typename ParserBase<Traits>::ExpressionT |
3153 ParserBase<Traits>::ParseMemberExpressionContinuation( | 3153 ParserBase<Traits>::ParseMemberExpressionContinuation( |
3154 ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, | 3154 ExpressionT expression, bool* is_async, ExpressionClassifier* classifier, |
3155 bool* ok) { | 3155 bool* ok) { |
3156 // Parses this part of MemberExpression: | 3156 // Parses this part of MemberExpression: |
3157 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* | 3157 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* |
3158 while (true) { | 3158 while (true) { |
(...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3693 has_seen_constructor_ = true; | 3693 has_seen_constructor_ = true; |
3694 return; | 3694 return; |
3695 } | 3695 } |
3696 } | 3696 } |
3697 | 3697 |
3698 | 3698 |
3699 } // namespace internal | 3699 } // namespace internal |
3700 } // namespace v8 | 3700 } // namespace v8 |
3701 | 3701 |
3702 #endif // V8_PARSING_PARSER_BASE_H | 3702 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |