X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.Reflection%2FModule.cs;h=935a0a08d3d9c2a99db623d64cfe79f308476d86;hb=4323fbeaebf249f016dfdd6dc9b3b52a515f87c4;hp=ff3c94f9765c84cdd17acc6bb469ba6756e615b3;hpb=f11aa9faf50ec2997ea88350885a0d10ec0d815c;p=mono.git diff --git a/mcs/class/corlib/System.Reflection/Module.cs b/mcs/class/corlib/System.Reflection/Module.cs index ff3c94f9765..935a0a08d3d 100644 --- a/mcs/class/corlib/System.Reflection/Module.cs +++ b/mcs/class/corlib/System.Reflection/Module.cs @@ -53,6 +53,7 @@ namespace System.Reflection { public static readonly TypeFilter FilterTypeName; public static readonly TypeFilter FilterTypeNameIgnoreCase; +#pragma warning disable 649 private IntPtr _impl; /* a pointer to a MonoImage */ internal Assembly assembly; internal string fqname; @@ -60,6 +61,7 @@ namespace System.Reflection { internal string scopename; internal bool is_resource; internal int token; +#pragma warning restore 649 const BindingFlags defaultBindingFlags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance; @@ -107,10 +109,16 @@ namespace System.Reflection { get; } - public extern int MDStreamVersion { - [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 GetMDStreamVersion (IntPtr module_handle); #endif public virtual Type[] FindTypes(TypeFilter filter, object filterCriteria) @@ -142,13 +150,13 @@ namespace System.Reflection { return (globalType != null) ? globalType.GetField (name, BindingFlags.Public | BindingFlags.Static) : null; } - public FieldInfo GetField (string name, BindingFlags flags) + public FieldInfo GetField (string name, BindingFlags bindingAttr) { if (IsResource ()) return null; Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetField (name, flags) : null; + return (globalType != null) ? globalType.GetField (name, bindingAttr) : null; } public FieldInfo[] GetFields () @@ -162,7 +170,12 @@ namespace System.Reflection { public MethodInfo GetMethod (string name) { - return GetMethodImpl (name, defaultBindingFlags, null, CallingConventions.Any, Type.EmptyTypes, null); + // 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; } public MethodInfo GetMethod (string name, Type[] types) @@ -194,21 +207,21 @@ namespace System.Reflection { } #if NET_2_0 - public MethodInfo[] GetMethods (BindingFlags flags) { + public MethodInfo[] GetMethods (BindingFlags bindingFlags) { if (IsResource ()) return new MethodInfo [0]; Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetMethods (flags) : new MethodInfo [0]; + return (globalType != null) ? globalType.GetMethods (bindingFlags) : new MethodInfo [0]; } - public FieldInfo[] GetFields (BindingFlags flags) + public FieldInfo[] GetFields (BindingFlags bindingFlags) { if (IsResource ()) return new FieldInfo [0]; Type globalType = GetGlobalType (); - return (globalType != null) ? globalType.GetFields (flags) : new FieldInfo [0]; + return (globalType != null) ? globalType.GetFields (bindingFlags) : new FieldInfo [0]; } #endif @@ -309,10 +322,28 @@ namespace System.Reflection { 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"); } + private 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; + } + } + public FieldInfo ResolveField (int metadataToken) { + return ResolveField (metadataToken, null, null); + } + + public FieldInfo ResolveField (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { ResolveTokenError error; - IntPtr handle = ResolveFieldToken (_impl, metadataToken, out error); + IntPtr handle = ResolveFieldToken (_impl, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); if (handle == IntPtr.Zero) throw resolve_token_exception (metadataToken, error, "Field"); else @@ -320,9 +351,14 @@ namespace System.Reflection { } public MemberInfo ResolveMember (int metadataToken) { + return ResolveMember (metadataToken, null, null); + } + + public MemberInfo ResolveMember (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { + ResolveTokenError error; - MemberInfo m = ResolveMemberToken (_impl, metadataToken, out error); + MemberInfo m = ResolveMemberToken (_impl, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); if (m == null) throw resolve_token_exception (metadataToken, error, "MemberInfo"); else @@ -330,9 +366,13 @@ namespace System.Reflection { } public MethodBase ResolveMethod (int metadataToken) { + return ResolveMethod (metadataToken, null, null); + } + + public MethodBase ResolveMethod (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { ResolveTokenError error; - IntPtr handle = ResolveMethodToken (_impl, metadataToken, out error); + IntPtr handle = ResolveMethodToken (_impl, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), out error); if (handle == IntPtr.Zero) throw resolve_token_exception (metadataToken, error, "MethodBase"); else @@ -350,18 +390,27 @@ namespace System.Reflection { } public Type ResolveType (int metadataToken) { + return ResolveType (metadataToken, null, null); + } + + public Type ResolveType (int metadataToken, Type [] genericTypeArguments, Type [] genericMethodArguments) { ResolveTokenError error; - IntPtr handle = ResolveTypeToken (_impl, metadataToken, out error); + IntPtr handle = ResolveTypeToken (_impl, metadataToken, ptrs_from_types (genericTypeArguments), ptrs_from_types (genericMethodArguments), 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 (); + ResolveTokenError error; + + byte[] res = ResolveSignature (_impl, metadataToken, out error); + if (res == null) + throw resolve_token_exception (metadataToken, error, "signature"); + else + return res; } #endif @@ -369,7 +418,7 @@ namespace System.Reflection { { 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 @@ -398,6 +447,9 @@ namespace System.Reflection { return String.Compare (m.Name, s, true) == 0; } + [MethodImplAttribute (MethodImplOptions.InternalCall)] + internal extern IntPtr GetHINSTANCE (); + [MethodImplAttribute (MethodImplOptions.InternalCall)] private extern string GetGuidInternal (); @@ -405,19 +457,22 @@ namespace System.Reflection { private 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);