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()); |