Merge pull request #2154 from BrennanConroy/bug_30018
[mono.git] / mcs / class / corlib / ReferenceSources / RuntimeType.cs
index 3557e77817c6b392af4e19cf509d4d6ee0219264..ce498cb17c52dda886e1cee61a393f79114239b1 100644 (file)
@@ -43,6 +43,8 @@ namespace System
 {
        partial class RuntimeType
        {
+               internal Object GenericCache;
+
                internal virtual MonoCMethod GetDefaultConstructor ()
                {
                        // TODO: Requires MonoType
@@ -358,7 +360,7 @@ namespace System
 
                public override StructLayoutAttribute StructLayoutAttribute {
                        get {
-                               return GetStructLayoutAttribute ();
+                               return StructLayoutAttribute.GetCustomAttribute (this);
                        }
                }
 
@@ -394,42 +396,11 @@ namespace System
                        return constraints;
                }
 
-               public override Type MakeGenericType (params Type[] typeArguments)
+               internal static object CreateInstanceForAnotherGenericParameter (Type genericType, RuntimeType genericArgument)
                {
-                       if (IsUserType)
-                               throw new NotSupportedException ();
-                       if (!IsGenericTypeDefinition)
-                               throw new InvalidOperationException ("not a generic type definition");
-                       if (typeArguments == null)
-                               throw new ArgumentNullException ("typeArguments");
-                       if (GetGenericArguments().Length != typeArguments.Length)
-                               throw new ArgumentException (String.Format ("The type or method has {0} generic parameter(s) but {1} generic argument(s) where provided. A generic argument must be provided for each generic parameter.", GetGenericArguments ().Length, typeArguments.Length), "typeArguments");
-
-                       bool hasUserType = false;
-
-                       Type[] systemTypes = new Type[typeArguments.Length];
-                       for (int i = 0; i < typeArguments.Length; ++i) {
-                               Type t = typeArguments [i];
-                               if (t == null)
-                                       throw new ArgumentNullException ("typeArguments");
-
-                               if (!(t is MonoType))
-                                       hasUserType = true;
-                               systemTypes [i] = t;
-                       }
-
-                       if (hasUserType) {
-#if FULL_AOT_RUNTIME
-                               throw new NotSupportedException ("User types are not supported under full aot");
-#else
-                               return new MonoGenericClass (this, typeArguments);
-#endif
-                       }
-
-                       Type res = MakeGenericType (this, systemTypes);
-                       if (res == null)
-                               throw new TypeLoadException ();
-                       return res;
+                       var gt = (RuntimeType) MakeGenericType (genericType, new Type [] { genericArgument });
+                       var ctor = gt.GetDefaultConstructor ();
+                       return ctor.InternalInvoke (null, null);
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
@@ -484,39 +455,8 @@ namespace System
                        }
                }
 
-               StructLayoutAttribute GetStructLayoutAttribute ()
-               {
-                       LayoutKind kind;
-
-                       if (IsLayoutSequential)
-                               kind = LayoutKind.Sequential;
-                       else if (IsExplicitLayout)
-                               kind = LayoutKind.Explicit;
-                       else
-                               kind = LayoutKind.Auto;
-
-                       StructLayoutAttribute attr = new StructLayoutAttribute (kind);
-
-                       if (IsUnicodeClass)
-                               attr.CharSet = CharSet.Unicode;
-                       else if (IsAnsiClass)
-                               attr.CharSet = CharSet.Ansi;
-                       else
-                               attr.CharSet = CharSet.Auto;
-
-                       if (kind != LayoutKind.Auto) {
-                               int packing;
-                               GetPacking (out packing, out attr.Size);
-                               // 0 means no data provided, we end up with default value
-                               if (packing != 0)
-                                       attr.Pack = packing;
-                       }
-
-                       return attr;
-               }
-
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               extern void GetPacking (out int packing, out int size);
+               internal extern void GetPacking (out int packing, out int size);
 
 #if MONO_COM
                private static Dictionary<Guid, Type> clsid_types;
@@ -612,7 +552,7 @@ namespace System
                internal extern string getFullName(bool full_name, bool assembly_qualified);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               public extern override Type [] GetGenericArguments ();
+               extern Type[] GetGenericArgumentsInternal (bool runtimeArray);
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                extern GenericParameterAttributes GetGenericParameterAttributes ();