| Index: runtime/vm/kernel_to_il.cc
|
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
|
| index 5b10f05fa41a64ffd304d0ef1c7eb76b1348fe06..54298f183ab4529fc96863eb74b1b30ce99be9e5 100644
|
| --- a/runtime/vm/kernel_to_il.cc
|
| +++ b/runtime/vm/kernel_to_il.cc
|
| @@ -1797,13 +1797,14 @@ Fragment FlowGraphBuilder::InstanceCall(TokenPosition position,
|
| }
|
|
|
|
|
| -Fragment FlowGraphBuilder::ClosureCall(int argument_count,
|
| +Fragment FlowGraphBuilder::ClosureCall(intptr_t type_args_len,
|
| + intptr_t argument_count,
|
| const Array& argument_names) {
|
| Value* function = Pop();
|
| - ArgumentArray arguments = GetArguments(argument_count);
|
| - const intptr_t kTypeArgsLen = 0; // Generic closures not yet supported.
|
| + const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0);
|
| + ArgumentArray arguments = GetArguments(total_count);
|
| ClosureCallInstr* call = new (Z)
|
| - ClosureCallInstr(function, arguments, kTypeArgsLen, argument_names,
|
| + ClosureCallInstr(function, arguments, type_args_len, argument_names,
|
| TokenPosition::kNoSource, GetNextDeoptId());
|
| Push(call);
|
| return Fragment(call);
|
| @@ -3460,6 +3461,13 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher(
|
|
|
| LocalScope* scope = parsed_function_->node_sequence()->scope();
|
|
|
| + if (descriptor.TypeArgsLen() > 0) {
|
| + LocalVariable* type_args = parsed_function_->function_type_arguments();
|
| + ASSERT(type_args != NULL);
|
| + body += LoadLocal(type_args);
|
| + body += PushArgument();
|
| + }
|
| +
|
| LocalVariable* closure = NULL;
|
| if (is_closure_call) {
|
| closure = scope->VariableAt(0);
|
| @@ -3488,8 +3496,12 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfInvokeFieldDispatcher(
|
| body += LoadLocal(closure);
|
| body += LoadField(Closure::function_offset());
|
|
|
| - body += ClosureCall(descriptor.Count(), argument_names);
|
| + body += ClosureCall(descriptor.TypeArgsLen(), descriptor.Count(),
|
| + argument_names);
|
| } else {
|
| + if (descriptor.TypeArgsLen() > 0) {
|
| + UNIMPLEMENTED();
|
| + }
|
| body += InstanceCall(TokenPosition::kMinSource, Symbols::Call(),
|
| Token::kILLEGAL, descriptor.Count(), argument_names);
|
| }
|
|
|