Index: runtime/lib/object.cc |
=================================================================== |
--- runtime/lib/object.cc (revision 15938) |
+++ runtime/lib/object.cc (working copy) |
@@ -17,37 +17,39 @@ |
} |
-DEFINE_NATIVE_ENTRY(Object_noSuchMethod, 3) { |
- const Instance& instance = |
- Instance::CheckedHandle(arguments->NativeArgAt(0)); |
+DEFINE_NATIVE_ENTRY(Object_noSuchMethod, 5) { |
+ const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0)); |
+ GET_NON_NULL_NATIVE_ARGUMENT(Bool, is_method, arguments->NativeArgAt(1)); |
+ GET_NON_NULL_NATIVE_ARGUMENT(String, member_name, arguments->NativeArgAt(2)); |
+ GET_NON_NULL_NATIVE_ARGUMENT(Instance, func_args, arguments->NativeArgAt(3)); |
GET_NON_NULL_NATIVE_ARGUMENT( |
- String, function_name, arguments->NativeArgAt(1)); |
- GET_NON_NULL_NATIVE_ARGUMENT(Array, func_args, arguments->NativeArgAt(2)); |
- const Object& null_object = Object::Handle(Object::null()); |
- GrowableArray<const Object*> dart_arguments(4); |
+ Instance, func_named_args, arguments->NativeArgAt(4)); |
+ GrowableArray<const Object*> dart_arguments(5); |
dart_arguments.Add(&instance); |
- dart_arguments.Add(&function_name); |
+ dart_arguments.Add(&member_name); |
dart_arguments.Add(&func_args); |
- dart_arguments.Add(&null_object); |
+ dart_arguments.Add(&func_named_args); |
- // Report if a function with same name (but different arguments) has been |
- // found. |
- Class& instance_class = Class::Handle(instance.clazz()); |
- Function& function = |
- Function::Handle(instance_class.LookupDynamicFunction(function_name)); |
- while (function.IsNull()) { |
- instance_class = instance_class.SuperClass(); |
- if (instance_class.IsNull()) break; |
- function = instance_class.LookupDynamicFunction(function_name); |
- } |
- if (!function.IsNull()) { |
- const int total_num_parameters = function.NumParameters(); |
- const Array& array = Array::Handle(Array::New(total_num_parameters - 1)); |
- // Skip receiver. |
- for (int i = 1; i < total_num_parameters; i++) { |
- array.SetAt(i - 1, String::Handle(function.ParameterNameAt(i))); |
+ if (is_method.value()) { |
+ // Report if a function with same name (but different arguments) has been |
+ // found. |
+ Class& instance_class = Class::Handle(instance.clazz()); |
+ Function& function = |
+ Function::Handle(instance_class.LookupDynamicFunction(member_name)); |
+ while (function.IsNull()) { |
+ instance_class = instance_class.SuperClass(); |
+ if (instance_class.IsNull()) break; |
+ function = instance_class.LookupDynamicFunction(member_name); |
} |
- dart_arguments.Add(&array); |
+ if (!function.IsNull()) { |
+ const int total_num_parameters = function.NumParameters(); |
+ const Array& array = Array::Handle(Array::New(total_num_parameters - 1)); |
+ // Skip receiver. |
+ for (int i = 1; i < total_num_parameters; i++) { |
+ array.SetAt(i - 1, String::Handle(function.ParameterNameAt(i))); |
+ } |
+ dart_arguments.Add(&array); |
+ } |
} |
Exceptions::ThrowByType(Exceptions::kNoSuchMethod, dart_arguments); |
return Object::null(); |