From a56c3146479ed44d711ca49869b2ec849ce834e0 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 16 Jul 2011 16:30:29 +0200 Subject: [PATCH] Update to Mono.Cecil 0.9.5 (with thread-safety fixes) --- Mono.Cecil/.gitignore | 1 + Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs | 29 ++++++++++++---- Mono.Cecil/Mono.Cecil.PE/ImageReader.cs | 3 -- Mono.Cecil/Mono.Cecil.nuspec | 2 +- Mono.Cecil/Mono.Cecil/AssemblyInfo.cs | 4 +-- Mono.Cecil/Mono.Cecil/AssemblyReader.cs | 32 ++++++++++++------ Mono.Cecil/Mono.Cecil/AssemblyWriter.cs | 14 ++++---- Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs | 12 +++++++ Mono.Cecil/Mono.Cecil/MetadataResolver.cs | 12 +++++++ Mono.Cecil/Mono.Cecil/ModuleDefinition.cs | 20 +++++++++++ Mono.Cecil/Mono.Cecil/ParameterDefinition.cs | 9 +++++ Mono.Cecil/Mono/Empty.cs | 8 ++--- .../Test/Mono.Cecil.Tests/FieldTests.cs | 9 +++++ .../SecurityDeclarationTests.cs | 20 +++++++++++ .../Resources/assemblies/empty-decsec-att.dll | Bin 0 -> 3584 bytes .../rocks/Mono.Cecil.Rocks/AssemblyInfo.cs | 4 +-- .../mdb/Mono.Cecil.Mdb/AssemblyInfo.cs | 4 +-- Mono.Cecil/symbols/pdb/Mono.Cecil.Pdb.csproj | 3 +- .../pdb/Mono.Cecil.Pdb/AssemblyInfo.cs | 4 +-- 19 files changed, 149 insertions(+), 41 deletions(-) create mode 100644 Mono.Cecil/Test/Resources/assemblies/empty-decsec-att.dll diff --git a/Mono.Cecil/.gitignore b/Mono.Cecil/.gitignore index e6204e104..4b6cda67b 100644 --- a/Mono.Cecil/.gitignore +++ b/Mono.Cecil/.gitignore @@ -6,3 +6,4 @@ obj *.userprefs *.xml *.nupkg +**/test-results/* diff --git a/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs b/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs index 1f94cde00..c7ae7aee1 100644 --- a/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs +++ b/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/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs index ebd4c6b85..734b00a53 100644 --- a/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs +++ b/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/Mono.Cecil/Mono.Cecil.nuspec b/Mono.Cecil/Mono.Cecil.nuspec index 62ad4b048..d34d23ca0 100644 --- a/Mono.Cecil/Mono.Cecil.nuspec +++ b/Mono.Cecil/Mono.Cecil.nuspec @@ -2,7 +2,7 @@ Mono.Cecil - 0.9.4.1 + 0.9.5.0 Mono.Cecil Jb Evain Jb Evain diff --git a/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs b/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs index ffac8eab6..b6fa641ed 100644 --- a/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs +++ b/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs @@ -38,9 +38,9 @@ using System.Runtime.InteropServices; [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/Mono.Cecil/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/Mono.Cecil/AssemblyReader.cs index 6aa5c4415..3caa269f8 100644 --- a/Mono.Cecil/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/Mono.Cecil/AssemblyReader.cs @@ -703,9 +703,24 @@ namespace Mono.Cecil { types.Add (type); } + if (image.HasTable (Table.MethodPtr) || image.HasTable (Table.FieldPtr)) + CompleteTypes (); + return types; } + void CompleteTypes () + { + var types = metadata.Types; + + for (int i = 0; i < types.Length; i++) { + var type = types [i]; + + InitializeCollection (type.Fields); + InitializeCollection (type.Methods); + } + } + void InitializeTypeDefinitions () { if (metadata.Types != null) @@ -2560,10 +2575,8 @@ namespace Mono.Cecil { scope = metadata.AssemblyReferences [(int) token.RID - 1]; break; case TokenType.File: + InitializeModuleReferences (); scope = GetModuleReferenceFromFile (token); - if (scope == null) - throw new NotSupportedException (); - break; default: throw new NotSupportedException (); @@ -2582,16 +2595,15 @@ namespace Mono.Cecil { var file_name = ReadString (); var modules = module.ModuleReferences; - ModuleReference reference = null; + ModuleReference reference; for (int i = 0; i < modules.Count; i++) { - var module_reference = modules [i]; - if (module_reference.Name != file_name) - continue; - - reference = module_reference; - break; + reference = modules [i]; + if (reference.Name == file_name) + return reference; } + reference = new ModuleReference (file_name); + modules.Add (reference); return reference; } diff --git a/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs b/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs index f05bf821c..bf41d5b72 100644 --- a/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs +++ b/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/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs b/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs index 140cc96c0..10ab2c34a 100644 --- a/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs +++ b/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/Mono.Cecil/Mono.Cecil/MetadataResolver.cs b/Mono.Cecil/Mono.Cecil/MetadataResolver.cs index 0b912e362..27a215fb8 100644 --- a/Mono.Cecil/Mono.Cecil/MetadataResolver.cs +++ b/Mono.Cecil/Mono.Cecil/MetadataResolver.cs @@ -41,6 +41,9 @@ namespace Mono.Cecil { AssemblyDefinition Resolve (string fullName, ReaderParameters parameters); } +#if !SILVERLIGHT && !CF + [Serializable] +#endif public class ResolutionException : Exception { readonly MemberReference member; @@ -54,6 +57,15 @@ 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 { diff --git a/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs b/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs index 70cfb1aa0..511a88389 100644 --- a/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs +++ b/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs @@ -506,6 +506,26 @@ namespace Mono.Cecil { return ((TypeDefinitionCollection) this.Types).GetType (@namespace ?? string.Empty, name); } + public IEnumerable GetTypes () + { + return GetTypes (Types); + } + + static IEnumerable GetTypes (Collection types) + { + for (int i = 0; i < types.Count; i++) { + var type = types [i]; + + yield return type; + + if (!type.HasNestedTypes) + continue; + + foreach (var nested in GetTypes (type.NestedTypes)) + yield return nested; + } + } + static void CheckFullName (string fullName) { if (fullName == null) diff --git a/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs b/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs index 6a4d96c86..da7bf81bd 100644 --- a/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs +++ b/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs @@ -49,6 +49,15 @@ namespace Mono.Cecil { get { return method; } } + public int Sequence { + get { + if (method == null) + return -1; + + return method.HasThis ? index + 1 : index; + } + } + public bool HasConstant { get { this.ResolveConstant (ref constant, parameter_type.Module); diff --git a/Mono.Cecil/Mono/Empty.cs b/Mono.Cecil/Mono/Empty.cs index 8701d7bb9..d043a35fa 100644 --- a/Mono.Cecil/Mono/Empty.cs +++ b/Mono.Cecil/Mono/Empty.cs @@ -26,9 +26,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // -using System; -using System.Collections; -using System.Collections.Generic; +using Mono.Collections.Generic; namespace Mono { @@ -47,9 +45,9 @@ namespace Mono.Cecil { return self == null || self.Length == 0; } - public static bool IsNullOrEmpty (this ICollection self) + public static bool IsNullOrEmpty (this Collection self) { - return self == null || self.Count == 0; + return self == null || self.size == 0; } } } diff --git a/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs b/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs index 1927f8569..9596a7bc6 100644 --- a/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs +++ b/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs @@ -163,6 +163,15 @@ namespace Mono.Cecil.Tests { Assert.IsTrue (array.Dimensions [1].IsSized); Assert.AreEqual (0, array.Dimensions [1].LowerBound); Assert.AreEqual (null, array.Dimensions [1].UpperBound); + + var rank_one_low_bound_m1 = types.GetField ("rank_one_low_bound_m1"); + array = rank_one_low_bound_m1.FieldType as ArrayType; + Assert.IsNotNull (array); + + Assert.AreEqual (1, array.Rank); + Assert.IsTrue (array.Dimensions [0].IsSized); + Assert.AreEqual (-1, array.Dimensions [0].LowerBound); + Assert.AreEqual (4, array.Dimensions [0].UpperBound); } [TestCSharp ("Fields.cs")] diff --git a/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs b/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs index a04150366..0175c6c82 100644 --- a/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs +++ b/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs @@ -88,6 +88,26 @@ namespace Mono.Cecil.Tests { Assert.AreEqual (permission_set, argument.Value); } + [TestModule ("empty-decsec-att.dll")] + public void SecurityDeclarationWithoutAttributes (ModuleDefinition module) + { + var type = module.GetType ("TestSecurityAction.ModalUITypeEditor"); + var method = type.GetMethod ("GetEditStyle"); + + Assert.IsNotNull (method); + + Assert.AreEqual (1, method.SecurityDeclarations.Count); + + var declaration = method.SecurityDeclarations [0]; + Assert.AreEqual (SecurityAction.LinkDemand, declaration.Action); + Assert.AreEqual (1, declaration.SecurityAttributes.Count); + + var attribute = declaration.SecurityAttributes [0]; + Assert.AreEqual ("System.Security.Permissions.SecurityPermissionAttribute", attribute.AttributeType.FullName); + Assert.AreEqual (0, attribute.Fields.Count); + Assert.AreEqual (0, attribute.Properties.Count); + } + [TestModule ("decsec-att.dll")] public void AttributeSecurityDeclaration (ModuleDefinition module) { diff --git a/Mono.Cecil/Test/Resources/assemblies/empty-decsec-att.dll b/Mono.Cecil/Test/Resources/assemblies/empty-decsec-att.dll new file mode 100644 index 0000000000000000000000000000000000000000..2dcd9418ba0585ee059055dd45f804ffd8251ed0 GIT binary patch literal 3584 zcmeHJ-ES0C6#vb33+-yFrIA2PU@901l*zWV77WO?-3n-1D!VPjXv*yLx=fs%S!ZT} z@}M=M27Tcl@SVg5nxK)GXiQ9eFp~J7@s&Tok0)cI3HUpAXLq}$F@Z6yD~v)%ILR%S%xfLj#W^cfUO+{i>sboL*Sf@Wzyzgj zaGUiDNNy=~A~t~$#xg|s0MMUJp@(*~??b9%59dr~A2#i!Y)5Jjv&!t9D7-jfBoQRV z^TSrw8qJOkk4eBZ&JpKmxa%$88t1D*7vj+M%aLdtiA4bCal*n;-CRnO@>UnUsz4;Tx z<*J%ma^oOGQAKfk5VWngd$#f_a?5_3ia097%bvn96}K22gz8S{RvBnA@bycV_?rwW z)xcMN%#0LkN>(jLa>}bxtz5QCo*Iw2@k+H=H7j)OvL8gT>qLnf>lGgn#HH)m(x+3( zvoC5Yy2rz*njgCrW!2SHSWw}4*P(r~Aaa_PTu<8GjF0QDednJ3sC)eV-qrBkKet># z*Xq&5xBGs|JlFO4rB@fWkKDeJ-fZ-BZ!(Ft^sIbn87r5QY8wr<=2Td5qlhU+Rzuj5 zHKPrhjVCy0E~rrSkH~Av-=H~J^Ws{lj`*q;hqgCp&ecku>%63vi@_VpKT;YSvqzoL zXNL|Q7*W}ShYWO>Fgi`c=zF5ez-Il1q{()Xs~=`NTKXoU364c`dB;{ z1{Wd&KP2arY|Gz-Hifzu8s}MSWpOeH^PV?jyMBFFDy28EXxx1oX0E0Bzo!g+u5JTX z+FMaS1G5{*MNjUIGdUn$bFjpz5lR<$w=NP-;S{M8ILS+Xk@GBGAT97^`u98a(^j)h zbTpyToY%P3(mb(2uQo#Zap6JHr;pbW==I(DvMh4drZnQZjhK1?xjL+-f8-uCm{UwG zm-6xko>sL^7LDHsN~D27W@I$=^Nb$B(SE9JaZKuFxxZVw3)Bs%-O44)Q@k~RIejlk zHL=$9nY+h+*{G1`kxc7hTI^@;id;>{jj@bza*Zl2EYZrN{vMs{GMt6mKu=pdo{yF*$m{U#XxV{Um`lT1V-?hy+D~*_Ug + net_4_0_Debug @@ -13,7 +13,6 @@ 512 true ..\..\mono.snk - 0649 true diff --git a/Mono.Cecil/symbols/pdb/Mono.Cecil.Pdb/AssemblyInfo.cs b/Mono.Cecil/symbols/pdb/Mono.Cecil.Pdb/AssemblyInfo.cs index 8144f7a72..ea63ba2ac 100644 --- a/Mono.Cecil/symbols/pdb/Mono.Cecil.Pdb/AssemblyInfo.cs +++ b/Mono.Cecil/symbols/pdb/Mono.Cecil.Pdb/AssemblyInfo.cs @@ -37,5 +37,5 @@ using System.Runtime.InteropServices; [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")]