Chromium Code Reviews| Index: runtime/lib/mirrors.cc |
| diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
| index 9ae7d17a40e8d9f5db18b92d37ea6cc2455d3195..5140d38811a71136631e73d3cb521cbcd30eb37d 100644 |
| --- a/runtime/lib/mirrors.cc |
| +++ b/runtime/lib/mirrors.cc |
| @@ -10,6 +10,7 @@ |
| #include "vm/object_store.h" |
| #include "vm/parser.h" |
| #include "vm/port.h" |
| +#include "vm/resolver.h" |
| #include "vm/symbols.h" |
| namespace dart { |
| @@ -789,6 +790,7 @@ static RawObject* ReflectivelyInvokeDynamicFunction( |
| return result.raw(); |
| } |
| + |
| DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) { |
| // Argument 0 is the mirror, which is unused by the native. It exists |
| // because this native is an instance method in order to be polymorphic |
| @@ -799,19 +801,13 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) { |
| GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3)); |
| GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4)); |
| + Class& klass = Class::Handle(reflectee.clazz()); |
| + Function& function = Function::Handle( |
| + Resolver::ResolveDynamicAnyArgsAllowPrivate(klass, function_name)); |
| + |
| const Array& args_descriptor = |
| Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names)); |
| - Class& klass = Class::Handle(reflectee.clazz()); |
| - Function& function = Function::Handle(); |
| - while (!klass.IsNull()) { |
| - function = klass.LookupDynamicFunctionAllowPrivate(function_name); |
| - if (!function.IsNull()) { |
| - break; |
| - } |
| - klass = klass.SuperClass(); |
| - } |
| - |
| return ReflectivelyInvokeDynamicFunction(reflectee, |
| function, |
| function_name, |
| @@ -827,21 +823,10 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) { |
| GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1)); |
| GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2)); |
| - // Every instance field has a getter Function. Try to find the |
| - // getter in any superclass and use that function to access the |
| - // field. |
| - // NB: We do not use Resolver::ResolveDynamic because we want to find private |
| - // members. |
| Class& klass = Class::Handle(reflectee.clazz()); |
| String& internal_getter_name = String::Handle(Field::GetterName(getter_name)); |
| - Function& getter = Function::Handle(); |
| - while (!klass.IsNull()) { |
| - getter = klass.LookupDynamicFunctionAllowPrivate(internal_getter_name); |
| - if (!getter.IsNull()) { |
| - break; |
| - } |
| - klass = klass.SuperClass(); |
| - } |
| + Function& function = Function::Handle( |
| + Resolver::ResolveDynamicAnyArgsAllowPrivate(klass, internal_getter_name)); |
| const int kNumArgs = 1; |
| const Array& args = Array::Handle(Array::New(kNumArgs)); |
| @@ -850,7 +835,7 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) { |
| Array::Handle(ArgumentsDescriptor::New(args.Length())); |
| return ReflectivelyInvokeDynamicFunction(reflectee, |
| - getter, |
| + function, |
| internal_getter_name, |
| args, |
| args_descriptor); |
| @@ -989,10 +974,19 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeGetter, 3) { |
| if (field.IsNull() || FieldIsUninitialized(field)) { |
| const String& internal_getter_name = String::Handle( |
| Field::GetterName(getter_name)); |
| - const Function& getter = Function::Handle( |
| + Function& getter = Function::Handle( |
| klass.LookupStaticFunctionAllowPrivate(internal_getter_name)); |
| if (getter.IsNull() || !getter.is_visible()) { |
| + if (getter.IsNull()) { |
| + getter = klass.LookupStaticFunctionAllowPrivate(getter_name); |
| + if (!getter.IsNull()) { |
| + // Looking for a getter but found a regular method: closurize. |
| + const Function& closure_function = |
| + Function::Handle(getter.ImplicitClosureFunction()); |
| + return closure_function.ImplicitStaticClosure(); |
| + } |
| + } |
| ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), |
| getter_name, |
| getter, |
| @@ -1010,6 +1004,7 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeGetter, 3) { |
| } |
| return result.raw(); |
| } |
| + |
|
siva
2013/09/25 20:17:57
extra blank line.
|
| return field.value(); |
| } |
| @@ -1249,6 +1244,15 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invokeGetter, 3) { |
| const String& internal_getter_name = |
| String::Handle(Field::GetterName(getter_name)); |
| getter = library.LookupFunctionAllowPrivate(internal_getter_name); |
| + if (getter.IsNull()) { |
| + getter = library.LookupFunctionAllowPrivate(getter_name); |
| + if (!getter.IsNull()) { |
| + // Looking for a getter but found a regular method: closurize. |
| + const Function& closure_function = |
| + Function::Handle(getter.ImplicitClosureFunction()); |
| + return closure_function.ImplicitStaticClosure(); |
| + } |
| + } |
| } else if (!field.IsNull() && FieldIsUninitialized(field)) { |
| // A field was found. Check for a getter in the field's owner classs. |
| const Class& klass = Class::Handle(field.owner()); |