Index: runtime/lib/mirrors.cc |
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
index c4605cf2e031c2a80bbda8d1c550c8849210cb50..58af05f0149f558e8521d0d4feed46367c00d200 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); |
} |
@@ -751,6 +753,9 @@ static RawAbstractType* InstantiateType(const AbstractType& type, |
return type.Canonicalize(); |
} |
+ if (instantiator.IsNull()) { |
+ return type.Canonicalize(); |
+ } |
ASSERT(!instantiator.IsNull()); |
ASSERT(instantiator.IsFinalized()); |
ASSERT(!instantiator.IsMalformed()); |
@@ -864,7 +869,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()); |
} |
@@ -1009,11 +1014,14 @@ DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) { |
} |
-DEFINE_NATIVE_ENTRY(ClassMirror_members, 2) { |
+DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) { |
GET_NON_NULL_NATIVE_ARGUMENT(Instance, |
owner_mirror, |
arguments->NativeArgAt(0)); |
- GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
+ GET_NATIVE_ARGUMENT(AbstractType, |
+ owner_instantiator, |
+ arguments->NativeArgAt(1)); |
+ GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2)); |
const Class& klass = Class::Handle(ref.GetClassReferent()); |
const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate)); |
@@ -1047,7 +1055,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, |
+ owner_instantiator); |
member_mirrors.Add(member_mirror); |
} |
} |
@@ -1056,11 +1065,14 @@ DEFINE_NATIVE_ENTRY(ClassMirror_members, 2) { |
} |
-DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 2) { |
+DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) { |
GET_NON_NULL_NATIVE_ARGUMENT(Instance, |
owner_mirror, |
arguments->NativeArgAt(0)); |
- GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1)); |
+ GET_NATIVE_ARGUMENT(AbstractType, |
+ owner_instantiator, |
+ arguments->NativeArgAt(1)); |
+ GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2)); |
const Class& klass = Class::Handle(ref.GetClassReferent()); |
const Error& error = Error::Handle(klass.EnsureIsFinalized(isolate)); |
@@ -1079,7 +1091,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, |
+ owner_instantiator); |
constructor_mirrors.Add(constructor_mirror); |
} |
} |
@@ -1134,7 +1147,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 +1398,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 +1855,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()) { |