Index: runtime/lib/mirrors.cc |
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc |
index 22b2d47fa4b2ea1c81d9c35b3526026b3b24293d..81af35ad758c781eb7b4c8969ecd468a3bb0d67e 100644 |
--- a/runtime/lib/mirrors.cc |
+++ b/runtime/lib/mirrors.cc |
@@ -841,14 +841,16 @@ static RawInstance* LookupFunctionOrFieldInLibrary(const Library& library, |
static RawAbstractType* InstantiateType(const AbstractType& type, |
const AbstractType& instantiator) { |
ASSERT(type.IsFinalized()); |
- ASSERT(instantiator.IsFinalized()); |
ASSERT(!type.IsMalformed()); |
- ASSERT(!instantiator.IsMalformed()); |
if (type.IsInstantiated()) { |
return type.Canonicalize(); |
} |
+ ASSERT(!instantiator.IsNull()); |
+ ASSERT(instantiator.IsFinalized()); |
+ ASSERT(!instantiator.IsMalformed()); |
+ |
const AbstractTypeArguments& type_args = |
AbstractTypeArguments::Handle(instantiator.arguments()); |
Error& bound_error = Error::Handle(); |
@@ -982,12 +984,16 @@ DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) { |
} |
-DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 1) { |
+DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) { |
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
+ GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, |
+ instantiator, |
+ arguments->NativeArgAt(1)); |
const Class& cls = Class::Handle(ref.GetClassReferent()); |
const Function& func = Function::Handle(CallMethod(cls)); |
ASSERT(!func.IsNull()); |
- return func.result_type(); |
+ AbstractType& type = AbstractType::Handle(func.result_type()); |
+ return InstantiateType(type, instantiator); |
} |
@@ -1301,25 +1307,6 @@ DEFINE_NATIVE_ENTRY(TypeVariableMirror_upper_bound, 1) { |
} |
-DEFINE_NATIVE_ENTRY(TypeVariableMirror_instantiate_from, 2) { |
- GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0)); |
- GET_NON_NULL_NATIVE_ARGUMENT(Type, instantiator, arguments->NativeArgAt(1)); |
- ASSERT(param.parameterized_class() == instantiator.type_class()); |
- return InstantiateType(param, instantiator); |
-} |
- |
- |
-DEFINE_NATIVE_ENTRY(TypedefMirror_instantiate_from, 2) { |
- GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); |
- GET_NON_NULL_NATIVE_ARGUMENT(Type, instantiator, arguments->NativeArgAt(1)); |
- const Class& cls = Class::Handle(type.type_class()); |
- // We represent typedefs as non-canonical signature classes. |
- ASSERT(cls.IsSignatureClass() && !cls.IsCanonicalSignatureClass()); |
- return InstantiateType(type, instantiator); |
-} |
- |
- |
- |
DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) { |
GET_NON_NULL_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(0)); |
const Class& cls = Class::Handle(type.type_class()); |
@@ -1901,12 +1888,14 @@ DEFINE_NATIVE_ENTRY(MethodMirror_parameters, 2) { |
} |
-DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 1) { |
+DEFINE_NATIVE_ENTRY(MethodMirror_return_type, 2) { |
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
const Function& func = Function::Handle(ref.GetFunctionReferent()); |
+ GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
// We handle constructors in Dart code. |
ASSERT(!func.IsConstructor()); |
- return func.result_type(); |
+ const AbstractType& type = AbstractType::Handle(func.result_type()); |
+ return InstantiateType(type, instantiator); |
} |
@@ -1952,18 +1941,23 @@ DEFINE_NATIVE_ENTRY(TypedefMirror_referent, 1) { |
} |
-DEFINE_NATIVE_ENTRY(ParameterMirror_type, 2) { |
+DEFINE_NATIVE_ENTRY(ParameterMirror_type, 3) { |
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
GET_NON_NULL_NATIVE_ARGUMENT(Smi, pos, arguments->NativeArgAt(1)); |
+ GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(2)); |
const Function& func = Function::Handle(ref.GetFunctionReferent()); |
- return func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value()); |
+ const AbstractType& type = AbstractType::Handle( |
+ func.ParameterTypeAt(func.NumImplicitParameters() + pos.Value())); |
+ return InstantiateType(type, instantiator); |
} |
-DEFINE_NATIVE_ENTRY(VariableMirror_type, 1) { |
+DEFINE_NATIVE_ENTRY(VariableMirror_type, 2) { |
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0)); |
const Field& field = Field::Handle(ref.GetFieldReferent()); |
- return field.type(); |
+ GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1)); |
+ const AbstractType& type = AbstractType::Handle(field.type()); |
+ return InstantiateType(type, instantiator); |
} |
} // namespace dart |