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_); |