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

Unified Diff: runtime/vm/object.cc

Issue 18209024: Correct handling of named optional parameters with noSuchMethod invocations. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: addressed comments Created 7 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | runtime/vm/parser.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | runtime/vm/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698