2010-03-18 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mcs / class / corlib / System / MonoType.cs
index 4feaadd7fecf0b2c2f807194052d514d4ad58206..d4a19182c9ef0394ff6cfe36e10c15557d922bc7 100644 (file)
@@ -30,6 +30,7 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System.Collections.Generic;
 using System.Globalization;
 using System.Reflection;
 using System.Runtime.CompilerServices;
@@ -41,6 +42,7 @@ namespace System
        // Contains information about the type which is expensive to compute
        internal class MonoTypeInfo {
                public string full_name;
+               public ConstructorInfo default_ctor;
        }
                
        [Serializable]
@@ -62,7 +64,21 @@ namespace System
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                private static extern TypeAttributes get_attributes (Type type);
+
+               internal ConstructorInfo GetDefaultConstructor () {
+                       ConstructorInfo ctor = null;
+                       
+                       if (type_info == null)
+                               type_info = new MonoTypeInfo ();
+                       if ((ctor = type_info.default_ctor) == null) {
+                               const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
        
+                               ctor = type_info.default_ctor = GetConstructor (flags,  null, CallingConventions.Any, Type.EmptyTypes, null);
+                       }
+
+                       return ctor;
+               }
+
                protected override TypeAttributes GetAttributeFlagsImpl ()
                {
                        return get_attributes (this);
@@ -73,11 +89,20 @@ namespace System
                                                                       CallingConventions callConvention,
                                                                       Type[] types,
                                                                       ParameterModifier[] modifiers)
+               {
+                       ConstructorInfo[] methods = GetConstructors (bindingAttr);
+                       return GetConstructorImpl (methods, bindingAttr, binder, callConvention, types, modifiers);
+               }
+
+               internal static ConstructorInfo GetConstructorImpl (ConstructorInfo[] methods, BindingFlags bindingAttr,
+                                                                      Binder binder,
+                                                                      CallingConventions callConvention,
+                                                                      Type[] types,
+                                                                      ParameterModifier[] modifiers)
                {
                        if (bindingAttr == BindingFlags.Default)
                                bindingAttr = BindingFlags.Public | BindingFlags.Instance;
 
-                       ConstructorInfo[] methods = GetConstructors (bindingAttr);
                        ConstructorInfo found = null;
                        MethodBase[] match;
                        int count = 0;
@@ -236,11 +261,15 @@ namespace System
 
                internal override MethodInfo GetMethod (MethodInfo fromNoninstanciated)
                 {
+                       if (fromNoninstanciated == null)
+                               throw new ArgumentNullException ("fromNoninstanciated");
                         return GetCorrespondingInflatedMethod (fromNoninstanciated);
                 }
 
                internal override ConstructorInfo GetConstructor (ConstructorInfo fromNoninstanciated)
                {
+                       if (fromNoninstanciated == null)
+                               throw new ArgumentNullException ("fromNoninstanciated");
                         return GetCorrespondingInflatedConstructor (fromNoninstanciated);
                }
 
@@ -322,11 +351,7 @@ namespace System
                                                     ParameterModifier[] modifiers,
                                                     CultureInfo culture, string[] namedParameters)
                {
-#if NET_2_0
                        const string bindingflags_arg = "bindingFlags";
-#else
-                       const string bindingflags_arg = "invokeAttr";
-#endif
 
 
                        if ((invokeAttr & BindingFlags.CreateInstance) != 0) {
@@ -420,10 +445,8 @@ namespace System
                        } else if ((invokeAttr & BindingFlags.SetField) != 0) {
                                FieldInfo f = GetField (name, invokeAttr);
                                if (f != null) {
-#if NET_2_0
                                        if (args == null)
                                                throw new ArgumentNullException ("providedArgs");
-#endif
                                        if ((args == null) || args.Length != 1)
                                                throw new ArgumentException ("Only the field value can be specified to set a field value.", bindingflags_arg);
                                        f.SetValue (target, args [0]);
@@ -529,13 +552,14 @@ namespace System
 
                public override string FullName {
                        get {
+                               string fullName;
                                // This doesn't need locking
                                if (type_info == null)
                                        type_info = new MonoTypeInfo ();
-                               if (type_info.full_name == null)
-                                       type_info.full_name = getFullName (true, false);
+                               if ((fullName = type_info.full_name) == null)
+                                       fullName = type_info.full_name = getFullName (true, false);
 
-                               return type_info.full_name;
+                               return fullName;
                        }
                }
 
@@ -570,7 +594,7 @@ namespace System
 
                public override MemberTypes MemberType {
                        get {
-                               if (DeclaringType != null)
+                               if (DeclaringType != null && !IsGenericParameter)
                                        return MemberTypes.NestedType;
                                else
                                        return MemberTypes.TypeInfo;
@@ -622,7 +646,6 @@ namespace System
                        return getFullName (false, false);
                }
 
-#if NET_2_0 || BOOTSTRAP_NET_2_0
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern override Type [] GetGenericArguments ();
 
@@ -653,9 +676,30 @@ namespace System
                        [MethodImplAttribute(MethodImplOptions.InternalCall)]
                        get;
                }
+
+               public override Type GetGenericTypeDefinition () {
+                       Type res = GetGenericTypeDefinition_impl ();
+                       if (res == null)
+                               throw new InvalidOperationException ();
+
+                       return res;
+               }
+
+#if NET_4_0
+               public override IList<CustomAttributeData> GetCustomAttributesData () {
+                       return CustomAttributeData.GetCustomAttributes (this);
+               }
+
+
+               public override Array GetEnumValues () {
+                       if (!IsEnum)
+                               throw new ArgumentException ("Type is not an enumeration", "enumType");
+
+                       return Enum.GetValues (this);
+               }
 #endif
 
-               private MethodBase CheckMethodSecurity (MethodBase mb)
+               static MethodBase CheckMethodSecurity (MethodBase mb)
                {
 #if NET_2_1
                        return mb;
@@ -691,5 +735,27 @@ namespace System
                        newArgs [parameters.Length - 1] = paramArray;
                        args = newArgs;
                }
+
+#if NET_4_0
+               //seclevel { transparent = 0, safe-critical = 1, critical = 2}
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern int get_core_clr_security_level ();
+
+               public override bool IsSecurityTransparent
+               {
+                       get { return get_core_clr_security_level () == 0; }
+               }
+
+               public override bool IsSecurityCritical
+               {
+                       get { return get_core_clr_security_level () > 0; }
+               }
+
+               public override bool IsSecuritySafeCritical
+               {
+                       get { return get_core_clr_security_level () == 1; }
+               }
+#endif
+
        }
 }