| Index: runtime/vm/parser.cc
|
| ===================================================================
|
| --- runtime/vm/parser.cc (revision 24510)
|
| +++ runtime/vm/parser.cc (working copy)
|
| @@ -1139,14 +1139,24 @@
|
|
|
| SequenceNode* Parser::ParseNoSuchMethodDispatcher(const Function& func) {
|
| TRACE_PARSER("ParseNoSuchMethodDispatcher");
|
| - ParamList params;
|
|
|
| ASSERT(func.IsNoSuchMethodDispatcher());
|
| intptr_t token_pos = func.token_pos();
|
| ASSERT(func.token_pos() == 0);
|
| ASSERT(current_class().raw() == func.Owner());
|
| +
|
| + ArgumentsDescriptor desc(Array::Handle(func.saved_args_desc()));
|
| + ASSERT(desc.Count() > 0);
|
| + ParamList params;
|
| params.AddReceiver(ReceiverType(token_pos));
|
| - ASSERT(func.num_fixed_parameters() == 1); // Receiver.
|
| + for (intptr_t i = 1; i < desc.Count(); ++i) {
|
| + ParamDesc p;
|
| + char name[64];
|
| + OS::SNPrint(name, 64, ":p%"Pd, i);
|
| + p.name = &String::ZoneHandle(Symbols::New(name));
|
| + p.type = &Type::ZoneHandle(Type::DynamicType());
|
| + params.parameters->Add(p);
|
| + }
|
| ASSERT(!func.HasOptionalParameters());
|
|
|
| // Build local scope for function and populate with the formal parameters.
|
| @@ -1155,11 +1165,11 @@
|
| AddFormalParamsToScope(¶ms, scope);
|
|
|
| // Receiver is local 0.
|
| - LocalVariable* receiver = scope->VariableAt(0);
|
| - LoadLocalNode* load_receiver = new LoadLocalNode(token_pos, receiver);
|
| + ArgumentListNode* func_args = new ArgumentListNode(token_pos);
|
| + for (intptr_t i = 0; i < desc.Count(); ++i) {
|
| + func_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
|
| + }
|
|
|
| - ArgumentListNode* func_args = new ArgumentListNode(token_pos);
|
| - func_args->Add(load_receiver);
|
| const String& func_name = String::ZoneHandle(func.name());
|
| ArgumentListNode* arguments = BuildNoSuchMethodArguments(token_pos,
|
| func_name,
|
|
|