| 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/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/bailout-reason.h" | 10 #include "src/bailout-reason.h" |
| (...skipping 2579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2590 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { | 2590 Scanner::Location* first_spread_arg_loc, bool maybe_arrow, bool* ok) { |
| 2591 // Arguments :: | 2591 // Arguments :: |
| 2592 // '(' (AssignmentExpression)*[','] ')' | 2592 // '(' (AssignmentExpression)*[','] ')' |
| 2593 | 2593 |
| 2594 Scanner::Location spread_arg = Scanner::Location::invalid(); | 2594 Scanner::Location spread_arg = Scanner::Location::invalid(); |
| 2595 ExpressionListT result = impl()->NewExpressionList(4); | 2595 ExpressionListT result = impl()->NewExpressionList(4); |
| 2596 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList)); | 2596 Expect(Token::LPAREN, CHECK_OK_CUSTOM(NullExpressionList)); |
| 2597 bool done = (peek() == Token::RPAREN); | 2597 bool done = (peek() == Token::RPAREN); |
| 2598 bool was_unspread = false; | 2598 bool was_unspread = false; |
| 2599 int unspread_sequences_count = 0; | 2599 int unspread_sequences_count = 0; |
| 2600 int spread_count = 0; | |
| 2601 while (!done) { | 2600 while (!done) { |
| 2602 int start_pos = peek_position(); | 2601 int start_pos = peek_position(); |
| 2603 bool is_spread = Check(Token::ELLIPSIS); | 2602 bool is_spread = Check(Token::ELLIPSIS); |
| 2604 int expr_pos = peek_position(); | 2603 int expr_pos = peek_position(); |
| 2605 | 2604 |
| 2606 ExpressionT argument = | 2605 ExpressionT argument = |
| 2607 ParseAssignmentExpression(true, CHECK_OK_CUSTOM(NullExpressionList)); | 2606 ParseAssignmentExpression(true, CHECK_OK_CUSTOM(NullExpressionList)); |
| 2608 if (!maybe_arrow) { | 2607 if (!maybe_arrow) { |
| 2609 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullExpressionList)); | 2608 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullExpressionList)); |
| 2610 } | 2609 } |
| 2611 if (is_spread) { | 2610 if (is_spread) { |
| 2612 if (!spread_arg.IsValid()) { | 2611 if (!spread_arg.IsValid()) { |
| 2613 spread_arg.beg_pos = start_pos; | 2612 spread_arg.beg_pos = start_pos; |
| 2614 spread_arg.end_pos = peek_position(); | 2613 spread_arg.end_pos = peek_position(); |
| 2615 } | 2614 } |
| 2616 argument = factory()->NewSpread(argument, start_pos, expr_pos); | 2615 argument = factory()->NewSpread(argument, start_pos, expr_pos); |
| 2617 } | 2616 } |
| 2618 result->Add(argument, zone_); | 2617 result->Add(argument, zone_); |
| 2619 | 2618 |
| 2620 // unspread_sequences_count is the number of sequences of parameters which | 2619 // unspread_sequences_count is the number of sequences of parameters which |
| 2621 // are not prefixed with a spread '...' operator. | 2620 // are not prefixed with a spread '...' operator. |
| 2622 if (is_spread) { | 2621 if (is_spread) { |
| 2623 was_unspread = false; | 2622 was_unspread = false; |
| 2624 spread_count++; | |
| 2625 } else if (!was_unspread) { | 2623 } else if (!was_unspread) { |
| 2626 was_unspread = true; | 2624 was_unspread = true; |
| 2627 unspread_sequences_count++; | 2625 unspread_sequences_count++; |
| 2628 } | 2626 } |
| 2629 | 2627 |
| 2630 if (result->length() > Code::kMaxArguments) { | 2628 if (result->length() > Code::kMaxArguments) { |
| 2631 ReportMessage(MessageTemplate::kTooManyArguments); | 2629 ReportMessage(MessageTemplate::kTooManyArguments); |
| 2632 *ok = false; | 2630 *ok = false; |
| 2633 return impl()->NullExpressionList(); | 2631 return impl()->NullExpressionList(); |
| 2634 } | 2632 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2650 *first_spread_arg_loc = spread_arg; | 2648 *first_spread_arg_loc = spread_arg; |
| 2651 | 2649 |
| 2652 if (!maybe_arrow || peek() != Token::ARROW) { | 2650 if (!maybe_arrow || peek() != Token::ARROW) { |
| 2653 if (maybe_arrow) { | 2651 if (maybe_arrow) { |
| 2654 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullExpressionList)); | 2652 impl()->RewriteNonPattern(CHECK_OK_CUSTOM(NullExpressionList)); |
| 2655 } | 2653 } |
| 2656 if (spread_arg.IsValid()) { | 2654 if (spread_arg.IsValid()) { |
| 2657 // Unspread parameter sequences are translated into array literals in the | 2655 // Unspread parameter sequences are translated into array literals in the |
| 2658 // parser. Ensure that the number of materialized literals matches between | 2656 // parser. Ensure that the number of materialized literals matches between |
| 2659 // the parser and preparser | 2657 // the parser and preparser |
| 2660 if (was_unspread || spread_count > 1) { | 2658 impl()->MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); |
| 2661 // There was more than one spread, or the spread was not the final | |
| 2662 // argument, so the parser will materialize literals. | |
| 2663 impl()->MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); | |
| 2664 } | |
| 2665 } | 2659 } |
| 2666 } | 2660 } |
| 2667 | 2661 |
| 2668 return result; | 2662 return result; |
| 2669 } | 2663 } |
| 2670 | 2664 |
| 2671 // Precedence = 2 | 2665 // Precedence = 2 |
| 2672 template <typename Impl> | 2666 template <typename Impl> |
| 2673 typename ParserBase<Impl>::ExpressionT | 2667 typename ParserBase<Impl>::ExpressionT |
| 2674 ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, bool* ok) { | 2668 ParserBase<Impl>::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3196 // The calls that need special treatment are the | 3190 // The calls that need special treatment are the |
| 3197 // direct eval calls. These calls are all of the form eval(...), with | 3191 // direct eval calls. These calls are all of the form eval(...), with |
| 3198 // no explicit receiver. | 3192 // no explicit receiver. |
| 3199 // These calls are marked as potentially direct eval calls. Whether | 3193 // These calls are marked as potentially direct eval calls. Whether |
| 3200 // they are actually direct calls to eval is determined at run time. | 3194 // they are actually direct calls to eval is determined at run time. |
| 3201 Call::PossiblyEval is_possibly_eval = | 3195 Call::PossiblyEval is_possibly_eval = |
| 3202 CheckPossibleEvalCall(result, scope()); | 3196 CheckPossibleEvalCall(result, scope()); |
| 3203 | 3197 |
| 3204 bool is_super_call = result->IsSuperCallReference(); | 3198 bool is_super_call = result->IsSuperCallReference(); |
| 3205 if (spread_pos.IsValid()) { | 3199 if (spread_pos.IsValid()) { |
| 3206 result = impl()->SpreadCall(result, args, pos, is_possibly_eval); | 3200 result = impl()->SpreadCall(result, args, pos); |
| 3207 } else { | 3201 } else { |
| 3208 result = factory()->NewCall(result, args, pos, is_possibly_eval); | 3202 result = factory()->NewCall(result, args, pos, is_possibly_eval); |
| 3209 } | 3203 } |
| 3210 | 3204 |
| 3211 // Explicit calls to the super constructor using super() perform an | 3205 // Explicit calls to the super constructor using super() perform an |
| 3212 // implicit binding assignment to the 'this' variable. | 3206 // implicit binding assignment to the 'this' variable. |
| 3213 if (is_super_call) { | 3207 if (is_super_call) { |
| 3214 ExpressionT this_expr = impl()->ThisExpression(pos); | 3208 ExpressionT this_expr = impl()->ThisExpression(pos); |
| 3215 result = | 3209 result = |
| 3216 factory()->NewAssignment(Token::INIT, this_expr, result, pos); | 3210 factory()->NewAssignment(Token::INIT, this_expr, result, pos); |
| (...skipping 2350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5567 has_seen_constructor_ = true; | 5561 has_seen_constructor_ = true; |
| 5568 return; | 5562 return; |
| 5569 } | 5563 } |
| 5570 } | 5564 } |
| 5571 | 5565 |
| 5572 | 5566 |
| 5573 } // namespace internal | 5567 } // namespace internal |
| 5574 } // namespace v8 | 5568 } // namespace v8 |
| 5575 | 5569 |
| 5576 #endif // V8_PARSING_PARSER_BASE_H | 5570 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |