| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/flow_graph_builder.h" | 5 #include "vm/flow_graph_builder.h" |
| 6 | 6 |
| 7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
| 8 #include "vm/ast_printer.h" | 8 #include "vm/ast_printer.h" |
| 9 #include "vm/bit_vector.h" | 9 #include "vm/bit_vector.h" |
| 10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 } | 158 } |
| 159 | 159 |
| 160 | 160 |
| 161 void NestedStatement::AdjustContextLevel(intptr_t context_level) { | 161 void NestedStatement::AdjustContextLevel(intptr_t context_level) { |
| 162 // There must be a NestedContextAdjustment on the nesting stack. | 162 // There must be a NestedContextAdjustment on the nesting stack. |
| 163 ASSERT(outer() != NULL); | 163 ASSERT(outer() != NULL); |
| 164 outer()->AdjustContextLevel(context_level); | 164 outer()->AdjustContextLevel(context_level); |
| 165 } | 165 } |
| 166 | 166 |
| 167 | 167 |
| 168 intptr_t FlowGraphBuilder::GetNextDeoptId() const { |
| 169 intptr_t deopt_id = thread()->GetNextDeoptId(); |
| 170 if (context_level_array_ != NULL) { |
| 171 intptr_t level = context_level(); |
| 172 context_level_array_->Add(deopt_id); |
| 173 context_level_array_->Add(level); |
| 174 } |
| 175 return deopt_id; |
| 176 } |
| 177 |
| 178 |
| 168 intptr_t FlowGraphBuilder::context_level() const { | 179 intptr_t FlowGraphBuilder::context_level() const { |
| 169 return (nesting_stack() == NULL) ? 0 : nesting_stack()->ContextLevel(); | 180 return (nesting_stack() == NULL) ? 0 : nesting_stack()->ContextLevel(); |
| 170 } | 181 } |
| 171 | 182 |
| 172 | 183 |
| 173 JoinEntryInstr* NestedStatement::BreakTargetFor(SourceLabel* label) { | 184 JoinEntryInstr* NestedStatement::BreakTargetFor(SourceLabel* label) { |
| 174 if (label != label_) return NULL; | 185 if (label != label_) return NULL; |
| 175 if (break_target_ == NULL) { | 186 if (break_target_ == NULL) { |
| 176 break_target_ = new (owner()->zone()) JoinEntryInstr( | 187 break_target_ = new (owner()->zone()) JoinEntryInstr( |
| 177 owner()->AllocateBlockId(), try_index(), owner()->GetNextDeoptId()); | 188 owner()->AllocateBlockId(), try_index(), owner()->GetNextDeoptId()); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 } | 305 } |
| 295 return case_targets_[i]; | 306 return case_targets_[i]; |
| 296 } | 307 } |
| 297 return NULL; | 308 return NULL; |
| 298 } | 309 } |
| 299 | 310 |
| 300 | 311 |
| 301 FlowGraphBuilder::FlowGraphBuilder( | 312 FlowGraphBuilder::FlowGraphBuilder( |
| 302 const ParsedFunction& parsed_function, | 313 const ParsedFunction& parsed_function, |
| 303 const ZoneGrowableArray<const ICData*>& ic_data_array, | 314 const ZoneGrowableArray<const ICData*>& ic_data_array, |
| 315 ZoneGrowableArray<intptr_t>* context_level_array, |
| 304 InlineExitCollector* exit_collector, | 316 InlineExitCollector* exit_collector, |
| 305 intptr_t osr_id) | 317 intptr_t osr_id) |
| 306 : parsed_function_(parsed_function), | 318 : parsed_function_(parsed_function), |
| 307 ic_data_array_(ic_data_array), | 319 ic_data_array_(ic_data_array), |
| 320 context_level_array_(context_level_array), |
| 308 num_copied_params_(parsed_function.num_copied_params()), | 321 num_copied_params_(parsed_function.num_copied_params()), |
| 309 // All parameters are copied if any parameter is. | 322 // All parameters are copied if any parameter is. |
| 310 num_non_copied_params_( | 323 num_non_copied_params_( |
| 311 (num_copied_params_ == 0) | 324 (num_copied_params_ == 0) |
| 312 ? parsed_function.function().num_fixed_parameters() | 325 ? parsed_function.function().num_fixed_parameters() |
| 313 : 0), | 326 : 0), |
| 314 num_stack_locals_(parsed_function.num_stack_locals()), | 327 num_stack_locals_(parsed_function.num_stack_locals()), |
| 315 exit_collector_(exit_collector), | 328 exit_collector_(exit_collector), |
| 316 last_used_block_id_(0), // 0 is used for the graph entry. | 329 last_used_block_id_(0), // 0 is used for the graph entry. |
| 317 try_index_(CatchClauseNode::kInvalidTryIndex), | 330 try_index_(CatchClauseNode::kInvalidTryIndex), |
| (...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 | 1110 |
| 1098 // Call to stub that checks whether the debugger is in single | 1111 // Call to stub that checks whether the debugger is in single |
| 1099 // step mode. This call must happen before the contexts are | 1112 // step mode. This call must happen before the contexts are |
| 1100 // unchained so that captured variables can be inspected. | 1113 // unchained so that captured variables can be inspected. |
| 1101 // No debugger check is done in native functions or for return | 1114 // No debugger check is done in native functions or for return |
| 1102 // statements for which there is no associated source position. | 1115 // statements for which there is no associated source position. |
| 1103 const Function& function = owner()->function(); | 1116 const Function& function = owner()->function(); |
| 1104 if (FLAG_support_debugger && node->token_pos().IsDebugPause() && | 1117 if (FLAG_support_debugger && node->token_pos().IsDebugPause() && |
| 1105 !function.is_native()) { | 1118 !function.is_native()) { |
| 1106 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), | 1119 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), |
| 1107 RawPcDescriptors::kRuntimeCall)); | 1120 RawPcDescriptors::kRuntimeCall, |
| 1121 owner()->GetNextDeoptId())); |
| 1108 } | 1122 } |
| 1109 | 1123 |
| 1110 NestedContextAdjustment context_adjustment(owner(), owner()->context_level()); | 1124 NestedContextAdjustment context_adjustment(owner(), owner()->context_level()); |
| 1111 | 1125 |
| 1112 if (node->inlined_finally_list_length() > 0) { | 1126 if (node->inlined_finally_list_length() > 0) { |
| 1113 LocalVariable* temp = owner()->parsed_function().finally_return_temp_var(); | 1127 LocalVariable* temp = owner()->parsed_function().finally_return_temp_var(); |
| 1114 ASSERT(temp != NULL); | 1128 ASSERT(temp != NULL); |
| 1115 Do(BuildStoreLocal(*temp, return_value, node->token_pos())); | 1129 Do(BuildStoreLocal(*temp, return_value, node->token_pos())); |
| 1116 for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) { | 1130 for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) { |
| 1117 InlineBailout("EffectGraphVisitor::VisitReturnNode (exception)"); | 1131 InlineBailout("EffectGraphVisitor::VisitReturnNode (exception)"); |
| (...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 instantiator_type_arguments = BuildNullValue(token_pos); | 1503 instantiator_type_arguments = BuildNullValue(token_pos); |
| 1490 } else { | 1504 } else { |
| 1491 instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); | 1505 instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); |
| 1492 } | 1506 } |
| 1493 if (dst_type.IsInstantiated(kFunctions)) { | 1507 if (dst_type.IsInstantiated(kFunctions)) { |
| 1494 function_type_arguments = BuildNullValue(token_pos); | 1508 function_type_arguments = BuildNullValue(token_pos); |
| 1495 } else { | 1509 } else { |
| 1496 function_type_arguments = BuildFunctionTypeArguments(token_pos); | 1510 function_type_arguments = BuildFunctionTypeArguments(token_pos); |
| 1497 } | 1511 } |
| 1498 | 1512 |
| 1499 const intptr_t deopt_id = Thread::Current()->GetNextDeoptId(); | 1513 const intptr_t deopt_id = owner()->GetNextDeoptId(); |
| 1500 return new (Z) AssertAssignableInstr( | 1514 return new (Z) AssertAssignableInstr( |
| 1501 token_pos, value, instantiator_type_arguments, function_type_arguments, | 1515 token_pos, value, instantiator_type_arguments, function_type_arguments, |
| 1502 dst_type, dst_name, deopt_id); | 1516 dst_type, dst_name, deopt_id); |
| 1503 } | 1517 } |
| 1504 | 1518 |
| 1505 | 1519 |
| 1506 // Used for type casts and to test assignments. | 1520 // Used for type casts and to test assignments. |
| 1507 Value* EffectGraphVisitor::BuildAssignableValue(TokenPosition token_pos, | 1521 Value* EffectGraphVisitor::BuildAssignableValue(TokenPosition token_pos, |
| 1508 Value* value, | 1522 Value* value, |
| 1509 const AbstractType& dst_type, | 1523 const AbstractType& dst_type, |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 for_test.IfFalseGoto(nested_loop.break_target()); | 2119 for_test.IfFalseGoto(nested_loop.break_target()); |
| 2106 exit_ = nested_loop.break_target(); | 2120 exit_ = nested_loop.break_target(); |
| 2107 } | 2121 } |
| 2108 } | 2122 } |
| 2109 } | 2123 } |
| 2110 | 2124 |
| 2111 | 2125 |
| 2112 void EffectGraphVisitor::VisitJumpNode(JumpNode* node) { | 2126 void EffectGraphVisitor::VisitJumpNode(JumpNode* node) { |
| 2113 if (FLAG_support_debugger && owner()->function().is_debuggable()) { | 2127 if (FLAG_support_debugger && owner()->function().is_debuggable()) { |
| 2114 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), | 2128 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), |
| 2115 RawPcDescriptors::kRuntimeCall)); | 2129 RawPcDescriptors::kRuntimeCall, |
| 2130 owner()->GetNextDeoptId())); |
| 2116 } | 2131 } |
| 2117 | 2132 |
| 2118 NestedContextAdjustment context_adjustment(owner(), owner()->context_level()); | 2133 NestedContextAdjustment context_adjustment(owner(), owner()->context_level()); |
| 2119 | 2134 |
| 2120 for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) { | 2135 for (intptr_t i = 0; i < node->inlined_finally_list_length(); i++) { |
| 2121 EffectGraphVisitor for_effect(owner()); | 2136 EffectGraphVisitor for_effect(owner()); |
| 2122 node->InlinedFinallyNodeAt(i)->Visit(&for_effect); | 2137 node->InlinedFinallyNodeAt(i)->Visit(&for_effect); |
| 2123 Append(for_effect); | 2138 Append(for_effect); |
| 2124 if (!is_open()) return; | 2139 if (!is_open()) return; |
| 2125 } | 2140 } |
| (...skipping 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3456 if (FLAG_support_debugger) { | 3471 if (FLAG_support_debugger) { |
| 3457 AstNode* rhs = node->value(); | 3472 AstNode* rhs = node->value(); |
| 3458 if (rhs->IsAssignableNode()) { | 3473 if (rhs->IsAssignableNode()) { |
| 3459 rhs = rhs->AsAssignableNode()->expr(); | 3474 rhs = rhs->AsAssignableNode()->expr(); |
| 3460 } | 3475 } |
| 3461 if ((rhs->IsLiteralNode() || rhs->IsLoadStaticFieldNode() || | 3476 if ((rhs->IsLiteralNode() || rhs->IsLoadStaticFieldNode() || |
| 3462 (rhs->IsLoadLocalNode() && | 3477 (rhs->IsLoadLocalNode() && |
| 3463 !rhs->AsLoadLocalNode()->local().IsInternal()) || | 3478 !rhs->AsLoadLocalNode()->local().IsInternal()) || |
| 3464 rhs->IsClosureNode()) && | 3479 rhs->IsClosureNode()) && |
| 3465 !node->local().IsInternal() && node->token_pos().IsDebugPause()) { | 3480 !node->local().IsInternal() && node->token_pos().IsDebugPause()) { |
| 3466 AddInstruction(new (Z) DebugStepCheckInstr( | 3481 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), |
| 3467 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | 3482 RawPcDescriptors::kRuntimeCall, |
| 3483 owner()->GetNextDeoptId())); |
| 3468 } | 3484 } |
| 3469 } | 3485 } |
| 3470 | 3486 |
| 3471 ValueGraphVisitor for_value(owner()); | 3487 ValueGraphVisitor for_value(owner()); |
| 3472 node->value()->Visit(&for_value); | 3488 node->value()->Visit(&for_value); |
| 3473 Append(for_value); | 3489 Append(for_value); |
| 3474 Value* store_value = for_value.value(); | 3490 Value* store_value = for_value.value(); |
| 3475 if (Isolate::Current()->type_checks()) { | 3491 if (Isolate::Current()->type_checks()) { |
| 3476 store_value = | 3492 store_value = |
| 3477 BuildAssignableValue(node->value()->token_pos(), store_value, | 3493 BuildAssignableValue(node->value()->token_pos(), store_value, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3559 // If the right hand side is an expression that does not contain | 3575 // If the right hand side is an expression that does not contain |
| 3560 // a safe point for the debugger to stop, add an explicit stub | 3576 // a safe point for the debugger to stop, add an explicit stub |
| 3561 // call. | 3577 // call. |
| 3562 AstNode* rhs = node->value(); | 3578 AstNode* rhs = node->value(); |
| 3563 if (rhs->IsAssignableNode()) { | 3579 if (rhs->IsAssignableNode()) { |
| 3564 rhs = rhs->AsAssignableNode()->expr(); | 3580 rhs = rhs->AsAssignableNode()->expr(); |
| 3565 } | 3581 } |
| 3566 if ((rhs->IsLiteralNode() || rhs->IsLoadLocalNode() || | 3582 if ((rhs->IsLiteralNode() || rhs->IsLoadLocalNode() || |
| 3567 rhs->IsLoadStaticFieldNode() || rhs->IsClosureNode()) && | 3583 rhs->IsLoadStaticFieldNode() || rhs->IsClosureNode()) && |
| 3568 node->token_pos().IsDebugPause()) { | 3584 node->token_pos().IsDebugPause()) { |
| 3569 AddInstruction(new (Z) DebugStepCheckInstr( | 3585 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), |
| 3570 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | 3586 RawPcDescriptors::kRuntimeCall, |
| 3587 owner()->GetNextDeoptId())); |
| 3571 } | 3588 } |
| 3572 } | 3589 } |
| 3573 | 3590 |
| 3574 ValueGraphVisitor for_value(owner()); | 3591 ValueGraphVisitor for_value(owner()); |
| 3575 node->value()->Visit(&for_value); | 3592 node->value()->Visit(&for_value); |
| 3576 Append(for_value); | 3593 Append(for_value); |
| 3577 Value* store_value = NULL; | 3594 Value* store_value = NULL; |
| 3578 if (result_is_needed) { | 3595 if (result_is_needed) { |
| 3579 store_value = Bind(BuildStoreExprTemp(for_value.value(), token_pos)); | 3596 store_value = Bind(BuildStoreExprTemp(for_value.value(), token_pos)); |
| 3580 } else { | 3597 } else { |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3920 if (num_params > 0) { | 3937 if (num_params > 0) { |
| 3921 const LocalVariable& parameter = *scope->VariableAt(num_params - 1); | 3938 const LocalVariable& parameter = *scope->VariableAt(num_params - 1); |
| 3922 check_pos = parameter.token_pos(); | 3939 check_pos = parameter.token_pos(); |
| 3923 } | 3940 } |
| 3924 | 3941 |
| 3925 if (check_pos.IsNoSource() || (check_pos.Pos() < node->token_pos().Pos())) { | 3942 if (check_pos.IsNoSource() || (check_pos.Pos() < node->token_pos().Pos())) { |
| 3926 // No parameters or synthetic parameters, e.g. 'this'. | 3943 // No parameters or synthetic parameters, e.g. 'this'. |
| 3927 check_pos = node->token_pos(); | 3944 check_pos = node->token_pos(); |
| 3928 ASSERT(check_pos.IsDebugPause()); | 3945 ASSERT(check_pos.IsDebugPause()); |
| 3929 } | 3946 } |
| 3930 AddInstruction( | 3947 AddInstruction(new (Z) DebugStepCheckInstr( |
| 3931 new (Z) DebugStepCheckInstr(check_pos, RawPcDescriptors::kRuntimeCall)); | 3948 check_pos, RawPcDescriptors::kRuntimeCall, owner()->GetNextDeoptId())); |
| 3932 } | 3949 } |
| 3933 | 3950 |
| 3934 // This check may be deleted if the generated code is leaf. | 3951 // This check may be deleted if the generated code is leaf. |
| 3935 // Native functions don't need a stack check at entry. | 3952 // Native functions don't need a stack check at entry. |
| 3936 if (is_top_level_sequence && !function.is_native()) { | 3953 if (is_top_level_sequence && !function.is_native()) { |
| 3937 // Always allocate CheckOverflowInstr so that deopt-ids match regardless | 3954 // Always allocate CheckOverflowInstr so that deopt-ids match regardless |
| 3938 // if we inline or not. | 3955 // if we inline or not. |
| 3939 if (!function.IsImplicitGetterFunction() && | 3956 if (!function.IsImplicitGetterFunction() && |
| 3940 !function.IsImplicitSetterFunction()) { | 3957 !function.IsImplicitSetterFunction()) { |
| 3941 CheckStackOverflowInstr* check = new (Z) CheckStackOverflowInstr( | 3958 CheckStackOverflowInstr* check = new (Z) CheckStackOverflowInstr( |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4157 // and ':stack_trace_var' can never be captured variables. | 4174 // and ':stack_trace_var' can never be captured variables. |
| 4158 ASSERT(!catch_block->context_var().is_captured()); | 4175 ASSERT(!catch_block->context_var().is_captured()); |
| 4159 ASSERT(!catch_block->exception_var().is_captured()); | 4176 ASSERT(!catch_block->exception_var().is_captured()); |
| 4160 ASSERT(!catch_block->stacktrace_var().is_captured()); | 4177 ASSERT(!catch_block->stacktrace_var().is_captured()); |
| 4161 | 4178 |
| 4162 CatchBlockEntryInstr* catch_entry = new (Z) CatchBlockEntryInstr( | 4179 CatchBlockEntryInstr* catch_entry = new (Z) CatchBlockEntryInstr( |
| 4163 catch_block->token_pos(), (node->token_pos() == TokenPosition::kNoSource), | 4180 catch_block->token_pos(), (node->token_pos() == TokenPosition::kNoSource), |
| 4164 owner()->AllocateBlockId(), catch_handler_index, owner()->graph_entry(), | 4181 owner()->AllocateBlockId(), catch_handler_index, owner()->graph_entry(), |
| 4165 catch_block->handler_types(), try_handler_index, | 4182 catch_block->handler_types(), try_handler_index, |
| 4166 catch_block->exception_var(), catch_block->stacktrace_var(), | 4183 catch_block->exception_var(), catch_block->stacktrace_var(), |
| 4167 catch_block->needs_stacktrace(), Thread::Current()->GetNextDeoptId()); | 4184 catch_block->needs_stacktrace(), owner()->GetNextDeoptId()); |
| 4168 owner()->AddCatchEntry(catch_entry); | 4185 owner()->AddCatchEntry(catch_entry); |
| 4169 AppendFragment(catch_entry, for_catch); | 4186 AppendFragment(catch_entry, for_catch); |
| 4170 | 4187 |
| 4171 if (for_catch.is_open()) { | 4188 if (for_catch.is_open()) { |
| 4172 JoinEntryInstr* join = new (Z) | 4189 JoinEntryInstr* join = new (Z) |
| 4173 JoinEntryInstr(owner()->AllocateBlockId(), original_handler_index, | 4190 JoinEntryInstr(owner()->AllocateBlockId(), original_handler_index, |
| 4174 owner()->GetNextDeoptId()); | 4191 owner()->GetNextDeoptId()); |
| 4175 for_catch.Goto(join); | 4192 for_catch.Goto(join); |
| 4176 if (is_open()) Goto(join); | 4193 if (is_open()) Goto(join); |
| 4177 exit_ = join; | 4194 exit_ = join; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4203 ASSERT(!for_finally.is_open()); | 4220 ASSERT(!for_finally.is_open()); |
| 4204 | 4221 |
| 4205 const Array& types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld)); | 4222 const Array& types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld)); |
| 4206 types.SetAt(0, Object::dynamic_type()); | 4223 types.SetAt(0, Object::dynamic_type()); |
| 4207 CatchBlockEntryInstr* finally_entry = new (Z) CatchBlockEntryInstr( | 4224 CatchBlockEntryInstr* finally_entry = new (Z) CatchBlockEntryInstr( |
| 4208 finally_block->token_pos(), | 4225 finally_block->token_pos(), |
| 4209 true, // this is not a catch block from user code. | 4226 true, // this is not a catch block from user code. |
| 4210 owner()->AllocateBlockId(), original_handler_index, | 4227 owner()->AllocateBlockId(), original_handler_index, |
| 4211 owner()->graph_entry(), types, catch_handler_index, | 4228 owner()->graph_entry(), types, catch_handler_index, |
| 4212 catch_block->exception_var(), catch_block->stacktrace_var(), | 4229 catch_block->exception_var(), catch_block->stacktrace_var(), |
| 4213 catch_block->needs_stacktrace(), Thread::Current()->GetNextDeoptId()); | 4230 catch_block->needs_stacktrace(), owner()->GetNextDeoptId()); |
| 4214 owner()->AddCatchEntry(finally_entry); | 4231 owner()->AddCatchEntry(finally_entry); |
| 4215 AppendFragment(finally_entry, for_finally); | 4232 AppendFragment(finally_entry, for_finally); |
| 4216 } | 4233 } |
| 4217 | 4234 |
| 4218 // Generate code for the finally block if one exists. | 4235 // Generate code for the finally block if one exists. |
| 4219 if ((finally_block != NULL) && is_open()) { | 4236 if ((finally_block != NULL) && is_open()) { |
| 4220 EffectGraphVisitor for_finally_block(owner()); | 4237 EffectGraphVisitor for_finally_block(owner()); |
| 4221 finally_block->Visit(&for_finally_block); | 4238 finally_block->Visit(&for_finally_block); |
| 4222 Append(for_finally_block); | 4239 Append(for_finally_block); |
| 4223 } | 4240 } |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4332 owner()->GetNextDeoptId()); | 4349 owner()->GetNextDeoptId()); |
| 4333 } | 4350 } |
| 4334 | 4351 |
| 4335 | 4352 |
| 4336 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) { | 4353 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) { |
| 4337 if (FLAG_support_debugger) { | 4354 if (FLAG_support_debugger) { |
| 4338 if (node->exception()->IsLiteralNode() || | 4355 if (node->exception()->IsLiteralNode() || |
| 4339 node->exception()->IsLoadLocalNode() || | 4356 node->exception()->IsLoadLocalNode() || |
| 4340 node->exception()->IsLoadStaticFieldNode() || | 4357 node->exception()->IsLoadStaticFieldNode() || |
| 4341 node->exception()->IsClosureNode()) { | 4358 node->exception()->IsClosureNode()) { |
| 4342 AddInstruction(new (Z) DebugStepCheckInstr( | 4359 AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(), |
| 4343 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | 4360 RawPcDescriptors::kRuntimeCall, |
| 4361 owner()->GetNextDeoptId())); |
| 4344 } | 4362 } |
| 4345 } | 4363 } |
| 4346 ValueGraphVisitor for_exception(owner()); | 4364 ValueGraphVisitor for_exception(owner()); |
| 4347 node->exception()->Visit(&for_exception); | 4365 node->exception()->Visit(&for_exception); |
| 4348 Append(for_exception); | 4366 Append(for_exception); |
| 4349 PushArgument(for_exception.value()); | 4367 PushArgument(for_exception.value()); |
| 4350 Instruction* instr = NULL; | 4368 Instruction* instr = NULL; |
| 4351 if (node->stacktrace() == NULL) { | 4369 if (node->stacktrace() == NULL) { |
| 4352 instr = new (Z) ThrowInstr(node->token_pos(), owner()->GetNextDeoptId()); | 4370 instr = new (Z) ThrowInstr(node->token_pos(), owner()->GetNextDeoptId()); |
| 4353 } else { | 4371 } else { |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4492 ASSERT(type.HasResolvedTypeClass()); | 4510 ASSERT(type.HasResolvedTypeClass()); |
| 4493 const Class& type_class = Class::Handle(type.type_class()); | 4511 const Class& type_class = Class::Handle(type.type_class()); |
| 4494 // Bail if the type has any type parameters. | 4512 // Bail if the type has any type parameters. |
| 4495 if (type_class.IsGeneric()) return false; | 4513 if (type_class.IsGeneric()) return false; |
| 4496 | 4514 |
| 4497 // Finally a simple class for instance of checking. | 4515 // Finally a simple class for instance of checking. |
| 4498 return true; | 4516 return true; |
| 4499 } | 4517 } |
| 4500 | 4518 |
| 4501 } // namespace dart | 4519 } // namespace dart |
| OLD | NEW |