Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: runtime/vm/flow_graph_builder.cc

Issue 2903993002: Remember deopt-id -> context-level mappings in var descriptors. (Closed)
Patch Set: update descriptor tests Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_builder_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_builder_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698