update Cecil
authorJb Evain <jbevain@gmail.com>
Wed, 17 Aug 2011 14:09:36 +0000 (16:09 +0200)
committerJb Evain <jbevain@gmail.com>
Wed, 17 Aug 2011 14:09:59 +0000 (16:09 +0200)
20 files changed:
data/cecil.pc.in
mcs/class/Mono.Cecil.Mdb/Mono.Cecil.Mdb/AssemblyInfo.cs
mcs/class/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs
mcs/class/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs
mcs/class/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs
mcs/class/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs
mcs/class/Mono.Cecil/Mono.Cecil/AssemblyReader.cs
mcs/class/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs
mcs/class/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs
mcs/class/Mono.Cecil/Mono.Cecil/GenericParameter.cs
mcs/class/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs
mcs/class/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs
mcs/class/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs
mcs/class/Mono.Cecil/Mono.Cecil/MetadataResolver.cs
mcs/class/Mono.Cecil/Mono.Cecil/MethodReference.cs
mcs/class/Mono.Cecil/Mono.Cecil/MethodReturnType.cs
mcs/class/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs
mcs/class/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs
mcs/class/Mono.Cecil/Mono.Cecil/TypeReference.cs
mcs/class/Mono.Cecil/revision

index 067872a5274553a21713c5515aea3609600d96f2..59450b40006e469b56c7f67e16b100e7dc2aff6d 100644 (file)
@@ -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 
index 277272a5f8eea1f9c2cdaccddb2b4e97f4f85c48..8186b506bc6b55c76b19e9e3344cbe5b13d25980 100644 (file)
@@ -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")]
index 2412034386cb8985b6d09129567c96d157fa334e..02876aad5af77e4ded13000e1d316bc30b568ba0 100644 (file)
@@ -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;
 
index 1f94cde0083acf266d935cef052b9d3580f3cd18..c7ae7aee132634bb9d2a88f39ced2f443501b4ee 100644 (file)
@@ -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)
index ebd4c6b85fa6c77e11853853d226538b07430261..734b00a5345d7a8833926f699cc7a549e08120de 100644 (file)
@@ -276,9 +276,6 @@ namespace Mono.Cecil.PE {
 
                                sections [i] = section;
 
-                               if (section.Name == ".reloc")
-                                       continue;
-
                                ReadSectionData (section);
                        }
 
index ffac8eab69051d5667a098afa74fe5aafc9f0d2a..8a9f8097e10657415448b65642324139698ff591 100644 (file)
@@ -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")]
index 96d0e5ad60128ef4894bb184d091dda729289bdb..f412d74621d2c532ab23a54cd36fb2f4b1c2b8cf 100644 (file)
@@ -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<GenericParameter> ();
+                               return new GenericParameterCollection (provider);
 
                        metadata.RemoveGenericParameterRange (provider);
 
-                       var generic_parameters = new Collection<GenericParameter> ((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;
index f05bf821cefe055148b565f5fb1d0b78af60dd9c..bf41d5b720cbb604c1ce95d189f32f241c99c32d 100644 (file)
@@ -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);
 
index 140cc96c0b75562f3eead60140e08003c3fb1229..10ab2c34a868cecfb0569888cf9a8d8e9645e71d 100644 (file)
@@ -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 {
index 2d0c19031d421ffdd011274a36a00ae222023472..664f00aae2a004b26bbec361d53b04854097bced 100644 (file)
@@ -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<TypeReference> 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<GenericParameter> {
+
+               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;
+               }
+       }
 }
index 2e3e8e5e75fc767bb42d4e42a20d95c11b892957..916ba0f5415bce7f809d02c6bdd4d2a1f123a124 100644 (file)
@@ -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<CustomAttribute> GetCustomAttributes (
index 4fc4ce1b9b03eeb0acd6dae8ed4d18aa4b7363c7..d41b7f6d08e0328ffe12b4807e0080bf4275c641 100644 (file)
@@ -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<GenericParameter> GetGenericParameters (
@@ -69,7 +67,7 @@ namespace Mono.Cecil {
                {
                        return module.HasImage ()
                                ? module.Read (self, (provider, reader) => reader.ReadGenericParameters (provider))
-                               : new Collection<GenericParameter> ();
+                               : new GenericParameterCollection (self);
                }
        }
 }
index de83cf632e55faa4974fdb6a8c1a7428b0943e0b..67a53a389f2977e65e8e27abe4416159ecac3d76 100644 (file)
@@ -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 (
index 0b912e362c2f4dc9ddb3c70b751a3350f4505dc6..e69fcd7150704faadde89399e0d47d33f1b0a0c3 100644 (file)
@@ -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<FieldDefinition> fields, FieldReference reference)
+               static FieldDefinition GetField (Collection<FieldDefinition> 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<MethodDefinition> methods, MethodReference reference)
+               public static MethodDefinition GetMethod (Collection<MethodDefinition> methods, MethodReference reference)
                {
                        for (int i = 0; i < methods.Count; i++) {
                                var method = methods [i];
index 21de336735c4d8d2d0348dec75493ed23d6853de..0adab452ef7852b52362a7bfce16fb62da9b7f4c 100644 (file)
@@ -99,7 +99,7 @@ namespace Mono.Cecil {
                                if (generic_parameters != null)
                                        return generic_parameters;
 
-                               return generic_parameters = new Collection<GenericParameter> ();
+                               return generic_parameters = new GenericParameterCollection (this);
                        }
                }
 
index f2d3c00f89ee78085a6e5810c25c8a1eb4580a8b..f2e2eaa3201cc83dd8649262e9ef0d4a508999d3 100644 (file)
@@ -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; }
                }
index ecfbf82b80d5b8ef8885d004b220d62e435652b8..0d137e065cbe70a1da958ca4325f17df7ff09df5 100644 (file)
@@ -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)
index ecafbc24a6bebb2fbe50d398bbda25149e492616..837472a1199902454b9ddf101ca988e037c6d772 100644 (file)
@@ -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<SecurityDeclaration> GetSecurityDeclarations (
index f4861245f42e5179bef096e4af7621b35f70e211..757c83aa60a6a414651ca97121d902048c71b650 100644 (file)
@@ -135,7 +135,7 @@ namespace Mono.Cecil {
                                if (generic_parameters != null)
                                        return generic_parameters;
 
-                               return generic_parameters = new Collection<GenericParameter> ();
+                               return generic_parameters = new GenericParameterCollection (this);
                        }
                }
 
index 0de762b41372facf2b84226a0b5b7112203bc544..9246580813be80d1175ab0faf15c4119b9f41840 100644 (file)
@@ -1 +1 @@
-90e481c594502333d400226b3d4198dfd26964b2
+53e6ba7207aa843fac13b80a295380c517f2af8d