Index: runtime/vm/aot_optimizer.cc |
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc |
index a30e36b328a0b24abbbb54cc6b4e084b11729764..c1cb3506fe1c7cadf3d74de81f056fc84a0bc097 100644 |
--- a/runtime/vm/aot_optimizer.cc |
+++ b/runtime/vm/aot_optimizer.cc |
@@ -113,9 +113,11 @@ bool AotOptimizer::RecognizeRuntimeTypeGetter(InstanceCallInstr* call) { |
// There is only a single function Object.get:runtimeType that can be invoked |
// by this call. Convert dynamic invocation to a static one. |
const Class& cls = Class::Handle(Z, I->object_store()->object_class()); |
+ const intptr_t kTypeArgsLen = 0; |
+ ASSERT(call->type_args_len() == kTypeArgsLen); |
const Array& args_desc_array = Array::Handle( |
- Z, |
- ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names())); |
+ Z, ArgumentsDescriptor::New(kTypeArgsLen, call->ArgumentCount(), |
+ call->argument_names())); |
ArgumentsDescriptor args_desc(args_desc_array); |
const Function& function = |
Function::Handle(Z, Resolver::ResolveDynamicForReceiverClass( |
@@ -128,7 +130,7 @@ bool AotOptimizer::RecognizeRuntimeTypeGetter(InstanceCallInstr* call) { |
args->Add(call->PushArgumentAt(i)); |
} |
StaticCallInstr* static_call = new (Z) StaticCallInstr( |
- call->token_pos(), Function::ZoneHandle(Z, function.raw()), |
+ call->token_pos(), Function::ZoneHandle(Z, function.raw()), kTypeArgsLen, |
call->argument_names(), args, call->deopt_id()); |
static_call->set_result_cid(kTypeCid); |
call->ReplaceWith(static_call, current_iterator()); |
@@ -222,9 +224,11 @@ bool AotOptimizer::TryCreateICData(InstanceCallInstr* call) { |
// finalized yet. |
return false; |
} |
- const Array& args_desc_array = |
- Array::Handle(Z, ArgumentsDescriptor::New(call->ArgumentCount(), |
- call->argument_names())); |
+ const Array& args_desc_array = Array::Handle( |
+ Z, ArgumentsDescriptor::New( |
+ call->type_args_len(), |
+ call->ArgumentCount() - (call->type_args_len() > 0 ? 1 : 0), |
zra
2017/05/03 15:03:24
This pattern gets repeated a lot. I'd recommend mo
regis
2017/05/09 18:31:22
Done.
|
+ call->argument_names())); |
ArgumentsDescriptor args_desc(args_desc_array); |
const Function& function = Function::Handle( |
Z, Resolver::ResolveDynamicForReceiverClass( |
@@ -253,10 +257,16 @@ bool AotOptimizer::TryCreateICData(InstanceCallInstr* call) { |
// Check if the target is unique. |
Function& target_function = Function::Handle(Z); |
GetUniqueDynamicTarget(isolate(), call->function_name(), &target_function); |
- // Calls with named arguments must be resolved/checked at runtime. |
+ // Calls passing named arguments and calls to a function taking named |
+ // arguments must be resolved/checked at runtime. |
+ // Calls passing a type argument vector and calls to a generic function must |
+ // be resolved/checked at runtime. |
if (!target_function.IsNull() && |
!target_function.HasOptionalNamedParameters() && |
- target_function.AreValidArgumentCounts(call->ArgumentCount(), 0, |
+ !target_function.IsGeneric() && |
+ target_function.AreValidArgumentCounts(call->type_args_len(), |
+ call->ArgumentCount(), |
+ call->argument_names().Length(), |
/* error_message = */ NULL)) { |
const Class& cls = Class::Handle(Z, target_function.Owner()); |
if (!CHA::IsImplemented(cls) && !CHA::HasSubclasses(cls)) { |
@@ -649,10 +659,11 @@ bool AotOptimizer::TryReplaceWithHaveSameRuntimeType(InstanceCallInstr* call) { |
arg = new (Z) PushArgumentInstr(new (Z) Value(right->ArgumentAt(0))); |
InsertBefore(call, arg, NULL, FlowGraph::kEffect); |
args->Add(arg); |
- StaticCallInstr* static_call = |
- new (Z) StaticCallInstr(call->token_pos(), have_same_runtime_type, |
- Object::null_array(), // argument_names |
- args, call->deopt_id()); |
+ const intptr_t kTypeArgsLen = 0; |
zra
2017/05/03 15:03:24
ASSERT(call->type_args_len() == kTypeArgsLen) ?
regis
2017/05/09 18:31:22
Done, although arguments names and others were not
|
+ StaticCallInstr* static_call = new (Z) |
+ StaticCallInstr(call->token_pos(), have_same_runtime_type, kTypeArgsLen, |
+ Object::null_array(), // argument_names |
+ args, call->deopt_id()); |
static_call->set_result_cid(kBoolCid); |
ReplaceCall(call, static_call); |
return true; |
@@ -1515,8 +1526,9 @@ void AotOptimizer::ReplaceWithInstanceOf(InstanceCallInstr* call) { |
ASSERT(!target.IsNull()); |
ASSERT(target.IsRecognized() && target.always_inline()); |
+ const intptr_t kTypeArgsLen = 0; |
zra
2017/05/03 15:03:24
ditto.
regis
2017/05/09 18:31:22
Done.
|
StaticCallInstr* new_call = |
- new (Z) StaticCallInstr(call->token_pos(), target, |
+ new (Z) StaticCallInstr(call->token_pos(), target, kTypeArgsLen, |
Object::null_array(), // argument_names |
args, call->deopt_id()); |
Environment* copy = call->env()->DeepCopy( |
@@ -1607,8 +1619,9 @@ void AotOptimizer::ReplaceWithTypeCast(InstanceCallInstr* call) { |
ASSERT(target.IsRecognized()); |
ASSERT(target.always_inline()); |
+ const intptr_t kTypeArgsLen = 0; |
zra
2017/05/03 15:03:24
ditto.
regis
2017/05/09 18:31:22
Done.
|
StaticCallInstr* new_call = |
- new (Z) StaticCallInstr(call->token_pos(), target, |
+ new (Z) StaticCallInstr(call->token_pos(), target, kTypeArgsLen, |
Object::null_array(), // argument_names |
args, call->deopt_id()); |
Environment* copy = |
@@ -1670,8 +1683,9 @@ void AotOptimizer::ReplaceWithTypeCast(InstanceCallInstr* call) { |
ASSERT(target.IsRecognized()); |
ASSERT(target.always_inline()); |
+ const intptr_t kTypeArgsLen = 0; |
zra
2017/05/03 15:03:24
ditto.
regis
2017/05/09 18:31:22
Done.
|
StaticCallInstr* new_call = |
- new (Z) StaticCallInstr(call->token_pos(), target, |
+ new (Z) StaticCallInstr(call->token_pos(), target, kTypeArgsLen, |
Object::null_array(), // argument_names |
args, call->deopt_id()); |
Environment* copy = call->env()->DeepCopy( |
@@ -1901,9 +1915,11 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
const Class& receiver_class = |
Class::Handle(Z, isolate()->class_table()->At(receiver_cid)); |
- const Array& args_desc_array = |
- Array::Handle(Z, ArgumentsDescriptor::New(instr->ArgumentCount(), |
- instr->argument_names())); |
+ const Array& args_desc_array = Array::Handle( |
+ Z, ArgumentsDescriptor::New( |
+ instr->type_args_len(), |
+ instr->ArgumentCount() - (instr->type_args_len() > 0 ? 1 : 0), |
+ instr->argument_names())); |
ArgumentsDescriptor args_desc(args_desc_array); |
Function& function = Function::Handle( |
Z, Resolver::ResolveDynamicForReceiverClass( |
@@ -1952,9 +1968,11 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
Function& single_target = Function::Handle(Z); |
ICData& ic_data = ICData::Handle(Z); |
- const Array& args_desc_array = |
- Array::Handle(Z, ArgumentsDescriptor::New(instr->ArgumentCount(), |
- instr->argument_names())); |
+ const Array& args_desc_array = Array::Handle( |
+ Z, ArgumentsDescriptor::New( |
+ instr->type_args_len(), |
+ instr->ArgumentCount() - (instr->type_args_len() > 0 ? 1 : 0), |
+ instr->argument_names())); |
ArgumentsDescriptor args_desc(args_desc_array); |
Function& target = Function::Handle(Z); |
@@ -2032,7 +2050,8 @@ void AotOptimizer::VisitInstanceCall(InstanceCallInstr* instr) { |
} |
StaticCallInstr* call = new (Z) StaticCallInstr( |
instr->token_pos(), Function::ZoneHandle(Z, single_target.raw()), |
- instr->argument_names(), args, instr->deopt_id()); |
+ instr->type_args_len(), instr->argument_names(), args, |
+ instr->deopt_id()); |
instr->ReplaceWith(call, current_iterator()); |
return; |
} else if ((ic_data.raw() != ICData::null()) && |
@@ -2074,9 +2093,12 @@ void AotOptimizer::VisitPolymorphicInstanceCall( |
const Class& receiver_class = |
Class::Handle(Z, isolate()->class_table()->At(receiver_cid)); |
+ const intptr_t type_args_len = call->instance_call()->type_args_len(); |
const Array& args_desc_array = Array::Handle( |
- Z, ArgumentsDescriptor::New(call->ArgumentCount(), |
- call->instance_call()->argument_names())); |
+ Z, ArgumentsDescriptor::New( |
+ type_args_len, |
+ call->ArgumentCount() - (type_args_len > 0 ? 1 : 0), |
+ call->instance_call()->argument_names())); |
ArgumentsDescriptor args_desc(args_desc_array); |
const Function& function = Function::Handle( |
Z, Resolver::ResolveDynamicForReceiverClass( |