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/hashmap.h" | 10 #include "src/hashmap.h" |
(...skipping 2335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2346 ExpressionClassifier* classifier, bool* ok) { | 2346 ExpressionClassifier* classifier, bool* ok) { |
2347 // LeftHandSideExpression :: | 2347 // LeftHandSideExpression :: |
2348 // (NewExpression | MemberExpression) ... | 2348 // (NewExpression | MemberExpression) ... |
2349 | 2349 |
2350 ExpressionT result = | 2350 ExpressionT result = |
2351 this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); | 2351 this->ParseMemberWithNewPrefixesExpression(classifier, CHECK_OK); |
2352 | 2352 |
2353 while (true) { | 2353 while (true) { |
2354 switch (peek()) { | 2354 switch (peek()) { |
2355 case Token::LBRACK: { | 2355 case Token::LBRACK: { |
| 2356 result = Traits::RewriteNonPattern(result, classifier, CHECK_OK); |
2356 BindingPatternUnexpectedToken(classifier); | 2357 BindingPatternUnexpectedToken(classifier); |
2357 ArrowFormalParametersUnexpectedToken(classifier); | 2358 ArrowFormalParametersUnexpectedToken(classifier); |
2358 Consume(Token::LBRACK); | 2359 Consume(Token::LBRACK); |
2359 int pos = position(); | 2360 int pos = position(); |
2360 ExpressionT index = ParseExpression(true, classifier, CHECK_OK); | 2361 ExpressionT index = ParseExpression(true, classifier, CHECK_OK); |
2361 index = Traits::RewriteNonPattern(index, classifier, CHECK_OK); | 2362 index = Traits::RewriteNonPattern(index, classifier, CHECK_OK); |
2362 result = factory()->NewProperty(result, index, pos); | 2363 result = factory()->NewProperty(result, index, pos); |
2363 Expect(Token::RBRACK, CHECK_OK); | 2364 Expect(Token::RBRACK, CHECK_OK); |
2364 break; | 2365 break; |
2365 } | 2366 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2422 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); | 2423 ExpressionT this_expr = this->ThisExpression(scope_, factory(), pos); |
2423 result = | 2424 result = |
2424 factory()->NewAssignment(Token::INIT, this_expr, result, pos); | 2425 factory()->NewAssignment(Token::INIT, this_expr, result, pos); |
2425 } | 2426 } |
2426 | 2427 |
2427 if (fni_ != NULL) fni_->RemoveLastFunction(); | 2428 if (fni_ != NULL) fni_->RemoveLastFunction(); |
2428 break; | 2429 break; |
2429 } | 2430 } |
2430 | 2431 |
2431 case Token::PERIOD: { | 2432 case Token::PERIOD: { |
| 2433 result = Traits::RewriteNonPattern(result, classifier, CHECK_OK); |
2432 BindingPatternUnexpectedToken(classifier); | 2434 BindingPatternUnexpectedToken(classifier); |
2433 ArrowFormalParametersUnexpectedToken(classifier); | 2435 ArrowFormalParametersUnexpectedToken(classifier); |
2434 Consume(Token::PERIOD); | 2436 Consume(Token::PERIOD); |
2435 int pos = position(); | 2437 int pos = position(); |
2436 IdentifierT name = ParseIdentifierName(CHECK_OK); | 2438 IdentifierT name = ParseIdentifierName(CHECK_OK); |
2437 result = factory()->NewProperty( | 2439 result = factory()->NewProperty( |
2438 result, factory()->NewStringLiteral(name, pos), pos); | 2440 result, factory()->NewStringLiteral(name, pos), pos); |
2439 if (fni_ != NULL) this->PushLiteralName(fni_, name); | 2441 if (fni_ != NULL) this->PushLiteralName(fni_, name); |
2440 break; | 2442 break; |
2441 } | 2443 } |
2442 | 2444 |
2443 case Token::TEMPLATE_SPAN: | 2445 case Token::TEMPLATE_SPAN: |
2444 case Token::TEMPLATE_TAIL: { | 2446 case Token::TEMPLATE_TAIL: { |
| 2447 result = Traits::RewriteNonPattern(result, classifier, CHECK_OK); |
2445 BindingPatternUnexpectedToken(classifier); | 2448 BindingPatternUnexpectedToken(classifier); |
2446 ArrowFormalParametersUnexpectedToken(classifier); | 2449 ArrowFormalParametersUnexpectedToken(classifier); |
2447 result = ParseTemplateLiteral(result, position(), classifier, CHECK_OK); | 2450 result = ParseTemplateLiteral(result, position(), classifier, CHECK_OK); |
2448 break; | 2451 break; |
2449 } | 2452 } |
2450 | 2453 |
2451 default: | 2454 default: |
2452 return result; | 2455 return result; |
2453 } | 2456 } |
2454 } | 2457 } |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2773 | 2776 |
2774 template <class Traits> | 2777 template <class Traits> |
2775 typename ParserBase<Traits>::ExpressionT | 2778 typename ParserBase<Traits>::ExpressionT |
2776 ParserBase<Traits>::ParseMemberExpressionContinuation( | 2779 ParserBase<Traits>::ParseMemberExpressionContinuation( |
2777 ExpressionT expression, ExpressionClassifier* classifier, bool* ok) { | 2780 ExpressionT expression, ExpressionClassifier* classifier, bool* ok) { |
2778 // Parses this part of MemberExpression: | 2781 // Parses this part of MemberExpression: |
2779 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* | 2782 // ('[' Expression ']' | '.' Identifier | TemplateLiteral)* |
2780 while (true) { | 2783 while (true) { |
2781 switch (peek()) { | 2784 switch (peek()) { |
2782 case Token::LBRACK: { | 2785 case Token::LBRACK: { |
| 2786 expression = |
| 2787 Traits::RewriteNonPattern(expression, classifier, CHECK_OK); |
2783 BindingPatternUnexpectedToken(classifier); | 2788 BindingPatternUnexpectedToken(classifier); |
2784 ArrowFormalParametersUnexpectedToken(classifier); | 2789 ArrowFormalParametersUnexpectedToken(classifier); |
2785 | 2790 |
2786 Consume(Token::LBRACK); | 2791 Consume(Token::LBRACK); |
2787 int pos = position(); | 2792 int pos = position(); |
2788 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); | 2793 ExpressionT index = this->ParseExpression(true, classifier, CHECK_OK); |
2789 index = Traits::RewriteNonPattern(index, classifier, CHECK_OK); | 2794 index = Traits::RewriteNonPattern(index, classifier, CHECK_OK); |
2790 expression = factory()->NewProperty(expression, index, pos); | 2795 expression = factory()->NewProperty(expression, index, pos); |
2791 if (fni_ != NULL) { | 2796 if (fni_ != NULL) { |
2792 this->PushPropertyName(fni_, index); | 2797 this->PushPropertyName(fni_, index); |
2793 } | 2798 } |
2794 Expect(Token::RBRACK, CHECK_OK); | 2799 Expect(Token::RBRACK, CHECK_OK); |
2795 break; | 2800 break; |
2796 } | 2801 } |
2797 case Token::PERIOD: { | 2802 case Token::PERIOD: { |
| 2803 expression = |
| 2804 Traits::RewriteNonPattern(expression, classifier, CHECK_OK); |
2798 BindingPatternUnexpectedToken(classifier); | 2805 BindingPatternUnexpectedToken(classifier); |
2799 ArrowFormalParametersUnexpectedToken(classifier); | 2806 ArrowFormalParametersUnexpectedToken(classifier); |
2800 | 2807 |
2801 Consume(Token::PERIOD); | 2808 Consume(Token::PERIOD); |
2802 int pos = position(); | 2809 int pos = position(); |
2803 IdentifierT name = ParseIdentifierName(CHECK_OK); | 2810 IdentifierT name = ParseIdentifierName(CHECK_OK); |
2804 expression = factory()->NewProperty( | 2811 expression = factory()->NewProperty( |
2805 expression, factory()->NewStringLiteral(name, pos), pos); | 2812 expression, factory()->NewStringLiteral(name, pos), pos); |
2806 if (fni_ != NULL) { | 2813 if (fni_ != NULL) { |
2807 this->PushLiteralName(fni_, name); | 2814 this->PushLiteralName(fni_, name); |
2808 } | 2815 } |
2809 break; | 2816 break; |
2810 } | 2817 } |
2811 case Token::TEMPLATE_SPAN: | 2818 case Token::TEMPLATE_SPAN: |
2812 case Token::TEMPLATE_TAIL: { | 2819 case Token::TEMPLATE_TAIL: { |
| 2820 expression = |
| 2821 Traits::RewriteNonPattern(expression, classifier, CHECK_OK); |
2813 BindingPatternUnexpectedToken(classifier); | 2822 BindingPatternUnexpectedToken(classifier); |
2814 ArrowFormalParametersUnexpectedToken(classifier); | 2823 ArrowFormalParametersUnexpectedToken(classifier); |
2815 int pos; | 2824 int pos; |
2816 if (scanner()->current_token() == Token::IDENTIFIER) { | 2825 if (scanner()->current_token() == Token::IDENTIFIER) { |
2817 pos = position(); | 2826 pos = position(); |
2818 } else { | 2827 } else { |
2819 pos = peek_position(); | 2828 pos = peek_position(); |
2820 if (expression->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { | 2829 if (expression->IsFunctionLiteral() && mode() == PARSE_EAGERLY) { |
2821 // If the tag function looks like an IIFE, set_parenthesized() to | 2830 // If the tag function looks like an IIFE, set_parenthesized() to |
2822 // force eager compilation. | 2831 // force eager compilation. |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3328 return; | 3337 return; |
3329 } | 3338 } |
3330 has_seen_constructor_ = true; | 3339 has_seen_constructor_ = true; |
3331 return; | 3340 return; |
3332 } | 3341 } |
3333 } | 3342 } |
3334 } // namespace internal | 3343 } // namespace internal |
3335 } // namespace v8 | 3344 } // namespace v8 |
3336 | 3345 |
3337 #endif // V8_PARSING_PARSER_BASE_H | 3346 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |