Index: runtime/vm/object.cc |
=================================================================== |
--- runtime/vm/object.cc (revision 24876) |
+++ runtime/vm/object.cc (working copy) |
@@ -1827,7 +1827,7 @@ |
RawFunction* Class::CreateNoSuchMethodDispatcher(const String& target_name, |
- const Array& args_desc) const { |
+ const Array& args_desc) const { |
Function& invocation = Function::Handle( |
Function::New(String::Handle(Symbols::New(target_name)), |
RawFunction::kNoSuchMethodDispatcher, |
@@ -1838,23 +1838,31 @@ |
*this, |
0)); // No token position. |
ArgumentsDescriptor desc(args_desc); |
- const intptr_t num_parameters = desc.Count(); |
- invocation.set_num_fixed_parameters(num_parameters); |
- invocation.SetNumOptionalParameters(0, true); |
- invocation.set_parameter_types(Array::Handle(Array::New(num_parameters, |
+ invocation.set_num_fixed_parameters(desc.PositionalCount()); |
+ invocation.SetNumOptionalParameters(desc.NamedCount(), |
+ false); // Not positional. |
+ invocation.set_parameter_types(Array::Handle(Array::New(desc.Count(), |
Heap::kOld))); |
- invocation.set_parameter_names(Array::Handle(Array::New(num_parameters, |
+ invocation.set_parameter_names(Array::Handle(Array::New(desc.Count(), |
Heap::kOld))); |
// Receiver. |
invocation.SetParameterTypeAt(0, Type::Handle(Type::DynamicType())); |
invocation.SetParameterNameAt(0, Symbols::This()); |
- // Remaining parameters. |
- for (intptr_t i = 1; i < num_parameters; i++) { |
+ // Remaining positional parameters. |
+ intptr_t i = 1; |
+ for (; i < desc.PositionalCount(); i++) { |
invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); |
char name[64]; |
OS::SNPrint(name, 64, ":p%"Pd, i); |
invocation.SetParameterNameAt(i, String::Handle(Symbols::New(name))); |
} |
+ |
+ // Named parameters. |
+ for (; i < desc.Count(); i++) { |
+ invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); |
+ intptr_t index = i - desc.PositionalCount(); |
+ invocation.SetParameterNameAt(i, String::Handle(desc.NameAt(index))); |
+ } |
invocation.set_result_type(Type::Handle(Type::DynamicType())); |
invocation.set_is_visible(false); // Not visible in stack trace. |
invocation.set_saved_args_desc(args_desc); |