Index: src/parsing/parser-base.h |
diff --git a/src/parsing/parser-base.h b/src/parsing/parser-base.h |
index eade9a7402a4b7200e286d8b1f9067bbe6a88e5e..73e6151ff9ef4596c5ad2e8adcd620ba1e10ddf1 100644 |
--- a/src/parsing/parser-base.h |
+++ b/src/parsing/parser-base.h |
@@ -2609,6 +2609,7 @@ typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( |
bool done = (peek() == Token::RPAREN); |
bool was_unspread = false; |
int unspread_sequences_count = 0; |
+ int spread_count = 0; |
while (!done) { |
int start_pos = peek_position(); |
bool is_spread = Check(Token::ELLIPSIS); |
@@ -2632,6 +2633,7 @@ typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( |
// are not prefixed with a spread '...' operator. |
if (is_spread) { |
was_unspread = false; |
+ spread_count++; |
} else if (!was_unspread) { |
was_unspread = true; |
unspread_sequences_count++; |
@@ -2667,7 +2669,11 @@ typename ParserBase<Impl>::ExpressionListT ParserBase<Impl>::ParseArguments( |
// Unspread parameter sequences are translated into array literals in the |
// parser. Ensure that the number of materialized literals matches between |
// the parser and preparser |
- impl()->MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); |
+ if (was_unspread || spread_count > 1) { |
+ // There was more than one spread, or the spread was not the final |
+ // argument, so the parser will materialize literals. |
+ impl()->MaterializeUnspreadArgumentsLiterals(unspread_sequences_count); |
+ } |
} |
} |
@@ -3209,7 +3215,7 @@ ParserBase<Impl>::ParseLeftHandSideExpression(bool* ok) { |
bool is_super_call = result->IsSuperCallReference(); |
if (spread_pos.IsValid()) { |
- result = impl()->SpreadCall(result, args, pos); |
+ result = impl()->SpreadCall(result, args, pos, is_possibly_eval); |
} else { |
result = factory()->NewCall(result, args, pos, is_possibly_eval); |
} |