- //
- // Mutate type dispatcher
- //
- public Type MutateType (Type type)
- {
- if (TypeManager.IsGenericType (type))
- return MutateGenericType (type);
-
- if (TypeManager.IsGenericParameter (type))
- return MutateGenericArgument (type);
-
- if (type.IsArray)
- return MutateArrayType (type);
- return type;
- }
-
- //
- // Changes method type arguments (MVAR) to storey (VAR) type arguments
- //
- public void MutateGenericMethod (MethodSpec ms)
- {
- var method = (MethodInfo) ms.MetaInfo;
- Type [] t_args = TypeManager.GetGenericArguments (method);
- if (TypeManager.IsGenericType (method.DeclaringType)) {
- Type t = MutateGenericType (method.DeclaringType);
- if (t != method.DeclaringType) {
- method = (MethodInfo) TypeManager.DropGenericMethodArguments (method);
- if (TypeManager.IsBeingCompiled (method))
- ms.MetaInfo = TypeBuilder.GetMethod (t, method);
- else
- ms.MetaInfo = MethodInfo.GetMethodFromHandle (method.MethodHandle, t.TypeHandle);
- }
- }
-
- if (t_args == null || t_args.Length == 0)
- return;
-
- for (int i = 0; i < t_args.Length; ++i)
- t_args [i] = MutateType (t_args [i]);
-
- method = (MethodInfo) ms.MetaInfo;
- ms.MetaInfo = method.GetGenericMethodDefinition ().MakeGenericMethod (t_args);
- }
-
- public void MutateConstructor (MethodSpec ms)
- {
- var ctor = (ConstructorInfo) ms.MetaInfo;
- if (TypeManager.IsGenericType (ctor.DeclaringType)) {
- Type t = MutateGenericType (ctor.DeclaringType);
- if (t != ctor.DeclaringType) {
- ctor = (ConstructorInfo) TypeManager.DropGenericMethodArguments (ctor);
- if (TypeManager.IsBeingCompiled (ctor))
- ms.MetaInfo = TypeBuilder.GetConstructor (t, ctor);
- else
- ms.MetaInfo = ConstructorInfo.GetMethodFromHandle (ctor.MethodHandle, t.TypeHandle);
- }
- }
- }
-
- public void MutateField (FieldSpec fs)
- {
- var field = fs.MetaInfo;
- if (TypeManager.IsGenericType (field.DeclaringType)) {
- Type t = MutateGenericType (field.DeclaringType);
- if (t != field.DeclaringType) {
- field = TypeManager.DropGenericTypeArguments (field.DeclaringType).GetField (field.Name, TypeManager.AllMembers);
-
- // HACK: TypeBuilder has to be used when a type is of TypeBuilder* but there is no
- // way how to find out (use type comparison when this becomes an issue)
- if (t.GetType ().FullName == "System.Reflection.MonoGenericClass") {
- fs.MetaInfo = TypeBuilder.GetField (t, field);
- } else {
- fs.MetaInfo = FieldInfo.GetFieldFromHandle (field.FieldHandle, t.TypeHandle);
- }
- }
- }
- }
-
- protected Type MutateArrayType (Type array)
- {
- Type element = TypeManager.GetElementType (array);
- if (element.IsArray) {
- element = MutateArrayType (element);
- } else if (TypeManager.IsGenericParameter (element)) {
- element = MutateGenericArgument (element);
- } else if (TypeManager.IsGenericType (element)) {
- element = MutateGenericType (element);
- } else {
- return array;