Chromium Code Reviews| Index: src/pattern-rewriter.cc |
| diff --git a/src/pattern-rewriter.cc b/src/pattern-rewriter.cc |
| index 52ff8f60f10bca57bc487195f8107e0ddea3ad8e..e8ac844e5a8b825724f8493b40334c5ecf454959 100644 |
| --- a/src/pattern-rewriter.cc |
| +++ b/src/pattern-rewriter.cc |
| @@ -246,7 +246,14 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { |
| factory()->NewBooleanLiteral(false, RelocInfo::kNoPosition)); |
| auto result = CreateTempVar(); |
| auto v = CreateTempVar(); |
| + |
| + Spread* spread = nullptr; |
| for (Expression* value : *node->values()) { |
| + if (value->IsSpread()) { |
| + spread = value->AsSpread(); |
| + break; |
| + } |
| + |
| // if (!done) { |
| // result = IteratorNext(iterator); |
| // v = (done = result.done) ? undefined : result.value; |
| @@ -296,6 +303,37 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node) { |
| RecurseIntoSubpattern(value, factory()->NewVariableProxy(v)); |
| } |
| } |
| + |
| + if (spread != nullptr) { |
| + // array = []; |
|
arv (Not doing code reviews)
2015/05/20 13:58:05
Lets change this to not create the array here and
Dmitry Lomov (no reviews)
2015/05/20 14:07:19
We definitely want to create an array here, to ben
|
| + // if (!done) $spreadIntoArray(array, iterator); |
| + auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone()); |
| + auto array = CreateTempVar(factory()->NewArrayLiteral( |
| + empty_exprs, spread->literal_index(), |
| + is_strong(descriptor_->parser->language_mode()), |
| + RelocInfo::kNoPosition)); |
| + |
| + auto arguments = new (zone()) ZoneList<Expression*>(2, zone()); |
| + arguments->Add(factory()->NewVariableProxy(array), zone()); |
| + arguments->Add(factory()->NewVariableProxy(iterator), zone()); |
| + auto spread_into_array_call = factory()->NewCallRuntime( |
| + ast_value_factory()->spread_into_array_string(), nullptr, arguments, |
| + RelocInfo::kNoPosition); |
| + |
| + auto if_statement = factory()->NewIfStatement( |
| + factory()->NewUnaryOperation(Token::NOT, |
| + factory()->NewVariableProxy(done), |
| + RelocInfo::kNoPosition), |
| + factory()->NewExpressionStatement(spread_into_array_call, |
| + RelocInfo::kNoPosition), |
| + factory()->NewEmptyStatement(RelocInfo::kNoPosition), |
| + RelocInfo::kNoPosition); |
| + block_->AddStatement(if_statement, zone()); |
| + |
| + |
| + RecurseIntoSubpattern(spread->expression(), |
| + factory()->NewVariableProxy(array)); |
| + } |
| } |