| Index: runtime/vm/flow_graph_builder.cc
|
| diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
|
| index 8973cc48c5be045cc6f5d1a8fe64ff35a8170d6f..e0e279513ee5fb8b9c5235ee4263df3145460bbe 100644
|
| --- a/runtime/vm/flow_graph_builder.cc
|
| +++ b/runtime/vm/flow_graph_builder.cc
|
| @@ -165,6 +165,17 @@ void NestedStatement::AdjustContextLevel(intptr_t context_level) {
|
| }
|
|
|
|
|
| +intptr_t FlowGraphBuilder::GetNextDeoptId() const {
|
| + intptr_t deopt_id = thread()->GetNextDeoptId();
|
| + if (context_level_array_ != NULL) {
|
| + intptr_t level = context_level();
|
| + context_level_array_->Add(deopt_id);
|
| + context_level_array_->Add(level);
|
| + }
|
| + return deopt_id;
|
| +}
|
| +
|
| +
|
| intptr_t FlowGraphBuilder::context_level() const {
|
| return (nesting_stack() == NULL) ? 0 : nesting_stack()->ContextLevel();
|
| }
|
| @@ -301,10 +312,12 @@ JoinEntryInstr* NestedSwitch::ContinueTargetFor(SourceLabel* label) {
|
| FlowGraphBuilder::FlowGraphBuilder(
|
| const ParsedFunction& parsed_function,
|
| const ZoneGrowableArray<const ICData*>& ic_data_array,
|
| + ZoneGrowableArray<intptr_t>* context_level_array,
|
| InlineExitCollector* exit_collector,
|
| intptr_t osr_id)
|
| : parsed_function_(parsed_function),
|
| ic_data_array_(ic_data_array),
|
| + context_level_array_(context_level_array),
|
| num_copied_params_(parsed_function.num_copied_params()),
|
| // All parameters are copied if any parameter is.
|
| num_non_copied_params_(
|
| @@ -1104,7 +1117,8 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
|
| if (FLAG_support_debugger && node->token_pos().IsDebugPause() &&
|
| !function.is_native()) {
|
| AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
|
| - RawPcDescriptors::kRuntimeCall));
|
| + RawPcDescriptors::kRuntimeCall,
|
| + owner()->GetNextDeoptId()));
|
| }
|
|
|
| NestedContextAdjustment context_adjustment(owner(), owner()->context_level());
|
| @@ -1496,7 +1510,7 @@ AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable(
|
| function_type_arguments = BuildFunctionTypeArguments(token_pos);
|
| }
|
|
|
| - const intptr_t deopt_id = Thread::Current()->GetNextDeoptId();
|
| + const intptr_t deopt_id = owner()->GetNextDeoptId();
|
| return new (Z) AssertAssignableInstr(
|
| token_pos, value, instantiator_type_arguments, function_type_arguments,
|
| dst_type, dst_name, deopt_id);
|
| @@ -2112,7 +2126,8 @@ void EffectGraphVisitor::VisitForNode(ForNode* node) {
|
| void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
|
| if (FLAG_support_debugger && owner()->function().is_debuggable()) {
|
| AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
|
| - RawPcDescriptors::kRuntimeCall));
|
| + RawPcDescriptors::kRuntimeCall,
|
| + owner()->GetNextDeoptId()));
|
| }
|
|
|
| NestedContextAdjustment context_adjustment(owner(), owner()->context_level());
|
| @@ -3463,8 +3478,9 @@ void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) {
|
| !rhs->AsLoadLocalNode()->local().IsInternal()) ||
|
| rhs->IsClosureNode()) &&
|
| !node->local().IsInternal() && node->token_pos().IsDebugPause()) {
|
| - AddInstruction(new (Z) DebugStepCheckInstr(
|
| - node->token_pos(), RawPcDescriptors::kRuntimeCall));
|
| + AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
|
| + RawPcDescriptors::kRuntimeCall,
|
| + owner()->GetNextDeoptId()));
|
| }
|
| }
|
|
|
| @@ -3566,8 +3582,9 @@ Definition* EffectGraphVisitor::BuildStoreStaticField(
|
| if ((rhs->IsLiteralNode() || rhs->IsLoadLocalNode() ||
|
| rhs->IsLoadStaticFieldNode() || rhs->IsClosureNode()) &&
|
| node->token_pos().IsDebugPause()) {
|
| - AddInstruction(new (Z) DebugStepCheckInstr(
|
| - node->token_pos(), RawPcDescriptors::kRuntimeCall));
|
| + AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
|
| + RawPcDescriptors::kRuntimeCall,
|
| + owner()->GetNextDeoptId()));
|
| }
|
| }
|
|
|
| @@ -3927,8 +3944,8 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
|
| check_pos = node->token_pos();
|
| ASSERT(check_pos.IsDebugPause());
|
| }
|
| - AddInstruction(
|
| - new (Z) DebugStepCheckInstr(check_pos, RawPcDescriptors::kRuntimeCall));
|
| + AddInstruction(new (Z) DebugStepCheckInstr(
|
| + check_pos, RawPcDescriptors::kRuntimeCall, owner()->GetNextDeoptId()));
|
| }
|
|
|
| // This check may be deleted if the generated code is leaf.
|
| @@ -4164,7 +4181,7 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
|
| owner()->AllocateBlockId(), catch_handler_index, owner()->graph_entry(),
|
| catch_block->handler_types(), try_handler_index,
|
| catch_block->exception_var(), catch_block->stacktrace_var(),
|
| - catch_block->needs_stacktrace(), Thread::Current()->GetNextDeoptId());
|
| + catch_block->needs_stacktrace(), owner()->GetNextDeoptId());
|
| owner()->AddCatchEntry(catch_entry);
|
| AppendFragment(catch_entry, for_catch);
|
|
|
| @@ -4210,7 +4227,7 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
|
| owner()->AllocateBlockId(), original_handler_index,
|
| owner()->graph_entry(), types, catch_handler_index,
|
| catch_block->exception_var(), catch_block->stacktrace_var(),
|
| - catch_block->needs_stacktrace(), Thread::Current()->GetNextDeoptId());
|
| + catch_block->needs_stacktrace(), owner()->GetNextDeoptId());
|
| owner()->AddCatchEntry(finally_entry);
|
| AppendFragment(finally_entry, for_finally);
|
| }
|
| @@ -4339,8 +4356,9 @@ void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
|
| node->exception()->IsLoadLocalNode() ||
|
| node->exception()->IsLoadStaticFieldNode() ||
|
| node->exception()->IsClosureNode()) {
|
| - AddInstruction(new (Z) DebugStepCheckInstr(
|
| - node->token_pos(), RawPcDescriptors::kRuntimeCall));
|
| + AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
|
| + RawPcDescriptors::kRuntimeCall,
|
| + owner()->GetNextDeoptId()));
|
| }
|
| }
|
| ValueGraphVisitor for_exception(owner());
|
|
|