Chromium Code Reviews| Index: src/preparser.h |
| diff --git a/src/preparser.h b/src/preparser.h |
| index 116a8eac9b891721e208bea92d9f3b7e4ad30528..129f7b1d00a0c1777e98d07d1a58f77f8d194807 100644 |
| --- a/src/preparser.h |
| +++ b/src/preparser.h |
| @@ -1485,7 +1485,8 @@ class PreParserFactory { |
| return PreParserExpression::Default(); |
| } |
| - PreParserExpression NewSpread(PreParserExpression expression, int pos) { |
| + PreParserExpression NewSpread(PreParserExpression expression, |
| + int literal_index, int pos) { |
| return PreParserExpression::Spread(expression); |
| } |
| @@ -2497,6 +2498,7 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| this->NewExpressionList(4, zone_); |
| Expect(Token::LBRACK, CHECK_OK); |
| while (peek() != Token::RBRACK) { |
| + bool seen_spread = false; |
| ExpressionT elem = this->EmptyExpression(); |
| if (peek() == Token::COMMA) { |
| if (is_strong(language_mode())) { |
| @@ -2506,11 +2508,24 @@ typename ParserBase<Traits>::ExpressionT ParserBase<Traits>::ParseArrayLiteral( |
| return this->EmptyExpression(); |
| } |
| elem = this->GetLiteralTheHole(peek_position(), factory()); |
| + } else if (peek() == Token::ELLIPSIS) { |
| + ExpressionUnexpectedToken(classifier); |
| + int start_pos = peek_position(); |
| + Consume(Token::ELLIPSIS); |
| + ExpressionT argument = |
| + this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
| + |
| + int literal_index = function_state_->NextMaterializedLiteralIndex(); |
|
arv (Not doing code reviews)
2015/05/20 13:52:25
Is this going to be a problem in the case of array
Dmitry Lomov (no reviews)
2015/05/20 14:07:19
I don't think so - we will just have an unused lit
Dmitry Lomov (no reviews)
2015/05/20 14:22:03
Scratch that - I have One Weird Trick in mind here
|
| + elem = factory()->NewSpread(argument, literal_index, start_pos); |
| + seen_spread = true; |
| } else { |
| elem = this->ParseAssignmentExpression(true, classifier, CHECK_OK); |
| } |
| values->Add(elem, zone_); |
| if (peek() != Token::RBRACK) { |
| + if (seen_spread) { |
| + BindingPatternUnexpectedToken(classifier); |
| + } |
| Expect(Token::COMMA, CHECK_OK); |
| } |
| } |
| @@ -2822,7 +2837,7 @@ typename Traits::Type::ExpressionList ParserBase<Traits>::ParseArguments( |
| spread_arg.beg_pos = start_pos; |
| spread_arg.end_pos = peek_position(); |
| } |
| - argument = factory()->NewSpread(argument, start_pos); |
| + argument = factory()->NewSpread(argument, -1, start_pos); |
| } |
| result->Add(argument, zone_); |