2010-03-18 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mcs / class / corlib / System / MonoType.cs
index 871da791c9745c421903d08a6def61154f284408..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;
@@ -88,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;
@@ -251,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);
                }
 
@@ -337,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) {
@@ -435,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]);
@@ -586,7 +594,7 @@ namespace System
 
                public override MemberTypes MemberType {
                        get {
-                               if (DeclaringType != null)
+                               if (DeclaringType != null && !IsGenericParameter)
                                        return MemberTypes.NestedType;
                                else
                                        return MemberTypes.TypeInfo;
@@ -638,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 ();
 
@@ -669,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;
@@ -707,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
+
        }
 }