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

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

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: Created 3 years, 7 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
OLDNEW
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 3158 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 } 3169 }
3170 } 3170 }
3171 #endif 3171 #endif
3172 3172
3173 3173
3174 void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3174 void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3175 Zone* zone = compiler->zone(); 3175 Zone* zone = compiler->zone();
3176 const ICData* call_ic_data = NULL; 3176 const ICData* call_ic_data = NULL;
3177 if (!FLAG_propagate_ic_data || !compiler->is_optimizing() || 3177 if (!FLAG_propagate_ic_data || !compiler->is_optimizing() ||
3178 (ic_data() == NULL)) { 3178 (ic_data() == NULL)) {
3179 const Array& arguments_descriptor = Array::Handle( 3179 const Array& arguments_descriptor =
3180 zone, ArgumentsDescriptor::New(ArgumentCount(), argument_names())); 3180 Array::Handle(zone, ArgumentsDescriptor::New(
3181 type_args_len(),
3182 ArgumentCount() - (type_args_len() > 0 ? 1 : 0),
3183 argument_names()));
3181 call_ic_data = compiler->GetOrAddInstanceCallICData( 3184 call_ic_data = compiler->GetOrAddInstanceCallICData(
3182 deopt_id(), function_name(), arguments_descriptor, 3185 deopt_id(), function_name(), arguments_descriptor,
3183 checked_argument_count()); 3186 checked_argument_count());
3184 } else { 3187 } else {
3185 call_ic_data = &ICData::ZoneHandle(zone, ic_data()->raw()); 3188 call_ic_data = &ICData::ZoneHandle(zone, ic_data()->raw());
3186 } 3189 }
3187 3190
3188 #if !defined(TARGET_ARCH_DBC) 3191 #if !defined(TARGET_ARCH_DBC)
3189 if (compiler->is_optimizing() && HasICData()) { 3192 if (compiler->is_optimizing() && HasICData()) {
3190 ASSERT(HasICData()); 3193 ASSERT(HasICData());
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
3341 } 3344 }
3342 3345
3343 3346
3344 // DBC does not support optimizing compiler and thus doesn't emit 3347 // DBC does not support optimizing compiler and thus doesn't emit
3345 // PolymorphicInstanceCallInstr. 3348 // PolymorphicInstanceCallInstr.
3346 #if !defined(TARGET_ARCH_DBC) 3349 #if !defined(TARGET_ARCH_DBC)
3347 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3350 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3348 if (!with_checks()) { 3351 if (!with_checks()) {
3349 ASSERT(targets().HasSingleTarget()); 3352 ASSERT(targets().HasSingleTarget());
3350 const Function& target = targets().FirstTarget(); 3353 const Function& target = targets().FirstTarget();
3351 compiler->GenerateStaticCall(deopt_id(), instance_call()->token_pos(), 3354 compiler->GenerateStaticCall(
3352 target, instance_call()->ArgumentCount(), 3355 deopt_id(), instance_call()->token_pos(), target,
3353 instance_call()->argument_names(), locs(), 3356 instance_call()->type_args_len(), instance_call()->ArgumentCount(),
3354 ICData::Handle()); 3357 instance_call()->argument_names(), locs(), ICData::Handle());
3355 return; 3358 return;
3356 } 3359 }
3357 3360
3358 compiler->EmitPolymorphicInstanceCall( 3361 compiler->EmitPolymorphicInstanceCall(
3359 targets_, *instance_call(), instance_call()->ArgumentCount(), 3362 targets_, *instance_call(), instance_call()->type_args_len(),
3360 instance_call()->argument_names(), deopt_id(), 3363 instance_call()->ArgumentCount(), instance_call()->argument_names(),
3361 instance_call()->token_pos(), locs(), complete(), total_call_count()); 3364 deopt_id(), instance_call()->token_pos(), locs(), complete(),
3365 total_call_count());
3362 } 3366 }
3363 #endif 3367 #endif
3364 3368
3365 3369
3366 RawType* PolymorphicInstanceCallInstr::ComputeRuntimeType( 3370 RawType* PolymorphicInstanceCallInstr::ComputeRuntimeType(
3367 const CallTargets& targets) { 3371 const CallTargets& targets) {
3368 bool is_string = true; 3372 bool is_string = true;
3369 bool is_integer = true; 3373 bool is_integer = true;
3370 bool is_double = true; 3374 bool is_double = true;
3371 3375
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3468 LocationSummary* StaticCallInstr::MakeLocationSummary(Zone* zone, 3472 LocationSummary* StaticCallInstr::MakeLocationSummary(Zone* zone,
3469 bool optimizing) const { 3473 bool optimizing) const {
3470 return MakeCallSummary(zone); 3474 return MakeCallSummary(zone);
3471 } 3475 }
3472 3476
3473 3477
3474 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3478 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3475 const ICData* call_ic_data = NULL; 3479 const ICData* call_ic_data = NULL;
3476 if (!FLAG_propagate_ic_data || !compiler->is_optimizing() || 3480 if (!FLAG_propagate_ic_data || !compiler->is_optimizing() ||
3477 (ic_data() == NULL)) { 3481 (ic_data() == NULL)) {
3478 const Array& arguments_descriptor = Array::Handle( 3482 const Array& arguments_descriptor = Array::Handle(ArgumentsDescriptor::New(
3479 ArgumentsDescriptor::New(ArgumentCount(), argument_names())); 3483 type_args_len(), ArgumentCount() - (type_args_len() > 0 ? 1 : 0),
3484 argument_names()));
3480 MethodRecognizer::Kind recognized_kind = 3485 MethodRecognizer::Kind recognized_kind =
3481 MethodRecognizer::RecognizeKind(function()); 3486 MethodRecognizer::RecognizeKind(function());
3482 int num_args_checked = 0; 3487 int num_args_checked = 0;
3483 switch (recognized_kind) { 3488 switch (recognized_kind) {
3484 case MethodRecognizer::kDoubleFromInteger: 3489 case MethodRecognizer::kDoubleFromInteger:
3485 case MethodRecognizer::kMathMin: 3490 case MethodRecognizer::kMathMin:
3486 case MethodRecognizer::kMathMax: 3491 case MethodRecognizer::kMathMax:
3487 num_args_checked = 2; 3492 num_args_checked = 2;
3488 break; 3493 break;
3489 default: 3494 default:
3490 break; 3495 break;
3491 } 3496 }
3492 call_ic_data = compiler->GetOrAddStaticCallICData( 3497 call_ic_data = compiler->GetOrAddStaticCallICData(
3493 deopt_id(), function(), arguments_descriptor, num_args_checked); 3498 deopt_id(), function(), arguments_descriptor, num_args_checked);
3494 } else { 3499 } else {
3495 call_ic_data = &ICData::ZoneHandle(ic_data()->raw()); 3500 call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
3496 } 3501 }
3497 3502
3498 #if !defined(TARGET_ARCH_DBC) 3503 #if !defined(TARGET_ARCH_DBC)
3499 compiler->GenerateStaticCall(deopt_id(), token_pos(), function(), 3504 compiler->GenerateStaticCall(deopt_id(), token_pos(), function(),
3500 ArgumentCount(), argument_names(), locs(), 3505 type_args_len(), ArgumentCount(),
3501 *call_ic_data); 3506 argument_names(), locs(), *call_ic_data);
3502 #else 3507 #else
3503 const Array& arguments_descriptor = 3508 const Array& arguments_descriptor =
3504 (ic_data() == NULL) ? Array::Handle(ArgumentsDescriptor::New( 3509 (ic_data() == NULL) ? Array::Handle(ArgumentsDescriptor::New(
3505 ArgumentCount(), argument_names())) 3510 type_args_len(),
3511 ArgumentCount() - (type_args_len() > 0 ? 1 : 0),
3512 argument_names()))
3506 : Array::Handle(ic_data()->arguments_descriptor()); 3513 : Array::Handle(ic_data()->arguments_descriptor());
3507 const intptr_t argdesc_kidx = __ AddConstant(arguments_descriptor); 3514 const intptr_t argdesc_kidx = __ AddConstant(arguments_descriptor);
3508 3515
3509 compiler->AddCurrentDescriptor(RawPcDescriptors::kRewind, deopt_id(), 3516 compiler->AddCurrentDescriptor(RawPcDescriptors::kRewind, deopt_id(),
3510 token_pos()); 3517 token_pos());
3511 if (compiler->is_optimizing()) { 3518 if (compiler->is_optimizing()) {
3512 __ PushConstant(function()); 3519 __ PushConstant(function());
3513 __ StaticCall(ArgumentCount(), argdesc_kidx); 3520 __ StaticCall(ArgumentCount(), argdesc_kidx);
3514 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), 3521 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(),
3515 token_pos()); 3522 token_pos());
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
3776 return Array::length_offset(); 3783 return Array::length_offset();
3777 default: 3784 default:
3778 UNREACHABLE(); 3785 UNREACHABLE();
3779 return -1; 3786 return -1;
3780 } 3787 }
3781 } 3788 }
3782 3789
3783 3790
3784 const Function& StringInterpolateInstr::CallFunction() const { 3791 const Function& StringInterpolateInstr::CallFunction() const {
3785 if (function_.IsNull()) { 3792 if (function_.IsNull()) {
3793 const int kTypeArgsLen = 0;
3786 const int kNumberOfArguments = 1; 3794 const int kNumberOfArguments = 1;
3787 const Array& kNoArgumentNames = Object::null_array(); 3795 const Array& kNoArgumentNames = Object::null_array();
3788 const Class& cls = 3796 const Class& cls =
3789 Class::Handle(Library::LookupCoreClass(Symbols::StringBase())); 3797 Class::Handle(Library::LookupCoreClass(Symbols::StringBase()));
3790 ASSERT(!cls.IsNull()); 3798 ASSERT(!cls.IsNull());
3791 function_ = Resolver::ResolveStatic( 3799 function_ = Resolver::ResolveStatic(
3792 cls, Library::PrivateCoreLibName(Symbols::Interpolate()), 3800 cls, Library::PrivateCoreLibName(Symbols::Interpolate()), kTypeArgsLen,
3793 kNumberOfArguments, kNoArgumentNames); 3801 kNumberOfArguments, kNoArgumentNames);
3794 } 3802 }
3795 ASSERT(!function_.IsNull()); 3803 ASSERT(!function_.IsNull());
3796 return function_; 3804 return function_;
3797 } 3805 }
3798 3806
3799 3807
3800 // Replace StringInterpolateInstr with a constant string if all inputs are 3808 // Replace StringInterpolateInstr with a constant string if all inputs are
3801 // constant of [string, number, boolean, null]. 3809 // constant of [string, number, boolean, null].
3802 // Leave the CreateArrayInstr and StoreIndexedInstr in the stream in case 3810 // Leave the CreateArrayInstr and StoreIndexedInstr in the stream in case
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
4183 "native function '%s' (%" Pd " arguments) cannot be found", 4191 "native function '%s' (%" Pd " arguments) cannot be found",
4184 native_name().ToCString(), function().NumParameters()); 4192 native_name().ToCString(), function().NumParameters());
4185 } 4193 }
4186 set_is_auto_scope(auto_setup_scope); 4194 set_is_auto_scope(auto_setup_scope);
4187 set_native_c_function(native_function); 4195 set_native_c_function(native_function);
4188 } 4196 }
4189 4197
4190 #undef __ 4198 #undef __
4191 4199
4192 } // namespace dart 4200 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698