[corlib] MonoAssembly.LoadWithPartialNameInternal.
[mono.git] / mcs / class / corlib / System.Reflection / Module.cs
index 0830cec58f2d922627f0051cd2601cf3e60242d4..75bfc1fc74b81ec166fe66f459e7af567465e296 100644 (file)
@@ -47,14 +47,14 @@ namespace System.Reflection {
        [ComDefaultInterfaceAttribute (typeof (_Module))]
        [Serializable]
        [ClassInterfaceAttribute (ClassInterfaceType.None)]
-
-#if NET_4_0
-       public class Module : ISerializable, ICustomAttributeProvider, _Module {
+       [StructLayout (LayoutKind.Sequential)]
+#if MOBILE
+       public abstract class Module : ISerializable, ICustomAttributeProvider {
 #else
-       public partial class Module : ISerializable, ICustomAttributeProvider, _Module {
+       public abstract class Module : ISerializable, ICustomAttributeProvider, _Module {
 #endif
-               public static readonly TypeFilter FilterTypeName;
-               public static readonly TypeFilter FilterTypeNameIgnoreCase;
+               public static readonly TypeFilter FilterTypeName = new TypeFilter (filter_by_type_name);
+               public static readonly TypeFilter FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
        
 #pragma warning disable 649    
                internal IntPtr _impl; /* a pointer to a MonoImage */
@@ -68,65 +68,20 @@ namespace System.Reflection {
        
                const BindingFlags defaultBindingFlags = 
                        BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance;
-               
-               static Module () {
-                       FilterTypeName = new TypeFilter (filter_by_type_name);
-                       FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
-               }
 
-
-#if NET_4_0
                protected
-#else
-               internal
-#endif
                Module () {
                }
 
-               public Assembly Assembly {
-                       get { return assembly; }
-               }
-       
-               public virtual string FullyQualifiedName {
-                       get {
-#if !NET_2_1
-                               if (SecurityManager.SecurityEnabled) {
-                                       new FileIOPermission (FileIOPermissionAccess.PathDiscovery, fqname).Demand ();
-                               }
-#endif
-                               return fqname;
-                       }
-               }
-
-               // Note: we do not ask for PathDiscovery because no path is returned here.
-               // However MS Fx requires it (see FDBK23572 for details).
-               public string Name {
-                       get { return name; }
-               }
-       
-               public string ScopeName {
-                       get { return scopename; }
-               }
-
                public ModuleHandle ModuleHandle {
                        get {
                                return new ModuleHandle (_impl);
                        }
                }
 
-               public extern int MetadataToken {
-                       [MethodImplAttribute (MethodImplOptions.InternalCall)]
-                       get;
-               }
-
-               public int MDStreamVersion {
-                       get {
-                               if (_impl == IntPtr.Zero)
-                                       throw new NotSupportedException ();
-                               return GetMDStreamVersion (_impl);
-                       }
-               }
-
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               internal static extern int get_MetadataToken (Module module);
+               
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal static extern int GetMDStreamVersion (IntPtr module_handle);
 
@@ -142,17 +97,20 @@ namespace System.Reflection {
        
                public MethodInfo GetMethod (string name) 
                {
-                       //FIXME this sure breaks since Type.GetMethod throws due to a null 'type' array. But it's what MS does
                        return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, null, null);
                }
        
                public MethodInfo GetMethod (string name, Type[] types) 
                {
+                       if (types == null)
+                               throw new ArgumentNullException ("types");
                        return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, types, null);
                }
        
                public MethodInfo GetMethod (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) 
                {
+                       if (types == null)
+                               throw new ArgumentNullException ("types");
                        return GetMethodImpl (name, bindingAttr, binder, callConvention, types, modifiers);
                }
        
@@ -164,10 +122,7 @@ namespace System.Reflection {
                [SecurityPermission (SecurityAction.LinkDemand, SerializationFormatter = true)]
                public virtual void GetObjectData (SerializationInfo info, StreamingContext context) 
                {
-                       if (info == null)
-                               throw new ArgumentNullException ("info");
-
-                       UnitySerializationHolder.GetModuleData (this, info, context);
+                       throw new NotImplementedException ();
                }
 
                [ComVisible (true)]
@@ -196,12 +151,6 @@ namespace System.Reflection {
                        }
                }
 
-               public Guid ModuleVersionId {
-                       get {
-                               return GetModuleVersionId ();
-                       }
-               }
-
                internal Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
                        if (error == ResolveTokenError.OutOfRange)
                                return new ArgumentOutOfRangeException ("metadataToken", String.Format ("Token 0x{0:x} is not valid in the scope of module {1}", metadataToken, name));
@@ -263,18 +212,18 @@ namespace System.Reflection {
 
                private static bool filter_by_type_name (Type m, object filterCriteria) {
                        string s = (string)filterCriteria;
-                       if (s.EndsWith ("*"))
-                               return m.Name.StartsWith (s.Substring (0, s.Length - 1));
-                       else
-                               return m.Name == s;
+                       if (s.Length > 0 && s [s.Length - 1] == '*')
+                               return m.Name.StartsWithOrdinalUnchecked (s.Substring (0, s.Length - 1));
+                       
+                       return m.Name == s;
                }
 
                private static bool filter_by_type_name_ignore_case (Type m, object filterCriteria) {
                        string s = (string)filterCriteria;
-                       if (s.EndsWith ("*"))
-                               return m.Name.ToLower ().StartsWith (s.Substring (0, s.Length - 1).ToLower ());
-                       else
-                               return String.Compare (m.Name, s, true) == 0;
+                       if (s.Length > 0 && s [s.Length - 1] == '*')
+                               return m.Name.StartsWith (s.Substring (0, s.Length - 1), StringComparison.OrdinalIgnoreCase);
+                       
+                       return string.Compare (m.Name, s, StringComparison.OrdinalIgnoreCase) == 0;
                }
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
@@ -307,6 +256,7 @@ namespace System.Reflection {
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
 
+#if !MOBILE
                void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
                {
                        throw new NotImplementedException ();
@@ -327,8 +277,66 @@ namespace System.Reflection {
                {
                        throw new NotImplementedException ();
                }
+#endif
+
+               public override bool Equals (object o)
+               {
+                       return o == (object) this;
+               }
+
+               public override int GetHashCode ()
+               {
+                       return base.GetHashCode ();
+               }
+
+               public static bool operator == (Module left, Module right)
+               {
+                       if ((object)left == (object)right)
+                               return true;
+                       if ((object)left == null ^ (object)right == null)
+                               return false;
+                       return left.Equals (right);
+               }
+
+               public static bool operator != (Module left, Module right)
+               {
+                       if ((object)left == (object)right)
+                               return false;
+                       if ((object)left == null ^ (object)right == null)
+                               return true;
+                       return !left.Equals (right);
+               }
+
+
+
+               public virtual Assembly Assembly {
+                       get { throw CreateNIE (); }
+               }
+
+               public virtual string Name {
+                       get { throw CreateNIE (); }
+               }
+       
+               public virtual string ScopeName {
+                       get { throw CreateNIE (); }
+               }
+
+               public virtual int MDStreamVersion {
+                       get { throw CreateNIE (); }
+               }
+
+               public virtual Guid ModuleVersionId {
+                       get { throw CreateNIE (); }
+               }
+
+               public virtual string FullyQualifiedName {
+                       get { throw CreateNIE (); }
+               }
+
+               public virtual int MetadataToken {
+                       get { throw CreateNIE (); }
+               }
 
-#if NET_4_0
                static Exception CreateNIE ()
                {
                        return new NotImplementedException ("Derived classes must implement it");
@@ -434,7 +442,9 @@ namespace System.Reflection {
                {
                        throw CreateNIE ();
                }
-#endif
 
+               public virtual IEnumerable<CustomAttributeData> CustomAttributes {
+                       get { return GetCustomAttributesData (); }
+               }
        }
 }