| Index: runtime/vm/code_generator.cc
|
| diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
|
| index a4d3cf4c495edf71b0aabb613c0d748d61b0f75c..e2efe293ebc8566f0b26da51421053d2cf9ce021 100644
|
| --- a/runtime/vm/code_generator.cc
|
| +++ b/runtime/vm/code_generator.cc
|
| @@ -1282,23 +1282,43 @@ DEFINE_RUNTIME_ENTRY(InvokeNoSuchMethodFunction, 4) {
|
| const String& original_function_name = String::Handle(ic_data.target_name());
|
| ASSERT(!Array::CheckedHandle(arguments.At(2)).IsNull());
|
| const Array& orig_arguments = Array::CheckedHandle(arguments.At(3));
|
| - // TODO(regis): The signature of the "noSuchMethod" method has to change from
|
| - // noSuchMethod(String name, Array arguments) to something like
|
| - // noSuchMethod(InvocationMirror call).
|
| - const int kNumArguments = 3;
|
| - const int kNumNamedArguments = 0;
|
| + // Allocate an InvocationMirror object.
|
| + // TODO(regis): Fill in the InvocationMirror object correctly at
|
| + // this point we do not deal with named arguments and treat them
|
| + // all as positional.
|
| + const Library& core_lib = Library::Handle(Library::CoreLibrary());
|
| + const String& invocation_mirror_name = String::Handle(
|
| + Symbols::InvocationMirror());
|
| + Class& invocation_mirror_class = Class::Handle(
|
| + core_lib.LookupClassAllowPrivate(invocation_mirror_name));
|
| + ASSERT(!invocation_mirror_class.IsNull());
|
| + const String& allocation_function_name = String::Handle(
|
| + Symbols::AllocateInvocationMirror());
|
| + const Function& allocation_function = Function::ZoneHandle(
|
| + Resolver::ResolveStaticByName(invocation_mirror_class,
|
| + allocation_function_name,
|
| + Resolver::kIsQualified));
|
| + ASSERT(!allocation_function.IsNull());
|
| + GrowableArray<const Object*> allocation_arguments(2);
|
| + allocation_arguments.Add(&original_function_name);
|
| + allocation_arguments.Add(&orig_arguments);
|
| const Array& kNoArgumentNames = Array::Handle();
|
| - const String& function_name =
|
| - String::Handle(Symbols::NoSuchMethod());
|
| + const Object& invocation_mirror = Object::Handle(
|
| + DartEntry::InvokeStatic(allocation_function,
|
| + allocation_arguments,
|
| + kNoArgumentNames));
|
| +
|
| + const int kNumArguments = 2;
|
| + const int kNumNamedArguments = 0;
|
| + const String& function_name = String::Handle(Symbols::NoSuchMethod());
|
| const Function& function = Function::ZoneHandle(
|
| Resolver::ResolveDynamic(receiver,
|
| function_name,
|
| kNumArguments,
|
| kNumNamedArguments));
|
| ASSERT(!function.IsNull());
|
| - GrowableArray<const Object*> invoke_arguments(2);
|
| - invoke_arguments.Add(&original_function_name);
|
| - invoke_arguments.Add(&orig_arguments);
|
| + GrowableArray<const Object*> invoke_arguments(1);
|
| + invoke_arguments.Add(&invocation_mirror);
|
| const Object& result = Object::Handle(
|
| DartEntry::InvokeDynamic(receiver,
|
| function,
|
|
|