| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
| 6 | 6 |
| 7 #include "vm/bit_vector.h" | 7 #include "vm/bit_vector.h" |
| 8 #include "vm/bootstrap.h" | 8 #include "vm/bootstrap.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/constant_propagator.h" | 10 #include "vm/constant_propagator.h" |
| (...skipping 3327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3338 | 3338 |
| 3339 intptr_t PolymorphicInstanceCallInstr::CallCount() const { | 3339 intptr_t PolymorphicInstanceCallInstr::CallCount() const { |
| 3340 return targets().AggregateCallCount(); | 3340 return targets().AggregateCallCount(); |
| 3341 } | 3341 } |
| 3342 | 3342 |
| 3343 | 3343 |
| 3344 // DBC does not support optimizing compiler and thus doesn't emit | 3344 // DBC does not support optimizing compiler and thus doesn't emit |
| 3345 // PolymorphicInstanceCallInstr. | 3345 // PolymorphicInstanceCallInstr. |
| 3346 #if !defined(TARGET_ARCH_DBC) | 3346 #if !defined(TARGET_ARCH_DBC) |
| 3347 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3347 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3348 if (!with_checks()) { | |
| 3349 ASSERT(targets().HasSingleTarget()); | |
| 3350 const Function& target = targets().FirstTarget(); | |
| 3351 compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), | |
| 3352 target, instance_call()->ArgumentCount(), | |
| 3353 instance_call()->argument_names(), locs(), | |
| 3354 ICData::Handle()); | |
| 3355 return; | |
| 3356 } | |
| 3357 | |
| 3358 compiler->EmitPolymorphicInstanceCall( | 3348 compiler->EmitPolymorphicInstanceCall( |
| 3359 targets_, *instance_call(), instance_call()->ArgumentCount(), | 3349 targets_, *instance_call(), instance_call()->ArgumentCount(), |
| 3360 instance_call()->argument_names(), deopt_id(), | 3350 instance_call()->argument_names(), deopt_id(), |
| 3361 instance_call()->token_pos(), locs(), complete(), total_call_count()); | 3351 instance_call()->token_pos(), locs(), complete(), total_call_count()); |
| 3362 } | 3352 } |
| 3363 #endif | 3353 #endif |
| 3364 | 3354 |
| 3365 | 3355 |
| 3366 RawType* PolymorphicInstanceCallInstr::ComputeRuntimeType( | 3356 RawType* PolymorphicInstanceCallInstr::ComputeRuntimeType( |
| 3367 const CallTargets& targets) { | 3357 const CallTargets& targets) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3408 const CallTargets* new_target = | 3398 const CallTargets* new_target = |
| 3409 FlowGraphCompiler::ResolveCallTargetsForReceiverCid( | 3399 FlowGraphCompiler::ResolveCallTargetsForReceiverCid( |
| 3410 receiver_cid, | 3400 receiver_cid, |
| 3411 String::Handle(flow_graph->zone(), ic_data()->target_name()), | 3401 String::Handle(flow_graph->zone(), ic_data()->target_name()), |
| 3412 Array::Handle(flow_graph->zone(), ic_data()->arguments_descriptor())); | 3402 Array::Handle(flow_graph->zone(), ic_data()->arguments_descriptor())); |
| 3413 if (new_target == NULL) { | 3403 if (new_target == NULL) { |
| 3414 // No specialization. | 3404 // No specialization. |
| 3415 return this; | 3405 return this; |
| 3416 } | 3406 } |
| 3417 | 3407 |
| 3418 const bool with_checks = false; | 3408 ASSERT(new_target->HasSingleTarget()); |
| 3419 const bool complete = false; | 3409 const Function& target = new_target->FirstTarget(); |
| 3420 PolymorphicInstanceCallInstr* specialized = new PolymorphicInstanceCallInstr( | 3410 StaticCallInstr* specialized = |
| 3421 this, *new_target, with_checks, complete); | 3411 StaticCallInstr::FromCall(flow_graph->zone(), this, target); |
| 3422 flow_graph->InsertBefore(this, specialized, env(), FlowGraph::kValue); | 3412 flow_graph->InsertBefore(this, specialized, env(), FlowGraph::kValue); |
| 3423 return specialized; | 3413 return specialized; |
| 3424 } | 3414 } |
| 3425 | 3415 |
| 3426 | 3416 |
| 3427 Definition* PolymorphicInstanceCallInstr::Canonicalize(FlowGraph* flow_graph) { | 3417 Definition* PolymorphicInstanceCallInstr::Canonicalize(FlowGraph* flow_graph) { |
| 3428 if (!IsSureToCallSingleRecognizedTarget()) { | 3418 if (!IsSureToCallSingleRecognizedTarget()) { |
| 3429 return this; | 3419 return this; |
| 3430 } | 3420 } |
| 3431 | 3421 |
| 3432 const Function& target = targets().FirstTarget(); | 3422 const Function& target = targets().FirstTarget(); |
| 3433 if (target.recognized_kind() == MethodRecognizer::kObjectRuntimeType) { | 3423 if (target.recognized_kind() == MethodRecognizer::kObjectRuntimeType) { |
| 3434 const AbstractType& type = | 3424 const AbstractType& type = |
| 3435 AbstractType::Handle(ComputeRuntimeType(targets_)); | 3425 AbstractType::Handle(ComputeRuntimeType(targets_)); |
| 3436 if (!type.IsNull()) { | 3426 if (!type.IsNull()) { |
| 3437 return flow_graph->GetConstant(type); | 3427 return flow_graph->GetConstant(type); |
| 3438 } | 3428 } |
| 3439 } | 3429 } |
| 3440 | 3430 |
| 3441 return this; | 3431 return this; |
| 3442 } | 3432 } |
| 3443 | 3433 |
| 3444 | 3434 |
| 3445 bool PolymorphicInstanceCallInstr::IsSureToCallSingleRecognizedTarget() const { | 3435 bool PolymorphicInstanceCallInstr::IsSureToCallSingleRecognizedTarget() const { |
| 3446 if (FLAG_precompiled_mode && with_checks()) return false; | 3436 if (FLAG_precompiled_mode && !complete()) return false; |
| 3447 return targets_.HasSingleRecognizedTarget(); | 3437 return targets_.HasSingleRecognizedTarget(); |
| 3448 } | 3438 } |
| 3449 | 3439 |
| 3450 | 3440 |
| 3451 Definition* StaticCallInstr::Canonicalize(FlowGraph* flow_graph) { | 3441 Definition* StaticCallInstr::Canonicalize(FlowGraph* flow_graph) { |
| 3452 if (!FLAG_precompiled_mode) { | 3442 if (!FLAG_precompiled_mode) { |
| 3453 return this; | 3443 return this; |
| 3454 } | 3444 } |
| 3455 | 3445 |
| 3456 if (function().recognized_kind() == MethodRecognizer::kObjectRuntimeType) { | 3446 if (function().recognized_kind() == MethodRecognizer::kObjectRuntimeType) { |
| (...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4183 "native function '%s' (%" Pd " arguments) cannot be found", | 4173 "native function '%s' (%" Pd " arguments) cannot be found", |
| 4184 native_name().ToCString(), function().NumParameters()); | 4174 native_name().ToCString(), function().NumParameters()); |
| 4185 } | 4175 } |
| 4186 set_is_auto_scope(auto_setup_scope); | 4176 set_is_auto_scope(auto_setup_scope); |
| 4187 set_native_c_function(native_function); | 4177 set_native_c_function(native_function); |
| 4188 } | 4178 } |
| 4189 | 4179 |
| 4190 #undef __ | 4180 #undef __ |
| 4191 | 4181 |
| 4192 } // namespace dart | 4182 } // namespace dart |
| OLD | NEW |