| Index: runtime/vm/flow_graph_builder.cc | 
| =================================================================== | 
| --- runtime/vm/flow_graph_builder.cc	(revision 41104) | 
| +++ runtime/vm/flow_graph_builder.cc	(working copy) | 
| @@ -259,7 +259,7 @@ | 
| args_pushed_(0), | 
| nesting_stack_(NULL), | 
| osr_id_(osr_id), | 
| -        jump_cnt_(0), | 
| +        jump_count_(0), | 
| await_joins_(new(I) ZoneGrowableArray<JoinEntryInstr*>()), | 
| await_levels_(new(I) ZoneGrowableArray<intptr_t>()) { } | 
|  | 
| @@ -1095,6 +1095,14 @@ | 
|  | 
|  | 
| AddReturnExit(node->token_pos(), return_value); | 
| + | 
| +  if (function.is_async_closure() && | 
| +      (node->return_type() == ReturnNode::kContinuationTarget)) { | 
| +    JoinEntryInstr* const join = new(I) JoinEntryInstr( | 
| +        owner()->AllocateBlockId(), owner()->try_index()); | 
| +    owner()->await_joins()->Add(join); | 
| +    exit_ = join; | 
| +  } | 
| } | 
|  | 
|  | 
| @@ -2214,43 +2222,28 @@ | 
|  | 
|  | 
| void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) { | 
| -  if (node->marker_type() == AwaitMarkerNode::kNewContinuationState) { | 
| -    // We need to create a new await state which involves: | 
| -    // * Increase the jump counter. Sanity check against the list of targets. | 
| -    // * Save the current context for resuming. | 
| -    ASSERT(node->scope() != NULL); | 
| -    LocalVariable* jump_var = node->scope()->LookupVariable( | 
| -        Symbols::AwaitJumpVar(), false); | 
| -    LocalVariable* ctx_var = node->scope()->LookupVariable( | 
| -        Symbols::AwaitContextVar(), false); | 
| -    ASSERT((jump_var != NULL) && jump_var->is_captured()); | 
| -    ASSERT((ctx_var != NULL) && ctx_var->is_captured()); | 
| -    const intptr_t jump_cnt = owner()->next_await_counter(); | 
| -    ASSERT(jump_cnt >= 0); | 
| -    // Sanity check that we always add a JoinEntryInstr before adding a new | 
| -    // state. | 
| -    ASSERT(jump_cnt == owner()->await_joins()->length()); | 
| -    // Store the counter in :await_jump_var. | 
| -    Value* jump_val = Bind(new (I) ConstantInstr( | 
| -        Smi::ZoneHandle(I, Smi::New(jump_cnt)))); | 
| -    Do(BuildStoreLocal(*jump_var, jump_val)); | 
| -    // Save the current context for resuming. | 
| -    BuildSaveContext(*ctx_var); | 
| -    owner()->await_levels()->Add(owner()->context_level()); | 
| -    return; | 
| -  } | 
| -  if (node->marker_type() == AwaitMarkerNode::kTargetForContinuation) { | 
| -    // We need to create a new await target which involves: | 
| -    // * Append a join that is also added to the list that will later result in | 
| -    //   a preamble. | 
| -    JoinEntryInstr* const join = new(I) JoinEntryInstr( | 
| -        owner()->AllocateBlockId(), owner()->try_index()); | 
| -    owner()->await_joins()->Add(join); | 
| -    Goto(join); | 
| -    exit_ = join; | 
| -    return; | 
| -  } | 
| -  UNREACHABLE(); | 
| +  // We need to create a new await state which involves: | 
| +  // * Increase the jump counter. Sanity check against the list of targets. | 
| +  // * Save the current context for resuming. | 
| +  ASSERT(node->scope() != NULL); | 
| +  LocalVariable* jump_var = node->scope()->LookupVariable( | 
| +      Symbols::AwaitJumpVar(), false); | 
| +  LocalVariable* ctx_var = node->scope()->LookupVariable( | 
| +      Symbols::AwaitContextVar(), false); | 
| +  ASSERT((jump_var != NULL) && jump_var->is_captured()); | 
| +  ASSERT((ctx_var != NULL) && ctx_var->is_captured()); | 
| +  const intptr_t jump_count = owner()->next_await_counter(); | 
| +  ASSERT(jump_count >= 0); | 
| +  // Sanity check that we always add a JoinEntryInstr before adding a new | 
| +  // state. | 
| +  ASSERT(jump_count == owner()->await_joins()->length()); | 
| +  // Store the counter in :await_jump_var. | 
| +  Value* jump_val = Bind(new (I) ConstantInstr( | 
| +      Smi::ZoneHandle(I, Smi::New(jump_count)))); | 
| +  Do(BuildStoreLocal(*jump_var, jump_val)); | 
| +  // Save the current context for resuming. | 
| +  BuildSaveContext(*ctx_var); | 
| +  owner()->await_levels()->Add(owner()->context_level()); | 
| } | 
|  | 
|  | 
| @@ -3884,19 +3877,19 @@ | 
| entry_ = NULL; | 
| exit_ = NULL; | 
|  | 
| -    LoadLocalNode* load_jump_cnt = new(I) LoadLocalNode( | 
| +    LoadLocalNode* load_jump_count = new(I) LoadLocalNode( | 
| Scanner::kNoSourcePos, jump_var); | 
| -    ComparisonNode* check_jump_cnt; | 
| +    ComparisonNode* check_jump_count; | 
| const intptr_t num_await_states = owner()->await_joins()->length(); | 
| for (intptr_t i = 0; i < num_await_states; i++) { | 
| -      check_jump_cnt = new(I) ComparisonNode( | 
| +      check_jump_count = new(I) ComparisonNode( | 
| Scanner::kNoSourcePos, | 
| Token::kEQ, | 
| -          load_jump_cnt, | 
| +          load_jump_count, | 
| new(I) LiteralNode( | 
| Scanner::kNoSourcePos, Smi::ZoneHandle(I, Smi::New(i)))); | 
| TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos); | 
| -      check_jump_cnt->Visit(&for_test); | 
| +      check_jump_count->Visit(&for_test); | 
| EffectGraphVisitor for_true(owner()); | 
| EffectGraphVisitor for_false(owner()); | 
|  | 
|  |