| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 4a3dd2710b1514dcf0c179575a2e5420c132cfde..fd1b72264118df535763e8ae440d326ccda432c8 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -5406,7 +5406,37 @@ void HOptimizedGraphBuilder::VisitForOfStatement(ForOfStatement* stmt) {
|
| DCHECK(!HasStackOverflow());
|
| DCHECK(current_block() != NULL);
|
| DCHECK(current_block()->HasPredecessor());
|
| - return Bailout(kForOfStatement);
|
| + CHECK_ALIVE(VisitForEffect(stmt->assign_iterator()));
|
| + DCHECK(current_block() != NULL);
|
| + HBasicBlock* loop_entry = BuildLoopEntry(stmt);
|
| +
|
| + HBasicBlock* body_entry = graph()->CreateBasicBlock();
|
| + HBasicBlock* loop_successor = graph()->CreateBasicBlock();
|
| + CHECK_BAILOUT(VisitForEffect(stmt->next_result()));
|
| + CHECK_BAILOUT(
|
| + VisitForControl(stmt->result_done(), loop_successor, body_entry));
|
| + if (body_entry->HasPredecessor()) {
|
| + body_entry->SetJoinId(stmt->BackEdgeId());
|
| + set_current_block(body_entry);
|
| + }
|
| + if (loop_successor->HasPredecessor()) {
|
| + loop_successor->SetJoinId(stmt->ExitId());
|
| + } else {
|
| + loop_successor = NULL;
|
| + }
|
| +
|
| + BreakAndContinueInfo break_info(stmt, scope());
|
| + if (current_block() != NULL) {
|
| + BreakAndContinueScope push(&break_info, this);
|
| + CHECK_BAILOUT(VisitForEffect(stmt->assign_each()));
|
| + CHECK_BAILOUT(VisitLoopBody(stmt, loop_entry));
|
| + }
|
| + HBasicBlock* body_exit =
|
| + JoinContinue(stmt, current_block(), break_info.continue_block());
|
| +
|
| + HBasicBlock* loop_exit = CreateLoop(stmt, loop_entry, body_exit,
|
| + loop_successor, break_info.break_block());
|
| + set_current_block(loop_exit);
|
| }
|
|
|
|
|
|
|