Index: runtime/lib/mirrors.cc |
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
index c4605cf2e031c2a80bbda8d1c550c8849210cb50..c4f6f62c22a20e120529238cedd4bef00f71e4a1 100644 |
--- a/runtime/lib/mirrors.cc |
+++ b/runtime/lib/mirrors.cc |
@@ -240,8 +240,9 @@ static RawInstance* CreateFunctionTypeMirror(const Class& cls, |
static RawInstance* CreateMethodMirror(const Function& func, |
- const Instance& owner_mirror) { |
- const Array& args = Array::Handle(Array::New(12)); |
+ const Instance& owner_mirror, |
+ const AbstractType& instantiator) { |
+ const Array& args = Array::Handle(Array::New(13)); |
args.SetAt(0, MirrorReference::Handle(MirrorReference::New(func))); |
String& name = String::Handle(func.name()); |
@@ -249,17 +250,18 @@ static RawInstance* CreateMethodMirror(const Function& func, |
args.SetAt(1, name); |
args.SetAt(2, owner_mirror); |
- args.SetAt(3, Bool::Get(func.is_static())); |
- args.SetAt(4, Bool::Get(func.is_abstract())); |
- args.SetAt(5, Bool::Get(func.IsGetterFunction())); |
- args.SetAt(6, Bool::Get(func.IsSetterFunction())); |
+ args.SetAt(3, instantiator); |
+ args.SetAt(4, Bool::Get(func.is_static())); |
+ args.SetAt(5, Bool::Get(func.is_abstract())); |
+ args.SetAt(6, Bool::Get(func.IsGetterFunction())); |
+ args.SetAt(7, Bool::Get(func.IsSetterFunction())); |
bool isConstructor = (func.kind() == RawFunction::kConstructor); |
- args.SetAt(7, Bool::Get(isConstructor)); |
- args.SetAt(8, Bool::Get(isConstructor && func.is_const())); |
- args.SetAt(9, Bool::Get(isConstructor && func.IsGenerativeConstructor())); |
- args.SetAt(10, Bool::Get(isConstructor && func.is_redirecting())); |
- args.SetAt(11, Bool::Get(isConstructor && func.IsFactory())); |
+ args.SetAt(8, Bool::Get(isConstructor)); |
+ args.SetAt(9, Bool::Get(isConstructor && func.is_const())); |
+ args.SetAt(10, Bool::Get(isConstructor && func.IsGenerativeConstructor())); |
+ args.SetAt(11, Bool::Get(isConstructor && func.is_redirecting())); |
+ args.SetAt(12, Bool::Get(isConstructor && func.IsFactory())); |
return CreateMirror(Symbols::_LocalMethodMirror(), args); |
} |
@@ -864,7 +866,7 @@ DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) { |
const Class& cls = Class::Handle(ref.GetClassReferent()); |
const Function& func = Function::Handle(CallMethod(cls)); |
ASSERT(!func.IsNull()); |
- return CreateMethodMirror(func, owner_mirror); |
+ return CreateMethodMirror(func, owner_mirror, AbstractType::Handle()); |
} |
@@ -1047,7 +1049,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_members, 2) { |
(func.kind() == RawFunction::kRegularFunction || |
func.kind() == RawFunction::kGetterFunction || |
func.kind() == RawFunction::kSetterFunction)) { |
- member_mirror = CreateMethodMirror(func, owner_mirror); |
+ member_mirror = CreateMethodMirror(func, owner_mirror, |
+ AbstractType::Handle()); |
member_mirrors.Add(member_mirror); |
} |
} |
@@ -1079,7 +1082,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 2) { |
for (intptr_t i = 0; i < num_functions; i++) { |
func ^= functions.At(i); |
if (func.is_reflectable() && func.kind() == RawFunction::kConstructor) { |
- constructor_mirror = CreateMethodMirror(func, owner_mirror); |
+ constructor_mirror = CreateMethodMirror(func, owner_mirror, |
+ AbstractType::Handle()); |
constructor_mirrors.Add(constructor_mirror); |
} |
} |
@@ -1134,7 +1138,8 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) { |
(func.kind() == RawFunction::kRegularFunction || |
func.kind() == RawFunction::kGetterFunction || |
func.kind() == RawFunction::kSetterFunction)) { |
- member_mirror = CreateMethodMirror(func, owner_mirror); |
+ member_mirror = CreateMethodMirror(func, owner_mirror, |
+ AbstractType::Handle()); |
member_mirrors.Add(member_mirror); |
} |
} |
@@ -1384,7 +1389,19 @@ DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) { |
// the equality test. |
function = function.parent_function(); |
} |
- return CreateMethodMirror(function, Instance::null_instance()); |
+ |
+ Type& instantiator = Type::Handle(); |
+ if (closure.IsClosure()) { |
+ const TypeArguments& arguments = |
+ TypeArguments::Handle(Closure::GetTypeArguments(closure)); |
+ const Class& cls = |
+ Class::Handle(Isolate::Current()->object_store()->object_class()); |
+ instantiator = Type::New(cls, arguments, Scanner::kNoSourcePos); |
+ instantiator.SetIsFinalized(); |
+ } |
+ return CreateMethodMirror(function, |
+ Instance::null_instance(), |
+ instantiator); |
} |
return Instance::null(); |
} |
@@ -1829,12 +1846,13 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) { |
} |
-DEFINE_NATIVE_ENTRY(MethodMirror_owner, 1) { |
+DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) { |
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
+ GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
const Function& func = Function::Handle(ref.GetFunctionReferent()); |
if (func.IsNonImplicitClosureFunction()) { |
return CreateMethodMirror(Function::Handle( |
- func.parent_function()), Object::null_instance()); |
+ func.parent_function()), Object::null_instance(), instantiator); |
} |
const Class& owner = Class::Handle(func.Owner()); |
if (owner.IsTopLevel()) { |