From f4df78bd2d1f95d26cf380552f6894721e2baf63 Mon Sep 17 00:00:00 2001 From: Jb Evain Date: Wed, 17 Aug 2011 16:09:36 +0200 Subject: update Cecil --- data/cecil.pc.in | 2 +- .../Mono.Cecil.Mdb/Mono.Cecil.Mdb/AssemblyInfo.cs | 6 +- mcs/class/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs | 3 + mcs/class/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs | 29 ++++-- mcs/class/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs | 3 - mcs/class/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs | 6 +- mcs/class/Mono.Cecil/Mono.Cecil/AssemblyReader.cs | 20 +++-- mcs/class/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs | 14 +-- .../Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs | 12 +++ .../Mono.Cecil/Mono.Cecil/GenericParameter.cs | 100 ++++++++++++++++++--- .../Mono.Cecil/ICustomAttributeProvider.cs | 4 +- .../Mono.Cecil/IGenericParameterProvider.cs | 6 +- .../Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs | 4 +- .../Mono.Cecil/Mono.Cecil/MetadataResolver.cs | 84 ++++++++++++----- mcs/class/Mono.Cecil/Mono.Cecil/MethodReference.cs | 2 +- .../Mono.Cecil/Mono.Cecil/MethodReturnType.cs | 5 ++ .../Mono.Cecil/Mono.Cecil/ModuleDefinition.cs | 49 ++++++++-- .../Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs | 17 +++- mcs/class/Mono.Cecil/Mono.Cecil/TypeReference.cs | 2 +- mcs/class/Mono.Cecil/revision | 2 +- 20 files changed, 285 insertions(+), 85 deletions(-) diff --git a/data/cecil.pc.in b/data/cecil.pc.in index 067872a5274..59450b40006 100644 --- a/data/cecil.pc.in +++ b/data/cecil.pc.in @@ -1,5 +1,5 @@ assemblies_dir=@prefix@/lib/mono -Libraries=${assemblies_dir}/gac/Mono.Cecil/0.9.4.0__0738eb9f132ed756/Mono.Cecil.dll +Libraries=${assemblies_dir}/gac/Mono.Cecil/0.9.5.0__0738eb9f132ed756/Mono.Cecil.dll Name: Mono Internal -- Do not use. Description: Mono Internal Libraries -- Do not use diff --git a/mcs/class/Mono.Cecil.Mdb/Mono.Cecil.Mdb/AssemblyInfo.cs b/mcs/class/Mono.Cecil.Mdb/Mono.Cecil.Mdb/AssemblyInfo.cs index 277272a5f8e..8186b506bc6 100644 --- a/mcs/class/Mono.Cecil.Mdb/Mono.Cecil.Mdb/AssemblyInfo.cs +++ b/mcs/class/Mono.Cecil.Mdb/Mono.Cecil.Mdb/AssemblyInfo.cs @@ -32,10 +32,10 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle ("Mono.Cecil.Mdb")] [assembly: AssemblyProduct ("Mono.Cecil")] -[assembly: AssemblyCopyright ("Copyright © 2008 - 2010 Jb Evain")] +[assembly: AssemblyCopyright ("Copyright © 2008 - 2011 Jb Evain")] [assembly: CLSCompliant (false)] [assembly: ComVisible (false)] -[assembly: AssemblyVersion ("0.9.4.0")] -[assembly: AssemblyFileVersion ("0.9.4.0")] +[assembly: AssemblyVersion ("0.9.5.0")] +[assembly: AssemblyFileVersion ("0.9.5.0")] diff --git a/mcs/class/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs b/mcs/class/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs index 2412034386c..02876aad5af 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs @@ -519,6 +519,9 @@ namespace Mono.Cecil.Cil { static bool IsFatRange (Instruction start, Instruction end) { + if (start == null) + throw new ArgumentException (); + if (end == null) return true; diff --git a/mcs/class/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs b/mcs/class/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs index 1f94cde0083..c7ae7aee132 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs @@ -140,11 +140,16 @@ namespace Mono.Cecil.PE { public int ReadCompressedInt32 () { - var value = (int) ReadCompressedUInt32 (); - - return (value & 1) != 0 - ? -(value >> 1) - : value >> 1; + var value = (int) (ReadCompressedUInt32 () >> 1); + if ((value & 1) == 0) + return value; + if (value < 0x40) + return value - 0x40; + if (value < 0x2000) + return value - 0x2000; + if (value < 0x10000000) + return value - 0x10000000; + return value - 0x20000000; } public float ReadSingle () @@ -267,7 +272,19 @@ namespace Mono.Cecil.PE { public void WriteCompressedInt32 (int value) { - WriteCompressedUInt32 ((uint) ((value < 0) ? ((-value) << 1) | 1 : value << 1)); + if (value >= 0) { + WriteCompressedUInt32 ((uint) (value << 1)); + return; + } + + if (value > -0x40) + value = 0x40 + value; + else if (value >= -0x2000) + value = 0x2000 + value; + else if (value >= -0x20000000) + value = 0x20000000 + value; + + WriteCompressedUInt32 ((uint) ((value << 1) | 1)); } public void WriteBytes (byte [] bytes) diff --git a/mcs/class/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs b/mcs/class/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs index ebd4c6b85fa..734b00a5345 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs @@ -276,9 +276,6 @@ namespace Mono.Cecil.PE { sections [i] = section; - if (section.Name == ".reloc") - continue; - ReadSectionData (section); } diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs b/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs index ffac8eab690..8a9f8097e10 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs @@ -32,15 +32,15 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle ("Mono.Cecil")] [assembly: AssemblyProduct ("Mono.Cecil")] -[assembly: AssemblyCopyright ("Copyright © 2008 - 2010 Jb Evain")] +[assembly: AssemblyCopyright ("Copyright © 2008 - 2011 Jb Evain")] [assembly: ComVisible (false)] [assembly: Guid ("fd225bb4-fa53-44b2-a6db-85f5e48dcb54")] -[assembly: AssemblyVersion ("0.9.4.0")] +[assembly: AssemblyVersion ("0.9.5.0")] #if !CF -[assembly: AssemblyFileVersion ("0.9.4.0")] +[assembly: AssemblyFileVersion ("0.9.5.0")] #endif [assembly: InternalsVisibleTo ("Mono.Cecil.Pdb, PublicKey=002400000480000094000000060200000024000052534131000400000100010079159977d2d03a8e6bea7a2e74e8d1afcc93e8851974952bb480a12c9134474d04062447c37e0e68c080536fcf3c3fbe2ff9c979ce998475e506e8ce82dd5b0f350dc10e93bf2eeecf874b24770c5081dbea7447fddafa277b22de47d6ffea449674a4f9fccf84d15069089380284dbdd35f46cdff12a1bd78e4ef0065d016df")] diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyReader.cs b/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyReader.cs index 96d0e5ad601..f412d74621d 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyReader.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyReader.cs @@ -85,6 +85,9 @@ namespace Mono.Cecil { if (parameters.AssemblyResolver != null) module.assembly_resolver = parameters.AssemblyResolver; + if (parameters.MetadataResolver != null) + module.metadata_resolver = parameters.MetadataResolver; + return module; } @@ -1795,11 +1798,11 @@ namespace Mono.Cecil { Range range; if (!metadata.TryGetGenericParameterRange (provider, out range) || !MoveTo (Table.GenericParam, range.Start)) - return new Collection (); + return new GenericParameterCollection (provider); metadata.RemoveGenericParameterRange (provider); - var generic_parameters = new Collection ((int) range.Length); + var generic_parameters = new GenericParameterCollection (provider, (int) range.Length); for (uint i = 0; i < range.Length; i++) { ReadUInt16 (); // index @@ -2644,9 +2647,10 @@ namespace Mono.Cecil { GenericParameter GetGenericParameter (GenericParameterType type, uint var) { var context = reader.context; + int index = (int) var; if (context == null) - throw new NotSupportedException (); + return GetUnboundGenericParameter (type, index); IGenericParameterProvider provider; @@ -2661,14 +2665,20 @@ namespace Mono.Cecil { throw new NotSupportedException (); } - int index = (int) var; - if (!context.IsDefinition) CheckGenericContext (provider, index); + if (index >= provider.GenericParameters.Count) + return GetUnboundGenericParameter (type, index); + return provider.GenericParameters [index]; } + static GenericParameter GetUnboundGenericParameter (GenericParameterType type, int index) + { + return new GenericParameter (index, type); + } + static void CheckGenericContext (IGenericParameterProvider owner, int index) { var owner_parameters = owner.GenericParameters; diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs b/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs index f05bf821cef..bf41d5b720c 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs @@ -935,11 +935,13 @@ namespace Mono.Cecil { ? reference.PublicKeyToken : reference.PublicKey; + var version = reference.Version; + var rid = table.AddRow (new AssemblyRefRow ( - (ushort) reference.Version.Major, - (ushort) reference.Version.Minor, - (ushort) reference.Version.Build, - (ushort) reference.Version.Revision, + (ushort) version.Major, + (ushort) version.Minor, + (ushort) version.Build, + (ushort) version.Revision, reference.Attributes, GetBlobIndex (key_or_token), GetStringIndex (reference.Name), @@ -2448,12 +2450,12 @@ namespace Mono.Cecil { var count = GetNamedArgumentCount (attribute); if (count == 0) { - WriteCompressedUInt32 (0); // length + WriteCompressedUInt32 (1); // length WriteCompressedUInt32 (0); // count return; } - var buffer = new SignatureWriter (metadata); + var buffer = new SignatureWriter (metadata); buffer.WriteCompressedUInt32 ((uint) count); buffer.WriteICustomAttributeNamedArguments (attribute); diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs b/mcs/class/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs index 140cc96c0b7..10ab2c34a86 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs @@ -51,6 +51,9 @@ namespace Mono.Cecil { } } +#if !SILVERLIGHT && !CF + [Serializable] +#endif public class AssemblyResolutionException : FileNotFoundException { readonly AssemblyNameReference reference; @@ -64,6 +67,15 @@ namespace Mono.Cecil { { this.reference = reference; } + +#if !SILVERLIGHT && !CF + protected AssemblyResolutionException ( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) + : base (info, context) + { + } +#endif } public abstract class BaseAssemblyResolver : IAssemblyResolver { diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/GenericParameter.cs b/mcs/class/Mono.Cecil/Mono.Cecil/GenericParameter.cs index 2d0c19031d4..664f00aae2a 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/GenericParameter.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/GenericParameter.cs @@ -36,7 +36,9 @@ namespace Mono.Cecil { public sealed class GenericParameter : TypeReference, ICustomAttributeProvider { - readonly IGenericParameterProvider owner; + internal int position; + internal GenericParameterType type; + internal IGenericParameterProvider owner; ushort attributes; Collection constraints; @@ -48,12 +50,11 @@ namespace Mono.Cecil { } public int Position { - get { - if (owner == null) - return -1; + get { return position; } + } - return owner.GenericParameters.IndexOf (this); - } + public GenericParameterType Type { + get { return type; } } public IGenericParameterProvider Owner { @@ -99,15 +100,17 @@ namespace Mono.Cecil { public override IMetadataScope Scope { get { - if (owner.GenericParameterType == GenericParameterType.Method) - return ((MethodReference) owner).DeclaringType.Scope; + if (owner == null) + return null; - return ((TypeReference) owner).Scope; + return owner.GenericParameterType == GenericParameterType.Method + ? ((MethodReference) owner).DeclaringType.Scope + : ((TypeReference) owner).Scope; } } public override ModuleDefinition Module { - get { return ((MemberReference) owner).Module; } + get { return owner != null ? owner.Module : null; } } public override string Name { @@ -115,7 +118,7 @@ namespace Mono.Cecil { if (!string.IsNullOrEmpty (base.Name)) return base.Name; - return base.Name = (owner.GenericParameterType == GenericParameterType.Type ? "!" : "!!") + Position; + return base.Name = (type == GenericParameterType.Method ? "!!" : "!") + position; } } @@ -185,8 +188,30 @@ namespace Mono.Cecil { if (owner == null) throw new ArgumentNullException (); + this.position = -1; this.owner = owner; - this.etype = owner.GenericParameterType == GenericParameterType.Type ? ElementType.Var : ElementType.MVar; + this.type = owner.GenericParameterType; + this.etype = ConvertGenericParameterType (this.type); + } + + public GenericParameter (int position, GenericParameterType type) + : base (string.Empty, string.Empty) + { + this.position = position; + this.type = type; + this.etype = ConvertGenericParameterType (type); + } + + static ElementType ConvertGenericParameterType (GenericParameterType type) + { + switch (type) { + case GenericParameterType.Type: + return ElementType.Var; + case GenericParameterType.Method: + return ElementType.MVar; + } + + throw new ArgumentOutOfRangeException (); } public override TypeDefinition Resolve () @@ -194,4 +219,55 @@ namespace Mono.Cecil { return null; } } + + sealed class GenericParameterCollection : Collection { + + readonly IGenericParameterProvider owner; + + internal GenericParameterCollection (IGenericParameterProvider owner) + { + this.owner = owner; + } + + internal GenericParameterCollection (IGenericParameterProvider owner, int capacity) + : base (capacity) + { + this.owner = owner; + } + + protected override void OnAdd (GenericParameter item, int index) + { + UpdateGenericParameter (item, index); + } + + protected override void OnInsert (GenericParameter item, int index) + { + UpdateGenericParameter (item, index); + + for (int i = index; i < size; i++) + items[i].position = i + 1; + } + + protected override void OnSet (GenericParameter item, int index) + { + UpdateGenericParameter (item, index); + } + + void UpdateGenericParameter (GenericParameter item, int index) + { + item.owner = owner; + item.position = index; + item.type = owner.GenericParameterType; + } + + protected override void OnRemove (GenericParameter item, int index) + { + item.owner = null; + item.position = -1; + item.type = GenericParameterType.Type; + + for (int i = index + 1; i < size; i++) + items[i].position = i - 1; + } + } } diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs b/mcs/class/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs index 2e3e8e5e75f..916ba0f5415 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs @@ -45,9 +45,7 @@ namespace Mono.Cecil { this ICustomAttributeProvider self, ModuleDefinition module) { - return module.HasImage () - ? module.Read (self, (provider, reader) => reader.HasCustomAttributes (provider)) - : false; + return module.HasImage () && module.Read (self, (provider, reader) => reader.HasCustomAttributes (provider)); } public static Collection GetCustomAttributes ( diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs b/mcs/class/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs index 4fc4ce1b9b0..d41b7f6d08e 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs @@ -58,9 +58,7 @@ namespace Mono.Cecil { this IGenericParameterProvider self, ModuleDefinition module) { - return module.HasImage () - ? module.Read (self, (provider, reader) => reader.HasGenericParameters (provider)) - : false; + return module.HasImage () && module.Read (self, (provider, reader) => reader.HasGenericParameters (provider)); } public static Collection GetGenericParameters ( @@ -69,7 +67,7 @@ namespace Mono.Cecil { { return module.HasImage () ? module.Read (self, (provider, reader) => reader.ReadGenericParameters (provider)) - : new Collection (); + : new GenericParameterCollection (self); } } } diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs b/mcs/class/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs index de83cf632e5..67a53a389f2 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs @@ -40,9 +40,7 @@ namespace Mono.Cecil { this IMarshalInfoProvider self, ModuleDefinition module) { - return module.HasImage () - ? module.Read (self, (provider, reader) => reader.HasMarshalInfo (provider)) - : false; + return module.HasImage () && module.Read (self, (provider, reader) => reader.HasMarshalInfo (provider)); } public static MarshalInfo GetMarshalInfo ( diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/MetadataResolver.cs b/mcs/class/Mono.Cecil/Mono.Cecil/MetadataResolver.cs index 0b912e362c2..e69fcd71507 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/MetadataResolver.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/MetadataResolver.cs @@ -27,7 +27,6 @@ // using System; -using System.Collections.Generic; using Mono.Collections.Generic; @@ -41,6 +40,15 @@ namespace Mono.Cecil { AssemblyDefinition Resolve (string fullName, ReaderParameters parameters); } + public interface IMetadataResolver { + TypeDefinition Resolve (TypeReference type); + FieldDefinition Resolve (FieldReference field); + MethodDefinition Resolve (MethodReference method); + } + +#if !SILVERLIGHT && !CF + [Serializable] +#endif public class ResolutionException : Exception { readonly MemberReference member; @@ -54,31 +62,57 @@ namespace Mono.Cecil { { this.member = member; } + +#if !SILVERLIGHT && !CF + protected ResolutionException ( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) + : base (info, context) + { + } +#endif } - static class MetadataResolver { + public class MetadataResolver : IMetadataResolver { + + readonly IAssemblyResolver assembly_resolver; + + public IAssemblyResolver AssemblyResolver { + get { return assembly_resolver; } + } + + public MetadataResolver (IAssemblyResolver assemblyResolver) + { + if (assemblyResolver == null) + throw new ArgumentNullException ("assemblyResolver"); + + assembly_resolver = assemblyResolver; + } - public static TypeDefinition Resolve (IAssemblyResolver resolver, TypeReference type) + public virtual TypeDefinition Resolve (TypeReference type) { + if (type == null) + throw new ArgumentNullException ("type"); + type = type.GetElementType (); var scope = type.Scope; switch (scope.MetadataScopeType) { case MetadataScopeType.AssemblyNameReference: - var assembly = resolver.Resolve ((AssemblyNameReference) scope); + var assembly = assembly_resolver.Resolve ((AssemblyNameReference) scope); if (assembly == null) return null; - return GetType (resolver, assembly.MainModule, type); + return GetType (assembly.MainModule, type); case MetadataScopeType.ModuleDefinition: - return GetType (resolver, (ModuleDefinition) scope, type); + return GetType ((ModuleDefinition) scope, type); case MetadataScopeType.ModuleReference: var modules = type.Module.Assembly.Modules; var module_ref = (ModuleReference) scope; for (int i = 0; i < modules.Count; i++) { var netmodule = modules [i]; if (netmodule.Name == module_ref.Name) - return GetType (resolver, netmodule, type); + return GetType (netmodule, type); } break; } @@ -86,9 +120,9 @@ namespace Mono.Cecil { throw new NotSupportedException (); } - static TypeDefinition GetType (IAssemblyResolver resolver, ModuleDefinition module, TypeReference reference) + static TypeDefinition GetType (ModuleDefinition module, TypeReference reference) { - var type = GetType (module, reference); + var type = GetTypeDefinition (module, reference); if (type != null) return type; @@ -111,7 +145,7 @@ namespace Mono.Cecil { return null; } - static TypeDefinition GetType (ModuleDefinition module, TypeReference type) + static TypeDefinition GetTypeDefinition (ModuleDefinition module, TypeReference type) { if (!type.IsNested) return module.GetType (type.Namespace, type.Name); @@ -123,19 +157,22 @@ namespace Mono.Cecil { return declaring_type.GetNestedType (type.Name); } - public static FieldDefinition Resolve (IAssemblyResolver resolver, FieldReference field) + public virtual FieldDefinition Resolve (FieldReference field) { - var type = Resolve (resolver, field.DeclaringType); + if (field == null) + throw new ArgumentNullException ("field"); + + var type = Resolve (field.DeclaringType); if (type == null) return null; if (!type.HasFields) return null; - return GetField (resolver, type, field); + return GetField (type, field); } - static FieldDefinition GetField (IAssemblyResolver resolver, TypeDefinition type, FieldReference reference) + FieldDefinition GetField (TypeDefinition type, FieldReference reference) { while (type != null) { var field = GetField (type.Fields, reference); @@ -145,13 +182,13 @@ namespace Mono.Cecil { if (type.BaseType == null) return null; - type = Resolve (resolver, type.BaseType); + type = Resolve (type.BaseType); } return null; } - static FieldDefinition GetField (IList fields, FieldReference reference) + static FieldDefinition GetField (Collection fields, FieldReference reference) { for (int i = 0; i < fields.Count; i++) { var field = fields [i]; @@ -168,9 +205,12 @@ namespace Mono.Cecil { return null; } - public static MethodDefinition Resolve (IAssemblyResolver resolver, MethodReference method) + public virtual MethodDefinition Resolve (MethodReference method) { - var type = Resolve (resolver, method.DeclaringType); + if (method == null) + throw new ArgumentNullException ("method"); + + var type = Resolve (method.DeclaringType); if (type == null) return null; @@ -179,10 +219,10 @@ namespace Mono.Cecil { if (!type.HasMethods) return null; - return GetMethod (resolver, type, method); + return GetMethod (type, method); } - static MethodDefinition GetMethod (IAssemblyResolver resolver, TypeDefinition type, MethodReference reference) + MethodDefinition GetMethod (TypeDefinition type, MethodReference reference) { while (type != null) { var method = GetMethod (type.Methods, reference); @@ -192,13 +232,13 @@ namespace Mono.Cecil { if (type.BaseType == null) return null; - type = Resolve (resolver, type.BaseType); + type = Resolve (type.BaseType); } return null; } - public static MethodDefinition GetMethod (IList methods, MethodReference reference) + public static MethodDefinition GetMethod (Collection methods, MethodReference reference) { for (int i = 0; i < methods.Count; i++) { var method = methods [i]; diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/MethodReference.cs b/mcs/class/Mono.Cecil/Mono.Cecil/MethodReference.cs index 21de336735c..0adab452ef7 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/MethodReference.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/MethodReference.cs @@ -99,7 +99,7 @@ namespace Mono.Cecil { if (generic_parameters != null) return generic_parameters; - return generic_parameters = new Collection (); + return generic_parameters = new GenericParameterCollection (this); } } diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/MethodReturnType.cs b/mcs/class/Mono.Cecil/Mono.Cecil/MethodReturnType.cs index f2d3c00f89e..f2e2eaa3201 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/MethodReturnType.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/MethodReturnType.cs @@ -55,6 +55,11 @@ namespace Mono.Cecil { set { Parameter.MetadataToken = value; } } + public ParameterAttributes Attributes { + get { return Parameter.Attributes; } + set { Parameter.Attributes = value; } + } + public bool HasCustomAttributes { get { return parameter != null && parameter.HasCustomAttributes; } } diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs b/mcs/class/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs index ecfbf82b80d..0d137e065cb 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs @@ -47,6 +47,7 @@ namespace Mono.Cecil { ReadingMode reading_mode; IAssemblyResolver assembly_resolver; + IMetadataResolver metadata_resolver; Stream symbol_stream; ISymbolReaderProvider symbol_reader_provider; bool read_symbols; @@ -61,6 +62,11 @@ namespace Mono.Cecil { set { assembly_resolver = value; } } + public IMetadataResolver MetadataResolver { + get { return metadata_resolver; } + set { metadata_resolver = value; } + } + public Stream SymbolStream { get { return symbol_stream; } set { symbol_stream = value; } @@ -95,6 +101,7 @@ namespace Mono.Cecil { TargetRuntime runtime; TargetArchitecture architecture; IAssemblyResolver assembly_resolver; + IMetadataResolver metadata_resolver; public ModuleKind Kind { get { return kind; } @@ -116,6 +123,11 @@ namespace Mono.Cecil { set { assembly_resolver = value; } } + public IMetadataResolver MetadataResolver { + get { return metadata_resolver; } + set { metadata_resolver = value; } + } + public ModuleParameters () { this.kind = ModuleKind.Dll; @@ -186,6 +198,7 @@ namespace Mono.Cecil { internal ISymbolReader SymbolReader; internal IAssemblyResolver assembly_resolver; + internal IMetadataResolver metadata_resolver; internal TypeSystem type_system; readonly MetadataReader reader; @@ -269,6 +282,10 @@ namespace Mono.Cecil { get { return assembly_resolver; } } + public IMetadataResolver MetadataResolver { + get { return metadata_resolver ?? (metadata_resolver = new MetadataResolver (assembly_resolver)); } + } + public TypeSystem TypeSystem { get { return type_system ?? (type_system = TypeSystem.CreateTypeSystem (this)); } } @@ -480,6 +497,13 @@ namespace Mono.Cecil { return Read (this, (_, reader) => reader.GetMemberReferences ()); } + public TypeReference GetType (string fullName, bool runtimeName) + { + return runtimeName + ? TypeParser.ParseType (this, fullName) + : GetType (fullName); + } + public TypeDefinition GetType (string fullName) { CheckFullName (fullName); @@ -547,17 +571,17 @@ namespace Mono.Cecil { internal FieldDefinition Resolve (FieldReference field) { - return MetadataResolver.Resolve (AssemblyResolver, field); + return MetadataResolver.Resolve (field); } internal MethodDefinition Resolve (MethodReference method) { - return MetadataResolver.Resolve (AssemblyResolver, method); + return MetadataResolver.Resolve (method); } internal TypeDefinition Resolve (TypeReference type) { - return MetadataResolver.Resolve (AssemblyResolver, type); + return MetadataResolver.Resolve (type); } #if !READ_ONLY @@ -832,10 +856,13 @@ namespace Mono.Cecil { if (parameters.AssemblyResolver != null) module.assembly_resolver = parameters.AssemblyResolver; + if (parameters.MetadataResolver != null) + module.metadata_resolver = parameters.MetadataResolver; + if (parameters.Kind != ModuleKind.NetModule) { var assembly = new AssemblyDefinition (); module.assembly = assembly; - module.assembly.Name = new AssemblyNameDefinition (name, new Version (0, 0)); + module.assembly.Name = CreateAssemblyName (name); assembly.main_module = module; } @@ -844,6 +871,14 @@ namespace Mono.Cecil { return module; } + static AssemblyNameDefinition CreateAssemblyName (string name) + { + if (name.EndsWith (".dll") || name.EndsWith (".exe")) + name = name.Substring (0, name.Length - 4); + + return new AssemblyNameDefinition (name, new Version (0, 0, 0, 0)); + } + #endif public void ReadSymbols () @@ -852,10 +887,10 @@ namespace Mono.Cecil { throw new InvalidOperationException (); var provider = SymbolProvider.GetPlatformReaderProvider (); + if (provider == null) + throw new InvalidOperationException (); - SymbolReader = provider.GetSymbolReader (this, fq_name); - - ProcessDebugHeader (); + ReadSymbols (provider.GetSymbolReader (this, fq_name)); } public void ReadSymbols (ISymbolReader reader) diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs b/mcs/class/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs index ecafbc24a6b..837472a1199 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs @@ -93,6 +93,7 @@ namespace Mono.Cecil { public sealed class SecurityDeclaration { readonly internal uint signature; + byte [] blob; readonly ModuleDefinition module; internal bool resolved; @@ -137,12 +138,22 @@ namespace Mono.Cecil { this.resolved = true; } + public SecurityDeclaration (SecurityAction action, byte [] blob) + { + this.action = action; + this.resolved = false; + this.blob = blob; + } + public byte [] GetBlob () { + if (blob != null) + return blob; + if (!HasImage || signature == 0) throw new NotSupportedException (); - return module.Read (this, (declaration, reader) => reader.ReadSecurityDeclarationBlob (declaration.signature)); + return blob = module.Read (this, (declaration, reader) => reader.ReadSecurityDeclarationBlob (declaration.signature)); } void Resolve () @@ -165,9 +176,7 @@ namespace Mono.Cecil { this ISecurityDeclarationProvider self, ModuleDefinition module) { - return module.HasImage () - ? module.Read (self, (provider, reader) => reader.HasSecurityDeclarations (provider)) - : false; + return module.HasImage () && module.Read (self, (provider, reader) => reader.HasSecurityDeclarations (provider)); } public static Collection GetSecurityDeclarations ( diff --git a/mcs/class/Mono.Cecil/Mono.Cecil/TypeReference.cs b/mcs/class/Mono.Cecil/Mono.Cecil/TypeReference.cs index f4861245f42..757c83aa60a 100644 --- a/mcs/class/Mono.Cecil/Mono.Cecil/TypeReference.cs +++ b/mcs/class/Mono.Cecil/Mono.Cecil/TypeReference.cs @@ -135,7 +135,7 @@ namespace Mono.Cecil { if (generic_parameters != null) return generic_parameters; - return generic_parameters = new Collection (); + return generic_parameters = new GenericParameterCollection (this); } } diff --git a/mcs/class/Mono.Cecil/revision b/mcs/class/Mono.Cecil/revision index 0de762b4137..9246580813b 100644 --- a/mcs/class/Mono.Cecil/revision +++ b/mcs/class/Mono.Cecil/revision @@ -1 +1 @@ -90e481c594502333d400226b3d4198dfd26964b2 +53e6ba7207aa843fac13b80a295380c517f2af8d -- cgit v1.2.3