Index: runtime/vm/dart_entry.cc |
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc |
index 397db9e17f794686bd5f0566e619d4e7ebea941c..1d8e5b27eb203648c63217cc5e46c36ecfd02008 100644 |
--- a/runtime/vm/dart_entry.cc |
+++ b/runtime/vm/dart_entry.cc |
@@ -140,15 +140,16 @@ RawObject* DartEntry::InvokeClosure(const Array& arguments, |
const Array& arguments_descriptor) { |
Thread* thread = Thread::Current(); |
Zone* zone = thread->zone(); |
+ const ArgumentsDescriptor args_desc(arguments_descriptor); |
+ const intptr_t instance_index = args_desc.TypeArgsLen() == 0 ? 0 : 1; |
Instance& instance = Instance::Handle(zone); |
- instance ^= arguments.At(0); |
+ instance ^= arguments.At(instance_index); |
// Get the entrypoint corresponding to the closure function or to the call |
// method of the instance. This will result in a compilation of the function |
// if it is not already compiled. |
Function& function = Function::Handle(zone); |
if (instance.IsCallable(&function)) { |
// Only invoke the function if its arguments are compatible. |
- const ArgumentsDescriptor args_desc(arguments_descriptor); |
if (function.AreValidArgumentCounts(args_desc.TypeArgsLen(), |
args_desc.Count(), |
args_desc.NamedCount(), NULL)) { |
@@ -391,16 +392,17 @@ RawArray* ArgumentsDescriptor::New(intptr_t type_args_len, |
intptr_t num_arguments) { |
ASSERT(type_args_len >= 0); |
ASSERT(num_arguments >= 0); |
- if (num_arguments < kCachedDescriptorCount) { |
+ if ((type_args_len == 0) && (num_arguments < kCachedDescriptorCount)) { |
return cached_args_descriptors_[num_arguments]; |
} |
- return NewNonCached(num_arguments); |
+ return NewNonCached(type_args_len, num_arguments); |
} |
-RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments, |
+RawArray* ArgumentsDescriptor::NewNonCached(intptr_t type_args_len, |
+ intptr_t num_arguments, |
bool canonicalize) { |
- // Build the arguments descriptor array, which consists of the zero length |
+ // Build the arguments descriptor array, which consists of the length of the |
// type argument vector, total argument count; the positional argument count; |
// and a terminating null to simplify iterating in generated code. |
Thread* thread = Thread::Current(); |
@@ -410,8 +412,9 @@ RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments, |
Array::Handle(zone, Array::New(descriptor_len, Heap::kOld)); |
const Smi& arg_count = Smi::Handle(zone, Smi::New(num_arguments)); |
- // Set zero length type argument vector. |
- descriptor.SetAt(kTypeArgsLenIndex, Smi::Handle(zone, Smi::New(0))); |
+ // Set type argument vector length. |
+ descriptor.SetAt(kTypeArgsLenIndex, |
+ Smi::Handle(zone, Smi::New(type_args_len))); |
// Set total number of passed arguments. |
descriptor.SetAt(kCountIndex, arg_count); |
@@ -434,7 +437,8 @@ RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments, |
void ArgumentsDescriptor::InitOnce() { |
for (int i = 0; i < kCachedDescriptorCount; i++) { |
- cached_args_descriptors_[i] = ArgumentsDescriptor::NewNonCached(i, false); |
+ cached_args_descriptors_[i] = |
+ ArgumentsDescriptor::NewNonCached(0, i, false); |
} |
} |