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 |