Merge pull request #1659 from alexanderkyte/stringbuilder-referencesource
[mono.git] / mcs / class / corlib / System.Reflection / Module.cs
index 6c136534127aeb479c74f57eea919b285d050a2e..75bfc1fc74b81ec166fe66f459e7af567465e296 100644 (file)
@@ -33,6 +33,7 @@ using System.Runtime.InteropServices;
 using System.Runtime.CompilerServices;
 using System.Security;
 using System.Security.Permissions;
+using System.Collections.Generic;
 
 namespace System.Reflection {
 
@@ -42,245 +43,102 @@ namespace System.Reflection {
                Other
        };
 
-#if NET_2_0
        [ComVisible (true)]
        [ComDefaultInterfaceAttribute (typeof (_Module))]
-#endif
        [Serializable]
        [ClassInterfaceAttribute (ClassInterfaceType.None)]
-       public class Module : ISerializable, ICustomAttributeProvider, _Module {
-       
-               public static readonly TypeFilter FilterTypeName;
-               public static readonly TypeFilter FilterTypeNameIgnoreCase;
+       [StructLayout (LayoutKind.Sequential)]
+#if MOBILE
+       public abstract class Module : ISerializable, ICustomAttributeProvider {
+#else
+       public abstract class Module : ISerializable, ICustomAttributeProvider, _Module {
+#endif
+               public static readonly TypeFilter FilterTypeName = new TypeFilter (filter_by_type_name);
+               public static readonly TypeFilter FilterTypeNameIgnoreCase = new TypeFilter (filter_by_type_name_ignore_case);
        
-               private IntPtr _impl; /* a pointer to a MonoImage */
+#pragma warning disable 649    
+               internal IntPtr _impl; /* a pointer to a MonoImage */
                internal Assembly assembly;
                internal string fqname;
                internal string name;
                internal string scopename;
                internal bool is_resource;
                internal int token;
+#pragma warning restore 649            
        
                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);
-               }
-
-               internal Module () {
-               }
-
-               public Assembly Assembly {
-                       get { return assembly; }
-               }
-       
-               public virtual string FullyQualifiedName {
-                       get {
-                               if (SecurityManager.SecurityEnabled) {
-                                       new FileIOPermission (FileIOPermissionAccess.PathDiscovery, fqname).Demand ();
-                               }
-                               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; }
+               protected
+               Module () {
                }
 
-#if NET_2_0
                public ModuleHandle ModuleHandle {
                        get {
                                return new ModuleHandle (_impl);
                        }
                }
 
-               public extern int MetadataToken {
-                       [MethodImplAttribute (MethodImplOptions.InternalCall)]
-                       get;
-               }
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               internal static extern int get_MetadataToken (Module module);
+               
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               internal static extern int GetMDStreamVersion (IntPtr module_handle);
 
-               public extern int MDStreamVersion {
-                       [MethodImplAttribute (MethodImplOptions.InternalCall)]
-                       get;
-               }
-#endif
-       
-               public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) 
-               {
-                       System.Collections.ArrayList filtered = new System.Collections.ArrayList ();
-                       Type[] types = GetTypes ();
-                       foreach (Type t in types)
-                               if (filter (t, filterCriteria))
-                                       filtered.Add (t);
-                       return (Type[])filtered.ToArray (typeof(Type));
-               }
-       
-               public virtual object[] GetCustomAttributes(bool inherit) 
-               {
-                       return MonoCustomAttrs.GetCustomAttributes (this, inherit);
-               }
-       
-               public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) 
-               {
-                       return MonoCustomAttrs.GetCustomAttributes (this, attributeType, inherit);
-               }
-       
                public FieldInfo GetField (string name) 
                {
-                       if (IsResource ())
-                               return null;
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetField (name, BindingFlags.Public | BindingFlags.Static) : null;
+                       return GetField (name, BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
                }
-       
-               public FieldInfo GetField (string name, BindingFlags flags) 
-               {
-                       if (IsResource ())
-                               return null;
 
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetField (name, flags) : null;
-               }
-       
                public FieldInfo[] GetFields () 
                {
-                       if (IsResource ())
-                               return new FieldInfo [0];
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetFields (BindingFlags.Public | BindingFlags.Static) : new FieldInfo [0];
+                       return GetFields (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
                }
        
                public MethodInfo GetMethod (string name) 
                {
-                       // Can't call the other overloads since they call Type.GetMethod () which does a null check on the 'types' array
-                       if (IsResource ())
-                               return null;
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetMethod (name) : null;
+                       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);
                }
        
-               protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) 
-               {
-                       if (IsResource ())
-                               return null;
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetMethod (name, bindingAttr, binder, callConvention, types, modifiers) : null;
-               }
-       
                public MethodInfo[] GetMethods () 
                {
-                       if (IsResource ())
-                               return new MethodInfo [0];
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetMethods () : new MethodInfo [0];
-               }
-
-#if NET_2_0
-               public MethodInfo[] GetMethods (BindingFlags flags) {
-                       if (IsResource ())
-                               return new MethodInfo [0];
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetMethods (flags) : new MethodInfo [0];
-               }
-
-               public FieldInfo[] GetFields (BindingFlags flags) 
-               {
-                       if (IsResource ())
-                               return new FieldInfo [0];
-
-                       Type globalType = GetGlobalType ();
-                       return (globalType != null) ? globalType.GetFields (flags) : new FieldInfo [0];
+                       return GetMethods (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
                }
-#endif
        
                [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);
-               }
-       
-               public X509Certificate GetSignerCertificate ()
-               {
-                       try {
-                               return X509Certificate.CreateFromSignedFile (assembly.Location);
-                       }
-                       catch {
-                               return null;
-                       }
+                       throw new NotImplementedException ();
                }
 
-#if NET_2_0
                [ComVisible (true)]
-#endif
                public virtual Type GetType(string className) 
                {
                        return GetType (className, false, false);
                }
 
-#if NET_2_0
                [ComVisible (true)]
-#endif 
                public virtual Type GetType(string className, bool ignoreCase) 
                {
                        return GetType (className, false, ignoreCase);
                }
        
-#if NET_2_0
-               [ComVisible (true)]
-#endif
-               public virtual Type GetType(string className, bool throwOnError, bool ignoreCase) 
-               {
-                       if (className == null)
-                               throw new ArgumentNullException ("className");
-                       if (className == String.Empty)
-                               throw new ArgumentException ("Type name can't be empty");
-                       return assembly.InternalGetType (this, className, throwOnError, ignoreCase);
-               }
-
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               private extern Type[] InternalGetTypes ();
-       
-               public virtual Type[] GetTypes() 
-               {
-                       return InternalGetTypes ();
-               }
-       
-               public virtual bool IsDefined (Type attributeType, bool inherit) 
-               {
-                       return MonoCustomAttrs.IsDefined (this, attributeType, inherit);
-               }
-       
-               public bool IsResource()
-               {
-                       return is_resource;
-               }
+               internal extern Type[] InternalGetTypes ();
        
                public override string ToString () 
                {
@@ -289,145 +147,116 @@ namespace System.Reflection {
 
                internal Guid MvId {
                        get {
-                               return Mono_GetGuid (this);
-                       }
-               }
-
-#if NET_2_0
-               public Guid ModuleVersionId {
-                       get {
-                               return Mono_GetGuid (this);
+                               return GetModuleVersionId ();
                        }
                }
 
-               public void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine) {
-                       ModuleHandle.GetPEKind (out peKind, out machine);
-               }
-#endif
-               
-
-#if NET_2_0
-               private Exception resolve_token_exception (int metadataToken, ResolveTokenError error, string tokenType) {
+               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));
                        else
                                return new ArgumentException (String.Format ("Token 0x{0:x} is not a valid {1} token in the scope of module {2}", metadataToken, tokenType, name), "metadataToken");
                }
 
-               public FieldInfo ResolveField (int metadataToken) {
-                       ResolveTokenError error;
+               internal IntPtr[] ptrs_from_types (Type[] types) {
+                       if (types == null)
+                               return null;
+                       else {
+                               IntPtr[] res = new IntPtr [types.Length];
+                               for (int i = 0; i < types.Length; ++i) {
+                                       if (types [i] == null)
+                                               throw new ArgumentException ();
+                                       res [i] = types [i].TypeHandle.Value;
+                               }
+                               return res;
+                       }
+               }
 
-                       IntPtr handle = ResolveFieldToken (_impl, metadataToken, out error);
-                       if (handle == IntPtr.Zero)
-                               throw resolve_token_exception (metadataToken, error, "Field");
-                       else
-                               return FieldInfo.GetFieldFromHandle (new RuntimeFieldHandle (handle));
+               public FieldInfo ResolveField (int metadataToken) {
+                       return ResolveField (metadataToken, null, null);
                }
 
                public MemberInfo ResolveMember (int metadataToken) {
-                       ResolveTokenError error;
-
-                       MemberInfo m = ResolveMemberToken (_impl, metadataToken, out error);
-                       if (m == null)
-                               throw resolve_token_exception (metadataToken, error, "MemberInfo");
-                       else
-                               return m;
+                       return ResolveMember (metadataToken, null, null);
                }
 
                public MethodBase ResolveMethod (int metadataToken) {
-                       ResolveTokenError error;
-
-                       IntPtr handle = ResolveMethodToken (_impl, metadataToken, out error);
-                       if (handle == IntPtr.Zero)
-                               throw resolve_token_exception (metadataToken, error, "MethodBase");
-                       else
-                               return MethodBase.GetMethodFromHandle (new RuntimeMethodHandle (handle));
-               }
-
-               public string ResolveString (int metadataToken) {
-                       ResolveTokenError error;
-
-                       string s = ResolveStringToken (_impl, metadataToken, out error);
-                       if (s == null)
-                               throw resolve_token_exception (metadataToken, error, "string");
-                       else
-                               return s;
+                       return ResolveMethod (metadataToken, null, null);
                }
 
                public Type ResolveType (int metadataToken) {
-                       ResolveTokenError error;
-
-                       IntPtr handle = ResolveTypeToken (_impl, metadataToken, out error);
-                       if (handle == IntPtr.Zero)
-                               throw resolve_token_exception (metadataToken, error, "Type");
-                       else
-                               return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
-               }
-
-               [MonoTODO]
-               public byte[] ResolveSignature (int metadataToken) {
-                       throw new NotImplementedException ();
+                       return ResolveType (metadataToken, null, null);
                }
-#endif
 
                internal static Type MonoDebugger_ResolveType (Module module, int token)
                {
                        ResolveTokenError error;
 
-                       IntPtr handle = ResolveTypeToken (module._impl, token, out error);
+                       IntPtr handle = ResolveTypeToken (module._impl, token, null, null, out error);
                        if (handle == IntPtr.Zero)
                                return null;
                        else
                                return Type.GetTypeFromHandle (new RuntimeTypeHandle (handle));
                }
 
-               // Mono Extension: returns the GUID of this module
+               // Used by mcs, the symbol writer, and mdb through reflection
                internal static Guid Mono_GetGuid (Module module)
                {
-                       return new Guid (module.GetGuidInternal ());
+                       return module.GetModuleVersionId ();
+               }
+
+               internal virtual Guid GetModuleVersionId ()
+               {
+                       return new Guid (GetGuidInternal ());
                }
 
                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)]
+               internal extern IntPtr GetHINSTANCE ();
+
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                private extern string GetGuidInternal ();
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               private extern Type GetGlobalType ();
+               internal extern Type GetGlobalType ();
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, out ResolveTokenError error);
+               internal static extern IntPtr ResolveTypeToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, out ResolveTokenError error);
+               internal static extern IntPtr ResolveMethodToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, out ResolveTokenError error);
+               internal static extern IntPtr ResolveFieldToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal static extern string ResolveStringToken (IntPtr module, int token, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
-               internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, out ResolveTokenError error);
+               internal static extern MemberInfo ResolveMemberToken (IntPtr module, int token, IntPtr[] type_args, IntPtr[] method_args, out ResolveTokenError error);
+
+               [MethodImplAttribute (MethodImplOptions.InternalCall)]
+               internal static extern byte[] ResolveSignature (IntPtr module, int metadataToken, out ResolveTokenError error);
 
                [MethodImplAttribute (MethodImplOptions.InternalCall)]
                internal static extern void GetPEKind (IntPtr module, out PortableExecutableKinds peKind, out ImageFileMachine machine);
 
-#if NET_1_1
+#if !MOBILE
                void _Module.GetIDsOfNames ([In] ref Guid riid, IntPtr rgszNames, uint cNames, uint lcid, IntPtr rgDispId)
                {
                        throw new NotImplementedException ();
@@ -449,5 +278,173 @@ 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 (); }
+               }
+
+               static Exception CreateNIE ()
+               {
+                       return new NotImplementedException ("Derived classes must implement it");
+               }
+
+               public virtual bool IsResource()
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual object[] GetCustomAttributes(bool inherit)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual object[] GetCustomAttributes(Type attributeType, bool inherit) 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual IList<CustomAttributeData> GetCustomAttributesData ()
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual FieldInfo GetField (string name, BindingFlags bindingAttr) 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual FieldInfo[] GetFields (BindingFlags bindingFlags)
+               {
+                       throw CreateNIE ();
+               }
+
+               protected virtual MethodInfo GetMethodImpl (string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, Type[] types, ParameterModifier[] modifiers) 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual MethodInfo[] GetMethods (BindingFlags bindingFlags)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual void GetPEKind (out PortableExecutableKinds peKind, out ImageFileMachine machine)
+               {
+                       throw CreateNIE ();
+               }
+
+               [ComVisible (true)]
+               public virtual Type GetType(string className, bool throwOnError, bool ignoreCase) 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual bool IsDefined (Type attributeType, bool inherit) 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual byte[] ResolveSignature (int metadataToken)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual string ResolveString (int metadataToken)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments)
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual X509Certificate GetSignerCertificate ()
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual Type[] GetTypes() 
+               {
+                       throw CreateNIE ();
+               }
+
+               public virtual IEnumerable<CustomAttributeData> CustomAttributes {
+                       get { return GetCustomAttributesData (); }
+               }
        }
 }