Switch to compiler-tester
[mono.git] / mcs / class / corlib / System / Type.cs
index b21db83ee75d79b61da7dfe57173d4cb7cd143de..286b6b4b7929c23ba8d4de72ba0cdac2e12c0359 100644 (file)
@@ -6,23 +6,47 @@
 //
 // (C) Ximian, Inc.  http://www.ximian.com
 //
-// TODO: Mucho left to implement.
+
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
+using System.Diagnostics;
 using System.Reflection;
+using System.Reflection.Emit;
 using System.Collections;
+using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
 using System.Globalization;
 
 namespace System {
 
-       //
-       // FIXME: Implement the various IReflect dependencies
-       //
-
-       [MonoTODO]
        [Serializable]
-       public abstract class Type : MemberInfo, IReflect {
+       [ClassInterface (ClassInterfaceType.None)]
+#if NET_2_0
+       [ComVisible (true)]
+       [ComDefaultInterface (typeof (_Type))]
+#endif
+       public abstract class Type : MemberInfo, IReflect, _Type, _MemberInfo {
                
                internal RuntimeTypeHandle _impl;
 
@@ -33,23 +57,50 @@ namespace System {
                public static readonly MemberFilter FilterNameIgnoreCase = new MemberFilter (FilterNameIgnoreCase_impl);
                public static readonly object Missing;
 
+               internal const BindingFlags DefaultBindingFlags =
+               BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
+
                /* implementation of the delegates for MemberFilter */
-               static bool FilterName_impl (MemberInfo m, object filterCriteria) {
+               static bool FilterName_impl (MemberInfo m, object filterCriteria)
+               {
                        string name = (string) filterCriteria;
-                       return name.Equals (m.Name);
+               if (name == null || name.Length == 0 )
+                               return false; // because m.Name cannot be null or empty
+                               
+                       if (name [name.Length-1] == '*')
+                               return string.Compare (name, 0, m.Name, 0, name.Length-1, false, CultureInfo.InvariantCulture) == 0;
+
+               return name.Equals (m.Name);                    
                }
-               
-               static bool FilterNameIgnoreCase_impl (MemberInfo m, object filterCriteria) {
+
+               static bool FilterNameIgnoreCase_impl (MemberInfo m, object filterCriteria)
+               {
                        string name = (string) filterCriteria;
-                       return String.Compare (name, m.Name, true) == 0;
+               if (name == null || name.Length == 0 )
+                               return false; // because m.Name cannot be null or empty
+                               
+                       if (name [name.Length-1] == '*')
+                               return string.Compare (name, 0, m.Name, 0, name.Length-1, true, CultureInfo.InvariantCulture) == 0;
+
+                       return String.Compare (name, m.Name, true, CultureInfo.InvariantCulture) == 0;                          
                }
-               
-               [MonoTODO]
-               static bool FilterAttribute_impl (MemberInfo m, object filterCriteria) {
-                       throw new NotImplementedException ("FilterAttribute_impl");
+
+               static bool FilterAttribute_impl (MemberInfo m, object filterCriteria)
+               {
+                       int flags = ((IConvertible)filterCriteria).ToInt32 (null);
+                       if (m is MethodInfo)
+                               return ((int)((MethodInfo)m).Attributes & flags) != 0;
+                       if (m is FieldInfo)
+                               return ((int)((FieldInfo)m).Attributes & flags) != 0;
+                       if (m is PropertyInfo)
+                               return ((int)((PropertyInfo)m).Attributes & flags) != 0;
+                       if (m is EventInfo)
+                               return ((int)((EventInfo)m).Attributes & flags) != 0;
+                       return false;
                }
 
-               protected Type () {
+               protected Type ()
+               {
                }
 
                /// <summary>
@@ -75,34 +126,32 @@ namespace System {
                                return GetAttributeFlagsImpl ();
                        }
                }
-               
+
                /// <summary>
                ///   Returns the basetype for this type
                /// </summary>
                public abstract Type BaseType {
                        get;
                }
-                       
+
                /// <summary>
                ///   Returns the class that declares the member.
                /// </summary>
-               [MonoTODO]
                public override Type DeclaringType {
                        get {
-                               throw new NotImplementedException ();
+                               return null;
                        }
                }
 
                /// <summary>
                ///
                /// </summary>
-               [MonoTODO]
                public static Binder DefaultBinder {
                        get {
-                               throw new NotImplementedException ();
+                               return Binder.DefaultBinder;
                        }
                }
-               
+
                /// <summary>
                ///    The full name of the type including its namespace
                /// </summary>
@@ -114,9 +163,10 @@ namespace System {
                        get;
                }
 
-               [MonoTODO]
                public bool HasElementType {
-                       get {return false;} // FIXME
+                       get {
+                               return HasElementTypeImpl ();
+                       }
                }
 
                public bool IsAbstract {
@@ -127,7 +177,8 @@ namespace System {
 
                public bool IsAnsiClass {
                        get {
-                               return (Attributes & TypeAttributes.StringFormatMask) == TypeAttributes.AnsiClass;
+                               return (Attributes & TypeAttributes.StringFormatMask)
+                               == TypeAttributes.AnsiClass;
                        }
                }
 
@@ -157,11 +208,15 @@ namespace System {
 
                public bool IsClass {
                        get {
-                               if (this == typeof (System.Enum) || this == typeof (System.ValueType))
+                               //
+                               // This code used to probe for "this == typeof (System.Enum)", but in
+                               // The .NET Framework 1.0, the above test return false
+                               //
+                               if (this == typeof (System.ValueType))
                                        return true;
                                if (IsInterface)
                                        return false;
-                               return !type_is_subtype_of (this, typeof (System.ValueType), false);
+                               return !is_subtype_of (this, typeof (System.ValueType), false);
                        }
                }
 
@@ -179,7 +234,11 @@ namespace System {
 
                public bool IsEnum {
                        get {
-                               return type_is_subtype_of (this, typeof (System.Enum), false) &&
+                               // This hack is needed because EnumBuilder's UnderlyingSystemType returns the enum's basetype
+                               if (this is EnumBuilder)
+                                       return true;
+
+                               return is_subtype_of (this, typeof (System.Enum), false) &&
                                        this != typeof (System.Enum);
                        }
                }
@@ -252,7 +311,7 @@ namespace System {
 
                public bool IsNotPublic {
                        get {
-                               return !IsPublic;
+                               return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.NotPublic;
                        }
                }
 
@@ -268,10 +327,8 @@ namespace System {
                        }
                }
 
-               [MonoTODO]
                public bool IsPublic {
                        get {
-                               // FIXME: handle nestedpublic, too?
                                return (Attributes & TypeAttributes.VisibilityMask) == TypeAttributes.Public;
                        }
                }
@@ -284,7 +341,9 @@ namespace System {
 
                public bool IsSerializable {
                        get {
-                               return (Attributes & TypeAttributes.Serializable) != 0;
+                               // Enums and delegates are always serializable
+                               return (Attributes & TypeAttributes.Serializable) != 0 || IsEnum || 
+                                       is_subtype_of (this, typeof (System.Delegate), false);
                        }
                }
 
@@ -306,145 +365,215 @@ namespace System {
                        }
                }
 
-               [MonoTODO]
                public override MemberTypes MemberType {
-                       get {return MemberTypes.TypeInfo;} // FIXME
+                       get {return MemberTypes.TypeInfo;}
                }
 
+#if NET_2_0 || BOOTSTRAP_NET_2_0
+               override
+#endif
                public abstract Module Module {get;}
        
                public abstract string Namespace {get;}
 
-               [MonoTODO]
                public override Type ReflectedType {
                        get {
-                               throw new NotImplementedException ();
+                               return null;
                        }
                }
 
                public abstract RuntimeTypeHandle TypeHandle {get;}
 
-               [MonoTODO]
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public ConstructorInfo TypeInitializer {
                        get {
-                               throw new NotImplementedException ();
+                               return GetConstructorImpl (
+                                       BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static,
+                                       null,
+                                       CallingConventions.Any,
+                                       EmptyTypes,
+                                       null);
                        }
                }
 
                public abstract Type UnderlyingSystemType {get;}
 
-               public override bool Equals (object o) {
+               public override bool Equals (object o)
+               {
                        if (o == null)
                                return false;
+                       
+                       // TODO: return UnderlyingSystemType == o.UnderlyingSystemType;
                        Type cmp = o as Type;
                        if (cmp == null)
                                return false;
                        return Equals (cmp);
                }
-               
+
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                public extern bool Equals (Type type);
                
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern Type internal_from_handle (RuntimeTypeHandle handle);
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern Type internal_from_name (string name);
+               private static extern Type internal_from_handle (IntPtr handle);
                
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               private static extern Type internal_from_name (string name, bool throwOnError, bool ignoreCase);
+
                public static Type GetType(string typeName)
                {
-                       return internal_from_name (typeName);
+                       if (typeName == null)
+                               throw new ArgumentNullException ("typeName");
+
+                       return internal_from_name (typeName, false, false);
                }
 
                public static Type GetType(string typeName, bool throwOnError)
                {
-                       // LAMESPEC: what kinds of errors cause exception to be thrown?
-                       return internal_from_name (typeName);
+                       if (typeName == null)
+                               throw new ArgumentNullException ("typeName");
+
+                       Type type = internal_from_name (typeName, throwOnError, false);
+                       if (throwOnError && type == null)
+                               throw new TypeLoadException ("Error loading '" + typeName + "'");
+
+                       return type;
                }
 
-               [MonoTODO]
                public static Type GetType(string typeName, bool throwOnError, bool ignoreCase)
                {
-                       throw new NotImplementedException ();
+                       if (typeName == null)
+                               throw new ArgumentNullException ("typeName");
+
+                       Type t = internal_from_name (typeName, throwOnError, ignoreCase);
+                       if (throwOnError && t == null)
+                               throw new TypeLoadException ("Error loading '" + typeName + "'");
+
+                       return t;
                }
 
                public static Type[] GetTypeArray (object[] args) {
-                       Type[] ret;
+                       if (args == null)
+                               throw new ArgumentNullException ("args");
 
+                       Type[] ret;
                        ret = new Type [args.Length];
                        for (int i = 0; i < args.Length; ++i)
                                ret [i] = args[i].GetType ();
                        return ret;
                }
 
-               [MonoTODO]
-               public static TypeCode GetTypeCode( Type type)
-               {
-                       // FIXME
-                       return TypeCode.Empty;
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               internal extern static TypeCode GetTypeCodeInternal (Type type);
+
+               public static TypeCode GetTypeCode (Type type) {
+                       type = type.UnderlyingSystemType;
+
+                       if (!type.IsSystemType)
+                               return Type.GetTypeCode (typeof (object));
+                       else
+                               return GetTypeCodeInternal (type);
                }
 
                [MonoTODO]
-               public static Type GetTypeFromCLSID (Guid clsid) {
+               public static Type GetTypeFromCLSID (Guid clsid)
+               {
                        throw new NotImplementedException ();
                }
 
                [MonoTODO]
-               public static Type GetTypeFromCLSID (Guid clsid, bool throwOnError) {
+               public static Type GetTypeFromCLSID (Guid clsid, bool throwOnError)
+               {
                        throw new NotImplementedException ();
                }
 
                [MonoTODO]
-               public static Type GetTypeFromCLSID (Guid clsid, string server) {
+               public static Type GetTypeFromCLSID (Guid clsid, string server)
+               {
                        throw new NotImplementedException ();
                }
 
                [MonoTODO]
-               public static Type GetTypeFromCLSID (Guid clsid, string server, bool throwOnError) {
+               public static Type GetTypeFromCLSID (Guid clsid, string server, bool throwOnError)
+               {
                        throw new NotImplementedException ();
                }
 
                public static Type GetTypeFromHandle (RuntimeTypeHandle handle)
                { 
-                       return internal_from_handle (handle);
+                       return internal_from_handle (handle.Value);
                }
 
                [MonoTODO]
-               public static Type GetTypeFromProgID (string progID) {
+               public static Type GetTypeFromProgID (string progID)
+               {
                        throw new NotImplementedException ();
                }
 
                [MonoTODO]
-               public static Type GetTypeFromProgID (string progID, bool throwOnError) {
+               public static Type GetTypeFromProgID (string progID, bool throwOnError)
+               {
                        throw new NotImplementedException ();
                }
 
                [MonoTODO]
-               public static Type GetTypeFromProgID (string progID, string server) {
+               public static Type GetTypeFromProgID (string progID, string server)
+               {
                        throw new NotImplementedException ();
                }
 
                [MonoTODO]
-               public static Type GetTypeFromProgID (string progID, string server, bool throwOnError) {
+               public static Type GetTypeFromProgID (string progID, string server, bool throwOnError)
+               {
                        throw new NotImplementedException ();
                }
 
-               public static RuntimeTypeHandle GetTypeHandle (object o) {
+               public static RuntimeTypeHandle GetTypeHandle (object o)
+               {
                        return o.GetType().TypeHandle;
                }
 
                [MethodImplAttribute(MethodImplOptions.InternalCall)]
                internal static extern bool type_is_subtype_of (Type a, Type b, bool check_interfaces);
-               
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               internal static extern bool type_is_assignable_from (Type a, Type b);
+
+               internal static bool is_subtype_of (Type a, Type b, bool check_interfaces)
+               {
+                       a = a.UnderlyingSystemType;
+                       b = b.UnderlyingSystemType;
+
+                       if (!a.IsSystemType || !b.IsSystemType)
+                               return false;
+                       else
+                               return type_is_subtype_of (a, b, check_interfaces);
+               }
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public virtual bool IsSubclassOf (Type c)
                {
-                       return type_is_subtype_of (this, c, false);
+                       if (c == null)
+                               return false;
+
+                       return (this != c) && is_subtype_of (this, c, false);
                }
 
-               [MonoTODO]
                public virtual Type[] FindInterfaces (TypeFilter filter, object filterCriteria)
                {
-                       // FIXME
-                       throw new NotImplementedException ();
+                       if (filter == null)
+                               throw new ArgumentNullException ("filter");
+
+                       ArrayList ifaces = new ArrayList ();
+                       foreach (Type iface in GetInterfaces ()) {
+                               if (filter (iface, filterCriteria))
+                                       ifaces.Add (iface);
+                       }
+
+                       return (Type []) ifaces.ToArray (typeof (Type));
                }
                
                public Type GetInterface (string name) {
@@ -453,251 +582,385 @@ namespace System {
 
                public abstract Type GetInterface (string name, bool ignoreCase);
 
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               internal static extern void GetInterfaceMapData (Type t, Type iface, out MethodInfo[] targets, out MethodInfo[] methods);
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif         
                public virtual InterfaceMapping GetInterfaceMap (Type interfaceType) {
-                       throw new NotImplementedException ();
+                       InterfaceMapping res;
+                       if (interfaceType == null)
+                               throw new ArgumentNullException ("interfaceType");
+                       if (!interfaceType.IsInterface)
+                               throw new ArgumentException (Locale.GetText ("Argument must be an interface."), "interfaceType");
+                       res.TargetType = this;
+                       res.InterfaceType = interfaceType;
+                       GetInterfaceMapData (this, interfaceType, out res.TargetMethods, out res.InterfaceMethods);
+                       if (res.TargetMethods == null)
+                               throw new ArgumentException (Locale.GetText ("Interface not found"), "interfaceType");
+
+                       return res;
                }
 
                public abstract Type[] GetInterfaces ();
 
-               [MonoTODO]
                public virtual bool IsAssignableFrom (Type c)
                {
-                       // FIXME
-                       return type_is_subtype_of (c, this, true);
-               }
+                       if (c == null)
+                               return false;
+
+                       if (Equals (c))
+                               return true;
+
+                       if (c is TypeBuilder)
+                               return ((TypeBuilder)c).IsAssignableTo (this);
 
-               public virtual bool IsInstanceOfType (object o) {
-                       if (o != null) {
-                               return o.GetType().IsSubclassOf (this);
+                       /* Handle user defined type classes */
+                       if (!IsSystemType) {
+                               Type systemType = UnderlyingSystemType;
+                               if (!systemType.IsSystemType)
+                                       return false;
+                               return systemType.IsAssignableFrom (c);
                        }
-                       return false;
+
+                       if (!c.IsSystemType) {
+                               Type underlyingType = c.UnderlyingSystemType;
+                               if (!underlyingType.IsSystemType)
+                                       return false;
+                               return IsAssignableFrom (underlyingType);
+                       }
+
+                       return type_is_assignable_from (this, c);
                }
 
-               [MonoTODO]
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern virtual bool IsInstanceOfType (object o);
+
                public virtual int GetArrayRank ()
                {
-                       // FIXME
-                       throw new NotImplementedException ();
+                       throw new NotSupportedException ();     // according to MSDN
                }
 
                public abstract Type GetElementType ();
 
-               [MonoTODO]
-               public EventInfo GetEvent (string name) {
-                       throw new NotImplementedException ();
+               public EventInfo GetEvent (string name)
+               {
+                       return GetEvent (name, DefaultBindingFlags);
                }
 
                public abstract EventInfo GetEvent (string name, BindingFlags bindingAttr);
 
-               public virtual EventInfo[] GetEvents () {
-                       return GetEvents (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
+               public virtual EventInfo[] GetEvents ()
+               {
+                       return GetEvents (DefaultBindingFlags);
                }
 
                public abstract EventInfo[] GetEvents (BindingFlags bindingAttr);
 
-               public FieldInfo GetField( string name) {
-                       return GetField (name, BindingFlags.Public);
+               public FieldInfo GetField( string name)
+               {
+                       return GetField (name, DefaultBindingFlags);
                }
 
                public abstract FieldInfo GetField( string name, BindingFlags bindingAttr);
 
                public FieldInfo[] GetFields ()
                {
-                       return GetFields (BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static);
+                       return GetFields (DefaultBindingFlags);
                }
 
                public abstract FieldInfo[] GetFields (BindingFlags bindingAttr);
                
-               public override int GetHashCode() {
+               public override int GetHashCode()
+               {
                        return (int)_impl.Value;
                }
 
-               public MemberInfo[] GetMember( string name) {
-                       return GetMember (name, BindingFlags.Public);
+               public MemberInfo[] GetMember (string name)
+               {
+                       return GetMember (name, DefaultBindingFlags);
                }
                
-               [MonoTODO]
-               public virtual MemberInfo[] GetMember( string name, BindingFlags bindingAttr) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public virtual MemberInfo[] GetMember (string name, BindingFlags bindingAttr)
+               {
+                       return GetMember (name, MemberTypes.All, bindingAttr);
                }
 
-               [MonoTODO]
-               public virtual MemberInfo[] GetMember( string name, MemberTypes type, BindingFlags bindingAttr) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public virtual MemberInfo[] GetMember (string name, MemberTypes type, BindingFlags bindingAttr)
+               {
+                       if ((bindingAttr & BindingFlags.IgnoreCase) != 0)
+                               return FindMembers (type, bindingAttr, FilterNameIgnoreCase, name);
+                       else
+                               return FindMembers (type, bindingAttr, FilterName, name);
                }
 
-               public MemberInfo[] GetMembers() {
-                       return GetMembers (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
+               public MemberInfo[] GetMembers ()
+               {
+                       return GetMembers (DefaultBindingFlags);
                }
 
-               public abstract MemberInfo[] GetMembers( BindingFlags bindingAttr);
-
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern MethodInfo get_method (Type type, string name, Type[] types);
+               public abstract MemberInfo[] GetMembers (BindingFlags bindingAttr);
 
-               public MethodInfo GetMethod( string name) {
-                       return GetMethod (name, BindingFlags.Public);
+               public MethodInfo GetMethod (string name)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       return GetMethodImpl (name, DefaultBindingFlags, null, CallingConventions.Any, null, null);
                }
 
-               [MonoTODO]
-               public MethodInfo GetMethod( string name, BindingFlags bindingAttr) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public MethodInfo GetMethod (string name, BindingFlags bindingAttr)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       
+                       return GetMethodImpl (name, bindingAttr, null, CallingConventions.Any, null, null);
                }
                
                public MethodInfo GetMethod (string name, Type[] types)
                {
-                       return get_method (this, name, types);
+                       return GetMethod (name, DefaultBindingFlags, null, CallingConventions.Any, types, null);
                }
 
-               [MonoTODO]
-               public MethodInfo GetMethod( string name, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public MethodInfo GetMethod (string name, Type[] types, ParameterModifier[] modifiers)
+               {
+                       return GetMethod (name, DefaultBindingFlags, null, CallingConventions.Any, types, modifiers);
                }
 
-               [MonoTODO]
-               public MethodInfo GetMethod( string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder,
+                                            Type[] types, ParameterModifier[] modifiers)
+               {
+                       
+                       return GetMethod (name, bindingAttr, binder, CallingConventions.Any, types, modifiers);
                }
 
-               [MonoTODO]
-               public MethodInfo GetMethod( string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder,
+                                            CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       if (types == null)
+                               throw new ArgumentNullException ("types");
+
+                       for (int i = 0; i < types.Length; i++) 
+                               if (types[i] == null)
+                                       throw new ArgumentNullException ("types");
+
+                       return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
+               }
+
+               protected abstract MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder,
+                                                            CallingConventions callConvention, Type[] types,
+                                                            ParameterModifier[] modifiers);
+
+               internal MethodInfo GetMethodImplInternal (string name, BindingFlags bindingAttr, Binder binder,
+                                                                                                                       CallingConventions callConvention, Type[] types,
+                                                                                                                       ParameterModifier[] modifiers)
+               {
+                       return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
                }
 
-               protected abstract MethodInfo GetMethodImpl( string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers);
+               internal virtual MethodInfo GetMethod (MethodInfo fromNoninstanciated)
+                {
+                       throw new System.InvalidOperationException ("can only be called in generic type");
+                }
+
+               internal virtual ConstructorInfo GetConstructor (ConstructorInfo fromNoninstanciated)
+                {
+                       throw new System.InvalidOperationException ("can only be called in generic type");
+                }
+
+               internal virtual FieldInfo GetField (FieldInfo fromNoninstanciated)
+                {
+                       throw new System.InvalidOperationException ("can only be called in generic type");
+                }
 
+               
                public MethodInfo[] GetMethods ()
                {
-                       return GetMethods (BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static);
+                       return GetMethods (DefaultBindingFlags);
                }
 
                public abstract MethodInfo[] GetMethods (BindingFlags bindingAttr);
 
-               public Type GetNestedType( string name) {
-                       return GetNestedType (name, BindingFlags.Public);
+               public Type GetNestedType (string name)
+               {
+                       return GetNestedType (name, DefaultBindingFlags);
                }
 
-               public abstract Type GetNestedTypestring name, BindingFlags bindingAttr);
+               public abstract Type GetNestedType (string name, BindingFlags bindingAttr);
 
-               public Type[] GetNestedTypes () {
-                       return GetNestedTypes (BindingFlags.Public);
+               public Type[] GetNestedTypes ()
+               {
+                       return GetNestedTypes (DefaultBindingFlags);
                }
 
                public abstract Type[] GetNestedTypes (BindingFlags bindingAttr);
 
+
                public PropertyInfo[] GetProperties ()
                {
-                       return GetProperties (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
+                       return GetProperties (DefaultBindingFlags);
                }
 
-               public abstract PropertyInfo[] GetProperties( BindingFlags bindingAttr);
+               public abstract PropertyInfo[] GetProperties (BindingFlags bindingAttr);
+
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern PropertyInfo get_property (Type type, string name, Type[] types);
-               
                public PropertyInfo GetProperty (string name)
                {
-                       return GetProperty (name, BindingFlags.Public);
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+
+                       return GetPropertyImpl (name, DefaultBindingFlags, null, null, null, null);
                }
 
-               [MonoTODO]
-               public PropertyInfo GetProperty( string name, BindingFlags bindingAttr) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public PropertyInfo GetProperty (string name, BindingFlags bindingAttr)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       return GetPropertyImpl (name, bindingAttr, null, null, null, null);
                }
 
-               [MonoTODO]
-               public PropertyInfo GetProperty( string name, Type returnType) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public PropertyInfo GetProperty (string name, Type returnType)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       return GetPropertyImpl (name, DefaultBindingFlags, null, returnType, null, null);
                }
 
                public PropertyInfo GetProperty (string name, Type[] types)
                {
-                       return get_property (this, name, types);
+                       return GetProperty (name, DefaultBindingFlags, null, null, types, null);
                }
 
-               [MonoTODO]
                public PropertyInfo GetProperty (string name, Type returnType, Type[] types)
                {
-                       // FIXME
-                       throw new NotImplementedException ();
+                       return GetProperty (name, DefaultBindingFlags, null, returnType, types, null);
                }
 
-               [MonoTODO]
-               public PropertyInfo GetProperty( string name, Type returnType, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public PropertyInfo GetProperty( string name, Type returnType, Type[] types, ParameterModifier[] modifiers)
+               {
+                       return GetProperty (name, DefaultBindingFlags, null, returnType, types, modifiers);
                }
 
-               [MonoTODO]
-               public PropertyInfo GetProperty( string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) {
-                       // FIXME
-                       throw new NotImplementedException ();
+               public PropertyInfo GetProperty (string name, BindingFlags bindingAttr, Binder binder, Type returnType,
+                                                Type[] types, ParameterModifier[] modifiers)
+               {
+                       if (name == null)
+                               throw new ArgumentNullException ("name");
+                       if (types == null)
+                               throw new ArgumentNullException ("types");
+
+                       return GetPropertyImpl (name, bindingAttr, binder, returnType, types, modifiers);
                }
 
-               protected abstract PropertyInfo GetPropertyImpl( string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers);
+               protected abstract PropertyInfo GetPropertyImpl (string name, BindingFlags bindingAttr, Binder binder,
+                                                                Type returnType, Type[] types, ParameterModifier[] modifiers);
 
-               [MethodImplAttribute(MethodImplOptions.InternalCall)]
-               private static extern ConstructorInfo get_constructor (Type type, Type[] types);
+               internal PropertyInfo GetPropertyImplInternal (string name, BindingFlags bindingAttr, Binder binder,
+                                                                                                          Type returnType, Type[] types, ParameterModifier[] modifiers)
+               {
+                       return GetPropertyImpl (name, bindingAttr, binder, returnType, types, modifiers);
+               }
 
-               protected abstract ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers);
+               protected abstract ConstructorInfo GetConstructorImpl (BindingFlags bindingAttr,
+                                                                      Binder binder,
+                                                                      CallingConventions callConvention,
+                                                                      Type[] types,
+                                                                      ParameterModifier[] modifiers);
 
                protected abstract TypeAttributes GetAttributeFlagsImpl ();
                protected abstract bool HasElementTypeImpl ();
                protected abstract bool IsArrayImpl ();
                protected abstract bool IsByRefImpl ();
                protected abstract bool IsCOMObjectImpl ();
-               protected virtual bool IsContextfulImpl () {
-                       return typeof (ContextBoundObject).IsAssignableFrom (this);
-               }
-               [MonoTODO]
-               protected virtual bool IsMarshalByRefImpl () {
-                       // FIXME
-                       return false;
-               }
                protected abstract bool IsPointerImpl ();
                protected abstract bool IsPrimitiveImpl ();
-               protected abstract bool IsValueTypeImpl ();
                
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               internal static extern bool IsArrayImpl (Type type);
+
+               protected virtual bool IsValueTypeImpl ()
+               {
+                       if (this == typeof (Enum) || this == typeof (ValueType))
+                               return false;
+
+                       return IsSubclassOf (typeof (ValueType));
+               }
+               
+               protected virtual bool IsContextfulImpl ()
+               {
+                       return typeof (ContextBoundObject).IsAssignableFrom (this);
+               }
+
+               protected virtual bool IsMarshalByRefImpl ()
+               {
+                       return typeof (MarshalByRefObject).IsAssignableFrom (this);
+               }
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif
                public ConstructorInfo GetConstructor (Type[] types)
                {
-                       return get_constructor (this, types);
+                       return GetConstructorImpl (
+                               DefaultBindingFlags, null, CallingConventions.Any, types, null);
                }
 
-               [MonoTODO]
-               public ConstructorInfo GetConstructor (BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) {
-                       throw new NotImplementedException ();
+#if NET_2_0
+               [ComVisible (true)]
+#endif
+               public ConstructorInfo GetConstructor (BindingFlags bindingAttr, Binder binder,
+                                                      Type[] types, ParameterModifier[] modifiers)
+               {
+                       return GetConstructorImpl (
+                               bindingAttr, binder, CallingConventions.Any, types, modifiers);
                }
 
-               [MonoTODO]
-               public ConstructorInfo GetConstructor( BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) {
-                       throw new NotImplementedException ();
+#if NET_2_0
+               [ComVisible (true)]
+#endif
+               public ConstructorInfo GetConstructor (BindingFlags bindingAttr, Binder binder,
+                                                      CallingConventions callConvention,
+                                                      Type[] types, ParameterModifier[] modifiers)
+               {
+                       if (types == null)
+                               throw new ArgumentNullException ("types");
+
+                       return GetConstructorImpl (bindingAttr, binder, callConvention, types, modifiers);
                }
 
-               public ConstructorInfo[] GetConstructors () {
-                       return GetConstructors (BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance);
+#if NET_2_0
+               [ComVisible (true)]
+#endif
+               public ConstructorInfo[] GetConstructors ()
+               {
+                       return GetConstructors (BindingFlags.Public | BindingFlags.Instance);
                }
-               
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif         
                public abstract ConstructorInfo[] GetConstructors (BindingFlags bindingAttr);
 
-               [MonoTODO]
-               public virtual MemberInfo[] GetDefaultMembers () {
-                       throw new NotImplementedException ();
+               public virtual MemberInfo[] GetDefaultMembers ()
+               {
+                       object [] att = GetCustomAttributes (typeof (DefaultMemberAttribute), true);
+                       if (att.Length == 0)
+                               return new MemberInfo [0];
+
+                       MemberInfo [] member = GetMember (((DefaultMemberAttribute) att [0]).MemberName);
+                       return (member != null) ? member : new MemberInfo [0];
                }
 
-               public virtual MemberInfo[] FindMembers( MemberTypes memberType, BindingFlags bindingAttr,
-                                                        MemberFilter filter, object filterCriteria) {
+               public virtual MemberInfo[] FindMembers (MemberTypes memberType, BindingFlags bindingAttr,
+                                                        MemberFilter filter, object filterCriteria)
+               {
                        MemberInfo[] result;
                        ArrayList l = new ArrayList ();
 
-                       //Console.WriteLine ("FindMembers for {0} (Type: {1}): {2}", this.FullName, this.GetType().FullName, this.obj_address());
+                       // Console.WriteLine ("FindMembers for {0} (Type: {1}): {2}",
+                       // this.FullName, this.GetType().FullName, this.obj_address());
 
                        if ((memberType & MemberTypes.Constructor) != 0) {
                                ConstructorInfo[] c = GetConstructors (bindingAttr);
@@ -762,35 +1025,236 @@ namespace System {
                                        l.AddRange (c);
                                }
                        }
+                       if ((memberType & MemberTypes.NestedType) != 0) {
+                               Type[] c = GetNestedTypes (bindingAttr);
+                               if (filter != null) {
+                                       foreach (MemberInfo m in c) {
+                                               if (filter (m, filterCriteria)) {
+                                                       l.Add (m);
+                                               }
+                                       }
+                               } else {
+                                       l.AddRange (c);
+                               }
+                       }
                        result = new MemberInfo [l.Count];
                        l.CopyTo (result);
                        return result;
                }
 
-               [MonoTODO]
-               public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args) {
-                       // FIXME
-                       return null;
+               [DebuggerHidden]
+               [DebuggerStepThrough] 
+               public object InvokeMember (string name, BindingFlags invokeAttr, Binder binder, object target, object[] args)
+               {
+                       return InvokeMember (name, invokeAttr, binder, target, args, null, null, null);
                }
 
-               [MonoTODO]
-               public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, CultureInfo culture) {
-                       // FIXME
-                       return null;
+               [DebuggerHidden]
+               [DebuggerStepThrough] 
+               public object InvokeMember (string name, BindingFlags invokeAttr, Binder binder,
+                                           object target, object[] args, CultureInfo culture)
+               {
+                       return InvokeMember (name, invokeAttr, binder, target, args, null, culture, null);
                }
 
-               public abstract object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters);
+               public abstract object InvokeMember (string name, BindingFlags invokeAttr,
+                                                    Binder binder, object target, object[] args,
+                                                    ParameterModifier[] modifiers,
+                                                    CultureInfo culture, string[] namedParameters);
 
                public override string ToString()
                {
-                       string res = FullName;
-                       if (IsArray)
-                               res = res + "[]";
-                       if (IsByRef)
-                               res = res + "&";
-                       if (IsPointer)
-                               res = res + "*";
+                       return FullName;
+               }
+
+               internal bool IsSystemType {
+                       get {
+                               return _impl.Value != IntPtr.Zero;
+                       }
+               }
+
+#if NET_2_0 || BOOTSTRAP_NET_2_0
+               public abstract Type[] GetGenericArguments ();
+
+               public abstract bool HasGenericArguments {
+                       get;
+               }
+
+               public abstract bool ContainsGenericParameters {
+                       get;
+               }
+
+               public extern bool IsGenericTypeDefinition {
+                       [MethodImplAttribute(MethodImplOptions.InternalCall)]
+                       get;
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern Type GetGenericTypeDefinition_impl ();
+
+               public virtual Type GetGenericTypeDefinition ()
+               {
+                       Type res = GetGenericTypeDefinition_impl ();
+                       if (res == null)
+                               throw new InvalidOperationException ();
+
                        return res;
                }
+
+               public extern bool IsGenericInstance {
+                       [MethodImplAttribute(MethodImplOptions.InternalCall)]
+                       get;
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               static extern Type BindGenericParameters (Type gt, Type [] types);
+
+#if NET_2_0
+               [ComVisible (true)]
+#endif         
+               public Type BindGenericParameters (Type [] types)
+               {
+                       if (types == null)
+                               throw new ArgumentNullException ("types");
+                       foreach (Type t in types) {
+                               if (t == null)
+                                       throw new ArgumentNullException ("types");
+                       }
+                       Type res = BindGenericParameters (this, types);
+                       if (res == null)
+                               throw new TypeLoadException ();
+                       return res;
+               }
+
+                public Type MakeGenericType (Type[] types)
+                {
+                       return BindGenericParameters (types);
+                }
+
+               public abstract bool IsGenericParameter {
+                       get;
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern int GetGenericParameterPosition ();
+               
+               public virtual int GenericParameterPosition {
+                       get {
+                               int res = GetGenericParameterPosition ();
+                               if (res < 0)
+                                       throw new InvalidOperationException ();
+                               return res;
+                       }
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern GenericParameterAttributes GetGenericParameterAttributes ();
+
+               public virtual GenericParameterAttributes GenericParameterAttributes {
+                       get {
+                               if (!IsGenericParameter)
+                                       throw new InvalidOperationException ();
+
+                               return GetGenericParameterAttributes ();
+                       }
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern Type[] GetGenericParameterConstraints_impl ();
+
+               public virtual Type[] GetGenericParameterConstraints ()
+               {
+                       if (!IsGenericParameter)
+                               throw new InvalidOperationException ();
+
+                       return GetGenericParameterConstraints_impl ();
+               }
+
+               public abstract MethodInfo DeclaringMethod {
+                       get;
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern Type make_array_type (int rank);
+
+               public virtual Type MakeArrayType ()
+               {
+                       return MakeArrayType (1);
+               }
+
+               public virtual Type MakeArrayType (int rank)
+               {
+                       if (rank < 1)
+                               throw new IndexOutOfRangeException ();
+                       return make_array_type (rank);
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern Type make_byref_type ();
+
+               public virtual Type MakeByRefType ()
+               {
+                       return make_byref_type ();
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               public extern virtual Type MakePointerType ();
+
+               [MonoTODO]
+               public static Type ReflectionOnlyGetType (string typeName, 
+                                                                                                 bool throwIfNotFound, 
+                                                                                                 bool ignoreCase)
+               {
+                       throw new NotImplementedException ();
+               }
+
+               [MethodImplAttribute(MethodImplOptions.InternalCall)]
+               extern void GetPacking (out int packing, out int size);         
+
+               public virtual StructLayoutAttribute StructLayoutAttribute {
+                       get {
+                               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)
+                                       GetPacking (out attr.Pack, out attr.Size);
+
+                               return attr;
+                       }
+               }
+
+               internal object[] GetPseudoCustomAttributes () {
+                       int count = 0;
+
+                       if (IsSerializable)
+                               count ++;
+
+                       if (count == 0)
+                               return null;
+                       object[] attrs = new object [count];
+                       count = 0;
+
+                       if (IsSerializable)
+                               attrs [count ++] = new SerializableAttribute ();
+
+                       return attrs;
+               }                       
+
+#endif
        }
 }