Index: runtime/vm/flow_graph_builder.cc |
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc |
index b5061df62c0c177a370d615ce6f4d2f04399b615..69ec40a76b031ff58441554df61757fb9857cc01 100644 |
--- a/runtime/vm/flow_graph_builder.cc |
+++ b/runtime/vm/flow_graph_builder.cc |
@@ -323,7 +323,8 @@ FlowGraphBuilder::FlowGraphBuilder( |
nesting_stack_(NULL), |
osr_id_(osr_id), |
jump_count_(0), |
- await_joins_(new (Z) ZoneGrowableArray<JoinEntryInstr*>()) {} |
+ await_joins_(new (Z) ZoneGrowableArray<JoinEntryInstr*>()), |
+ await_token_positions_(new (Z) ZoneGrowableArray<TokenPosition>()) {} |
void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) { |
@@ -2186,6 +2187,8 @@ void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) { |
Value* jump_val = Bind(new (Z) ConstantInstr( |
Smi::ZoneHandle(Z, Smi::New(jump_count)), node->token_pos())); |
Do(BuildStoreLocal(*jump_var, jump_val, node->token_pos())); |
+ // Add a mapping from jump_count -> token_position. |
+ owner()->AppendAwaitTokenPosition(node->token_pos()); |
// Save the current context for resuming. |
BuildSaveContext(*ctx_var, node->token_pos()); |
} |
@@ -4078,6 +4081,7 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) { |
ASSERT(!catch_block->stacktrace_var().is_captured()); |
CatchBlockEntryInstr* catch_entry = new (Z) CatchBlockEntryInstr( |
+ catch_block->token_pos(), (node->token_pos() == TokenPosition::kNoSource), |
owner()->AllocateBlockId(), catch_handler_index, owner()->graph_entry(), |
catch_block->handler_types(), try_handler_index, |
catch_block->exception_var(), catch_block->stacktrace_var(), |
@@ -4120,6 +4124,8 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) { |
const Array& types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld)); |
types.SetAt(0, Object::dynamic_type()); |
CatchBlockEntryInstr* finally_entry = new (Z) CatchBlockEntryInstr( |
+ finally_block->token_pos(), |
+ true, // this is not a catch block from user code. |
owner()->AllocateBlockId(), original_handler_index, |
owner()->graph_entry(), types, catch_handler_index, |
catch_block->exception_var(), catch_block->stacktrace_var(), |
@@ -4367,10 +4373,16 @@ FlowGraph* FlowGraphBuilder::BuildGraph() { |
FlowGraph* graph = |
new (Z) FlowGraph(parsed_function(), graph_entry_, last_used_block_id_); |
+ graph->set_await_token_positions(await_token_positions_); |
return graph; |
} |
+void FlowGraphBuilder::AppendAwaitTokenPosition(TokenPosition token_pos) { |
+ await_token_positions_->Add(token_pos); |
+} |
+ |
+ |
void FlowGraphBuilder::PruneUnreachable() { |
ASSERT(osr_id_ != Compiler::kNoOSRDeoptId); |
BitVector* block_marks = new (Z) BitVector(Z, last_used_block_id_ + 1); |