| Index: src/parsing/pattern-rewriter.cc | 
| diff --git a/src/parsing/pattern-rewriter.cc b/src/parsing/pattern-rewriter.cc | 
| index a9d2051b18c1ba30c64ee01db4b46d163fb87d75..91d75495469b9f966641eec51f772d016a056dc6 100644 | 
| --- a/src/parsing/pattern-rewriter.cc | 
| +++ b/src/parsing/pattern-rewriter.cc | 
| @@ -546,11 +546,11 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node, | 
|  | 
| // let array = []; | 
| // while (!done) { | 
| +    //   done = true;  // If .next, .done or .value throws, don't close. | 
| //   result = IteratorNext(iterator); | 
| -    //   if (result.done) { | 
| -    //     done = true; | 
| -    //   } else { | 
| +    //   if (!result.done) { | 
| //     %AppendElement(array, result.value); | 
| +    //     done = false; | 
| //   } | 
| // } | 
|  | 
| @@ -565,12 +565,6 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node, | 
| 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( | 
| @@ -578,6 +572,12 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node, | 
| factory()->NewBooleanLiteral(true, nopos), nopos), | 
| nopos); | 
|  | 
| +    // result = IteratorNext(iterator); | 
| +    Statement* get_next = factory()->NewExpressionStatement( | 
| +        parser_->BuildIteratorNextResult(factory()->NewVariableProxy(iterator), | 
| +                                         result, nopos), | 
| +        nopos); | 
| + | 
| // %AppendElement(array, result.value); | 
| Statement* append_element; | 
| { | 
| @@ -594,29 +594,44 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node, | 
| nopos); | 
| } | 
|  | 
| -    // if (result.done) { #set_done } else { #append_element } | 
| -    Statement* set_done_or_append; | 
| +    // done = false; | 
| +    Statement* unset_done = factory()->NewExpressionStatement( | 
| +        factory()->NewAssignment( | 
| +            Token::ASSIGN, factory()->NewVariableProxy(done), | 
| +            factory()->NewBooleanLiteral(false, nopos), nopos), | 
| +        nopos); | 
| + | 
| +    // if (!result.done) { #append_element; #unset_done } | 
| +    Statement* maybe_append_and_unset_done; | 
| { | 
| 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); | 
| + | 
| +      Block* then = factory()->NewBlock(nullptr, 2, true, nopos); | 
| +      then->statements()->Add(append_element, zone()); | 
| +      then->statements()->Add(unset_done, zone()); | 
| + | 
| +      maybe_append_and_unset_done = factory()->NewIfStatement( | 
| +          factory()->NewUnaryOperation(Token::NOT, result_done, nopos), then, | 
| +          factory()->NewEmptyStatement(nopos), nopos); | 
| } | 
|  | 
| // while (!done) { | 
| +    //   #set_done; | 
| //   #get_next; | 
| -    //   #set_done_or_append; | 
| +    //   #maybe_append_and_unset_done; | 
| // } | 
| WhileStatement* loop = factory()->NewWhileStatement(nullptr, nopos); | 
| { | 
| Expression* condition = factory()->NewUnaryOperation( | 
| Token::NOT, factory()->NewVariableProxy(done), nopos); | 
| -      Block* body = factory()->NewBlock(nullptr, 2, true, nopos); | 
| +      Block* body = factory()->NewBlock(nullptr, 3, true, nopos); | 
| +      body->statements()->Add(set_done, zone()); | 
| body->statements()->Add(get_next, zone()); | 
| -      body->statements()->Add(set_done_or_append, zone()); | 
| +      body->statements()->Add(maybe_append_and_unset_done, zone()); | 
| loop->Initialize(condition, body); | 
| } | 
|  | 
|  |