| Index: src/parsing/pattern-rewriter.cc
|
| diff --git a/src/parsing/pattern-rewriter.cc b/src/parsing/pattern-rewriter.cc
|
| index 3ecffb99dbd763f26a5a13756092fb5e8006a64b..6570810264201b6767d6f9677f836ac3402b3b5c 100644
|
| --- a/src/parsing/pattern-rewriter.cc
|
| +++ b/src/parsing/pattern-rewriter.cc
|
| @@ -547,39 +547,82 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node,
|
| // RecurseIntoSubpattern above.
|
|
|
| // let array = [];
|
| - // if (!done) %concat_iterable_to_array(array, iterator);
|
| + // while (!done) {
|
| + // result = IteratorNext(iterator);
|
| + // if (result.done) {
|
| + // done = true;
|
| + // } else {
|
| + // %AppendElement(array, result.value);
|
| + // }
|
| + // }
|
| +
|
| + // let array = [];
|
| + Variable* array;
|
| + {
|
| + auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone());
|
| + array = CreateTempVar(factory()->NewArrayLiteral(
|
| + empty_exprs,
|
| + // Reuse pattern's literal index - it is unused since there is no
|
| + // actual literal allocated.
|
| + node->literal_index(), RelocInfo::kNoPosition));
|
| + }
|
| +
|
| + // result = IteratorNext(iterator);
|
| + Statement* get_next = factory()->NewExpressionStatement(
|
| + parser_->BuildIteratorNextResult(factory()->NewVariableProxy(iterator),
|
| + result, nopos),
|
| + nopos);
|
| +
|
| // done = true;
|
| + Statement* set_done = factory()->NewExpressionStatement(
|
| + factory()->NewAssignment(
|
| + Token::ASSIGN, factory()->NewVariableProxy(done),
|
| + factory()->NewBooleanLiteral(true, nopos), nopos),
|
| + nopos);
|
| +
|
| + // %AppendElement(array, result.value);
|
| + Statement* append_element;
|
| + {
|
| + auto args = new (zone()) ZoneList<Expression*>(2, zone());
|
| + args->Add(factory()->NewVariableProxy(array), zone());
|
| + args->Add(factory()->NewProperty(
|
| + factory()->NewVariableProxy(result),
|
| + factory()->NewStringLiteral(
|
| + ast_value_factory()->value_string(), nopos),
|
| + nopos),
|
| + zone());
|
| + append_element = factory()->NewExpressionStatement(
|
| + factory()->NewCallRuntime(Runtime::kAppendElement, args, nopos),
|
| + nopos);
|
| + }
|
|
|
| - auto empty_exprs = new (zone()) ZoneList<Expression*>(0, zone());
|
| - auto array = CreateTempVar(factory()->NewArrayLiteral(
|
| - empty_exprs,
|
| - // Reuse pattern's literal index - it is unused since there is no
|
| - // actual literal allocated.
|
| - node->literal_index(), 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(Context::CONCAT_ITERABLE_TO_ARRAY_INDEX,
|
| - 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_->statements()->Add(if_statement, zone());
|
| + // if (result.done) { #set_done } else { #append_element }
|
| + Statement* set_done_or_append;
|
| + {
|
| + Expression* result_done =
|
| + factory()->NewProperty(factory()->NewVariableProxy(result),
|
| + factory()->NewStringLiteral(
|
| + ast_value_factory()->done_string(), nopos),
|
| + nopos);
|
| + set_done_or_append = factory()->NewIfStatement(result_done, set_done,
|
| + append_element, nopos);
|
| + }
|
|
|
| - auto set_done = factory()->NewAssignment(
|
| - Token::ASSIGN, factory()->NewVariableProxy(done),
|
| - factory()->NewBooleanLiteral(true, nopos), nopos);
|
| - block_->statements()->Add(
|
| - factory()->NewExpressionStatement(set_done, nopos), zone());
|
| + // while (!done) {
|
| + // #get_next;
|
| + // #set_done_or_append;
|
| + // }
|
| + WhileStatement* loop = factory()->NewWhileStatement(nullptr, nopos);
|
| + {
|
| + Expression* condition = factory()->NewUnaryOperation(
|
| + Token::NOT, factory()->NewVariableProxy(done), nopos);
|
| + Block* body = factory()->NewBlock(nullptr, 2, true, nopos);
|
| + body->statements()->Add(get_next, zone());
|
| + body->statements()->Add(set_done_or_append, zone());
|
| + loop->Initialize(condition, body);
|
| + }
|
|
|
| + block_->statements()->Add(loop, zone());
|
| RecurseIntoSubpattern(spread->expression(),
|
| factory()->NewVariableProxy(array));
|
| }
|
|
|