From 77d5f4163eb295c5a3a6c38a3c5f08fa50c7966c Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sat, 3 Sep 2011 17:58:19 +0200 Subject: [PATCH] Update to Mono.Cecil 0.9.5-33-g5ce1cb6 --- src/Libraries/Mono.Cecil/.gitignore | 10 + .../Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs | 3 + .../Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs | 29 +- .../Mono.Cecil/Mono.Cecil.PE/ImageReader.cs | 3 - src/Libraries/Mono.Cecil/Mono.Cecil.nunit | 9 + src/Libraries/Mono.Cecil/Mono.Cecil.nuspec | 23 + src/Libraries/Mono.Cecil/Mono.Cecil.sln | 197 +++++++ .../Mono.Cecil/Mono.Cecil/AssemblyInfo.cs | 6 +- .../Mono.Cecil/Mono.Cecil/AssemblyReader.cs | 64 ++- .../Mono.Cecil/Mono.Cecil/AssemblyWriter.cs | 14 +- .../Mono.Cecil/BaseAssemblyResolver.cs | 12 + .../Mono.Cecil/Mono.Cecil/GenericParameter.cs | 104 +++- .../Mono.Cecil/ICustomAttributeProvider.cs | 4 +- .../Mono.Cecil/IGenericParameterProvider.cs | 6 +- .../Mono.Cecil/IMarshalInfoProvider.cs | 4 +- .../Mono.Cecil/Mono.Cecil/MetadataResolver.cs | 90 ++- .../Mono.Cecil/MethodImplAttributes.cs | 1 - .../Mono.Cecil/Mono.Cecil/MethodReference.cs | 2 +- .../Mono.Cecil/Mono.Cecil/MethodReturnType.cs | 5 + .../Mono.Cecil/Mono.Cecil/ModuleDefinition.cs | 69 ++- .../Mono.Cecil/ParameterDefinition.cs | 9 + .../Mono.Cecil/SecurityDeclaration.cs | 17 +- .../Mono.Cecil/Mono.Cecil/TypeReference.cs | 2 +- src/Libraries/Mono.Cecil/Mono/Empty.cs | 8 +- src/Libraries/Mono.Cecil/Test/.gitignore | 7 + .../Mono.Cecil/Test/Mono.Cecil.Tests.csproj | 178 ++++++ .../Mono.Cecil/Test/Mono.Cecil.Tests/Addin.cs | 303 +++++++++++ .../Test/Mono.Cecil.Tests/AssemblyInfo.cs | 14 + .../Test/Mono.Cecil.Tests/AssemblyTests.cs | 25 + .../Test/Mono.Cecil.Tests/BaseTestFixture.cs | 76 +++ .../Mono.Cecil.Tests/CompilationService.cs | 237 ++++++++ .../Mono.Cecil.Tests/CustomAttributesTests.cs | 511 ++++++++++++++++++ .../Test/Mono.Cecil.Tests/EventTests.cs | 66 +++ .../Test/Mono.Cecil.Tests/Extensions.cs | 92 ++++ .../Test/Mono.Cecil.Tests/FieldTests.cs | 333 ++++++++++++ .../Test/Mono.Cecil.Tests/Formatter.cs | 173 ++++++ .../Test/Mono.Cecil.Tests/ILProcessorTests.cs | 79 +++ .../Test/Mono.Cecil.Tests/ImageReadTests.cs | 127 +++++ .../Test/Mono.Cecil.Tests/ImportCecilTests.cs | 310 +++++++++++ .../Mono.Cecil.Tests/ImportReflectionTests.cs | 409 ++++++++++++++ .../Mono.Cecil/Test/Mono.Cecil.Tests/Linq.cs | 47 ++ .../Test/Mono.Cecil.Tests/MethodBodyTests.cs | 363 +++++++++++++ .../Test/Mono.Cecil.Tests/MethodTests.cs | 193 +++++++ .../Test/Mono.Cecil.Tests/ModuleTests.cs | 250 +++++++++ .../Test/Mono.Cecil.Tests/NestedTypesTests.cs | 45 ++ .../Test/Mono.Cecil.Tests/ParameterTests.cs | 224 ++++++++ .../Test/Mono.Cecil.Tests/PropertyTests.cs | 112 ++++ .../Test/Mono.Cecil.Tests/ResolveTests.cs | 262 +++++++++ .../SecurityDeclarationTests.cs | 290 ++++++++++ .../Test/Mono.Cecil.Tests/TypeParserTests.cs | 394 ++++++++++++++ .../Test/Mono.Cecil.Tests/TypeTests.cs | 199 +++++++ .../Test/Mono.Cecil.Tests/VariableTests.cs | 108 ++++ .../Test/Resources/assemblies/boxedoptarg.dll | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/catch.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/cppcli.dll | Bin 0 -> 50176 bytes .../Test/Resources/assemblies/cscgpbug.dll | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/decsec-att.dll | Bin 0 -> 4096 bytes .../Test/Resources/assemblies/decsec-xml.dll | Bin 0 -> 5120 bytes .../Test/Resources/assemblies/decsec1-xml.dll | Bin 0 -> 4096 bytes .../Resources/assemblies/empty-decsec-att.dll | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/fptr.exe | Bin 0 -> 2048 bytes .../Test/Resources/assemblies/gifaceref.exe | Bin 0 -> 5120 bytes .../Resources/assemblies/hello.anycpu.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/hello.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/hello.ia64.exe | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/hello.x64.exe | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/hello.x86.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/hello1.exe | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/hellow.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/iterator.exe | Bin 0 -> 5632 bytes .../Test/Resources/assemblies/libhello.dll | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/libres.dll | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/marshal.dll | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/mma.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/moda.netmodule | Bin 0 -> 2048 bytes .../Test/Resources/assemblies/modb.netmodule | Bin 0 -> 2048 bytes .../Test/Resources/assemblies/noblob.dll | Bin 0 -> 3072 bytes .../Test/Resources/assemblies/pinvoke.exe | Bin 0 -> 4096 bytes .../Test/Resources/assemblies/switch.exe | Bin 0 -> 3584 bytes .../Test/Resources/assemblies/text_file.txt | 1 + .../Test/Resources/assemblies/varargs.exe | Bin 0 -> 2048 bytes .../Test/Resources/cs/CustomAttributes.cs | 152 ++++++ .../Mono.Cecil/Test/Resources/cs/Events.cs | 8 + .../Mono.Cecil/Test/Resources/cs/Fields.cs | 41 ++ .../Mono.Cecil/Test/Resources/cs/Generics.cs | 121 +++++ .../Test/Resources/cs/Interfaces.cs | 22 + .../Mono.Cecil/Test/Resources/cs/Layouts.cs | 16 + .../Mono.Cecil/Test/Resources/cs/Methods.cs | 21 + .../Test/Resources/cs/NestedTypes.cs | 16 + .../Test/Resources/cs/Properties.cs | 18 + .../Mono.Cecil/Test/Resources/il/hello.il | 84 +++ .../Test/Resources/il/methodspecs.il | 43 ++ .../Mono.Cecil/Test/Resources/il/others.il | 81 +++ .../Mono.Cecil/Test/Resources/il/types.il | 46 ++ .../Test/libs/nunit-2.4.8/license.txt | 15 + .../Test/libs/nunit-2.4.8/nunit.core.dll | Bin 0 -> 90112 bytes .../nunit-2.4.8/nunit.core.interfaces.dll | Bin 0 -> 40960 bytes .../Test/libs/nunit-2.4.8/nunit.framework.dll | Bin 0 -> 77824 bytes src/Libraries/Mono.Cecil/readme.txt | 25 - 99 files changed, 6701 insertions(+), 127 deletions(-) create mode 100644 src/Libraries/Mono.Cecil/.gitignore create mode 100644 src/Libraries/Mono.Cecil/Mono.Cecil.nunit create mode 100644 src/Libraries/Mono.Cecil/Mono.Cecil.nuspec create mode 100644 src/Libraries/Mono.Cecil/Mono.Cecil.sln create mode 100644 src/Libraries/Mono.Cecil/Test/.gitignore create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests.csproj create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Addin.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyInfo.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/BaseTestFixture.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CompilationService.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CustomAttributesTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/EventTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Extensions.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Formatter.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ILProcessorTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Linq.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodBodyTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ModuleTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/NestedTypesTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ParameterTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/PropertyTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ResolveTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeParserTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/VariableTests.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/boxedoptarg.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/catch.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/cppcli.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/cscgpbug.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/decsec-att.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/decsec-xml.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/decsec1-xml.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/empty-decsec-att.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/fptr.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/gifaceref.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.anycpu.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.ia64.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.x64.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.x86.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello1.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/hellow.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/iterator.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/libhello.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/libres.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/marshal.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/mma.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/moda.netmodule create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/modb.netmodule create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/noblob.dll create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/pinvoke.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/switch.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/text_file.txt create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/assemblies/varargs.exe create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/CustomAttributes.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Events.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Fields.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Generics.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Interfaces.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Layouts.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Methods.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/NestedTypes.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/cs/Properties.cs create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/il/hello.il create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/il/methodspecs.il create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/il/others.il create mode 100644 src/Libraries/Mono.Cecil/Test/Resources/il/types.il create mode 100644 src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/license.txt create mode 100644 src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.core.dll create mode 100644 src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.core.interfaces.dll create mode 100644 src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.framework.dll delete mode 100644 src/Libraries/Mono.Cecil/readme.txt diff --git a/src/Libraries/Mono.Cecil/.gitignore b/src/Libraries/Mono.Cecil/.gitignore new file mode 100644 index 0000000000..8dcb32b7f6 --- /dev/null +++ b/src/Libraries/Mono.Cecil/.gitignore @@ -0,0 +1,10 @@ +bin +obj +*.suo +*.user +*.pidb +*.userprefs +*.xml +*.nupkg +**/test-results/* +*Resharper* diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs b/src/Libraries/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs index 2412034386..02876aad5a 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil.Cil/CodeWriter.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs b/src/Libraries/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs index 1f94cde008..c7ae7aee13 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil.PE/ByteBuffer.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs b/src/Libraries/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs index ebd4c6b85f..734b00a534 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil.PE/ImageReader.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil.nunit b/src/Libraries/Mono.Cecil/Mono.Cecil.nunit new file mode 100644 index 0000000000..1cb0ebab1e --- /dev/null +++ b/src/Libraries/Mono.Cecil/Mono.Cecil.nunit @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil.nuspec b/src/Libraries/Mono.Cecil/Mono.Cecil.nuspec new file mode 100644 index 0000000000..d34d23ca0c --- /dev/null +++ b/src/Libraries/Mono.Cecil/Mono.Cecil.nuspec @@ -0,0 +1,23 @@ + + + + Mono.Cecil + 0.9.5.0 + Mono.Cecil + Jb Evain + Jb Evain + http://opensource.org/licenses/mit-license.php + false + http://github.com/jbevain/cecil/ + Cecil is a library written by Jb Evain to generate and inspect programs and libraries in the ECMA CIL format. + Cecil is a library written by Jb Evain to generate and inspect programs and libraries in the ECMA CIL format. It has full support for generics, and support some debugging symbol format. In simple English, with Cecil, you can load existing managed assemblies, browse all the contained types, modify them on the fly and save back to the disk the modified assembly. + en-US + assembly assemblies module modules il cil msil bytecode reflection injection cecil mono aop + + + + + + + + diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil.sln b/src/Libraries/Mono.Cecil/Mono.Cecil.sln new file mode 100644 index 0000000000..7f2eda7f98 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Mono.Cecil.sln @@ -0,0 +1,197 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{74E5ECE0-06B4-401C-AEBA-E8DD53E17943}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Symbols", "Symbols", "{929D5B3B-E29A-40CC-93D8-0FF43A6F9FA1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil", "Mono.Cecil.csproj", "{D68133BD-1E63-496E-9EDE-4FBDBF77B486}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Tests", "Test\Mono.Cecil.Tests.csproj", "{A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dbg", "dbg\dbg.csproj", "{89A775F3-64AB-485E-B958-60C25254B732}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Mdb", "symbols\mdb\Mono.Cecil.Mdb.csproj", "{8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Mdb.Tests", "symbols\mdb\Test\Mono.Cecil.Mdb.Tests.csproj", "{AC71DF9C-99FA-4A63-990A-66C8010355A6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Pdb", "symbols\pdb\Mono.Cecil.Pdb.csproj", "{63E6915C-7EA4-4D76-AB28-0D7191EEA626}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Pdb.Tests", "symbols\pdb\Test\Mono.Cecil.Pdb.Tests.csproj", "{29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Rocks.Tests", "rocks\Test\Mono.Cecil.Rocks.Tests.csproj", "{C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mono.Cecil.Rocks", "rocks\Mono.Cecil.Rocks.csproj", "{FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + net_2_0_Debug|Any CPU = net_2_0_Debug|Any CPU + net_2_0_Release|Any CPU = net_2_0_Release|Any CPU + net_3_5_Debug|Any CPU = net_3_5_Debug|Any CPU + net_3_5_Release|Any CPU = net_3_5_Release|Any CPU + net_4_0_Debug|Any CPU = net_4_0_Debug|Any CPU + net_4_0_Release|Any CPU = net_4_0_Release|Any CPU + silverlight_Debug|Any CPU = silverlight_Debug|Any CPU + silverlight_Release|Any CPU = silverlight_Release|Any CPU + winphone_Debug|Any CPU = winphone_Debug|Any CPU + winphone_Release|Any CPU = winphone_Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Debug|Any CPU.ActiveCfg = silverlight_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Debug|Any CPU.Build.0 = silverlight_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Release|Any CPU.ActiveCfg = silverlight_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.silverlight_Release|Any CPU.Build.0 = silverlight_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Debug|Any CPU.ActiveCfg = winphone_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Debug|Any CPU.Build.0 = winphone_Debug|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Release|Any CPU.ActiveCfg = winphone_Release|Any CPU + {D68133BD-1E63-496E-9EDE-4FBDBF77B486}.winphone_Release|Any CPU.Build.0 = winphone_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_2_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_2_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {89A775F3-64AB-485E-B958-60C25254B732}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {AC71DF9C-99FA-4A63-990A-66C8010355A6}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {63E6915C-7EA4-4D76-AB28-0D7191EEA626}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Debug|Any CPU.ActiveCfg = net_2_0_Debug|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Debug|Any CPU.Build.0 = net_2_0_Debug|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Release|Any CPU.ActiveCfg = net_2_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_2_0_Release|Any CPU.Build.0 = net_2_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_2_0_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_2_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.silverlight_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.silverlight_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.winphone_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52}.winphone_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_2_0_Debug|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_2_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Debug|Any CPU.ActiveCfg = net_3_5_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Debug|Any CPU.Build.0 = net_3_5_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Release|Any CPU.ActiveCfg = net_3_5_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_3_5_Release|Any CPU.Build.0 = net_3_5_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Debug|Any CPU.ActiveCfg = net_4_0_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Debug|Any CPU.Build.0 = net_4_0_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Release|Any CPU.ActiveCfg = net_4_0_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.net_4_0_Release|Any CPU.Build.0 = net_4_0_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Debug|Any CPU.ActiveCfg = silverlight_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Debug|Any CPU.Build.0 = silverlight_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Release|Any CPU.ActiveCfg = silverlight_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.silverlight_Release|Any CPU.Build.0 = silverlight_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Debug|Any CPU.ActiveCfg = winphone_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Debug|Any CPU.Build.0 = winphone_Debug|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Release|Any CPU.ActiveCfg = winphone_Release|Any CPU + {FBC6DD59-D09D-499C-B03C-99C1C78FF2AC}.winphone_Release|Any CPU.Build.0 = winphone_Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} + {AC71DF9C-99FA-4A63-990A-66C8010355A6} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} + {29300103-CB76-4A1D-B6FD-FFD91C1EC8AA} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} + {C6CFD7E1-B855-44DC-B4CE-9CD72984AF52} = {74E5ECE0-06B4-401C-AEBA-E8DD53E17943} + {8559DD7F-A16F-46D0-A05A-9139FAEBA8FD} = {929D5B3B-E29A-40CC-93D8-0FF43A6F9FA1} + {63E6915C-7EA4-4D76-AB28-0D7191EEA626} = {929D5B3B-E29A-40CC-93D8-0FF43A6F9FA1} + EndGlobalSection +EndGlobal diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs index ffac8eab69..8a9f8097e1 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyInfo.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyReader.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyReader.cs index 63d3d835b6..72cb480188 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyReader.cs +++ b/src/Libraries/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; } @@ -525,11 +528,10 @@ namespace Mono.Cecil { public MethodDefinition ReadEntryPoint () { - if (module.Kind != ModuleKind.Console && module.Kind != ModuleKind.Windows) + if (module.Image.EntryPointToken == 0) return null; var token = new MetadataToken (module.Image.EntryPointToken); - return GetMethodDefinition (token.RID); } @@ -703,9 +705,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) @@ -1780,11 +1797,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 @@ -1842,7 +1859,7 @@ namespace Mono.Cecil { range.Length++; } - if (owner != MetadataToken.Zero) + if (owner != MetadataToken.Zero && !ranges.ContainsKey (owner)) ranges.Add (owner, range); return ranges; @@ -2170,7 +2187,8 @@ namespace Mono.Cecil { { var declaring_type = GetTypeDefOrRef (type); - this.context = declaring_type; + if (!declaring_type.IsArray) + this.context = declaring_type; var member = ReadMemberReferenceSignature (signature, declaring_type); member.Name = name; @@ -2475,7 +2493,7 @@ namespace Mono.Cecil { return; } - reader.ReadByte (); + reader.position++; var count = reader.ReadCompressedUInt32 (); var attributes = new Collection ((int) count); @@ -2559,10 +2577,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 (); @@ -2581,16 +2597,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; } @@ -2632,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; @@ -2649,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]; } + GenericParameter GetUnboundGenericParameter (GenericParameterType type, int index) + { + return new GenericParameter (index, type, reader.module); + } + static void CheckGenericContext (IGenericParameterProvider owner, int index) { var owner_parameters = owner.GenericParameters; @@ -2799,7 +2821,7 @@ namespace Mono.Cecil { method.CallingConvention = (MethodCallingConvention) calling_convention; var generic_context = method as MethodReference; - if (generic_context != null) + if (generic_context != null && !generic_context.DeclaringType.IsArray) reader.context = generic_context; if ((calling_convention & 0x10) != 0) { diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs index f05bf821ce..bf41d5b720 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/AssemblyWriter.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs index 140cc96c0b..10ab2c34a8 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/BaseAssemblyResolver.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/GenericParameter.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/GenericParameter.cs index 2d0c19031d..d694e296d7 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/GenericParameter.cs +++ b/src/Libraries/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 module ?? owner.Module; } } 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,34 @@ 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, ModuleDefinition module) + : base (string.Empty, string.Empty) + { + if (module == null) + throw new ArgumentNullException (); + + this.position = position; + this.type = type; + this.etype = ConvertGenericParameterType (type); + this.module = module; + } + + 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 +223,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/src/Libraries/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs index 2e3e8e5e75..916ba0f541 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/ICustomAttributeProvider.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs index 4fc4ce1b9b..d41b7f6d08 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/IGenericParameterProvider.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs index de83cf632e..67a53a389f 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/IMarshalInfoProvider.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/MetadataResolver.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/MetadataResolver.cs index 77d418d4fd..e69fcd7150 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/MetadataResolver.cs +++ b/src/Libraries/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]; @@ -206,6 +246,12 @@ namespace Mono.Cecil { if (method.Name != reference.Name) continue; + if (method.HasGenericParameters != reference.HasGenericParameters) + continue; + + if (method.HasGenericParameters && method.GenericParameters.Count != reference.GenericParameters.Count) + continue; + if (!AreSame (method.ReturnType, reference.ReturnType)) continue; diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil/MethodImplAttributes.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/MethodImplAttributes.cs index 94d8771a9b..b24fcf7047 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/MethodImplAttributes.cs +++ b/src/Libraries/Mono.Cecil/Mono.Cecil/MethodImplAttributes.cs @@ -49,6 +49,5 @@ namespace Mono.Cecil { Synchronized = 0x0020, // Method is single threaded through the body NoOptimization = 0x0040, // Method is not optimized by the JIT. NoInlining = 0x0008, // Method may not be inlined - MaxMethodImplVal = 0xffff // Range check value } } diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil/MethodReference.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/MethodReference.cs index 21de336735..0adab452ef 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/MethodReference.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/MethodReturnType.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/MethodReturnType.cs index f2d3c00f89..f2e2eaa320 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/MethodReturnType.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs index 7fecf74890..0d137e065c 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/ModuleDefinition.cs +++ b/src/Libraries/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); @@ -498,6 +522,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) @@ -527,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 @@ -812,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; } @@ -824,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 () @@ -832,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/src/Libraries/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs index 9b66b77aca..8902615bbd 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/ParameterDefinition.cs +++ b/src/Libraries/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 { ResolveConstant (); diff --git a/src/Libraries/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs index ecafbc24a6..837472a119 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/SecurityDeclaration.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono.Cecil/TypeReference.cs b/src/Libraries/Mono.Cecil/Mono.Cecil/TypeReference.cs index f4861245f4..757c83aa60 100644 --- a/src/Libraries/Mono.Cecil/Mono.Cecil/TypeReference.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Mono/Empty.cs b/src/Libraries/Mono.Cecil/Mono/Empty.cs index 8701d7bb9a..d043a35fa5 100644 --- a/src/Libraries/Mono.Cecil/Mono/Empty.cs +++ b/src/Libraries/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/src/Libraries/Mono.Cecil/Test/.gitignore b/src/Libraries/Mono.Cecil/Test/.gitignore new file mode 100644 index 0000000000..2b75ccefb9 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/.gitignore @@ -0,0 +1,7 @@ +bin +obj +*.suo +*.user +*.xml +*.pidb +*.userprefs diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests.csproj b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests.csproj new file mode 100644 index 0000000000..bd065db584 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests.csproj @@ -0,0 +1,178 @@ + + + + net_4_0_Debug + AnyCPU + 9.0.30729 + 2.0 + {A47B1F49-A81A-43E8-BE6B-DD28AF2C4055} + Library + Properties + Mono.Cecil.Tests + Mono.Cecil.Tests + 512 + true + ..\mono.snk + + + true + full + false + bin\net_2_0_Debug\ + DEBUG;TRACE + prompt + 4 + v2.0 + + + pdbonly + true + bin\net_2_0_Release\ + TRACE + prompt + 4 + v2.0 + + + true + full + false + bin\net_3_5_Debug\ + DEBUG;TRACE;NET_3_5 + prompt + 4 + v3.5 + + + pdbonly + true + bin\net_3_5_Release\ + TRACE;NET_3_5 + prompt + 4 + v3.5 + + + true + full + false + bin\net_4_0_Debug\ + DEBUG;TRACE;NET_3_5;NET_4_0 + prompt + 4 + v4.0 + + + pdbonly + true + bin\net_4_0_Release\ + TRACE;NET_3_5;NET_4_0 + prompt + 4 + v4.0 + + + + + + + False + libs\nunit-2.4.8\nunit.core.dll + + + False + libs\nunit-2.4.8\nunit.core.interfaces.dll + + + False + libs\nunit-2.4.8\nunit.framework.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {D68133BD-1E63-496E-9EDE-4FBDBF77B486} + Mono.Cecil + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Addin.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Addin.cs new file mode 100644 index 0000000000..b8ede12a58 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Addin.cs @@ -0,0 +1,303 @@ +using System; +using System.IO; +using System.Reflection; + +using NUnit.Core; +using NUnit.Core.Extensibility; + +using Mono.Cecil.Cil; + +namespace Mono.Cecil.Tests { + + public abstract class TestCecilAttribute : Attribute { + + bool verify = true; + Type symbol_reader_provider; + Type symbol_writer_provider; + + public bool Verify { + get { return verify; } + set { verify = value; } + } + + public Type SymbolReaderProvider { + get { return symbol_reader_provider; } + set { symbol_reader_provider = value; } + } + + public Type SymbolWriterProvider { + get { return symbol_writer_provider; } + set { symbol_writer_provider = value; } + } + + public abstract string GetModuleLocation (Assembly assembly); + } + + [AttributeUsage (AttributeTargets.Method, AllowMultiple = false)] + public sealed class TestModuleAttribute : TestCecilAttribute { + + readonly string module; + + public string Module { + get { return module; } + } + + public TestModuleAttribute (string assembly) + { + this.module = assembly; + } + + public override string GetModuleLocation (Assembly assembly) + { + return BaseTestFixture.GetAssemblyResourcePath (module, assembly); + } + } + + [AttributeUsage (AttributeTargets.Method, AllowMultiple = false)] + public sealed class TestCSharpAttribute : TestCecilAttribute { + + readonly string file; + + public string File { + get { return file; } + } + + public TestCSharpAttribute (string file) + { + this.file = file; + } + + public override string GetModuleLocation (Assembly assembly) + { + return CompilationService.CompileResource ( + BaseTestFixture.GetCSharpResourcePath (file, assembly)); + } + } + + [AttributeUsage (AttributeTargets.Method, AllowMultiple = false)] + public sealed class TestILAttribute : TestCecilAttribute { + + readonly string file; + + public string File { + get { return file; } + } + + public TestILAttribute (string file) + { + this.file = file; + } + + public override string GetModuleLocation (Assembly assembly) + { + return CompilationService.CompileResource ( + BaseTestFixture.GetILResourcePath (file, assembly)); + } + } + + class CecilTestCase : NUnitTestMethod { + + readonly TestCecilAttribute attribute; + readonly TestCaseType type; + + public CecilTestCase (MethodInfo method, TestCecilAttribute attribute, TestCaseType type) + : base (method) + { + this.TestName.Name = type.ToString (); + this.TestName.FullName = method.DeclaringType.FullName + "." + method.Name + "." + type; + this.attribute = attribute; + this.type = type; + } + + ModuleDefinition GetModule () + { + var location = attribute.GetModuleLocation (this.Method.DeclaringType.Assembly); + + var parameters = new ReaderParameters { + SymbolReaderProvider = GetSymbolReaderProvider (attribute), + }; + + switch (type) { + case TestCaseType.ReadImmediate: + parameters.ReadingMode = ReadingMode.Immediate; + return ModuleDefinition.ReadModule (location, parameters); + case TestCaseType.ReadDeferred: + parameters.ReadingMode = ReadingMode.Deferred; + return ModuleDefinition.ReadModule (location, parameters); + case TestCaseType.WriteFromImmediate: + parameters.ReadingMode = ReadingMode.Immediate; + return RoundTrip (location, parameters, "cecil-irt"); + case TestCaseType.WriteFromDeferred: + parameters.ReadingMode = ReadingMode.Deferred; + return RoundTrip (location, parameters, "cecil-drt"); + default: + return null; + } + } + + static ISymbolReaderProvider GetSymbolReaderProvider (TestCecilAttribute attribute) + { + if (attribute.SymbolReaderProvider == null) + return null; + + return (ISymbolReaderProvider) Activator.CreateInstance (attribute.SymbolReaderProvider); + } + + static ISymbolWriterProvider GetSymbolWriterProvider (TestCecilAttribute attribute) + { + if (attribute.SymbolReaderProvider == null) + return null; + + return (ISymbolWriterProvider) Activator.CreateInstance (attribute.SymbolWriterProvider); + } + + ModuleDefinition RoundTrip (string location, ReaderParameters reader_parameters, string folder) + { + var module = ModuleDefinition.ReadModule (location, reader_parameters); + var rt_folder = Path.Combine (Path.GetTempPath (), folder); + if (!Directory.Exists (rt_folder)) + Directory.CreateDirectory (rt_folder); + var rt_module = Path.Combine (rt_folder, Path.GetFileName (location)); + + var writer_parameters = new WriterParameters { + SymbolWriterProvider = GetSymbolWriterProvider (attribute), + }; + + Reflect.InvokeMethod (Method, Fixture, new object [] { module }); + + module.Write (rt_module, writer_parameters); + + if (attribute.Verify) + CompilationService.Verify (rt_module); + + return ModuleDefinition.ReadModule (rt_module, reader_parameters); + } + + public override void RunTestMethod (TestCaseResult testResult) + { + var module = GetModule (); + if (module == null) + return; + + Reflect.InvokeMethod (Method, Fixture, new object [] { module }); + + testResult.Success (); + } + } + + class CecilTestSuite : TestSuite { + + public CecilTestSuite (MethodInfo method) + : base (method.DeclaringType.FullName, method.Name) + { + } + + public override TestResult Run (EventListener listener, ITestFilter filter) + { + if (this.Parent != null) + this.Fixture = this.Parent.Fixture; + + return base.Run (listener, filter); + } + + protected override void DoOneTimeSetUp (TestResult suiteResult) + { + } + + protected override void DoOneTimeTearDown (TestResult suiteResult) + { + } + } + + enum TestCaseType { + ReadImmediate, + ReadDeferred, + WriteFromImmediate, + WriteFromDeferred, + } + + static class CecilTestFactory { + + public static CecilTestSuite CreateTestSuite (MethodInfo method) + { + if (method == null) + throw new ArgumentNullException ("method"); + + var suite = new CecilTestSuite (method); + + NUnitFramework.ApplyCommonAttributes (method, suite); + PopulateTestSuite (method, suite); + + return suite; + } + + static void PopulateTestSuite (MethodInfo method, CecilTestSuite suite) + { + var attribute = GetTestCecilAttribute (method); + if (attribute == null) + throw new ArgumentException (); + + foreach (var value in Enum.GetValues (typeof (TestCaseType))) { + var test = CreateTestCase (method, attribute, (TestCaseType) value); + if (test != null) + suite.Add (test); + } + } + + static CecilTestCase CreateTestCase (MethodInfo method, TestCecilAttribute attribute, TestCaseType type) + { + return new CecilTestCase (method, attribute, type); + } + + static TestCecilAttribute GetTestCecilAttribute (MethodInfo method) + { + foreach (var attribute in method.GetCustomAttributes (false)) { + var test = attribute as TestCecilAttribute; + if (test != null) + return test; + } + + return null; + } + } + + [NUnitAddin] + public class CecilTestAddin : IAddin, ITestCaseBuilder { + + public bool Install (IExtensionHost host) + { + if (host == null) + throw new ArgumentNullException ("host"); + + var builders = host.GetExtensionPoint ("TestCaseBuilders"); + if (builders == null) + return false; + + builders.Install (this); + return true; + } + + public Test BuildFrom (MethodInfo method) + { + if (method == null) + throw new ArgumentNullException ("method"); + + return CecilTestFactory.CreateTestSuite (method); + } + + public bool CanBuildFrom (MethodInfo method) + { + if (method == null) + return false; + + return IsCecilTestMethod (method); + } + + static bool IsCecilTestMethod (MethodInfo method) + { + return Reflect.HasAttribute (method, typeof (TestModuleAttribute).FullName, false) + || Reflect.HasAttribute (method, typeof (TestILAttribute).FullName, false) + || Reflect.HasAttribute (method, typeof (TestCSharpAttribute).FullName, false); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyInfo.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyInfo.cs new file mode 100644 index 0000000000..ad7488f773 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyInfo.cs @@ -0,0 +1,14 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle ("Mono.Cecil.Tests")] +[assembly: AssemblyProduct ("Mono.Cecil")] +[assembly: AssemblyCopyright ("Copyright © 2008 - 2011 Jb Evain")] + +[assembly: ComVisible (false)] + +[assembly: Guid ("da96c202-696a-457e-89af-5fa74e6bda0d")] + +[assembly: AssemblyVersion ("1.0.0.0")] +[assembly: AssemblyFileVersion ("1.0.0.0")] diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyTests.cs new file mode 100644 index 0000000000..8cd6898fc4 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/AssemblyTests.cs @@ -0,0 +1,25 @@ +using System; + +using Mono.Cecil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class AssemblyTests : BaseTestFixture { + + [TestModule ("hello.exe")] + public void Name (ModuleDefinition module) + { + var name = module.Assembly.Name; + + Assert.IsNotNull (name); + + Assert.AreEqual ("hello", name.Name); + Assert.AreEqual (string.Empty, name.Culture); + Assert.AreEqual (new Version (0, 0, 0, 0), name.Version); + Assert.AreEqual (AssemblyHashAlgorithm.SHA1, name.HashAlgorithm); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/BaseTestFixture.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/BaseTestFixture.cs new file mode 100644 index 0000000000..e160f48afc --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/BaseTestFixture.cs @@ -0,0 +1,76 @@ +using System; +using System.IO; +using System.Reflection; + +using NUnit.Framework; + +using Mono.Cecil.PE; + +namespace Mono.Cecil.Tests { + + public abstract class BaseTestFixture { + + public static string GetResourcePath (string name, Assembly assembly) + { + return Path.Combine (FindResourcesDirectory (assembly), name); + } + + public static string GetAssemblyResourcePath (string name, Assembly assembly) + { + return GetResourcePath (Path.Combine ("assemblies", name), assembly); + } + + public static string GetCSharpResourcePath (string name, Assembly assembly) + { + return GetResourcePath (Path.Combine ("cs", name), assembly); + } + + public static string GetILResourcePath (string name, Assembly assembly) + { + return GetResourcePath (Path.Combine ("il", name), assembly); + } + + public static ModuleDefinition GetResourceModule (string name) + { + return ModuleDefinition.ReadModule (GetAssemblyResourcePath (name, typeof (BaseTestFixture).Assembly)); + } + + public static ModuleDefinition GetResourceModule (string name, ReaderParameters parameters) + { + return ModuleDefinition.ReadModule (GetAssemblyResourcePath (name, typeof (BaseTestFixture).Assembly), parameters); + } + + public static ModuleDefinition GetResourceModule (string name, ReadingMode mode) + { + return ModuleDefinition.ReadModule (GetAssemblyResourcePath (name, typeof (BaseTestFixture).Assembly), new ReaderParameters (mode)); + } + + internal static Image GetResourceImage (string name) + { + using (var fs = new FileStream (GetAssemblyResourcePath (name, typeof (BaseTestFixture).Assembly), FileMode.Open, FileAccess.Read)) + return ImageReader.ReadImageFrom (fs); + } + + public static ModuleDefinition GetCurrentModule () + { + return ModuleDefinition.ReadModule (typeof (BaseTestFixture).Module.FullyQualifiedName); + } + + public static ModuleDefinition GetCurrentModule (ReaderParameters parameters) + { + return ModuleDefinition.ReadModule (typeof (BaseTestFixture).Module.FullyQualifiedName, parameters); + } + + public static string FindResourcesDirectory (Assembly assembly) + { + var path = Path.GetDirectoryName (new Uri (assembly.CodeBase).LocalPath); + while (!Directory.Exists (Path.Combine (path, "Resources"))) { + var old = path; + path = Path.GetDirectoryName (path); + Assert.AreNotEqual (old, path); + } + + return Path.Combine (path, "Resources"); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CompilationService.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CompilationService.cs new file mode 100644 index 0000000000..5a2def5cd1 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CompilationService.cs @@ -0,0 +1,237 @@ +using System; +using System.CodeDom.Compiler; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + struct CompilationResult { + internal DateTime source_write_time; + internal string result_file; + + public CompilationResult (DateTime write_time, string result_file) + { + this.source_write_time = write_time; + this.result_file = result_file; + } + } + + abstract class CompilationService { + + Dictionary files = new Dictionary (); + + bool TryGetResult (string name, out string file_result) + { + file_result = null; + CompilationResult result; + if (!files.TryGetValue (name, out result)) + return false; + + if (result.source_write_time != File.GetLastWriteTime (name)) + return false; + + file_result = result.result_file; + return true; + } + + public string Compile (string name) + { + string result_file; + if (TryGetResult (name, out result_file)) + return result_file; + + result_file = CompileFile (name); + RegisterFile (name, result_file); + return result_file; + } + + void RegisterFile (string name, string result_file) + { + files [name] = new CompilationResult (File.GetLastWriteTime (name), result_file); + } + + protected abstract string CompileFile (string name); + + public static string CompileResource (string name) + { + var extension = Path.GetExtension (name); + if (extension == ".il") + return IlasmCompilationService.Instance.Compile (name); + + if (extension == ".cs" || extension == ".vb") + return CodeDomCompilationService.Instance.Compile (name); + + throw new NotSupportedException (extension); + } + + protected static string GetCompiledFilePath (string file_name) + { + var tmp_cecil = Path.Combine (Path.GetTempPath (), "cecil"); + if (!Directory.Exists (tmp_cecil)) + Directory.CreateDirectory (tmp_cecil); + + return Path.Combine (tmp_cecil, Path.GetFileName (file_name) + ".dll"); + } + + static bool OnMono { get { return typeof (object).Assembly.GetType ("Mono.Runtime") != null; } } + + public static void Verify (string name) + { + var output = OnMono ? ShellService.PEDump (name) : ShellService.PEVerify (name); + if (output.ExitCode != 0) + Assert.Fail (output.ToString ()); + } + } + + class IlasmCompilationService : CompilationService { + + public static readonly IlasmCompilationService Instance = new IlasmCompilationService (); + + protected override string CompileFile (string name) + { + string file = GetCompiledFilePath (name); + + var output = ShellService.ILAsm (name, file); + + AssertAssemblerResult (output); + + return file; + } + + static void AssertAssemblerResult (ShellService.ProcessOutput output) + { + if (output.ExitCode != 0) + Assert.Fail (output.ToString ()); + } + } + + class CodeDomCompilationService : CompilationService { + + public static readonly CodeDomCompilationService Instance = new CodeDomCompilationService (); + + protected override string CompileFile (string name) + { + string file = GetCompiledFilePath (name); + + using (var provider = GetProvider (name)) { + var parameters = GetDefaultParameters (name); + parameters.IncludeDebugInformation = false; + parameters.GenerateExecutable = false; + parameters.OutputAssembly = file; + + var results = provider.CompileAssemblyFromFile (parameters, name); + AssertCompilerResults (results); + } + + return file; + } + + static void AssertCompilerResults (CompilerResults results) + { + Assert.IsFalse (results.Errors.HasErrors, GetErrorMessage (results)); + } + + static string GetErrorMessage (CompilerResults results) + { + if (!results.Errors.HasErrors) + return string.Empty; + + var builder = new StringBuilder (); + foreach (CompilerError error in results.Errors) + builder.AppendLine (error.ToString ()); + return builder.ToString (); + } + + static CompilerParameters GetDefaultParameters (string name) + { + return GetCompilerInfo (name).CreateDefaultCompilerParameters (); + } + + static CodeDomProvider GetProvider (string name) + { + return GetCompilerInfo (name).CreateProvider (); + } + + static CompilerInfo GetCompilerInfo (string name) + { + return CodeDomProvider.GetCompilerInfo ( + CodeDomProvider.GetLanguageFromExtension (Path.GetExtension (name))); + } + } + + class ShellService { + + public class ProcessOutput { + + public int ExitCode; + public string StdOut; + public string StdErr; + + public ProcessOutput (int exitCode, string stdout, string stderr) + { + ExitCode = exitCode; + StdOut = stdout; + StdErr = stderr; + } + + public override string ToString () + { + return StdOut + StdErr; + } + } + + static ProcessOutput RunProcess (string target, params string [] arguments) + { + var stdout = new StringWriter (); + var stderr = new StringWriter (); + + var process = new Process { + StartInfo = new ProcessStartInfo { + FileName = target, + Arguments = string.Join (" ", arguments), + CreateNoWindow = true, + UseShellExecute = false, + RedirectStandardError = true, + RedirectStandardInput = true, + RedirectStandardOutput = true, + }, + }; + + process.Start (); + + process.OutputDataReceived += (_, args) => stdout.Write (args.Data); + process.ErrorDataReceived += (_, args) => stderr.Write (args.Data); + + process.BeginOutputReadLine (); + process.BeginErrorReadLine (); + + process.WaitForExit (); + + return new ProcessOutput (process.ExitCode, stdout.ToString (), stderr.ToString ()); + } + + public static ProcessOutput ILAsm (string source, string output) + { + return RunProcess ("ilasm", "/nologo", "/dll", "/out:" + Quote (output), Quote (source)); + } + + static string Quote (string file) + { + return "\"" + file + "\""; + } + + public static ProcessOutput PEVerify (string source) + { + return RunProcess ("peverify", "/nologo", Quote (source)); + } + + public static ProcessOutput PEDump (string source) + { + return RunProcess ("pedump", "--verify code,metadata", Quote (source)); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CustomAttributesTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CustomAttributesTests.cs new file mode 100644 index 0000000000..6565ba6ca5 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/CustomAttributesTests.cs @@ -0,0 +1,511 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; + +using Mono.Cecil; +using Mono.Cecil.Metadata; +using Mono.Cecil.PE; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class CustomAttributesTests : BaseTestFixture { + + [TestCSharp ("CustomAttributes.cs")] + public void StringArgumentOnType (ModuleDefinition module) + { + var hamster = module.GetType ("Hamster"); + + Assert.IsTrue (hamster.HasCustomAttributes); + Assert.AreEqual (1, hamster.CustomAttributes.Count); + + var attribute = hamster.CustomAttributes [0]; + Assert.AreEqual ("System.Void FooAttribute::.ctor(System.String)", + attribute.Constructor.FullName); + + Assert.IsTrue (attribute.HasConstructorArguments); + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + AssertArgument ("bar", attribute.ConstructorArguments [0]); + } + + [TestCSharp ("CustomAttributes.cs")] + public void NullString (ModuleDefinition module) + { + var dentist = module.GetType ("Dentist"); + + var attribute = GetAttribute (dentist, "Foo"); + Assert.IsNotNull (attribute); + + AssertArgument (null, attribute.ConstructorArguments [0]); + } + + [TestCSharp ("CustomAttributes.cs")] + public void Primitives1 (ModuleDefinition module) + { + var steven = module.GetType ("Steven"); + + var attribute = GetAttribute (steven, "Foo"); + Assert.IsNotNull (attribute); + + AssertArgument (-12, attribute.ConstructorArguments [0]); + AssertArgument (242, attribute.ConstructorArguments [1]); + AssertArgument (true, attribute.ConstructorArguments [2]); + AssertArgument (false, attribute.ConstructorArguments [3]); + AssertArgument (4242, attribute.ConstructorArguments [4]); + AssertArgument (-1983, attribute.ConstructorArguments [5]); + AssertArgument ('c', attribute.ConstructorArguments [6]); + } + + [TestCSharp ("CustomAttributes.cs")] + public void Primitives2 (ModuleDefinition module) + { + var seagull = module.GetType ("Seagull"); + + var attribute = GetAttribute (seagull, "Foo"); + Assert.IsNotNull (attribute); + + AssertArgument (-100000, attribute.ConstructorArguments [0]); + AssertArgument (200000, attribute.ConstructorArguments [1]); + AssertArgument (12.12f, attribute.ConstructorArguments [2]); + AssertArgument (long.MaxValue, attribute.ConstructorArguments [3]); + AssertArgument (ulong.MaxValue, attribute.ConstructorArguments [4]); + AssertArgument (64.646464, attribute.ConstructorArguments [5]); + } + + [TestCSharp ("CustomAttributes.cs")] + public void StringArgumentOnAssembly (ModuleDefinition module) + { + var assembly = module.Assembly; + + var attribute = GetAttribute (assembly, "Foo"); + Assert.IsNotNull (attribute); + + AssertArgument ("bingo", attribute.ConstructorArguments [0]); + } + + [TestCSharp ("CustomAttributes.cs")] + public void CharArray (ModuleDefinition module) + { + var rifle = module.GetType ("Rifle"); + + var attribute = GetAttribute (rifle, "Foo"); + Assert.IsNotNull (attribute); + + var argument = attribute.ConstructorArguments [0]; + + Assert.AreEqual ("System.Char[]", argument.Type.FullName); + + var array = argument.Value as CustomAttributeArgument []; + Assert.IsNotNull (array); + + var str = "cecil"; + + Assert.AreEqual (array.Length, str.Length); + + for (int i = 0; i < str.Length; i++) + AssertArgument (str [i], array [i]); + } + + [TestCSharp ("CustomAttributes.cs")] + public void BoxedArguments (ModuleDefinition module) + { + var worm = module.GetType ("Worm"); + + var attribute = GetAttribute (worm, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (".ctor ((Object:(String:\"2\")), (Object:(I4:2)))", PrettyPrint (attribute)); + } + + [TestCSharp ("CustomAttributes.cs")] + public void BoxedArraysArguments (ModuleDefinition module) + { + var sheep = module.GetType ("Sheep"); + + var attribute = GetAttribute (sheep, "Foo"); + Assert.IsNotNull (attribute); + + // [Foo (new object [] { "2", 2, 'c' }, new object [] { new object [] { 1, 2, 3}, null })] + AssertCustomAttribute (".ctor ((Object:(Object[]:{(Object:(String:\"2\")), (Object:(I4:2)), (Object:(Char:'c'))})), (Object:(Object[]:{(Object:(Object[]:{(Object:(I4:1)), (Object:(I4:2)), (Object:(I4:3))})), (Object:(String:null))})))", attribute); + } + + [TestCSharp ("CustomAttributes.cs")] + public void FieldsAndProperties (ModuleDefinition module) + { + var angola = module.GetType ("Angola"); + + var attribute = GetAttribute (angola, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (2, attribute.Fields.Count); + + var argument = attribute.Fields.Where (a => a.Name == "Pan").First (); + AssertCustomAttributeArgument ("(Object:(Object[]:{(Object:(I4:1)), (Object:(String:\"2\")), (Object:(Char:'3'))}))", argument); + + argument = attribute.Fields.Where (a => a.Name == "PanPan").First (); + AssertCustomAttributeArgument ("(String[]:{(String:\"yo\"), (String:\"yo\")})", argument); + + Assert.AreEqual (2, attribute.Properties.Count); + + argument = attribute.Properties.Where (a => a.Name == "Bang").First (); + AssertArgument (42, argument); + + argument = attribute.Properties.Where (a => a.Name == "Fiou").First (); + AssertArgument (null, argument); + } + + [TestCSharp ("CustomAttributes.cs")] + public void BoxedStringField (ModuleDefinition module) + { + var type = module.GetType ("BoxedStringField"); + + var attribute = GetAttribute (type, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.Fields.Count); + + var argument = attribute.Fields.Where (a => a.Name == "Pan").First (); + AssertCustomAttributeArgument ("(Object:(String:\"fiouuu\"))", argument); + } + + [TestCSharp ("CustomAttributes.cs")] + public void TypeDefinitionEnum (ModuleDefinition module) + { + var zero = module.GetType ("Zero"); + + var attribute = GetAttribute (zero, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + Assert.AreEqual ((short) 2, attribute.ConstructorArguments [0].Value); + Assert.AreEqual ("Bingo", attribute.ConstructorArguments [0].Type.FullName); + } + + [TestCSharp ("CustomAttributes.cs")] + public void TypeReferenceEnum (ModuleDefinition module) + { + var ace = module.GetType ("Ace"); + + var attribute = GetAttribute (ace, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + Assert.AreEqual ((byte) 0x04, attribute.ConstructorArguments [0].Value); + Assert.AreEqual ("System.Security.AccessControl.AceFlags", attribute.ConstructorArguments [0].Type.FullName); + Assert.AreEqual (module, attribute.ConstructorArguments [0].Type.Module); + } + + [TestCSharp ("CustomAttributes.cs")] + public void BoxedEnumReference (ModuleDefinition module) + { + var bzzz = module.GetType ("Bzzz"); + + var attribute = GetAttribute (bzzz, "Foo"); + Assert.IsNotNull (attribute); + + // [Foo (new object [] { Bingo.Fuel, Bingo.Binga }, null, Pan = System.Security.AccessControl.AceFlags.NoPropagateInherit)] + + Assert.AreEqual (2, attribute.ConstructorArguments.Count); + + var argument = attribute.ConstructorArguments [0]; + + AssertCustomAttributeArgument ("(Object:(Object[]:{(Object:(Bingo:2)), (Object:(Bingo:4))}))", argument); + + argument = attribute.ConstructorArguments [1]; + + AssertCustomAttributeArgument ("(Object:(String:null))", argument); + + argument = attribute.Fields.Where (a => a.Name == "Pan").First ().Argument; + + AssertCustomAttributeArgument ("(Object:(System.Security.AccessControl.AceFlags:4))", argument); + } + + [TestCSharp ("CustomAttributes.cs")] + public void TypeOfTypeDefinition (ModuleDefinition module) + { + var typed = module.GetType ("Typed"); + + var attribute = GetAttribute (typed, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + var argument = attribute.ConstructorArguments [0]; + + Assert.AreEqual ("System.Type", argument.Type.FullName); + + var type = argument.Value as TypeDefinition; + Assert.IsNotNull (type); + + Assert.AreEqual ("Bingo", type.FullName); + } + + [TestCSharp ("CustomAttributes.cs")] + public void TypeOfNestedTypeDefinition (ModuleDefinition module) + { + var typed = module.GetType ("NestedTyped"); + + var attribute = GetAttribute (typed, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + var argument = attribute.ConstructorArguments [0]; + + Assert.AreEqual ("System.Type", argument.Type.FullName); + + var type = argument.Value as TypeDefinition; + Assert.IsNotNull (type); + + Assert.AreEqual ("FooAttribute/Token", type.FullName); + } + + [TestCSharp ("CustomAttributes.cs")] + public void FieldTypeOf (ModuleDefinition module) + { + var truc = module.GetType ("Truc"); + + var attribute = GetAttribute (truc, "Foo"); + Assert.IsNotNull (attribute); + + var argument = attribute.Fields.Where (a => a.Name == "Chose").First ().Argument; + + Assert.AreEqual ("System.Type", argument.Type.FullName); + + var type = argument.Value as TypeDefinition; + Assert.IsNotNull (type); + + Assert.AreEqual ("Typed", type.FullName); + } + + [TestCSharp ("CustomAttributes.cs")] + public void FieldNullTypeOf (ModuleDefinition module) + { + var truc = module.GetType ("Machin"); + + var attribute = GetAttribute (truc, "Foo"); + Assert.IsNotNull (attribute); + + var argument = attribute.Fields.Where (a => a.Name == "Chose").First ().Argument; + + Assert.AreEqual ("System.Type", argument.Type.FullName); + + Assert.IsNull (argument.Value); + } + + [TestCSharp ("CustomAttributes.cs")] + public void OpenGenericTypeOf (ModuleDefinition module) + { + var open_generic = module.GetType ("OpenGeneric`2"); + Assert.IsNotNull (open_generic); + + var attribute = GetAttribute (open_generic, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + var argument = attribute.ConstructorArguments [0]; + + Assert.AreEqual ("System.Type", argument.Type.FullName); + + var type = argument.Value as TypeReference; + Assert.IsNotNull (type); + + Assert.AreEqual ("System.Collections.Generic.Dictionary`2", type.FullName); + } + + [TestCSharp ("CustomAttributes.cs")] + public void ClosedGenericTypeOf (ModuleDefinition module) + { + var closed_generic = module.GetType ("ClosedGeneric"); + Assert.IsNotNull (closed_generic); + + var attribute = GetAttribute (closed_generic, "Foo"); + Assert.IsNotNull (attribute); + + Assert.AreEqual (1, attribute.ConstructorArguments.Count); + + var argument = attribute.ConstructorArguments [0]; + + Assert.AreEqual ("System.Type", argument.Type.FullName); + + var type = argument.Value as TypeReference; + Assert.IsNotNull (type); + + Assert.AreEqual ("System.Collections.Generic.Dictionary`2[,]>", type.FullName); + } + + [Test] + public void DefineCustomAttributeFromBlob () + { + var file = Path.Combine (Path.GetTempPath (), "CaBlob.dll"); + + var module = ModuleDefinition.CreateModule ("CaBlob.dll", new ModuleParameters { Kind = ModuleKind.Dll, Runtime = TargetRuntime.Net_2_0 }); + var assembly_title_ctor = module.Import (typeof (System.Reflection.AssemblyTitleAttribute).GetConstructor (new [] {typeof (string)})); + + Assert.IsNotNull (assembly_title_ctor); + + var buffer = new ByteBuffer (); + buffer.WriteUInt16 (1); // ca signature + + var title = Encoding.UTF8.GetBytes ("CaBlob"); + + buffer.WriteCompressedUInt32 ((uint) title.Length); + buffer.WriteBytes (title); + + buffer.WriteUInt16 (0); // named arguments + + var blob = new byte [buffer.length]; + Buffer.BlockCopy (buffer.buffer, 0, blob, 0, buffer.length); + + var attribute = new CustomAttribute (assembly_title_ctor, blob); + module.Assembly.CustomAttributes.Add (attribute); + + module.Write (file); + + module = ModuleDefinition.ReadModule (file); + + attribute = GetAttribute (module.Assembly, "AssemblyTitle"); + + Assert.IsNotNull (attribute); + Assert.AreEqual ("CaBlob", (string) attribute.ConstructorArguments [0].Value); + } + + static void AssertCustomAttribute (string expected, CustomAttribute attribute) + { + Assert.AreEqual (expected, PrettyPrint (attribute)); + } + + static void AssertCustomAttributeArgument (string expected, CustomAttributeNamedArgument named_argument) + { + AssertCustomAttributeArgument (expected, named_argument.Argument); + } + + static void AssertCustomAttributeArgument (string expected, CustomAttributeArgument argument) + { + var result = new StringBuilder (); + PrettyPrint (argument, result); + + Assert.AreEqual (expected, result.ToString ()); + } + + static string PrettyPrint (CustomAttribute attribute) + { + var signature = new StringBuilder (); + signature.Append (".ctor ("); + + for (int i = 0; i < attribute.ConstructorArguments.Count; i++) { + if (i > 0) + signature.Append (", "); + + PrettyPrint (attribute.ConstructorArguments [i], signature); + } + + signature.Append (")"); + return signature.ToString (); + } + + static void PrettyPrint (CustomAttributeArgument argument, StringBuilder signature) + { + var value = argument.Value; + + signature.Append ("("); + + PrettyPrint (argument.Type, signature); + + signature.Append (":"); + + PrettyPrintValue (argument.Value, signature); + + signature.Append (")"); + } + + static void PrettyPrintValue (object value, StringBuilder signature) + { + if (value == null) { + signature.Append ("null"); + return; + } + + var arguments = value as CustomAttributeArgument []; + if (arguments != null) { + signature.Append ("{"); + for (int i = 0; i < arguments.Length; i++) { + if (i > 0) + signature.Append (", "); + + PrettyPrint (arguments [i], signature); + } + signature.Append ("}"); + + return; + } + + switch (Type.GetTypeCode (value.GetType ())) { + case TypeCode.String: + signature.AppendFormat ("\"{0}\"", value); + break; + case TypeCode.Char: + signature.AppendFormat ("'{0}'", (char) value); + break; + default: + var formattable = value as IFormattable; + if (formattable != null) { + signature.Append (formattable.ToString (null, CultureInfo.InvariantCulture)); + return; + } + + if (value is CustomAttributeArgument) { + PrettyPrint ((CustomAttributeArgument) value, signature); + return; + } + break; + } + } + + static void PrettyPrint (TypeReference type, StringBuilder signature) + { + if (type.IsArray) { + ArrayType array = (ArrayType) type; + signature.AppendFormat ("{0}[]", array.ElementType.etype.ToString ()); + } else if (type.etype == ElementType.None) { + signature.Append (type.FullName); + } else + signature.Append (type.etype.ToString ()); + } + + static void AssertArgument (T value, CustomAttributeNamedArgument named_argument) + { + AssertArgument (value, named_argument.Argument); + } + + static void AssertArgument (T value, CustomAttributeArgument argument) + { + AssertArgument (typeof (T).FullName, (object) value, argument); + } + + static void AssertArgument (string type, object value, CustomAttributeArgument argument) + { + Assert.AreEqual (type, argument.Type.FullName); + Assert.AreEqual (value, argument.Value); + } + + static CustomAttribute GetAttribute (ICustomAttributeProvider owner, string type) + { + Assert.IsTrue (owner.HasCustomAttributes); + + foreach (var attribute in owner.CustomAttributes) + if (attribute.Constructor.DeclaringType.Name.StartsWith (type)) + return attribute; + + return null; + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/EventTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/EventTests.cs new file mode 100644 index 0000000000..15a599c58b --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/EventTests.cs @@ -0,0 +1,66 @@ +using System; + +using Mono.Cecil; +using Mono.Cecil.Metadata; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class EventTests : BaseTestFixture { + + [TestCSharp ("Events.cs")] + public void AbstractMethod (ModuleDefinition module) + { + var type = module.GetType ("Foo"); + + Assert.IsTrue (type.HasEvents); + + var events = type.Events; + + Assert.AreEqual (1, events.Count); + + var @event = events [0]; + + Assert.IsNotNull (@event); + Assert.AreEqual ("Bar", @event.Name); + Assert.IsNotNull (@event.EventType); + Assert.AreEqual ("Pan", @event.EventType.FullName); + + Assert.IsNotNull (@event.AddMethod); + Assert.AreEqual (MethodSemanticsAttributes.AddOn, @event.AddMethod.SemanticsAttributes); + Assert.IsNotNull (@event.RemoveMethod); + Assert.AreEqual (MethodSemanticsAttributes.RemoveOn, @event.RemoveMethod.SemanticsAttributes); + } + + [TestIL ("others.il")] + public void OtherMethod (ModuleDefinition module) + { + var type = module.GetType ("Others"); + + Assert.IsTrue (type.HasEvents); + + var events = type.Events; + + Assert.AreEqual (1, events.Count); + + var @event = events [0]; + + Assert.IsNotNull (@event); + Assert.AreEqual ("Handler", @event.Name); + Assert.IsNotNull (@event.EventType); + Assert.AreEqual ("System.EventHandler", @event.EventType.FullName); + + Assert.IsTrue (@event.HasOtherMethods); + + Assert.AreEqual (2, @event.OtherMethods.Count); + + var other = @event.OtherMethods [0]; + Assert.AreEqual ("dang_Handler", other.Name); + + other = @event.OtherMethods [1]; + Assert.AreEqual ("fang_Handler", other.Name); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Extensions.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Extensions.cs new file mode 100644 index 0000000000..0788d21bc5 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Extensions.cs @@ -0,0 +1,92 @@ +using System; +using System.Linq; +using SR = System.Reflection; + +using Mono.Cecil; + +namespace Mono.Cecil.Tests { + + public static class Extensions { + + public static MethodDefinition GetMethod (this TypeDefinition self, string name) + { + return self.Methods.Where (m => m.Name == name).First (); + } + + public static FieldDefinition GetField (this TypeDefinition self, string name) + { + return self.Fields.Where (f => f.Name == name).First (); + } + + public static TypeDefinition ToDefinition (this Type self) + { + var module = ModuleDefinition.ReadModule (self.Module.FullyQualifiedName); + return (TypeDefinition) module.LookupToken (self.MetadataToken); + } + + public static MethodDefinition ToDefinition (this SR.MethodBase method) + { + var declaring_type = method.DeclaringType.ToDefinition (); + return (MethodDefinition) declaring_type.Module.LookupToken (method.MetadataToken); + } + + public static FieldDefinition ToDefinition (this SR.FieldInfo field) + { + var declaring_type = field.DeclaringType.ToDefinition (); + return (FieldDefinition) declaring_type.Module.LookupToken (field.MetadataToken); + } + + public static TypeReference MakeGenericType (this TypeReference self, params TypeReference [] arguments) + { + if (self.GenericParameters.Count != arguments.Length) + throw new ArgumentException (); + + var instance = new GenericInstanceType (self); + foreach (var argument in arguments) + instance.GenericArguments.Add (argument); + + return instance; + } + + public static MethodReference MakeGenericMethod (this MethodReference self, params TypeReference [] arguments) + { + if (self.GenericParameters.Count != arguments.Length) + throw new ArgumentException (); + + var instance = new GenericInstanceMethod (self); + foreach (var argument in arguments) + instance.GenericArguments.Add (argument); + + return instance; + } + + public static MethodReference MakeGeneric (this MethodReference self, params TypeReference [] arguments) + { + var reference = new MethodReference { + Name = self.Name, + DeclaringType = self.DeclaringType.MakeGenericType (arguments), + HasThis = self.HasThis, + ExplicitThis = self.ExplicitThis, + ReturnType = self.ReturnType, + CallingConvention = self.CallingConvention, + }; + + foreach (var parameter in self.Parameters) + reference.Parameters.Add (new ParameterDefinition (parameter.ParameterType)); + + foreach (var generic_parameter in self.GenericParameters) + reference.GenericParameters.Add (new GenericParameter (generic_parameter.Name, reference)); + + return reference; + } + + public static FieldReference MakeGeneric (this FieldReference self, params TypeReference [] arguments) + { + return new FieldReference { + Name = self.Name, + DeclaringType = self.DeclaringType.MakeGenericType (arguments), + FieldType = self.FieldType, + }; + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs new file mode 100644 index 0000000000..9596a7bc62 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/FieldTests.cs @@ -0,0 +1,333 @@ +using System; + +using Mono.Cecil; +using Mono.Cecil.Metadata; +using Mono.Cecil.PE; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class FieldTests : BaseTestFixture { + + [TestCSharp ("Fields.cs")] + public void TypeDefField (ModuleDefinition module) + { + var type = module.Types [1]; + Assert.AreEqual ("Foo", type.Name); + Assert.AreEqual (1, type.Fields.Count); + + var field = type.Fields [0]; + Assert.AreEqual ("bar", field.Name); + Assert.AreEqual (1, field.MetadataToken.RID); + Assert.IsNotNull (field.FieldType); + Assert.AreEqual ("Bar", field.FieldType.FullName); + Assert.AreEqual (TokenType.Field, field.MetadataToken.TokenType); + Assert.IsFalse (field.HasConstant); + Assert.IsNull (field.Constant); + } + + [TestCSharp ("Fields.cs")] + public void PrimitiveTypes (ModuleDefinition module) + { + var type = module.GetType ("Baz"); + + AssertField (type, "char", typeof (char)); + AssertField (type, "bool", typeof (bool)); + AssertField (type, "sbyte", typeof (sbyte)); + AssertField (type, "byte", typeof (byte)); + AssertField (type, "int16", typeof (short)); + AssertField (type, "uint16", typeof (ushort)); + AssertField (type, "int32", typeof (int)); + AssertField (type, "uint32", typeof (uint)); + AssertField (type, "int64", typeof (long)); + AssertField (type, "uint64", typeof (ulong)); + AssertField (type, "single", typeof (float)); + AssertField (type, "double", typeof (double)); + AssertField (type, "string", typeof (string)); + AssertField (type, "object", typeof (object)); + } + + [TestCSharp ("Fields.cs")] + public void VolatileField (ModuleDefinition module) + { + var type = module.GetType ("Bar"); + + Assert.IsTrue (type.HasFields); + Assert.AreEqual (1, type.Fields.Count); + + var field = type.Fields [0]; + + Assert.AreEqual ("oiseau", field.Name); + Assert.AreEqual ("System.Int32 modreq(System.Runtime.CompilerServices.IsVolatile)", field.FieldType.FullName); + + Assert.IsFalse (field.HasConstant); + } + + [TestCSharp ("Layouts.cs")] + public void FieldLayout (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + Assert.IsNotNull (foo); + + Assert.IsTrue (foo.HasFields); + + var fields = foo.Fields; + + var field = fields [0]; + + Assert.AreEqual ("Bar", field.Name); + Assert.IsTrue (field.HasLayoutInfo); + Assert.AreEqual (0, field.Offset); + + field = fields [1]; + + Assert.AreEqual ("Baz", field.Name); + Assert.IsTrue (field.HasLayoutInfo); + Assert.AreEqual (2, field.Offset); + + field = fields [2]; + + Assert.AreEqual ("Gazonk", field.Name); + Assert.IsTrue (field.HasLayoutInfo); + Assert.AreEqual (4, field.Offset); + } + + [TestCSharp ("Layouts.cs")] + public void FieldRVA (ModuleDefinition module) + { + var priv_impl = GetPrivateImplementationType (module); + Assert.IsNotNull (priv_impl); + + Assert.AreEqual (1, priv_impl.Fields.Count); + + var field = priv_impl.Fields [0]; + + Assert.IsNotNull (field); + Assert.AreNotEqual (0, field.RVA); + Assert.IsNotNull (field.InitialValue); + Assert.AreEqual (16, field.InitialValue.Length); + + var buffer = new ByteBuffer (field.InitialValue); + + Assert.AreEqual (1, buffer.ReadUInt32 ()); + Assert.AreEqual (2, buffer.ReadUInt32 ()); + Assert.AreEqual (3, buffer.ReadUInt32 ()); + Assert.AreEqual (4, buffer.ReadUInt32 ()); + } + + [TestCSharp ("Generics.cs")] + public void GenericFieldDefinition (ModuleDefinition module) + { + var bar = module.GetType ("Bar`1"); + Assert.IsNotNull (bar); + + Assert.IsTrue (bar.HasGenericParameters); + var t = bar.GenericParameters [0]; + + Assert.AreEqual ("T", t.Name); + Assert.AreEqual (t.Owner, bar); + + var bang = bar.GetField ("bang"); + + Assert.IsNotNull (bang); + + Assert.AreEqual (t, bang.FieldType); + } + + [TestIL ("types.il")] + public void ArrayFields (ModuleDefinition module) + { + var types = module.GetType ("Types"); + Assert.IsNotNull (types); + + var rank_two = types.GetField ("rank_two"); + + var array = rank_two.FieldType as ArrayType; + Assert.IsNotNull (array); + + Assert.AreEqual (2, array.Rank); + Assert.IsFalse (array.Dimensions [0].IsSized); + Assert.IsFalse (array.Dimensions [1].IsSized); + + var rank_two_low_bound_zero = types.GetField ("rank_two_low_bound_zero"); + + array = rank_two_low_bound_zero.FieldType as ArrayType; + Assert.IsNotNull (array); + + Assert.AreEqual (2, array.Rank); + Assert.IsTrue (array.Dimensions [0].IsSized); + Assert.AreEqual (0, array.Dimensions [0].LowerBound); + Assert.AreEqual (null, array.Dimensions [0].UpperBound); + 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")] + public void EnumFieldsConstant (ModuleDefinition module) + { + var pim = module.GetType ("Pim"); + Assert.IsNotNull (pim); + + var field = pim.GetField ("Pam"); + Assert.IsTrue (field.HasConstant); + Assert.AreEqual (1, (int) field.Constant); + + field = pim.GetField ("Poum"); + Assert.AreEqual (2, (int) field.Constant); + } + + [TestCSharp ("Fields.cs")] + public void StringAndClassConstant (ModuleDefinition module) + { + var panpan = module.GetType ("PanPan"); + Assert.IsNotNull (panpan); + + var field = panpan.GetField ("Peter"); + Assert.IsTrue (field.HasConstant); + Assert.IsNull (field.Constant); + + field = panpan.GetField ("QQ"); + Assert.AreEqual ("qq", (string) field.Constant); + + field = panpan.GetField ("nil"); + Assert.AreEqual (null, (string) field.Constant); + } + + [TestCSharp ("Fields.cs")] + public void ObjectConstant (ModuleDefinition module) + { + var panpan = module.GetType ("PanPan"); + Assert.IsNotNull (panpan); + + var field = panpan.GetField ("obj"); + Assert.IsTrue (field.HasConstant); + Assert.IsNull (field.Constant); + } + + [TestIL ("types.il")] + public void NullPrimitiveConstant (ModuleDefinition module) + { + var fields = module.GetType ("Fields"); + + var field = fields.GetField ("int32_nullref"); + Assert.IsTrue (field.HasConstant); + Assert.AreEqual (null, field.Constant); + } + + [TestCSharp ("Fields.cs")] + public void ArrayConstant (ModuleDefinition module) + { + var panpan = module.GetType ("PanPan"); + Assert.IsNotNull (panpan); + + var field = panpan.GetField ("ints"); + Assert.IsTrue (field.HasConstant); + Assert.IsNull (field.Constant); + } + + [TestIL ("types.il")] + public void ConstantCoalescing (ModuleDefinition module) + { + var fields = module.GetType ("Fields"); + + var field = fields.GetField ("int32_int16"); + Assert.AreEqual ("System.Int32", field.FieldType.FullName); + Assert.IsTrue (field.HasConstant); + Assert.IsInstanceOfType (typeof (short), field.Constant); + Assert.AreEqual ((short) 1, field.Constant); + + field = fields.GetField ("int16_int32"); + Assert.AreEqual ("System.Int16", field.FieldType.FullName); + Assert.IsTrue (field.HasConstant); + Assert.IsInstanceOfType (typeof (int), field.Constant); + Assert.AreEqual (1, field.Constant); + + field = fields.GetField ("char_int16"); + Assert.AreEqual ("System.Char", field.FieldType.FullName); + Assert.IsTrue (field.HasConstant); + Assert.IsInstanceOfType (typeof (short), field.Constant); + Assert.AreEqual ((short) 1, field.Constant); + + field = fields.GetField ("int16_char"); + Assert.AreEqual ("System.Int16", field.FieldType.FullName); + Assert.IsTrue (field.HasConstant); + Assert.IsInstanceOfType (typeof (char), field.Constant); + Assert.AreEqual ('s', field.Constant); + } + + [TestCSharp ("Generics.cs")] + public void NestedEnumOfGenericTypeDefinition (ModuleDefinition module) + { + var dang = module.GetType ("Bongo`1/Dang"); + Assert.IsNotNull (dang); + + var field = dang.GetField ("Ding"); + Assert.IsNotNull (field); + Assert.AreEqual (2, field.Constant); + + field = dang.GetField ("Dong"); + Assert.IsNotNull (field); + Assert.AreEqual (12, field.Constant); + } + + [TestModule ("marshal.dll")] + public void MarshalAsFixedStr (ModuleDefinition module) + { + var boc = module.GetType ("Boc"); + var field = boc.GetField ("a"); + + Assert.IsNotNull (field); + + Assert.IsTrue (field.HasMarshalInfo); + + var info = (FixedSysStringMarshalInfo) field.MarshalInfo; + + Assert.AreEqual (42, info.Size); + } + + [TestModule ("marshal.dll")] + public void MarshalAsFixedArray (ModuleDefinition module) + { + var boc = module.GetType ("Boc"); + var field = boc.GetField ("b"); + + Assert.IsNotNull (field); + + Assert.IsTrue (field.HasMarshalInfo); + + var info = (FixedArrayMarshalInfo) field.MarshalInfo; + + Assert.AreEqual (12, info.Size); + Assert.AreEqual (NativeType.Boolean, info.ElementType); + } + + static TypeDefinition GetPrivateImplementationType (ModuleDefinition module) + { + foreach (var type in module.Types) + if (type.FullName.Contains ("")) + return type; + + return null; + } + + static void AssertField (TypeDefinition type, string name, Type expected) + { + var field = type.GetField (name); + Assert.IsNotNull (field, name); + + Assert.AreEqual (expected.FullName, field.FieldType.FullName); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Formatter.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Formatter.cs new file mode 100644 index 0000000000..967896ce8e --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Formatter.cs @@ -0,0 +1,173 @@ +using System; +using System.IO; +using Mono.Cecil; +using Mono.Cecil.Cil; + +namespace Mono.Cecil.Tests { + + public static class Formatter { + + public static string FormatInstruction (Instruction instruction) + { + var writer = new StringWriter (); + WriteInstruction (writer, instruction); + return writer.ToString (); + } + + public static string FormatMethodBody (MethodDefinition method) + { + var writer = new StringWriter (); + WriteMethodBody (writer, method); + return writer.ToString (); + } + + public static void WriteMethodBody (TextWriter writer, MethodDefinition method) + { + var body = method.Body; + + WriteVariables (writer, body); + + foreach (Instruction instruction in body.Instructions) { + var sequence_point = instruction.SequencePoint; + if (sequence_point != null) { + writer.Write ('\t'); + WriteSequencePoint (writer, sequence_point); + writer.WriteLine (); + } + + writer.Write ('\t'); + WriteInstruction (writer, instruction); + writer.WriteLine (); + } + + WriteExceptionHandlers (writer, body); + } + + static void WriteVariables (TextWriter writer, MethodBody body) + { + var variables = body.Variables; + + writer.Write ('\t'); + writer.Write (".locals {0}(", body.InitLocals ? "init " : string.Empty); + + for (int i = 0; i < variables.Count; i++) { + if (i > 0) + writer.Write (", "); + + var variable = variables [i]; + + writer.Write ("{0} {1}", variable.VariableType, variable); + } + writer.WriteLine (")"); + } + + static void WriteInstruction (TextWriter writer, Instruction instruction) + { + writer.Write (FormatLabel (instruction.Offset)); + writer.Write (": "); + writer.Write (instruction.OpCode.Name); + if (null != instruction.Operand) { + writer.Write (' '); + WriteOperand (writer, instruction.Operand); + } + } + + static void WriteSequencePoint (TextWriter writer, SequencePoint sequence_point) + { + writer.Write (".line {0},{1}:{2},{3} '{4}'", + sequence_point.StartLine, + sequence_point.EndLine, + sequence_point.StartColumn, + sequence_point.EndColumn, + sequence_point.Document.Url); + } + + static string FormatLabel (int offset) + { + string label = "000" + offset.ToString ("x"); + return "IL_" + label.Substring (label.Length - 4); + } + + static string FormatLabel (Instruction instruction) + { + return FormatLabel (instruction.Offset); + } + + static void WriteOperand (TextWriter writer, object operand) + { + if (null == operand) throw new ArgumentNullException ("operand"); + + var target = operand as Instruction; + if (null != target) { + writer.Write (FormatLabel (target.Offset)); + return; + } + + var targets = operand as Instruction []; + if (null != targets) { + WriteLabelList (writer, targets); + return; + } + + string s = operand as string; + if (null != s) { + writer.Write ("\"" + s + "\""); + return; + } + + s = ToInvariantCultureString (operand); + writer.Write (s); + } + + static void WriteLabelList (TextWriter writer, Instruction [] instructions) + { + writer.Write ("("); + + for (int i = 0; i < instructions.Length; i++) { + if (i != 0) writer.Write (", "); + writer.Write (FormatLabel (instructions [i].Offset)); + } + + writer.Write (")"); + } + + static void WriteExceptionHandlers (TextWriter writer, MethodBody body) + { + if (!body.HasExceptionHandlers) + return; + + foreach (var handler in body.ExceptionHandlers) { + writer.Write ("\t"); + writer.WriteLine (".try {0} to {1} {2} handler {3} to {4}", + FormatLabel (handler.TryStart), + FormatLabel (handler.TryEnd), + FormatHandlerType (handler), + FormatLabel (handler.HandlerStart), + FormatLabel (handler.HandlerEnd)); + } + } + + static string FormatHandlerType (ExceptionHandler handler) + { + var handler_type = handler.HandlerType; + var type = handler_type.ToString ().ToLowerInvariant (); + + switch (handler_type) { + case ExceptionHandlerType.Catch: + return string.Format ("{0} {1}", type, handler.CatchType.FullName); + case ExceptionHandlerType.Filter: + throw new NotImplementedException (); + default: + return type; + } + } + + public static string ToInvariantCultureString (object value) + { + var convertible = value as IConvertible; + return (null != convertible) + ? convertible.ToString (System.Globalization.CultureInfo.InvariantCulture) + : value.ToString (); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ILProcessorTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ILProcessorTests.cs new file mode 100644 index 0000000000..3d9d1751b2 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ILProcessorTests.cs @@ -0,0 +1,79 @@ +using System; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ILProcessorTests : BaseTestFixture { + + [Test] + public void Append () + { + var method = CreateTestMethod (); + var il = method.GetILProcessor (); + + var ret = il.Create (OpCodes.Ret); + il.Append (ret); + + AssertOpCodeSequence (new [] { OpCodes.Ret }, method); + } + + [Test] + public void InsertBefore () + { + var method = CreateTestMethod (OpCodes.Ldloc_0, OpCodes.Ldloc_2, OpCodes.Ldloc_3); + var il = method.GetILProcessor (); + + var ldloc_2 = method.Instructions.Where (i => i.OpCode == OpCodes.Ldloc_2).First (); + + il.InsertBefore ( + ldloc_2, + il.Create (OpCodes.Ldloc_1)); + + AssertOpCodeSequence (new [] { OpCodes.Ldloc_0, OpCodes.Ldloc_1, OpCodes.Ldloc_2, OpCodes.Ldloc_3 }, method); + } + + [Test] + public void InsertAfter () + { + var method = CreateTestMethod (OpCodes.Ldloc_0, OpCodes.Ldloc_2, OpCodes.Ldloc_3); + var il = method.GetILProcessor (); + + var ldloc_0 = method.Instructions.First (); + + il.InsertAfter ( + ldloc_0, + il.Create (OpCodes.Ldloc_1)); + + AssertOpCodeSequence (new [] { OpCodes.Ldloc_0, OpCodes.Ldloc_1, OpCodes.Ldloc_2, OpCodes.Ldloc_3 }, method); + } + + static void AssertOpCodeSequence (OpCode [] expected, MethodBody body) + { + var opcodes = body.Instructions.Select (i => i.OpCode).ToArray (); + Assert.AreEqual (expected.Length, opcodes.Length); + + for (int i = 0; i < opcodes.Length; i++) + Assert.AreEqual (expected [i], opcodes [i]); + } + + static MethodBody CreateTestMethod (params OpCode [] opcodes) + { + var method = new MethodDefinition { + Name = "function", + }; + + var il = method.Body.GetILProcessor (); + + foreach (var opcode in opcodes) + il.Emit (opcode); + + return method.Body; + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs new file mode 100644 index 0000000000..c601fc986c --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImageReadTests.cs @@ -0,0 +1,127 @@ +using System; +using System.IO; + +using Mono.Cecil; +using Mono.Cecil.PE; +using Mono.Cecil.Metadata; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ImageReadTests : BaseTestFixture { + + [Test] + public void ImageSections () + { + var image = GetResourceImage ("hello.exe"); + + Assert.AreEqual (3, image.Sections.Length); + Assert.AreEqual (".text", image.Sections [0].Name); + Assert.AreEqual (".rsrc", image.Sections [1].Name); + Assert.AreEqual (".reloc", image.Sections [2].Name); + } + + [Test] + public void ImageMetadataVersion () + { + var image = GetResourceImage ("hello.exe"); + Assert.AreEqual (TargetRuntime.Net_2_0, image.Runtime); + + image = GetResourceImage ("hello1.exe"); + Assert.AreEqual (TargetRuntime.Net_1_1, image.Runtime); + } + + [Test] + public void ImageModuleKind () + { + var image = GetResourceImage ("hello.exe"); + Assert.AreEqual (ModuleKind.Console, image.Kind); + + image = GetResourceImage ("libhello.dll"); + Assert.AreEqual (ModuleKind.Dll, image.Kind); + + image = GetResourceImage ("hellow.exe"); + Assert.AreEqual (ModuleKind.Windows, image.Kind); + } + + [Test] + public void MetadataHeaps () + { + var image = GetResourceImage ("hello.exe"); + + Assert.IsNotNull (image.TableHeap); + + Assert.IsNotNull (image.StringHeap); + Assert.AreEqual (string.Empty, image.StringHeap.Read (0)); + Assert.AreEqual ("", image.StringHeap.Read (1)); + + Assert.IsNotNull (image.UserStringHeap); + Assert.AreEqual (string.Empty, image.UserStringHeap.Read (0)); + Assert.AreEqual ("Hello Cecil World !", image.UserStringHeap.Read (1)); + + Assert.IsNotNull (image.GuidHeap); + Assert.AreEqual (new Guid (), image.GuidHeap.Read (0)); + Assert.AreEqual (new Guid ("C3BC2BD3-2576-4D00-A80E-465B5632415F"), image.GuidHeap.Read (1)); + + Assert.IsNotNull (image.BlobHeap); + Assert.AreEqual (new byte [0], image.BlobHeap.Read (0)); + } + + [Test] + public void TablesHeap () + { + var image = GetResourceImage ("hello.exe"); + var heap = image.TableHeap; + + Assert.IsNotNull (heap); + + Assert.AreEqual (1, heap [Table.Module].Length); + Assert.AreEqual (4, heap [Table.TypeRef].Length); + Assert.AreEqual (2, heap [Table.TypeDef].Length); + Assert.AreEqual (0, heap [Table.Field].Length); + Assert.AreEqual (2, heap [Table.Method].Length); + Assert.AreEqual (4, heap [Table.MemberRef].Length); + Assert.AreEqual (2, heap [Table.CustomAttribute].Length); + Assert.AreEqual (1, heap [Table.Assembly].Length); + Assert.AreEqual (1, heap [Table.AssemblyRef].Length); + } + + [Test] + public void ReadX64Image () + { + var image = GetResourceImage ("hello.x64.exe"); + + Assert.AreEqual (TargetArchitecture.AMD64, image.Architecture); + Assert.AreEqual (ModuleAttributes.ILOnly, image.Attributes); + } + + [Test] + public void ReadIA64Image () + { + var image = GetResourceImage ("hello.ia64.exe"); + + Assert.AreEqual (TargetArchitecture.IA64, image.Architecture); + Assert.AreEqual (ModuleAttributes.ILOnly, image.Attributes); + } + + [Test] + public void ReadX86Image () + { + var image = GetResourceImage ("hello.x86.exe"); + + Assert.AreEqual (TargetArchitecture.I386, image.Architecture); + Assert.AreEqual (ModuleAttributes.ILOnly | ModuleAttributes.Required32Bit, image.Attributes); + } + + [Test] + public void ReadAnyCpuImage () + { + var image = GetResourceImage ("hello.anycpu.exe"); + + Assert.AreEqual (TargetArchitecture.I386, image.Architecture); + Assert.AreEqual (ModuleAttributes.ILOnly, image.Attributes); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs new file mode 100644 index 0000000000..3fa04068eb --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportCecilTests.cs @@ -0,0 +1,310 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using SR = System.Reflection; +using System.Runtime.CompilerServices; + +using Mono.Cecil.Cil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ImportCecilTests : BaseTestFixture { + + [Test] + public void ImportStringByRef () + { + var get_string = Compile> ((module, body) => { + var type = module.Types [1]; + + var method_by_ref = new MethodDefinition { + Name = "ModifyString", + IsPrivate = true, + IsStatic = true, + }; + + type.Methods.Add (method_by_ref); + + method_by_ref.MethodReturnType.ReturnType = module.Import (typeof (void).ToDefinition ()); + + method_by_ref.Parameters.Add (new ParameterDefinition (module.Import (typeof (string).ToDefinition ()))); + method_by_ref.Parameters.Add (new ParameterDefinition (module.Import (new ByReferenceType (typeof (string).ToDefinition ())))); + + var m_il = method_by_ref.Body.GetILProcessor (); + m_il.Emit (OpCodes.Ldarg_1); + m_il.Emit (OpCodes.Ldarg_0); + m_il.Emit (OpCodes.Stind_Ref); + m_il.Emit (OpCodes.Ret); + + var v_0 = new VariableDefinition (module.Import (typeof (string).ToDefinition ())); + body.Variables.Add (v_0); + + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Stloc, v_0); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldloca, v_0); + il.Emit (OpCodes.Call, method_by_ref); + il.Emit (OpCodes.Ldloc_0); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("foo", get_string ("foo")); + } + + [Test] + public void ImportStringArray () + { + var identity = Compile> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ret); + }); + + var array = new string [2, 2]; + + Assert.AreEqual (array, identity (array)); + } + + [Test] + public void ImportFieldStringEmpty () + { + var get_empty = Compile> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldsfld, module.Import (typeof (string).GetField ("Empty").ToDefinition ())); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("", get_empty ()); + } + + [Test] + public void ImportStringConcat () + { + var concat = Compile> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Call, module.Import (typeof (string).GetMethod ("Concat", new [] { typeof (string), typeof (string) }).ToDefinition ())); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("FooBar", concat ("Foo", "Bar")); + } + + public class Generic { + public T Field; + + public T Method (T t) + { + return t; + } + + public TS GenericMethod (T t, TS s) + { + return s; + } + + public Generic ComplexGenericMethod (T t, TS s) + { + return new Generic { Field = s }; + } + } + + [Test] + public void ImportGenericField () + { + var get_field = Compile, string>> ((module, body) => { + var generic_def = module.Import (typeof (Generic<>)).Resolve (); + var field_def = generic_def.Fields.Where (f => f.Name == "Field").First (); + + var field_string = field_def.MakeGeneric (module.Import (typeof (string))); + + var field_ref = module.Import (field_string); + + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldfld, field_ref); + il.Emit (OpCodes.Ret); + }); + + var generic = new Generic { + Field = "foo", + }; + + Assert.AreEqual ("foo", get_field (generic)); + } + + [Test] + public void ImportGenericMethod () + { + var generic_identity = Compile, int, int>> ((module, body) => { + var generic_def = module.Import (typeof (Generic<>)).Resolve (); + var method_def = generic_def.Methods.Where (m => m.Name == "Method").First (); + + var method_int = method_def.MakeGeneric (module.Import (typeof (int))); + var method_ref = module.Import (method_int); + + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Callvirt, method_ref); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, generic_identity (new Generic (), 42)); + } + + [Test] + public void ImportGenericMethodSpec () + { + var gen_spec_id = Compile, int, int>> ((module, body) => { + var generic_def = module.Import (typeof (Generic<>)).Resolve (); + var method_def = generic_def.Methods.Where (m => m.Name == "GenericMethod").First (); + + var method_string = method_def.MakeGeneric (module.Import (typeof (string))); + + var method_instance = method_string.MakeGenericMethod (module.Import (typeof (int))); + + var method_ref = module.Import (method_instance); + + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Callvirt, method_ref); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, gen_spec_id (new Generic (), 42)); + } + + [Test] + public void ImportComplexGenericMethodSpec () + { + var gen_spec_id = Compile, int, int>> ((module, body) => { + var generic_def = module.Import (typeof (Generic<>)).Resolve (); + var method_def = generic_def.Methods.Where (m => m.Name == "ComplexGenericMethod").First (); + + var method_string = method_def.MakeGeneric (module.Import (typeof (string))); + var method_instance = method_string.MakeGenericMethod (module.Import (typeof (int))); + var method_ref = module.Import (method_instance); + + var field_def = generic_def.Fields.Where (f => f.Name == "Field").First (); + var field_int = field_def.MakeGeneric (module.Import (typeof (int))); + var field_ref = module.Import (field_int); + + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Callvirt, method_ref); + il.Emit (OpCodes.Ldfld, field_ref); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, gen_spec_id (new Generic (), 42)); + } + + [Test] + public void ImportMethodOnOpenGeneric () + { + var generic = typeof (Generic<>).ToDefinition (); + var module = ModuleDefinition.CreateModule ("foo", ModuleKind.Dll); + + var method = module.Import (generic.GetMethod ("Method")); + + Assert.AreEqual ("T Mono.Cecil.Tests.ImportCecilTests/Generic`1::Method(T)", method.FullName); + } + + delegate void Emitter (ModuleDefinition module, MethodBody body); + + [MethodImpl (MethodImplOptions.NoInlining)] + static TDelegate Compile (Emitter emitter) + where TDelegate : class + { + var name = GetTestCaseName (); + + var module = CreateTestModule (name, emitter); + var assembly = LoadTestModule (module); + + return CreateRunDelegate (GetTestCase (name, assembly)); + } + + static TDelegate CreateRunDelegate (Type type) + where TDelegate : class + { + return (TDelegate) (object) Delegate.CreateDelegate (typeof (TDelegate), type.GetMethod ("Run")); + } + + static Type GetTestCase (string name, SR.Assembly assembly) + { + return assembly.GetType (name); + } + + static SR.Assembly LoadTestModule (ModuleDefinition module) + { + using (var stream = new MemoryStream ()) { + module.Write (stream); + File.WriteAllBytes (Path.Combine (Path.Combine (Path.GetTempPath (), "cecil"), module.Name + ".dll"), stream.ToArray ()); + return SR.Assembly.Load (stream.ToArray ()); + } + } + + static ModuleDefinition CreateTestModule (string name, Emitter emitter) + { + var module = CreateModule (name); + + var type = new TypeDefinition ( + "", + name, + TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract, + module.Import (typeof (object))); + + module.Types.Add (type); + + var method = CreateMethod (type, typeof (TDelegate).GetMethod ("Invoke")); + + emitter (module, method.Body); + + return module; + } + + static MethodDefinition CreateMethod (TypeDefinition type, SR.MethodInfo pattern) + { + var module = type.Module; + + var method = new MethodDefinition { + Name = "Run", + IsPublic = true, + IsStatic = true, + }; + + type.Methods.Add (method); + + method.MethodReturnType.ReturnType = module.Import (pattern.ReturnType); + + foreach (var parameter_pattern in pattern.GetParameters ()) + method.Parameters.Add (new ParameterDefinition (module.Import (parameter_pattern.ParameterType))); + + return method; + } + + static ModuleDefinition CreateModule (string name) + { + return ModuleDefinition.CreateModule (name, ModuleKind.Dll); + } + + [MethodImpl (MethodImplOptions.NoInlining)] + static string GetTestCaseName () + { + var stack_trace = new StackTrace (); + var stack_frame = stack_trace.GetFrame (2); + + return "ImportCecil_" + stack_frame.GetMethod ().Name; + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs new file mode 100644 index 0000000000..dd1d28a121 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ImportReflectionTests.cs @@ -0,0 +1,409 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using SR = System.Reflection; +using System.Runtime.CompilerServices; + +using Mono.Cecil.Cil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ImportReflectionTests : BaseTestFixture { + + [Test] + public void ImportString () + { + var get_string = Compile> ((_, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldstr, "yo dawg!"); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("yo dawg!", get_string ()); + } + + [Test] + public void ImportInt () + { + var add = Compile> ((_, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Add); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, add (40, 2)); + } + + [Test] + public void ImportStringByRef () + { + var get_string = Compile> ((module, body) => { + var type = module.Types [1]; + + var method_by_ref = new MethodDefinition { + Name = "ModifyString", + IsPrivate = true, + IsStatic = true, + }; + + type.Methods.Add (method_by_ref); + + method_by_ref.MethodReturnType.ReturnType = module.Import (typeof (void)); + + method_by_ref.Parameters.Add (new ParameterDefinition (module.Import (typeof (string)))); + method_by_ref.Parameters.Add (new ParameterDefinition (module.Import (typeof (string).MakeByRefType ()))); + + var m_il = method_by_ref.Body.GetILProcessor (); + m_il.Emit (OpCodes.Ldarg_1); + m_il.Emit (OpCodes.Ldarg_0); + m_il.Emit (OpCodes.Stind_Ref); + m_il.Emit (OpCodes.Ret); + + var v_0 = new VariableDefinition (module.Import (typeof (string))); + body.Variables.Add (v_0); + + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Stloc, v_0); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldloca, v_0); + il.Emit (OpCodes.Call, method_by_ref); + il.Emit (OpCodes.Ldloc_0); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("foo", get_string ("foo")); + } + + [Test] + public void ImportStringArray () + { + var identity = Compile> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ret); + }); + + var array = new string [2, 2]; + + Assert.AreEqual (array, identity (array)); + } + + [Test] + public void ImportFieldStringEmpty () + { + var get_empty = Compile> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldsfld, module.Import (typeof (string).GetField ("Empty"))); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("", get_empty ()); + } + + [Test] + public void ImportStringConcat () + { + var concat = Compile> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Call, module.Import (typeof (string).GetMethod ("Concat", new [] { typeof (string), typeof (string) }))); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual ("FooBar", concat ("Foo", "Bar")); + } + + public class Generic { + public T Field; + + public T Method (T t) + { + return t; + } + + public TS GenericMethod (T t, TS s) + { + return s; + } + + public Generic ComplexGenericMethod (T t, TS s) + { + return new Generic { Field = s }; + } + } + + [Test] + public void ImportGenericField () + { + var get_field = Compile, string>> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldfld, module.Import (typeof (Generic).GetField ("Field"))); + il.Emit (OpCodes.Ret); + }); + + var generic = new Generic { + Field = "foo", + }; + + Assert.AreEqual ("foo", get_field (generic)); + } + + [Test] + public void ImportGenericMethod () + { + var generic_identity = Compile, int, int>> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Callvirt, module.Import (typeof (Generic).GetMethod ("Method"))); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, generic_identity (new Generic (), 42)); + } + + [Test] + public void ImportGenericMethodSpec () + { + var gen_spec_id = Compile, int, int>> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Callvirt, module.Import (typeof (Generic).GetMethod ("GenericMethod").MakeGenericMethod (typeof (int)))); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, gen_spec_id (new Generic (), 42)); + } + + [Test] + public void ImportComplexGenericMethodSpec () + { + var gen_spec_id = Compile, int, int>> ((module, body) => { + var il = body.GetILProcessor (); + il.Emit (OpCodes.Ldarg_0); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Ldarg_1); + il.Emit (OpCodes.Callvirt, module.Import (typeof (Generic).GetMethod ("ComplexGenericMethod").MakeGenericMethod (typeof (int)))); + il.Emit (OpCodes.Ldfld, module.Import (typeof (Generic).GetField ("Field"))); + il.Emit (OpCodes.Ret); + }); + + Assert.AreEqual (42, gen_spec_id (new Generic (), 42)); + } + + public class Foo { + public List list; + } + + [Test] + public void ImportGenericTypeDefOrOpen () + { + var module = typeof (Foo<>).ToDefinition ().Module; + + var foo_def = module.Import (typeof (Foo<>)); + var foo_open = module.Import (typeof (Foo<>), foo_def); + + Assert.AreEqual ("Mono.Cecil.Tests.ImportReflectionTests/Foo`1", foo_def.FullName); + Assert.AreEqual ("Mono.Cecil.Tests.ImportReflectionTests/Foo`1", foo_open.FullName); + } + + [Test] + public void ImportGenericTypeFromContext () + { + var list_foo = typeof (Foo<>).GetField ("list").FieldType; + var generic_list_foo_open = typeof (Generic<>).MakeGenericType (list_foo); + + var foo_def = typeof (Foo<>).ToDefinition (); + var module = foo_def.Module; + + var generic_foo = module.Import (generic_list_foo_open, foo_def); + + Assert.AreEqual ("Mono.Cecil.Tests.ImportReflectionTests/Generic`1>", + generic_foo.FullName); + } + + [Test] + public void ImportGenericTypeDefFromContext () + { + var foo_open = typeof (Foo<>).MakeGenericType (typeof (Foo<>).GetGenericArguments () [0]); + var generic_foo_open = typeof (Generic<>).MakeGenericType (foo_open); + + var foo_def = typeof (Foo<>).ToDefinition (); + var module = foo_def.Module; + + var generic_foo = module.Import (generic_foo_open, foo_def); + + Assert.AreEqual ("Mono.Cecil.Tests.ImportReflectionTests/Generic`1>", + generic_foo.FullName); + } + + [Test] + public void ImportArrayTypeDefFromContext () + { + var foo_open = typeof (Foo<>).MakeGenericType (typeof (Foo<>).GetGenericArguments () [0]); + var foo_open_array = foo_open.MakeArrayType (); + + var foo_def = typeof (Foo<>).ToDefinition (); + var module = foo_def.Module; + + var array_foo = module.Import (foo_open_array, foo_def); + + Assert.AreEqual ("Mono.Cecil.Tests.ImportReflectionTests/Foo`1[]", + array_foo.FullName); + } + + [Test] + public void ImportGenericFieldFromContext () + { + var list_foo = typeof (Foo<>).GetField ("list").FieldType; + var generic_list_foo_open = typeof (Generic<>).MakeGenericType (list_foo); + var generic_list_foo_open_field = generic_list_foo_open.GetField ("Field"); + + var foo_def = typeof (Foo<>).ToDefinition (); + var module = foo_def.Module; + + var generic_field = module.Import (generic_list_foo_open_field, foo_def); + + Assert.AreEqual ("TFoo Mono.Cecil.Tests.ImportReflectionTests/Generic`1>::Field", + generic_field.FullName); + } + + [Test] + public void ImportGenericMethodFromContext () + { + var list_foo = typeof (Foo<>).GetField ("list").FieldType; + var generic_list_foo_open = typeof (Generic<>).MakeGenericType (list_foo); + var generic_list_foo_open_method = generic_list_foo_open.GetMethod ("Method"); + + var foo_def = typeof (Foo<>).ToDefinition (); + var module = foo_def.Module; + + var generic_method = module.Import (generic_list_foo_open_method, foo_def); + + Assert.AreEqual ("TFoo Mono.Cecil.Tests.ImportReflectionTests/Generic`1>::Method(TFoo)", + generic_method.FullName); + } + + [Test] + public void ImportMethodOnOpenGenericType () + { + var module = typeof (Generic<>).ToDefinition ().Module; + + var method = module.Import (typeof (Generic<>).GetMethod ("Method")); + + Assert.AreEqual ("T Mono.Cecil.Tests.ImportReflectionTests/Generic`1::Method(T)", method.FullName); + } + + [Test] + public void ImportGenericMethodOnOpenGenericType () + { + var module = typeof (Generic<>).ToDefinition ().Module; + + var generic_method = module.Import (typeof (Generic<>).GetMethod ("GenericMethod")); + + Assert.AreEqual ("TS Mono.Cecil.Tests.ImportReflectionTests/Generic`1::GenericMethod(T,TS)", generic_method.FullName); + + generic_method = module.Import (typeof (Generic<>).GetMethod ("GenericMethod"), generic_method); + + Assert.AreEqual ("TS Mono.Cecil.Tests.ImportReflectionTests/Generic`1::GenericMethod(T,TS)", generic_method.FullName); + } + + delegate void Emitter (ModuleDefinition module, MethodBody body); + + [MethodImpl (MethodImplOptions.NoInlining)] + static TDelegate Compile (Emitter emitter) + where TDelegate : class + { + var name = GetTestCaseName (); + + var module = CreateTestModule (name, emitter); + var assembly = LoadTestModule (module); + + return CreateRunDelegate (GetTestCase (name, assembly)); + } + + static TDelegate CreateRunDelegate (Type type) + where TDelegate : class + { + return (TDelegate) (object) Delegate.CreateDelegate (typeof (TDelegate), type.GetMethod ("Run")); + } + + static Type GetTestCase (string name, SR.Assembly assembly) + { + return assembly.GetType (name); + } + + static SR.Assembly LoadTestModule (ModuleDefinition module) + { + using (var stream = new MemoryStream ()) { + module.Write (stream); + File.WriteAllBytes (Path.Combine (Path.Combine (Path.GetTempPath (), "cecil"), module.Name + ".dll"), stream.ToArray ()); + return SR.Assembly.Load (stream.ToArray ()); + } + } + + static ModuleDefinition CreateTestModule (string name, Emitter emitter) + { + var module = CreateModule (name); + + var type = new TypeDefinition ( + "", + name, + TypeAttributes.Public | TypeAttributes.Sealed | TypeAttributes.Abstract, + module.Import (typeof (object))); + + module.Types.Add (type); + + var method = CreateMethod (type, typeof (TDelegate).GetMethod ("Invoke")); + + emitter (module, method.Body); + + return module; + } + + static MethodDefinition CreateMethod (TypeDefinition type, SR.MethodInfo pattern) + { + var module = type.Module; + + var method = new MethodDefinition { + Name = "Run", + IsPublic = true, + IsStatic = true, + }; + + type.Methods.Add (method); + + method.MethodReturnType.ReturnType = module.Import (pattern.ReturnType); + + foreach (var parameter_pattern in pattern.GetParameters ()) + method.Parameters.Add (new ParameterDefinition (module.Import (parameter_pattern.ParameterType))); + + return method; + } + + static ModuleDefinition CreateModule (string name) + { + return ModuleDefinition.CreateModule (name, ModuleKind.Dll); + } + + [MethodImpl (MethodImplOptions.NoInlining)] + static string GetTestCaseName () + { + var stack_trace = new StackTrace (); + var stack_frame = stack_trace.GetFrame (2); + + return "ImportReflection_" + stack_frame.GetMethod ().Name; + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Linq.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Linq.cs new file mode 100644 index 0000000000..4f870e0047 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/Linq.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; + +using Mono; + +#if !NET_3_5 && !NET_4_0 + +namespace System.Linq { + + static class Enumerable { + + public static IEnumerable Select (this IEnumerable self, Func selector) + { + foreach (var item in self) + yield return selector (item); + } + + public static IEnumerable Where (this IEnumerable self, Func predicate) + { + foreach (var item in self) + if (predicate (item)) + yield return item; + } + + public static List ToList (this IEnumerable self) + { + return new List (self); + } + + public static T [] ToArray (this IEnumerable self) + { + return self.ToList ().ToArray (); + } + + public static T First (this IEnumerable self) + { + using (var enumerator = self.GetEnumerator ()) { + if (!enumerator.MoveNext ()) + throw new InvalidOperationException (); + + return enumerator.Current; + } + } + } +} + +#endif diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodBodyTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodBodyTests.cs new file mode 100644 index 0000000000..afe8f79f95 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodBodyTests.cs @@ -0,0 +1,363 @@ +using System; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class MethodBodyTests : BaseTestFixture { + + [TestIL ("hello.il")] + public void MultiplyMethod (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + Assert.IsNotNull (foo); + + var bar = foo.GetMethod ("Bar"); + Assert.IsNotNull (bar); + Assert.IsTrue (bar.IsIL); + + AssertCode (@" + .locals init (System.Int32 V_0) + IL_0000: ldarg.0 + IL_0001: ldarg.1 + IL_0002: mul + IL_0003: stloc.0 + IL_0004: ldloc.0 + IL_0005: call System.Void Foo::Baz(System.Int32) + IL_000a: ret +", bar); + } + + [TestIL ("hello.il")] + public void PrintStringEmpty (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + Assert.IsNotNull (foo); + + var print_empty = foo.GetMethod ("PrintEmpty"); + Assert.IsNotNull (print_empty); + + AssertCode (@" + .locals () + IL_0000: ldsfld System.String System.String::Empty + IL_0005: call System.Void System.Console::WriteLine(System.String) + IL_000a: ret +", print_empty); + } + + [TestModule ("libhello.dll")] + public void Branch (ModuleDefinition module) + { + var lib = module.GetType ("Library"); + Assert.IsNotNull (lib); + + var method = lib.GetMethod ("GetHelloString"); + Assert.IsNotNull (method); + + AssertCode (@" + .locals init (System.String V_0) + IL_0000: nop + IL_0001: ldstr ""hello world of tomorrow"" + IL_0006: stloc.0 + IL_0007: br.s IL_0009 + IL_0009: ldloc.0 + IL_000a: ret +", method); + } + + [TestModule ("switch.exe")] + public void Switch (ModuleDefinition module) + { + var program = module.GetType ("Program"); + Assert.IsNotNull (program); + + var method = program.GetMethod ("Main"); + Assert.IsNotNull (method); + + AssertCode (@" + .locals init (System.Int32 V_0) + IL_0000: ldarg.0 + IL_0001: ldlen + IL_0002: conv.i4 + IL_0003: stloc.0 + IL_0004: ldloc.0 + IL_0005: ldc.i4.8 + IL_0006: bgt.s IL_0026 + IL_0008: ldloc.0 + IL_0009: ldc.i4.1 + IL_000a: sub + IL_000b: switch (IL_0032, IL_0034, IL_0038, IL_0034) + IL_0020: ldloc.0 + IL_0021: ldc.i4.8 + IL_0022: beq.s IL_0036 + IL_0024: br.s IL_0038 + IL_0026: ldloc.0 + IL_0027: ldc.i4.s 16 + IL_0029: beq.s IL_0036 + IL_002b: ldloc.0 + IL_002c: ldc.i4.s 32 + IL_002e: beq.s IL_0036 + IL_0030: br.s IL_0038 + IL_0032: ldc.i4.0 + IL_0033: ret + IL_0034: ldc.i4.1 + IL_0035: ret + IL_0036: ldc.i4.2 + IL_0037: ret + IL_0038: ldc.i4.s 42 + IL_003a: ret +", method); + } + + [TestIL ("methodspecs.il")] + public void MethodSpec (ModuleDefinition module) + { + var tamtam = module.GetType ("Tamtam"); + + var bar = tamtam.GetMethod ("Bar"); + Assert.IsNotNull (bar); + + AssertCode (@" + .locals () + IL_0000: ldc.i4.2 + IL_0001: call System.Void Tamtam::Foo(TFoo) + IL_0006: ret +", bar); + } + + [TestModule ("catch.exe")] + public void NestedTryCatchFinally (ModuleDefinition module) + { + var program = module.GetType ("Program"); + var main = program.GetMethod ("Main"); + Assert.IsNotNull (main); + + AssertCode (@" + .locals () + IL_0000: call System.Void Program::Foo() + IL_0005: leave.s IL_000d + IL_0007: call System.Void Program::Baz() + IL_000c: endfinally + IL_000d: leave.s IL_001f + IL_000f: pop + IL_0010: call System.Void Program::Bar() + IL_0015: leave.s IL_001f + IL_0017: pop + IL_0018: call System.Void Program::Bar() + IL_001d: leave.s IL_001f + IL_001f: leave.s IL_0027 + IL_0021: call System.Void Program::Baz() + IL_0026: endfinally + IL_0027: ret + .try IL_0000 to IL_0007 finally handler IL_0007 to IL_000d + .try IL_0000 to IL_000f catch System.ArgumentException handler IL_000f to IL_0017 + .try IL_0000 to IL_000f catch System.Exception handler IL_0017 to IL_001f + .try IL_0000 to IL_0021 finally handler IL_0021 to IL_0027 +", main); + } + + [TestModule ("fptr.exe", Verify = false)] + public void FunctionPointersAndCallSites (ModuleDefinition module) + { + var type = module.Types [0]; + var start = type.GetMethod ("Start"); + Assert.IsNotNull (start); + + AssertCode (@" + .locals init () + IL_0000: ldc.i4.1 + IL_0001: call method System.Int32 *(System.Int32) MakeDecision::Decide() + IL_0006: calli System.Int32(System.Int32) + IL_000b: call System.Void System.Console::WriteLine(System.Int32) + IL_0010: ldc.i4.1 + IL_0011: call method System.Int32 *(System.Int32) MakeDecision::Decide() + IL_0016: calli System.Int32(System.Int32) + IL_001b: call System.Void System.Console::WriteLine(System.Int32) + IL_0020: ldc.i4.1 + IL_0021: call method System.Int32 *(System.Int32) MakeDecision::Decide() + IL_0026: calli System.Int32(System.Int32) + IL_002b: call System.Void System.Console::WriteLine(System.Int32) + IL_0030: ret +", start); + } + + [TestIL ("hello.il")] + public void ThisParameter (ModuleDefinition module) + { + var type = module.GetType ("Foo"); + var method = type.GetMethod ("Gazonk"); + + Assert.IsNotNull (method); + + AssertCode (@" + .locals () + IL_0000: ldarg 0 + IL_0004: pop + IL_0005: ret +", method); + + Assert.AreEqual (method.Body.ThisParameter, method.Body.Instructions [0].Operand); + } + + [TestIL ("hello.il")] + public void FilterMaxStack (ModuleDefinition module) + { + var type = module.GetType ("Foo"); + var method = type.GetMethod ("TestFilter"); + + Assert.IsNotNull (method); + Assert.AreEqual (2, method.Body.MaxStackSize); + } + + [TestModule ("iterator.exe")] + public void Iterator (ModuleDefinition module) + { + var method = module.GetType ("Program").GetMethod ("GetLittleArgs"); + Assert.IsNotNull (method.Body); + } + + [TestCSharp ("CustomAttributes.cs")] + public void LoadString (ModuleDefinition module) + { + var type = module.GetType ("FooAttribute"); + var get_fiou = type.GetMethod ("get_Fiou"); + Assert.IsNotNull (get_fiou); + + var ldstr = get_fiou.Body.Instructions.Where (i => i.OpCode == OpCodes.Ldstr).First (); + Assert.AreEqual ("fiou", ldstr.Operand); + } + + static void AssertCode (string expected, MethodDefinition method) + { + Assert.IsTrue (method.HasBody); + Assert.IsNotNull (method.Body); + + Assert.AreEqual (Normalize (expected), Normalize (Formatter.FormatMethodBody (method))); + } + + static string Normalize (string str) + { + return str.Trim ().Replace ("\r\n", "\n"); + } + + [Test] + public void AddInstruction () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var il = body.GetILProcessor (); + + var first = il.Create (OpCodes.Nop); + var second = il.Create (OpCodes.Nop); + + body.Instructions.Add (first); + body.Instructions.Add (second); + + Assert.IsNull (first.Previous); + Assert.AreEqual (second, first.Next); + Assert.AreEqual (first, second.Previous); + Assert.IsNull (second.Next); + } + + [Test] + public void InsertInstruction () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var il = body.GetILProcessor (); + + var first = il.Create (OpCodes.Nop); + var second = il.Create (OpCodes.Nop); + var third = il.Create (OpCodes.Nop); + + body.Instructions.Add (first); + body.Instructions.Add (third); + + Assert.IsNull (first.Previous); + Assert.AreEqual (third, first.Next); + Assert.AreEqual (first, third.Previous); + Assert.IsNull (third.Next); + + body.Instructions.Insert (1, second); + + Assert.IsNull (first.Previous); + Assert.AreEqual (second, first.Next); + Assert.AreEqual (first, second.Previous); + Assert.AreEqual (third, second.Next); + Assert.AreEqual (second, third.Previous); + Assert.IsNull (third.Next); + } + + [Test] + public void InsertAfterLastInstruction () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var il = body.GetILProcessor (); + + var first = il.Create (OpCodes.Nop); + var second = il.Create (OpCodes.Nop); + var third = il.Create (OpCodes.Nop); + + body.Instructions.Add (first); + body.Instructions.Add (second); + + Assert.IsNull (first.Previous); + Assert.AreEqual (second, first.Next); + Assert.AreEqual (first, second.Previous); + Assert.IsNull (second.Next); + + body.Instructions.Insert (2, third); + + Assert.IsNull (first.Previous); + Assert.AreEqual (second, first.Next); + Assert.AreEqual (first, second.Previous); + Assert.AreEqual (third, second.Next); + Assert.AreEqual (second, third.Previous); + Assert.IsNull (third.Next); + } + + [Test] + public void RemoveInstruction () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var il = body.GetILProcessor (); + + var first = il.Create (OpCodes.Nop); + var second = il.Create (OpCodes.Nop); + var third = il.Create (OpCodes.Nop); + + body.Instructions.Add (first); + body.Instructions.Add (second); + body.Instructions.Add (third); + + Assert.IsNull (first.Previous); + Assert.AreEqual (second, first.Next); + Assert.AreEqual (first, second.Previous); + Assert.AreEqual (third, second.Next); + Assert.AreEqual (second, third.Previous); + Assert.IsNull (third.Next); + + body.Instructions.Remove (second); + + Assert.IsNull (first.Previous); + Assert.AreEqual (third, first.Next); + Assert.AreEqual (first, third.Previous); + Assert.IsNull (third.Next); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodTests.cs new file mode 100644 index 0000000000..c7d55f9a39 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/MethodTests.cs @@ -0,0 +1,193 @@ +using System; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Metadata; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class MethodTests : BaseTestFixture { + + [TestCSharp ("Methods.cs")] + public void AbstractMethod (ModuleDefinition module) + { + var type = module.Types [1]; + Assert.AreEqual ("Foo", type.Name); + Assert.AreEqual (2, type.Methods.Count); + + var method = type.GetMethod ("Bar"); + Assert.AreEqual ("Bar", method.Name); + Assert.IsTrue (method.IsAbstract); + Assert.IsNotNull (method.ReturnType); + + Assert.AreEqual (1, method.Parameters.Count); + + var parameter = method.Parameters [0]; + + Assert.AreEqual ("a", parameter.Name); + Assert.AreEqual ("System.Int32", parameter.ParameterType.FullName); + } + + [TestCSharp ("Methods.cs")] + public void SimplePInvoke (ModuleDefinition module) + { + var bar = module.GetType ("Bar"); + var pan = bar.GetMethod ("Pan"); + + Assert.IsTrue (pan.IsPInvokeImpl); + Assert.IsNotNull (pan.PInvokeInfo); + + Assert.AreEqual ("Pan", pan.PInvokeInfo.EntryPoint); + Assert.IsNotNull (pan.PInvokeInfo.Module); + Assert.AreEqual ("foo.dll", pan.PInvokeInfo.Module.Name); + } + + [TestCSharp ("Generics.cs")] + public void GenericMethodDefinition (ModuleDefinition module) + { + var baz = module.GetType ("Baz"); + + var gazonk = baz.GetMethod ("Gazonk"); + + Assert.IsNotNull (gazonk); + + Assert.IsTrue (gazonk.HasGenericParameters); + Assert.AreEqual (1, gazonk.GenericParameters.Count); + Assert.AreEqual ("TBang", gazonk.GenericParameters [0].Name); + } + + [TestCSharp ("Generics.cs")] + public void ReturnGenericInstance (ModuleDefinition module) + { + var bar = module.GetType ("Bar`1"); + + var self = bar.GetMethod ("Self"); + Assert.IsNotNull (self); + + var bar_t = self.ReturnType; + + Assert.IsTrue (bar_t.IsGenericInstance); + + var bar_t_instance = (GenericInstanceType) bar_t; + + Assert.AreEqual (bar.GenericParameters [0], bar_t_instance.GenericArguments [0]); + + var self_str = bar.GetMethod ("SelfString"); + Assert.IsNotNull (self_str); + + var bar_str = self_str.ReturnType; + Assert.IsTrue (bar_str.IsGenericInstance); + + var bar_str_instance = (GenericInstanceType) bar_str; + + Assert.AreEqual ("System.String", bar_str_instance.GenericArguments [0].FullName); + } + + [TestCSharp ("Generics.cs")] + public void ReturnGenericInstanceWithMethodParameter (ModuleDefinition module) + { + var baz = module.GetType ("Baz"); + + var gazoo = baz.GetMethod ("Gazoo"); + Assert.IsNotNull (gazoo); + + var bar_bingo = gazoo.ReturnType; + + Assert.IsTrue (bar_bingo.IsGenericInstance); + + var bar_bingo_instance = (GenericInstanceType) bar_bingo; + + Assert.AreEqual (gazoo.GenericParameters [0], bar_bingo_instance.GenericArguments [0]); + } + + [TestCSharp ("Interfaces.cs")] + public void SimpleOverrides (ModuleDefinition module) + { + var ibingo = module.GetType ("IBingo"); + var ibingo_foo = ibingo.GetMethod ("Foo"); + Assert.IsNotNull (ibingo_foo); + + var ibingo_bar = ibingo.GetMethod ("Bar"); + Assert.IsNotNull (ibingo_bar); + + var bingo = module.GetType ("Bingo"); + + var foo = bingo.GetMethod ("IBingo.Foo"); + Assert.IsNotNull (foo); + + Assert.IsTrue (foo.HasOverrides); + Assert.AreEqual (ibingo_foo, foo.Overrides [0]); + + var bar = bingo.GetMethod ("IBingo.Bar"); + Assert.IsNotNull (bar); + + Assert.IsTrue (bar.HasOverrides); + Assert.AreEqual (ibingo_bar, bar.Overrides [0]); + } + + [TestModule ("varargs.exe")] + public void VarArgs (ModuleDefinition module) + { + var module_type = module.Types [0]; + + Assert.AreEqual (3, module_type.Methods.Count); + + var bar = module_type.GetMethod ("Bar"); + var baz = module_type.GetMethod ("Baz"); + var foo = module_type.GetMethod ("Foo"); + + Assert.IsTrue (bar.IsVarArg ()); + Assert.IsFalse (baz.IsVarArg ()); + + Assert.IsTrue(foo.IsVarArg ()); + + var bar_reference = (MethodReference) baz.Body.Instructions.Where (i => i.Offset == 0x000a).First ().Operand; + + Assert.IsTrue (bar_reference.IsVarArg ()); + Assert.AreEqual (0, bar_reference.GetSentinelPosition ()); + + var foo_reference = (MethodReference) baz.Body.Instructions.Where (i => i.Offset == 0x0023).First ().Operand; + + Assert.IsTrue (foo_reference.IsVarArg ()); + + Assert.AreEqual (1, foo_reference.GetSentinelPosition ()); + } + + [TestCSharp ("Generics.cs")] + public void GenericInstanceMethod (ModuleDefinition module) + { + var type = module.GetType ("It"); + var method = type.GetMethod ("ReadPwow"); + + GenericInstanceMethod instance = null; + + foreach (var instruction in method.Body.Instructions) { + instance = instruction.Operand as GenericInstanceMethod; + if (instance != null) + break; + } + + Assert.IsNotNull (instance); + + Assert.AreEqual (TokenType.MethodSpec, instance.MetadataToken.TokenType); + Assert.AreNotEqual (0, instance.MetadataToken.RID); + } + + [TestCSharp ("Generics.cs")] + public void MethodRefDeclaredOnGenerics (ModuleDefinition module) + { + var type = module.GetType ("Tamtam"); + var beta = type.GetMethod ("Beta"); + var charlie = type.GetMethod ("Charlie"); + + var new_list_beta = (MethodReference) beta.Body.Instructions [0].Operand; + var new_list_charlie = (MethodReference) charlie.Body.Instructions [0].Operand; + + Assert.AreEqual ("System.Collections.Generic.List`1", new_list_beta.DeclaringType.FullName); + Assert.AreEqual ("System.Collections.Generic.List`1", new_list_charlie.DeclaringType.FullName); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ModuleTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ModuleTests.cs new file mode 100644 index 0000000000..00f9e1af60 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ModuleTests.cs @@ -0,0 +1,250 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; + +using Mono.Cecil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ModuleTests : BaseTestFixture { + + [Test] + public void CreateModuleEscapesAssemblyName () + { + var module = ModuleDefinition.CreateModule ("Test.dll", ModuleKind.Dll); + Assert.AreEqual ("Test", module.Assembly.Name.Name); + + module = ModuleDefinition.CreateModule ("Test.exe", ModuleKind.Console); + Assert.AreEqual ("Test", module.Assembly.Name.Name); + } + + [TestModule ("hello.exe")] + public void SingleModule (ModuleDefinition module) + { + var assembly = module.Assembly; + + Assert.AreEqual (1, assembly.Modules.Count); + Assert.IsNotNull (assembly.MainModule); + } + + [TestModule ("hello.exe")] + public void EntryPoint (ModuleDefinition module) + { + var entry_point = module.EntryPoint; + Assert.IsNotNull (entry_point); + + Assert.AreEqual ("System.Void Program::Main()", entry_point.ToString ()); + } + + [TestModule ("mma.exe")] + public void MultiModules (ModuleDefinition module) + { + var assembly = module.Assembly; + + Assert.AreEqual (3, assembly.Modules.Count); + + Assert.AreEqual ("mma.exe", assembly.Modules [0].Name); + Assert.AreEqual (ModuleKind.Console, assembly.Modules [0].Kind); + + Assert.AreEqual ("moda.netmodule", assembly.Modules [1].Name); + Assert.AreEqual ("eedb4721-6c3e-4d9a-be30-49021121dd92", assembly.Modules [1].Mvid.ToString ()); + Assert.AreEqual (ModuleKind.NetModule, assembly.Modules [1].Kind); + + Assert.AreEqual ("modb.netmodule", assembly.Modules [2].Name); + Assert.AreEqual ("46c5c577-11b2-4ea0-bb3c-3c71f1331dd0", assembly.Modules [2].Mvid.ToString ()); + Assert.AreEqual (ModuleKind.NetModule, assembly.Modules [2].Kind); + } + + [TestModule ("hello.exe")] + public void ModuleInformation (ModuleDefinition module) + { + Assert.IsNotNull (module); + + Assert.AreEqual ("hello.exe", module.Name); + Assert.AreEqual (new Guid ("C3BC2BD3-2576-4D00-A80E-465B5632415F"), module.Mvid); + } + + [TestModule ("hello.exe")] + public void AssemblyReferences (ModuleDefinition module) + { + Assert.AreEqual (1, module.AssemblyReferences.Count); + + var reference = module.AssemblyReferences [0]; + + Assert.AreEqual ("mscorlib", reference.Name); + Assert.AreEqual (new Version (2, 0, 0, 0), reference.Version); + Assert.AreEqual (new byte [] { 0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89 }, reference.PublicKeyToken); + } + + [TestModule ("pinvoke.exe")] + public void ModuleReferences (ModuleDefinition module) + { + Assert.AreEqual (2, module.ModuleReferences.Count); + Assert.AreEqual ("kernel32.dll", module.ModuleReferences [0].Name); + Assert.AreEqual ("shell32.dll", module.ModuleReferences [1].Name); + } + + [TestModule ("hello.exe")] + public void Types (ModuleDefinition module) + { + Assert.AreEqual (2, module.Types.Count); + Assert.AreEqual ("", module.Types [0].FullName); + Assert.AreEqual ("", module.GetType ("").FullName); + Assert.AreEqual ("Program", module.Types [1].FullName); + Assert.AreEqual ("Program", module.GetType ("Program").FullName); + } + + [TestModule ("libres.dll")] + public void LinkedResource (ModuleDefinition module) + { + var resource = module.Resources.Where (res => res.Name == "linked.txt").First () as LinkedResource; + Assert.IsNotNull (resource); + + Assert.AreEqual ("linked.txt", resource.Name); + Assert.AreEqual ("linked.txt", resource.File); + Assert.AreEqual (ResourceType.Linked, resource.ResourceType); + Assert.IsTrue (resource.IsPublic); + } + + [TestModule ("libres.dll")] + public void EmbeddedResource (ModuleDefinition module) + { + var resource = module.Resources.Where (res => res.Name == "embedded1.txt").First () as EmbeddedResource; + Assert.IsNotNull (resource); + + Assert.AreEqual ("embedded1.txt", resource.Name); + Assert.AreEqual (ResourceType.Embedded, resource.ResourceType); + Assert.IsTrue (resource.IsPublic); + + using (var reader = new StreamReader (resource.GetResourceStream ())) + Assert.AreEqual ("Hello", reader.ReadToEnd ()); + + resource = module.Resources.Where (res => res.Name == "embedded2.txt").First () as EmbeddedResource; + Assert.IsNotNull (resource); + + Assert.AreEqual ("embedded2.txt", resource.Name); + Assert.AreEqual (ResourceType.Embedded, resource.ResourceType); + Assert.IsTrue (resource.IsPublic); + + using (var reader = new StreamReader (resource.GetResourceStream ())) + Assert.AreEqual ("World", reader.ReadToEnd ()); + } + + [TestModule ("mma.exe")] + public void ExportedTypeFromNetModule (ModuleDefinition module) + { + Assert.IsTrue (module.HasExportedTypes); + Assert.AreEqual (2, module.ExportedTypes.Count); + + var exported_type = module.ExportedTypes [0]; + + Assert.AreEqual ("Module.A.Foo", exported_type.FullName); + Assert.AreEqual ("moda.netmodule", exported_type.Scope.Name); + + exported_type = module.ExportedTypes [1]; + + Assert.AreEqual ("Module.B.Baz", exported_type.FullName); + Assert.AreEqual ("modb.netmodule", exported_type.Scope.Name); + } + + [TestCSharp ("CustomAttributes.cs")] + public void NestedTypeForwarder (ModuleDefinition module) + { + Assert.IsTrue (module.HasExportedTypes); + Assert.AreEqual (2, module.ExportedTypes.Count); + + var exported_type = module.ExportedTypes [0]; + + Assert.AreEqual ("System.Diagnostics.DebuggableAttribute", exported_type.FullName); + Assert.AreEqual ("mscorlib", exported_type.Scope.Name); + Assert.IsTrue (exported_type.IsForwarder); + + var nested_exported_type = module.ExportedTypes [1]; + + Assert.AreEqual ("System.Diagnostics.DebuggableAttribute/DebuggingModes", nested_exported_type.FullName); + Assert.AreEqual (exported_type, nested_exported_type.DeclaringType); + Assert.AreEqual ("mscorlib", nested_exported_type.Scope.Name); + } + + [TestCSharp ("CustomAttributes.cs")] + public void HasTypeReference (ModuleDefinition module) + { + Assert.IsTrue (module.HasTypeReference ("System.Attribute")); + Assert.IsTrue (module.HasTypeReference ("mscorlib", "System.Attribute")); + + Assert.IsFalse (module.HasTypeReference ("System.Core", "System.Attribute")); + Assert.IsFalse (module.HasTypeReference ("System.Linq.Enumerable")); + } + + [TestModule ("libhello.dll")] + public void Win32FileVersion (ModuleDefinition module) + { + var version = FileVersionInfo.GetVersionInfo (module.FullyQualifiedName); + + Assert.AreEqual ("0.0.0.0", version.FileVersion); + } + + [TestModule ("noblob.dll")] + public void ModuleWithoutBlob (ModuleDefinition module) + { + Assert.IsNull (module.Image.BlobHeap); + } + + [Test] + public void MixedModeModule () + { + var module = GetResourceModule ("cppcli.dll"); + + Assert.AreEqual (1, module.ModuleReferences.Count); + Assert.AreEqual (string.Empty, module.ModuleReferences [0].Name); + } + + [Test] + [ExpectedException (typeof (BadImageFormatException))] + public void OpenIrrelevantFile () + { + GetResourceModule ("text_file.txt"); + } + + [Test] + public void WriteModuleTwice () + { + var module = GetResourceModule ("iterator.exe"); + + var path = Path.Combine (Path.GetTempPath (), "cecil"); + var file = Path.Combine (path, "iteratorrt.exe"); + + module.Write (file); + module.Write (file); + } + + [Test] + public void GetTypeNamespacePlusName () + { + var module = GetResourceModule ("moda.netmodule"); + + var type = module.GetType ("Module.A", "Foo"); + Assert.IsNotNull (type); + } + + [Test] + public void OpenModuleImmediate () + { + var module = GetResourceModule ("hello.exe", ReadingMode.Immediate); + + Assert.AreEqual (ReadingMode.Immediate, module.ReadingMode); + } + + [Test] + public void OpenModuleDeferred () + { + var module = GetResourceModule ("hello.exe", ReadingMode.Deferred); + + Assert.AreEqual (ReadingMode.Deferred, module.ReadingMode); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/NestedTypesTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/NestedTypesTests.cs new file mode 100644 index 0000000000..a8392928ba --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/NestedTypesTests.cs @@ -0,0 +1,45 @@ +using System; + +using Mono.Cecil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class NestedTypesTests : BaseTestFixture { + + [TestCSharp ("NestedTypes.cs")] + public void NestedTypes (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + + Assert.AreEqual ("Foo", foo.Name); + Assert.AreEqual ("Foo", foo.FullName); + Assert.AreEqual (module, foo.Module); + Assert.AreEqual (1, foo.NestedTypes.Count); + + var bar = foo.NestedTypes [0]; + + Assert.AreEqual ("Bar", bar.Name); + Assert.AreEqual ("Foo/Bar", bar.FullName); + Assert.AreEqual (module, bar.Module); + Assert.AreEqual (1, bar.NestedTypes.Count); + + var baz = bar.NestedTypes [0]; + + Assert.AreEqual ("Baz", baz.Name); + Assert.AreEqual ("Foo/Bar/Baz", baz.FullName); + Assert.AreEqual (module, baz.Module); + } + + [TestCSharp ("NestedTypes.cs")] + public void DirectNestedType (ModuleDefinition module) + { + var bingo = module.GetType ("Bingo"); + var get_fuel = bingo.GetMethod ("GetFuel"); + + Assert.AreEqual ("Bingo/Fuel", get_fuel.ReturnType.FullName); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ParameterTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ParameterTests.cs new file mode 100644 index 0000000000..124d7e1bd9 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ParameterTests.cs @@ -0,0 +1,224 @@ +using System; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Metadata; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ParameterTests : BaseTestFixture { + + [TestModule ("marshal.dll")] + public void MarshalAsI4 (ModuleDefinition module) + { + var bar = module.GetType ("Bar"); + var pan = bar.GetMethod ("Pan"); + + Assert.AreEqual (1, pan.Parameters.Count); + + var parameter = pan.Parameters [0]; + + Assert.IsTrue (parameter.HasMarshalInfo); + var info = parameter.MarshalInfo; + + Assert.AreEqual (typeof (MarshalInfo), info.GetType ()); + Assert.AreEqual (NativeType.I4, info.NativeType); + } + + [TestModule ("marshal.dll")] + public void CustomMarshaler (ModuleDefinition module) + { + var bar = module.GetType ("Bar"); + var pan = bar.GetMethod ("PanPan"); + + var parameter = pan.Parameters [0]; + + Assert.IsTrue (parameter.HasMarshalInfo); + + var info = (CustomMarshalInfo) parameter.MarshalInfo; + + Assert.AreEqual (Guid.Empty, info.Guid); + Assert.AreEqual (string.Empty, info.UnmanagedType); + Assert.AreEqual (NativeType.CustomMarshaler, info.NativeType); + Assert.AreEqual ("nomnom", info.Cookie); + + Assert.AreEqual ("Boc", info.ManagedType.FullName); + Assert.AreEqual (module, info.ManagedType.Scope); + } + + [TestModule ("marshal.dll")] + public void SafeArrayMarshaler (ModuleDefinition module) + { + var bar = module.GetType ("Bar"); + var pan = bar.GetMethod ("PanPan"); + + Assert.IsTrue (pan.MethodReturnType.HasMarshalInfo); + + var info = (SafeArrayMarshalInfo) pan.MethodReturnType.MarshalInfo; + + Assert.AreEqual (VariantType.Dispatch, info.ElementType); + } + + [TestModule ("marshal.dll")] + public void ArrayMarshaler (ModuleDefinition module) + { + var bar = module.GetType ("Bar"); + var pan = bar.GetMethod ("PanPan"); + + var parameter = pan.Parameters [1]; + + Assert.IsTrue (parameter.HasMarshalInfo); + + var info = (ArrayMarshalInfo) parameter.MarshalInfo; + + Assert.AreEqual (NativeType.I8, info.ElementType); + Assert.AreEqual (66, info.Size); + Assert.AreEqual (2, info.SizeParameterIndex); + + parameter = pan.Parameters [3]; + + Assert.IsTrue (parameter.HasMarshalInfo); + + info = (ArrayMarshalInfo) parameter.MarshalInfo; + + Assert.AreEqual (NativeType.I2, info.ElementType); + Assert.AreEqual (-1, info.Size); + Assert.AreEqual (-1, info.SizeParameterIndex); + } + + [TestModule ("marshal.dll")] + public void ArrayMarshalerSized (ModuleDefinition module) + { + var delegate_type = module.GetType ("SomeMethod"); + var parameter = delegate_type.GetMethod ("Invoke").Parameters [1]; + + Assert.IsTrue (parameter.HasMarshalInfo); + var array_info = (ArrayMarshalInfo) parameter.MarshalInfo; + + Assert.IsNotNull (array_info); + + Assert.AreEqual (0, array_info.SizeParameterMultiplier); + } + + [TestModule ("boxedoptarg.dll")] + public void BoxedDefaultArgumentValue (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + var bar = foo.GetMethod ("Bar"); + var baz = bar.Parameters [0]; + + Assert.IsTrue (baz.HasConstant); + Assert.AreEqual (-1, baz.Constant); + } + + [Test] + public void AddParameterIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + + var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref); + var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + + method.Parameters.Add (x); + method.Parameters.Add (y); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + + Assert.AreEqual (method, x.Method); + Assert.AreEqual (method, y.Method); + } + + [Test] + public void RemoveAtParameterIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + + var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref); + var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + var z = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + + method.Parameters.Add (x); + method.Parameters.Add (y); + method.Parameters.Add (z); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + Assert.AreEqual (2, z.Index); + + method.Parameters.RemoveAt (1); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (-1, y.Index); + Assert.AreEqual (1, z.Index); + } + + [Test] + public void RemoveParameterIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + + var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref); + var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + var z = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + + method.Parameters.Add (x); + method.Parameters.Add (y); + method.Parameters.Add (z); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + Assert.AreEqual (2, z.Index); + + method.Parameters.Remove (y); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (-1, y.Index); + Assert.AreEqual (1, z.Index); + } + + [Test] + public void InsertParameterIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + + var x = new ParameterDefinition ("x", ParameterAttributes.None, object_ref); + var y = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + var z = new ParameterDefinition ("y", ParameterAttributes.None, object_ref); + + method.Parameters.Add (x); + method.Parameters.Add (z); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (-1, y.Index); + Assert.AreEqual (1, z.Index); + + method.Parameters.Insert (1, y); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + Assert.AreEqual (2, z.Index); + } + + [TestIL ("hello.il")] + public void GenericParameterConstant (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + var method = foo.GetMethod ("GetState"); + + Assert.IsNotNull (method); + + var parameter = method.Parameters [1]; + + Assert.IsTrue (parameter.HasConstant); + Assert.IsNull (parameter.Constant); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/PropertyTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/PropertyTests.cs new file mode 100644 index 0000000000..2ff9c92853 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/PropertyTests.cs @@ -0,0 +1,112 @@ +using System.Linq; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class PropertyTests : BaseTestFixture { + + [TestCSharp ("Properties.cs")] + public void AbstractMethod (ModuleDefinition module) + { + var type = module.GetType ("Foo"); + + Assert.IsTrue (type.HasProperties); + + var properties = type.Properties; + + Assert.AreEqual (3, properties.Count); + + var property = properties [0]; + + Assert.IsNotNull (property); + Assert.AreEqual ("Bar", property.Name); + Assert.IsNotNull (property.PropertyType); + Assert.AreEqual ("System.Int32", property.PropertyType.FullName); + + Assert.IsNotNull (property.GetMethod); + Assert.AreEqual (MethodSemanticsAttributes.Getter, property.GetMethod.SemanticsAttributes); + Assert.IsNull (property.SetMethod); + + property = properties [1]; + + Assert.IsNotNull (property); + Assert.AreEqual ("Baz", property.Name); + Assert.IsNotNull (property.PropertyType); + Assert.AreEqual ("System.String", property.PropertyType.FullName); + + Assert.IsNotNull (property.GetMethod); + Assert.AreEqual (MethodSemanticsAttributes.Getter, property.GetMethod.SemanticsAttributes); + Assert.IsNotNull (property.SetMethod); + Assert.AreEqual (MethodSemanticsAttributes.Setter, property.SetMethod.SemanticsAttributes); + + property = properties [2]; + + Assert.IsNotNull (property); + Assert.AreEqual ("Gazonk", property.Name); + Assert.IsNotNull (property.PropertyType); + Assert.AreEqual ("System.String", property.PropertyType.FullName); + + Assert.IsNull (property.GetMethod); + Assert.IsNotNull (property.SetMethod); + Assert.AreEqual (MethodSemanticsAttributes.Setter, property.SetMethod.SemanticsAttributes); + } + + [TestIL ("others.il")] + public void OtherMethod (ModuleDefinition module) + { + var type = module.GetType ("Others"); + + Assert.IsTrue (type.HasProperties); + + var properties = type.Properties; + + Assert.AreEqual (1, properties.Count); + + var property = properties [0]; + + Assert.IsNotNull (property); + Assert.AreEqual ("Context", property.Name); + Assert.IsNotNull (property.PropertyType); + Assert.AreEqual ("System.String", property.PropertyType.FullName); + + Assert.IsTrue (property.HasOtherMethods); + + Assert.AreEqual (2, property.OtherMethods.Count); + + var other = property.OtherMethods [0]; + Assert.AreEqual ("let_Context", other.Name); + + other = property.OtherMethods [1]; + Assert.AreEqual ("bet_Context", other.Name); + } + + [TestCSharp ("Properties.cs")] + public void SetOnlyIndexer (ModuleDefinition module) + { + var type = module.GetType ("Bar"); + var indexer = type.Properties.Where (property => property.Name == "Item").First (); + + var parameters = indexer.Parameters; + + Assert.AreEqual (2, parameters.Count); + Assert.AreEqual ("System.Int32", parameters [0].ParameterType.FullName); + Assert.AreEqual ("System.String", parameters [1].ParameterType.FullName); + } + + [TestCSharp ("Properties.cs")] + public void ReadSemanticsFirst (ModuleDefinition module) + { + var type = module.GetType ("Baz"); + var setter = type.GetMethod ("set_Bingo"); + + Assert.AreEqual (MethodSemanticsAttributes.Setter, setter.SemanticsAttributes); + + var property = type.Properties.Where (p => p.Name == "Bingo").First (); + + Assert.AreEqual (setter, property.SetMethod); + Assert.AreEqual (type.GetMethod ("get_Bingo"), property.GetMethod); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ResolveTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ResolveTests.cs new file mode 100644 index 0000000000..9ec1be8f26 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/ResolveTests.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class ResolveTests : BaseTestFixture { + + [Test] + public void StringEmpty () + { + var string_empty = GetReference, FieldReference> ( + () => string.Empty); + + Assert.AreEqual ("System.String System.String::Empty", string_empty.FullName); + + var definition = string_empty.Resolve (); + + Assert.IsNotNull (definition); + + Assert.AreEqual ("System.String System.String::Empty", definition.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + delegate string GetSubstring (string str, int start, int length); + + [Test] + public void StringSubstring () + { + var string_substring = GetReference ( + (s, start, length) => s.Substring (start, length)); + + var definition = string_substring.Resolve (); + + Assert.IsNotNull (definition); + + Assert.AreEqual ("System.String System.String::Substring(System.Int32,System.Int32)", definition.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + [Test] + public void StringLength () + { + var string_length = GetReference, MethodReference> (s => s.Length); + + var definition = string_length.Resolve (); + + Assert.IsNotNull (definition); + + Assert.AreEqual ("get_Length", definition.Name); + Assert.AreEqual ("System.String", definition.DeclaringType.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + [Test] + public void ListOfStringAdd () + { + var list_add = GetReference>, MethodReference> ( + list => list.Add ("coucou")); + + Assert.AreEqual ("System.Void System.Collections.Generic.List`1::Add(!0)", list_add.FullName); + + var definition = list_add.Resolve (); + + Assert.IsNotNull (definition); + + Assert.AreEqual ("System.Void System.Collections.Generic.List`1::Add(T)", definition.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + [Test] + public void DictionaryOfStringTypeDefinitionTryGetValue () + { + var try_get_value = GetReference, string, bool>, MethodReference> ( + (d, s) => { + TypeDefinition type; + return d.TryGetValue (s, out type); + }); + + Assert.AreEqual ("System.Boolean System.Collections.Generic.Dictionary`2::TryGetValue(!0,!1&)", + try_get_value.FullName); + + var definition = try_get_value.Resolve (); + + Assert.IsNotNull (definition); + + Assert.AreEqual ("System.Boolean System.Collections.Generic.Dictionary`2::TryGetValue(TKey,TValue&)", definition.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + class CustomResolver : DefaultAssemblyResolver { + + public void Register (AssemblyDefinition assembly) + { + this.RegisterAssembly (assembly); + this.AddSearchDirectory (Path.GetDirectoryName (assembly.MainModule.FullyQualifiedName)); + } + } + + [Test] + public void ExportedTypeFromModule () + { + var resolver = new CustomResolver (); + var parameters = new ReaderParameters { AssemblyResolver = resolver }; + var mma = GetResourceModule ("mma.exe", parameters); + + resolver.Register (mma.Assembly); + + var current_module = GetCurrentModule (parameters); + var reference = new TypeReference ("Module.A", "Foo", current_module, AssemblyNameReference.Parse (mma.Assembly.FullName), false); + + var definition = reference.Resolve (); + Assert.IsNotNull (definition); + Assert.AreEqual ("Module.A.Foo", definition.FullName); + } + + [Test] + public void TypeForwarder () + { + var resolver = new CustomResolver (); + var parameters = new ReaderParameters { AssemblyResolver = resolver }; + + var types = ModuleDefinition.ReadModule ( + CompilationService.CompileResource (GetCSharpResourcePath ("CustomAttributes.cs", typeof (ResolveTests).Assembly)), + parameters); + + resolver.Register (types.Assembly); + + var current_module = GetCurrentModule (parameters); + var reference = new TypeReference ("System.Diagnostics", "DebuggableAttribute", current_module, AssemblyNameReference.Parse (types.Assembly.FullName), false); + + var definition = reference.Resolve (); + Assert.IsNotNull (definition); + Assert.AreEqual ("System.Diagnostics.DebuggableAttribute", definition.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + [Test] + public void NestedTypeForwarder () + { + var resolver = new CustomResolver (); + var parameters = new ReaderParameters { AssemblyResolver = resolver }; + + var types = ModuleDefinition.ReadModule ( + CompilationService.CompileResource (GetCSharpResourcePath ("CustomAttributes.cs", typeof (ResolveTests).Assembly)), + parameters); + + resolver.Register (types.Assembly); + + var current_module = GetCurrentModule (parameters); + var reference = new TypeReference ("", "DebuggingModes", current_module, null, true); + reference.DeclaringType = new TypeReference ("System.Diagnostics", "DebuggableAttribute", current_module, AssemblyNameReference.Parse (types.Assembly.FullName), false); + + var definition = reference.Resolve (); + Assert.IsNotNull (definition); + Assert.AreEqual ("System.Diagnostics.DebuggableAttribute/DebuggingModes", definition.FullName); + Assert.AreEqual ("mscorlib", definition.Module.Assembly.Name.Name); + } + + [Test] + public void RectangularArrayResolveGetMethod () + { + var get_a_b = GetReference, MethodReference> (matrix => matrix [2, 2]); + + Assert.AreEqual ("Get", get_a_b.Name); + Assert.IsNotNull (get_a_b.Module); + Assert.IsNull (get_a_b.Resolve ()); + } + + [Test] + public void ResolveFunctionPointer () + { + var module = GetResourceModule ("cppcli.dll"); + var global = module.GetType (""); + var field = global.GetField ("__onexitbegin_app_domain"); + + var type = field.FieldType as PointerType; + Assert.IsNotNull(type); + + var fnptr = type.ElementType as FunctionPointerType; + Assert.IsNotNull (fnptr); + + Assert.IsNull (fnptr.Resolve ()); + } + + [Test] + public void ResolveGenericParameter () + { + var collection = typeof (Mono.Collections.Generic.Collection<>).ToDefinition (); + var parameter = collection.GenericParameters [0]; + + Assert.IsNotNull (parameter); + + Assert.IsNull (parameter.Resolve ()); + } + + [Test] + public void ResolveNullVersionAssembly () + { + var reference = AssemblyNameReference.Parse ("System.Core"); + reference.Version = null; + + var resolver = new DefaultAssemblyResolver (); + Assert.IsNotNull (resolver.Resolve (reference)); + } + + static TRet GetReference (TDel code) + { + var @delegate = code as Delegate; + if (@delegate == null) + throw new InvalidOperationException (); + + var reference = (TRet) GetReturnee (GetMethodFromDelegate (@delegate)); + + Assert.IsNotNull (reference); + + return reference; + } + + static object GetReturnee (MethodDefinition method) + { + Assert.IsTrue (method.HasBody); + + var instruction = method.Body.Instructions [method.Body.Instructions.Count - 1]; + + Assert.IsNotNull (instruction); + + while (instruction != null) { + var opcode = instruction.OpCode; + switch (opcode.OperandType) { + case OperandType.InlineField: + case OperandType.InlineTok: + case OperandType.InlineType: + case OperandType.InlineMethod: + return instruction.Operand; + default: + instruction = instruction.Previous; + break; + } + } + + throw new InvalidOperationException (); + } + + static MethodDefinition GetMethodFromDelegate (Delegate @delegate) + { + var method = @delegate.Method; + var type = (TypeDefinition) TypeParser.ParseType (GetCurrentModule (), method.DeclaringType.FullName); + + Assert.IsNotNull (type); + + return type.Methods.Where (m => m.Name == method.Name).First (); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs new file mode 100644 index 0000000000..2cc8d5b43a --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/SecurityDeclarationTests.cs @@ -0,0 +1,290 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; + +using Mono.Cecil; +using Mono.Cecil.Metadata; +using Mono.Cecil.PE; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class SecurityDeclarationTests : BaseTestFixture { + + [TestModule ("decsec-xml.dll")] + public void XmlSecurityDeclaration (ModuleDefinition module) + { + var type = module.GetType ("SubLibrary"); + + Assert.IsTrue (type.HasSecurityDeclarations); + + Assert.AreEqual (1, type.SecurityDeclarations.Count); + + var declaration = type.SecurityDeclarations [0]; + Assert.AreEqual (SecurityAction.Deny, declaration.Action); + + Assert.AreEqual (1, declaration.SecurityAttributes.Count); + + var attribute = declaration.SecurityAttributes [0]; + + Assert.AreEqual ("System.Security.Permissions.PermissionSetAttribute", attribute.AttributeType.FullName); + + Assert.AreEqual (1, attribute.Properties.Count); + + var named_argument = attribute.Properties [0]; + + Assert.AreEqual ("XML", named_argument.Name); + + var argument = named_argument.Argument; + + Assert.AreEqual ("System.String", argument.Type.FullName); + + const string permission_set = "\r\n\r\n\r\n"; + + Assert.AreEqual (permission_set, argument.Value); + } + + [TestModule ("decsec1-xml.dll")] + public void XmlNet_1_1SecurityDeclaration (ModuleDefinition module) + { + var type = module.GetType ("SubLibrary"); + + Assert.IsTrue (type.HasSecurityDeclarations); + + Assert.AreEqual (1, type.SecurityDeclarations.Count); + + var declaration = type.SecurityDeclarations [0]; + Assert.AreEqual (SecurityAction.Deny, declaration.Action); + + Assert.AreEqual (1, declaration.SecurityAttributes.Count); + + var attribute = declaration.SecurityAttributes [0]; + + Assert.AreEqual ("System.Security.Permissions.PermissionSetAttribute", attribute.AttributeType.FullName); + + Assert.AreEqual (1, attribute.Properties.Count); + + var named_argument = attribute.Properties [0]; + + Assert.AreEqual ("XML", named_argument.Name); + + var argument = named_argument.Argument; + + Assert.AreEqual ("System.String", argument.Type.FullName); + + const string permission_set = "\r\n\r\n\r\n"; + + Assert.AreEqual (permission_set, argument.Value); + } + + [Test] + public void DefineSecurityDeclarationByBlob () + { + var file = Path.Combine(Path.GetTempPath(), "SecDecBlob.dll"); + var module = ModuleDefinition.CreateModule ("SecDecBlob.dll", new ModuleParameters { Kind = ModuleKind.Dll, Runtime = TargetRuntime.Net_2_0 }); + + const string permission_set = "\r\n\r\n\r\n"; + + var declaration = new SecurityDeclaration (SecurityAction.Deny, Encoding.Unicode.GetBytes (permission_set)); + module.Assembly.SecurityDeclarations.Add (declaration); + + module.Write (file); + module = ModuleDefinition.ReadModule (file); + + declaration = module.Assembly.SecurityDeclarations [0]; + Assert.AreEqual (SecurityAction.Deny, declaration.Action); + Assert.AreEqual (1, declaration.SecurityAttributes.Count); + + var attribute = declaration.SecurityAttributes [0]; + Assert.AreEqual ("System.Security.Permissions.PermissionSetAttribute", attribute.AttributeType.FullName); + Assert.AreEqual (1, attribute.Properties.Count); + + var named_argument = attribute.Properties [0]; + Assert.AreEqual ("XML", named_argument.Name); + var argument = named_argument.Argument; + Assert.AreEqual ("System.String", argument.Type.FullName); + 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) + { + var type = module.GetType ("SubLibrary"); + + Assert.IsTrue (type.HasSecurityDeclarations); + + Assert.AreEqual (1, type.SecurityDeclarations.Count); + + var declaration = type.SecurityDeclarations [0]; + Assert.AreEqual (SecurityAction.Deny, declaration.Action); + + Assert.AreEqual (1, declaration.SecurityAttributes.Count); + + var attribute = declaration.SecurityAttributes [0]; + + Assert.AreEqual ("System.Security.Permissions.SecurityPermissionAttribute", attribute.AttributeType.FullName); + + Assert.AreEqual (1, attribute.Properties.Count); + + var named_argument = attribute.Properties [0]; + + Assert.AreEqual ("UnmanagedCode", named_argument.Name); + + var argument = named_argument.Argument; + + Assert.AreEqual ("System.Boolean", argument.Type.FullName); + + Assert.AreEqual (true, argument.Value); + } + + static void AssertCustomAttributeArgument (string expected, CustomAttributeNamedArgument named_argument) + { + AssertCustomAttributeArgument (expected, named_argument.Argument); + } + + static void AssertCustomAttributeArgument (string expected, CustomAttributeArgument argument) + { + var result = new StringBuilder (); + PrettyPrint (argument, result); + + Assert.AreEqual (expected, result.ToString ()); + } + + static string PrettyPrint (CustomAttribute attribute) + { + var signature = new StringBuilder (); + signature.Append (".ctor ("); + + for (int i = 0; i < attribute.ConstructorArguments.Count; i++) { + if (i > 0) + signature.Append (", "); + + PrettyPrint (attribute.ConstructorArguments [i], signature); + } + + signature.Append (")"); + return signature.ToString (); + } + + static void PrettyPrint (CustomAttributeArgument argument, StringBuilder signature) + { + var value = argument.Value; + + signature.Append ("("); + + PrettyPrint (argument.Type, signature); + + signature.Append (":"); + + PrettyPrintValue (argument.Value, signature); + + signature.Append (")"); + } + + static void PrettyPrintValue (object value, StringBuilder signature) + { + if (value == null) { + signature.Append ("null"); + return; + } + + var arguments = value as CustomAttributeArgument []; + if (arguments != null) { + signature.Append ("{"); + for (int i = 0; i < arguments.Length; i++) { + if (i > 0) + signature.Append (", "); + + PrettyPrint (arguments [i], signature); + } + signature.Append ("}"); + + return; + } + + switch (Type.GetTypeCode (value.GetType ())) { + case TypeCode.String: + signature.AppendFormat ("\"{0}\"", value); + break; + case TypeCode.Char: + signature.AppendFormat ("'{0}'", (char) value); + break; + default: + var formattable = value as IFormattable; + if (formattable != null) { + signature.Append (formattable.ToString (null, CultureInfo.InvariantCulture)); + return; + } + + if (value is CustomAttributeArgument) { + PrettyPrint ((CustomAttributeArgument) value, signature); + return; + } + break; + } + } + + static void PrettyPrint (TypeReference type, StringBuilder signature) + { + if (type.IsArray) { + ArrayType array = (ArrayType) type; + signature.AppendFormat ("{0}[]", array.ElementType.etype.ToString ()); + } else if (type.etype == ElementType.None) { + signature.Append (type.FullName); + } else + signature.Append (type.etype.ToString ()); + } + + static void AssertArgument (T value, CustomAttributeNamedArgument named_argument) + { + AssertArgument (value, named_argument.Argument); + } + + static void AssertArgument (T value, CustomAttributeArgument argument) + { + AssertArgument (typeof (T).FullName, (object) value, argument); + } + + static void AssertArgument (string type, object value, CustomAttributeArgument argument) + { + Assert.AreEqual (type, argument.Type.FullName); + Assert.AreEqual (value, argument.Value); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeParserTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeParserTests.cs new file mode 100644 index 0000000000..a367919b91 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeParserTests.cs @@ -0,0 +1,394 @@ +using System; +using System.Linq; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class TypeParserTests : BaseTestFixture { + + [Test] + public void SimpleStringReference () + { + var module = GetCurrentModule (); + var corlib = module.TypeSystem.Corlib; + + const string fullname = "System.String"; + + var type = TypeParser.ParseType (module, fullname); + Assert.IsNotNull (type); + Assert.AreEqual (corlib, type.Scope); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System", type.Namespace); + Assert.AreEqual ("String", type.Name); + Assert.AreEqual (MetadataType.String, type.MetadataType); + Assert.IsFalse (type.IsValueType); + Assert.IsInstanceOfType (typeof (TypeReference), type); + } + + [Test] + public void SimpleInt32Reference () + { + var module = GetCurrentModule (); + var corlib = module.TypeSystem.Corlib; + + const string fullname = "System.Int32"; + + var type = TypeParser.ParseType (module, fullname); + Assert.IsNotNull (type); + Assert.AreEqual (corlib, type.Scope); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System", type.Namespace); + Assert.AreEqual ("Int32", type.Name); + Assert.AreEqual (MetadataType.Int32, type.MetadataType); + Assert.IsTrue (type.IsValueType); + Assert.IsInstanceOfType (typeof (TypeReference), type); + } + + [Test] + public void SimpleTypeDefinition () + { + var module = GetCurrentModule (); + + const string fullname = "Mono.Cecil.Tests.TypeParserTests"; + + var type = TypeParser.ParseType (module, fullname); + Assert.IsNotNull (type); + Assert.AreEqual (module, type.Scope); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("Mono.Cecil.Tests", type.Namespace); + Assert.AreEqual ("TypeParserTests", type.Name); + Assert.IsInstanceOfType (typeof (TypeDefinition), type); + } + + [Test] + public void ByRefTypeReference () + { + var module = GetCurrentModule (); + var corlib = module.TypeSystem.Corlib; + + const string fullname = "System.String&"; + + var type = TypeParser.ParseType (module, fullname); + + Assert.IsInstanceOfType (typeof (ByReferenceType), type); + + type = ((ByReferenceType) type).ElementType; + + Assert.IsNotNull (type); + Assert.AreEqual (corlib, type.Scope); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System", type.Namespace); + Assert.AreEqual ("String", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + } + + [Test] + public void FullyQualifiedTypeReference () + { + var module = GetCurrentModule (); + var cecil = module.AssemblyReferences.Where (reference => reference.Name == "Mono.Cecil").First (); + + var fullname = "Mono.Cecil.TypeDefinition, " + cecil.FullName; + + var type = TypeParser.ParseType (module, fullname); + Assert.IsNotNull (type); + Assert.AreEqual (cecil, type.Scope); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("Mono.Cecil", type.Namespace); + Assert.AreEqual ("TypeDefinition", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + } + + [Test] + public void OpenGenericType () + { + var module = GetCurrentModule (); + var corlib = module.TypeSystem.Corlib; + + const string fullname = "System.Collections.Generic.Dictionary`2"; + + var type = TypeParser.ParseType (module, fullname); + Assert.IsNotNull (type); + Assert.AreEqual (corlib, type.Scope); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System.Collections.Generic", type.Namespace); + Assert.AreEqual ("Dictionary`2", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + Assert.AreEqual (2, type.GenericParameters.Count); + } + + public class ID {} + + [Test] + public void SimpleNestedType () + { + var module = GetCurrentModule (); + + const string fullname = "Mono.Cecil.Tests.TypeParserTests+ID"; + + var type = TypeParser.ParseType (module, fullname); + + Assert.IsNotNull (type); + Assert.AreEqual (module, type.Module); + Assert.AreEqual (module, type.Scope); + Assert.AreEqual ("", type.Namespace); + Assert.AreEqual ("ID", type.Name); + + Assert.AreEqual ("Mono.Cecil.Tests.TypeParserTests/ID", type.FullName); + Assert.AreEqual (fullname, TypeParser.ToParseable (type)); + } + + [Test] + public void TripleNestedTypeWithScope () + { + var module = GetCurrentModule (); + + const string fullname = "Bingo.Foo`1+Bar`1+Baz`1, Bingo"; + + var type = TypeParser.ParseType (module, fullname); + + Assert.AreEqual ("Bingo.Foo`1+Bar`1+Baz`1, Bingo, Culture=neutral, PublicKeyToken=null", TypeParser.ToParseable (type)); + + Assert.IsNotNull (type); + Assert.AreEqual ("Bingo", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("", type.Namespace); + Assert.AreEqual ("Baz`1", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + Assert.AreEqual (1, type.GenericParameters.Count); + + type = type.DeclaringType; + + Assert.IsNotNull (type); + Assert.AreEqual ("Bingo", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("", type.Namespace); + Assert.AreEqual ("Bar`1", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + Assert.AreEqual (1, type.GenericParameters.Count); + + type = type.DeclaringType; + + Assert.IsNotNull (type); + Assert.AreEqual ("Bingo", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("Bingo", type.Namespace); + Assert.AreEqual ("Foo`1", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + Assert.AreEqual (1, type.GenericParameters.Count); + } + + [Test] + public void Vector () + { + var module = GetCurrentModule (); + + const string fullname = "Bingo.Gazonk[], Bingo"; + + var type = TypeParser.ParseType (module, fullname); + + Assert.AreEqual ("Bingo.Gazonk[], Bingo, Culture=neutral, PublicKeyToken=null", TypeParser.ToParseable (type)); + + var array = type as ArrayType; + Assert.IsNotNull (array); + Assert.AreEqual (1, array.Rank); + Assert.IsTrue (array.IsVector); + + type = array.ElementType; + + Assert.IsNotNull (type); + Assert.AreEqual ("Bingo", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("Bingo", type.Namespace); + Assert.AreEqual ("Gazonk", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + } + + [Test] + public void ThreeDimensionalArray () + { + var module = GetCurrentModule (); + + const string fullname = "Bingo.Gazonk[,,], Bingo"; + + var type = TypeParser.ParseType (module, fullname); + + var array = type as ArrayType; + Assert.IsNotNull (array); + Assert.AreEqual (3, array.Rank); + Assert.IsFalse (array.IsVector); + + type = array.ElementType; + + Assert.IsNotNull (type); + Assert.AreEqual ("Bingo", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("Bingo", type.Namespace); + Assert.AreEqual ("Gazonk", type.Name); + Assert.IsInstanceOfType (typeof (TypeReference), type); + } + + [Test] + public void GenericInstanceExternArguments () + { + var module = GetCurrentModule (); + + var fullname = string.Format ("System.Collections.Generic.Dictionary`2[[System.Int32, {0}],[System.String, {0}]]", + typeof (object).Assembly.FullName); + + var type = TypeParser.ParseType (module, fullname); + + Assert.AreEqual (fullname, TypeParser.ToParseable (type)); + + var instance = type as GenericInstanceType; + Assert.IsNotNull (instance); + Assert.AreEqual (2, instance.GenericArguments.Count); + Assert.AreEqual ("mscorlib", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System.Collections.Generic", type.Namespace); + Assert.AreEqual ("Dictionary`2", type.Name); + + type = instance.ElementType; + + Assert.AreEqual (2, type.GenericParameters.Count); + + var argument = instance.GenericArguments [0]; + Assert.AreEqual ("mscorlib", argument.Scope.Name); + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("System", argument.Namespace); + Assert.AreEqual ("Int32", argument.Name); + + argument = instance.GenericArguments [1]; + Assert.AreEqual ("mscorlib", argument.Scope.Name); + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("System", argument.Namespace); + Assert.AreEqual ("String", argument.Name); + } + + [Test] + public void GenericInstanceMixedArguments () + { + var module = GetCurrentModule (); + + var fullname = string.Format ("System.Collections.Generic.Dictionary`2[Mono.Cecil.Tests.TypeParserTests,[System.String, {0}]]", + typeof (object).Assembly.FullName); + + var type = TypeParser.ParseType (module, fullname); + + var instance = type as GenericInstanceType; + Assert.IsNotNull (instance); + Assert.AreEqual (2, instance.GenericArguments.Count); + Assert.AreEqual ("mscorlib", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System.Collections.Generic", type.Namespace); + Assert.AreEqual ("Dictionary`2", type.Name); + + type = instance.ElementType; + + Assert.AreEqual (2, type.GenericParameters.Count); + + var argument = instance.GenericArguments [0]; + Assert.IsInstanceOfType (typeof (TypeDefinition), argument); + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("Mono.Cecil.Tests", argument.Namespace); + Assert.AreEqual ("TypeParserTests", argument.Name); + + argument = instance.GenericArguments [1]; + Assert.AreEqual ("mscorlib", argument.Scope.Name); + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("System", argument.Namespace); + Assert.AreEqual ("String", argument.Name); + } + + public class Foo { + } + + public class Bar {} + + [Test] + public void GenericInstanceTwoNonFqArguments () + { + var module = GetCurrentModule (); + + var fullname = string.Format ("System.Collections.Generic.Dictionary`2[Mono.Cecil.Tests.TypeParserTests+Bar,Mono.Cecil.Tests.TypeParserTests+Bar], {0}", typeof (object).Assembly.FullName); + + var type = TypeParser.ParseType (module, fullname); + + var instance = type as GenericInstanceType; + Assert.IsNotNull (instance); + Assert.AreEqual (2, instance.GenericArguments.Count); + Assert.AreEqual ("mscorlib", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System.Collections.Generic", type.Namespace); + Assert.AreEqual ("Dictionary`2", type.Name); + + type = instance.ElementType; + + Assert.AreEqual (2, type.GenericParameters.Count); + + var argument = instance.GenericArguments [0]; + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("", argument.Namespace); + Assert.AreEqual ("Bar", argument.Name); + Assert.IsInstanceOfType (typeof (TypeDefinition), argument); + + argument = instance.GenericArguments [1]; + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("", argument.Namespace); + Assert.AreEqual ("Bar", argument.Name); + Assert.IsInstanceOfType (typeof (TypeDefinition), argument); + } + + [Test] + public void ComplexGenericInstanceMixedArguments () + { + var module = GetCurrentModule (); + + var fullname = string.Format ("System.Collections.Generic.Dictionary`2[[System.String, {0}],Mono.Cecil.Tests.TypeParserTests+Foo`2[Mono.Cecil.Tests.TypeParserTests,[System.Int32, {0}]]]", + typeof (object).Assembly.FullName); + + var type = TypeParser.ParseType (module, fullname); + + var instance = type as GenericInstanceType; + Assert.IsNotNull (instance); + Assert.AreEqual (2, instance.GenericArguments.Count); + Assert.AreEqual ("mscorlib", type.Scope.Name); + Assert.AreEqual (module, type.Module); + Assert.AreEqual ("System.Collections.Generic", type.Namespace); + Assert.AreEqual ("Dictionary`2", type.Name); + + type = instance.ElementType; + + Assert.AreEqual (2, type.GenericParameters.Count); + + var argument = instance.GenericArguments [0]; + Assert.AreEqual ("mscorlib", argument.Scope.Name); + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("System", argument.Namespace); + Assert.AreEqual ("String", argument.Name); + + argument = instance.GenericArguments [1]; + + instance = argument as GenericInstanceType; + Assert.IsNotNull (instance); + Assert.AreEqual (2, instance.GenericArguments.Count); + Assert.AreEqual (module, instance.Module); + Assert.AreEqual ("Mono.Cecil.Tests.TypeParserTests/Foo`2", instance.ElementType.FullName); + Assert.IsInstanceOfType (typeof (TypeDefinition), instance.ElementType); + + argument = instance.GenericArguments [0]; + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("Mono.Cecil.Tests", argument.Namespace); + Assert.AreEqual ("TypeParserTests", argument.Name); + Assert.IsInstanceOfType (typeof (TypeDefinition), argument); + + argument = instance.GenericArguments [1]; + Assert.AreEqual ("mscorlib", argument.Scope.Name); + Assert.AreEqual (module, argument.Module); + Assert.AreEqual ("System", argument.Namespace); + Assert.AreEqual ("Int32", argument.Name); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeTests.cs new file mode 100644 index 0000000000..82e025b0b4 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/TypeTests.cs @@ -0,0 +1,199 @@ +using System; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Metadata; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class TypeTests : BaseTestFixture { + + [TestCSharp ("Layouts.cs")] + public void TypeLayout (ModuleDefinition module) + { + var foo = module.GetType ("Foo"); + Assert.IsNotNull (foo); + Assert.IsTrue (foo.IsValueType); + + Assert.IsTrue (foo.HasLayoutInfo); + Assert.AreEqual (16, foo.ClassSize); + + var babar = module.GetType ("Babar"); + Assert.IsNotNull (babar); + Assert.IsFalse (babar.IsValueType); + Assert.IsFalse (babar.HasLayoutInfo); + } + + [TestIL ("types.il")] + public void SimpleInterfaces (ModuleDefinition module) + { + var ibaz = module.GetType ("IBaz"); + Assert.IsNotNull (ibaz); + + Assert.IsTrue (ibaz.HasInterfaces); + + var interfaces = ibaz.Interfaces; + + Assert.AreEqual (2, interfaces.Count); + + Assert.AreEqual ("IBar", interfaces [0].FullName); + Assert.AreEqual ("IFoo", interfaces [1].FullName); + } + + [TestCSharp ("Generics.cs")] + public void GenericTypeDefinition (ModuleDefinition module) + { + var foo = module.GetType ("Foo`2"); + Assert.IsNotNull (foo); + + Assert.IsTrue (foo.HasGenericParameters); + Assert.AreEqual (2, foo.GenericParameters.Count); + + var tbar = foo.GenericParameters [0]; + + Assert.AreEqual ("TBar", tbar.Name); + Assert.AreEqual (foo, tbar.Owner); + + var tbaz = foo.GenericParameters [1]; + + Assert.AreEqual ("TBaz", tbaz.Name); + Assert.AreEqual (foo, tbaz.Owner); + } + + [TestCSharp ("Generics.cs")] + public void ConstrainedGenericType (ModuleDefinition module) + { + var bongo_t = module.GetType ("Bongo`1"); + Assert.IsNotNull (bongo_t); + + var t = bongo_t.GenericParameters [0]; + Assert.IsNotNull (t); + Assert.AreEqual ("T", t.Name); + + Assert.IsTrue (t.HasConstraints); + Assert.AreEqual (2, t.Constraints.Count); + + Assert.AreEqual ("Zap", t.Constraints [0].FullName); + Assert.AreEqual ("IZoom", t.Constraints [1].FullName); + } + + [TestCSharp ("Generics.cs")] + public void GenericBaseType (ModuleDefinition module) + { + var child = module.GetType ("Child`1"); + + var child_t = child.GenericParameters [0]; + Assert.IsNotNull (child_t); + + var instance = child.BaseType as GenericInstanceType; + Assert.IsNotNull (instance); + Assert.AreNotEqual (0, instance.MetadataToken.RID); + + Assert.AreEqual (child_t, instance.GenericArguments [0]); + } + + [TestCSharp ("Generics.cs")] + public void GenericConstraintOnGenericParameter (ModuleDefinition module) + { + var duel = module.GetType ("Duel`3"); + + Assert.AreEqual (3, duel.GenericParameters.Count); + + var t1 = duel.GenericParameters [0]; + var t2 = duel.GenericParameters [1]; + var t3 = duel.GenericParameters [2]; + + Assert.AreEqual (t1, t2.Constraints [0]); + Assert.AreEqual (t2, t3.Constraints [0]); + } + + [TestCSharp ("Generics.cs")] + public void GenericForwardBaseType (ModuleDefinition module) + { + var tamchild = module.GetType ("TamChild"); + + Assert.IsNotNull (tamchild); + Assert.IsNotNull (tamchild.BaseType); + + var generic_instance = tamchild.BaseType as GenericInstanceType; + + Assert.IsNotNull (generic_instance); + + Assert.AreEqual (1, generic_instance.GenericArguments.Count); + Assert.AreEqual (module.GetType ("Tamtam"), generic_instance.GenericArguments [0]); + } + + [TestCSharp ("Generics.cs")] + public void TypeExtentingGenericOfSelf (ModuleDefinition module) + { + var rec_child = module.GetType ("RecChild"); + + Assert.IsNotNull (rec_child); + Assert.IsNotNull (rec_child.BaseType); + + var generic_instance = rec_child.BaseType as GenericInstanceType; + + Assert.IsNotNull (generic_instance); + + Assert.AreEqual (1, generic_instance.GenericArguments.Count); + Assert.AreEqual (rec_child, generic_instance.GenericArguments [0]); + } + + [TestCSharp ("Methods.cs")] + public void TypeReferenceValueType (ModuleDefinition module) + { + var baz = module.GetType ("Baz"); + var method = baz.GetMethod ("PrintAnswer"); + + var box = method.Body.Instructions.Where (i => i.OpCode == OpCodes.Box).First (); + var int32 = (TypeReference) box.Operand; + + Assert.IsTrue (int32.IsValueType); + } + + [TestModule ("gifaceref.exe")] + public void GenericInterfaceReference (ModuleDefinition module) + { + var type = module.GetType ("Program"); + var iface = type.Interfaces [0]; + + var instance = (GenericInstanceType) iface; + var owner = instance.ElementType; + + Assert.AreEqual (1, instance.GenericArguments.Count); + Assert.AreEqual (1, owner.GenericParameters.Count); + } + + [TestModule ("cscgpbug.dll", Verify = false)] + public void UnboundGenericParameter (ModuleDefinition module) + { + var type = module.GetType ("ListViewModel"); + var method = type.GetMethod ("<>n__FabricatedMethod1"); + + var parameter = method.ReturnType as GenericParameter; + + Assert.IsNotNull (parameter); + Assert.AreEqual (0, parameter.Position); + Assert.IsNull (parameter.Owner); + } + + [TestCSharp ("Generics.cs")] + public void GenericMultidimensionalArray (ModuleDefinition module) + { + var type = module.GetType ("LaMatrix"); + var method = type.GetMethod ("At"); + + var call = method.Body.Instructions.Where (i => i.Operand is MethodReference).First (); + var get = (MethodReference) call.Operand; + + Assert.IsNotNull (get); + Assert.AreEqual (0, get.GenericParameters.Count); + Assert.AreEqual (MethodCallingConvention.Default, get.CallingConvention); + Assert.AreEqual (method.GenericParameters [0], get.ReturnType); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/VariableTests.cs b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/VariableTests.cs new file mode 100644 index 0000000000..9f6c54c67a --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Mono.Cecil.Tests/VariableTests.cs @@ -0,0 +1,108 @@ +using System; +using System.Linq; + +using Mono.Cecil; +using Mono.Cecil.Cil; + +using NUnit.Framework; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class VariableTests : BaseTestFixture { + + [Test] + public void AddVariableIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var x = new VariableDefinition ("x", object_ref); + var y = new VariableDefinition ("y", object_ref); + + body.Variables.Add (x); + body.Variables.Add (y); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + } + + [Test] + public void RemoveAtVariableIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var x = new VariableDefinition ("x", object_ref); + var y = new VariableDefinition ("y", object_ref); + var z = new VariableDefinition ("z", object_ref); + + body.Variables.Add (x); + body.Variables.Add (y); + body.Variables.Add (z); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + Assert.AreEqual (2, z.Index); + + body.Variables.RemoveAt (1); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (-1, y.Index); + Assert.AreEqual (1, z.Index); + } + + [Test] + public void RemoveVariableIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var x = new VariableDefinition ("x", object_ref); + var y = new VariableDefinition ("y", object_ref); + var z = new VariableDefinition ("z", object_ref); + + body.Variables.Add (x); + body.Variables.Add (y); + body.Variables.Add (z); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + Assert.AreEqual (2, z.Index); + + body.Variables.Remove (y); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (-1, y.Index); + Assert.AreEqual (1, z.Index); + } + + [Test] + public void InsertVariableIndex () + { + var object_ref = new TypeReference ("System", "Object", null, null, false); + var method = new MethodDefinition ("foo", MethodAttributes.Static, object_ref); + var body = new MethodBody (method); + + var x = new VariableDefinition ("x", object_ref); + var y = new VariableDefinition ("y", object_ref); + var z = new VariableDefinition ("z", object_ref); + + body.Variables.Add (x); + body.Variables.Add (z); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (-1, y.Index); + Assert.AreEqual (1, z.Index); + + body.Variables.Insert (1, y); + + Assert.AreEqual (0, x.Index); + Assert.AreEqual (1, y.Index); + Assert.AreEqual (2, z.Index); + } + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/boxedoptarg.dll b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/boxedoptarg.dll new file mode 100644 index 0000000000000000000000000000000000000000..23edd61bb885effcb95ae501ed93d10716729b94 GIT binary patch literal 3072 zcmeHJ&2Jk;6#uR3L~fu_P^FLx5+-$ms)81y_&^1sZa&%uk|xA%8da5=wY@lt);rej zx;Qxm4obKcEsvBo2h%n_b6tRne;I0inL+eZP70-kX_C zR&U@B*(GhS!E>JS`-^m``qi_8*iu)%Irw^=^!|BS77pYdL8==!wH75vktg5aG z+kx@|wYXMROR8|($woqz>0MOfBy2|)9!8$k(qwQ$|Xe&C)TMvxgwT`LKImh z387@_7mht5?E)E;z6Qq3Z;z*H5`tgP0yji10sHB?)RnMp;MD=cGb##T2gi`3e)U)b z?AYzZ)MsS)^qB@8+n?rbJB-2_-KMru8kf$5nt>9lw?o(03^cWF(=540h<#83=KIt{ zl(`b5whV@FO94AvYl-nWU@CKtOGnNRpXX-fPv)&Olhk#mXcz3c!rc28B=Hb@(nrMn zSHKom?TcKFLoaAV6p>>cGQ<4!GR7$LB$2;zeR+{wQJ0$Y^S-W<3(#a;nFLOX^4IJf z#*;o|#Pk`IzC;%;HsON64=EqU6kf+L%9taKNClD@=|-f}#33WED~cGNnB}l7Y#D7F z?_iYL*qDX)SdI8zBb~q*Bj>pGG;HD|=^J<(**!c4-%^)1*#)crFh5$=^|tSRjAm5R zq3>03S!QFWd)}(^uA5v%}vf zSH5q4_~63Li@zcF>q!3 zUzahYkM_nBGTk#V1$2Lks8R;rWkuF;{33UcP&0X21N$h(7I=$$v73wy8QrU;z%M`# zff7%^GTp=`Hel^O=jEVD9jrj3L#a+KyU7e1%u#2QJhpSDwiQM+%*q85w`;0vV23MU zp2t&&BBLz{Dmc`}1t_WF}vfe*}@OPoW*$R>O8vCFES cwvJ0*!i%1OO8#e1$)C9wo&9CL|M&#{0YH8KWdHyG literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/catch.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/catch.exe new file mode 100644 index 0000000000000000000000000000000000000000..d7ef04afb22c37d1d9c7b15929a40e012140d921 GIT binary patch literal 3584 zcmeHJ&uL1wszk!GQ)PB#J{&t4Oe3Pn@N@JMPTd zbvRVHv{I{9qIW8B>o|^}4N^}PFPS&*y?O7= z_hx2aGX35S>LH?DjHgeD?qJqbF#Mm{Dwg}-xZ6+PZhJUz$C`RLFu&|6R+pkCoq)Mc z7>bBhIFpT#c_Ay!lvyCE+}^pf?@*F@c7kZi>Y<0l#S87-9#hKNZe?Onm^9rV1Y;Nl z49ys(RO|xD;MX&)V!*DchYBAP?KZ!iIZ(}%E;t`hCoXxog=h!W_= zI|Kclb#ZpYTM_i1_2Fa96p-MCW{448wWX3SG=r@GA)O3NZ7Kl0Ex9k?Xs}+ziq5qG zIQ+(8?V?+#Uz5g`qAm0bBf5!L3p$40?S*K2&Z40tVhDNCkJ3Xp*7Wa>cE34j-aseg>fr(H)S`E z+d2E~+==5SbcQYDgYQ7L!HUe_A87HwFuw=IHedXhzmWm_n#8nbY(Z9Y!J7=mPj>hTk@p z2jH4w|G1*vgpE*x)@GSr{gOsZt~-f#(r9-REpN0R60Kmg`$qd@e~J2$d%lTVe?XSid5_Tq;(Mxbi-K4*53t1hK$m5|$aO4bWiG*=HL^^67 zs}8IR>kdWm6VPJ%ruQb2TEG;+%Y(i4j7+-USd?4)8KnwjLJvs6-rl){-4(eePrYj& z2HzasTE}+*z7pOYEIE9;ok28ezIt6vWPC$l_iu?-nKQ;=)M z`z$K0(~3b1)S+wA?@-rX zM7;{00Zz{cD)z5&2&E_Ye#)O|1wLzXsqn#%WsljpEaRaos_6Y=*-P{1j-Jdi6**zm z@kPkTvMXF=&z#=bmv@xnLB(HTND!*AY(s{pl)KCWM;#43R|+MTqNA<|PB|*Do5!*& za6)g1t7u{UZb-%0TC&M18W4I@7b5(z0;JH(v0nE*bS&Vtoq9bx9A}7RLq(I} zlGr4k<5?4jy%l#G5_={(ERuiF08U<=m0lBlw#L;avyQa0GEgTET9n(+h^Kgy`^?vT zEbFMruqoc>GRqoX(M2D}F)lg2;z>~^$?!AKw4o1oVb2e*9ReKk!|fY_qHp^pz3>UJ S_}|0_BQG5JGT?u30)GRb5V>#w literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/cppcli.dll b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/cppcli.dll new file mode 100644 index 0000000000000000000000000000000000000000..f216fde980cbdbb8194a82cd151c07dad8c7cc2e GIT binary patch literal 50176 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 literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/decsec-att.dll b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/decsec-att.dll new file mode 100644 index 0000000000000000000000000000000000000000..e9ac355408f5423bfea500f79051791f4d204aed GIT binary patch literal 4096 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 Y)$Pmon$y$&Eq;4vuMO|pdm1Y6AFNgto&W#< literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/empty-decsec-att.dll b/src/Libraries/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~*_Ug6#vY)yRDl_OQ4X4zPbvwhhft~gph4rDbsa@T~oT~xbsz~W@na}*;paO zLw`WmE*-mcivsBqbnD4}ExY`A(|)O6c+e6c2l+q8vgi(W(3`?(Wo3wDiI>FsG<^_4+wkA$>uQa#2Z!O{t-8K0{g%=ZRSeQWWF9nc5nw1fm)` z7r8G5|6e+STtu`#2$VzfbeRXbPLG`J6#$*!h?0cw9w9*UWy>dA<;$m7aDb?9LIDY2 zRdc1~)S@2pf+=iXGr@kszfw1+~NTKjFMF!wBZITy!;DB++J z=v&T$eeH$VC$k`*itABc-w5rNx<(>BLR+W)gtOb*lp7mf-(fYu+Z`mxOk@udRG*;b zQK;N2D8VVhyL&vU<+Pi*@zHVKG!Bd8K5=Fn*reL0Y*&2Ov^P95@r``^{4$Fbd?%Zx z2$?&JGey!d+C(reSk4-0CUPlDaWzTD1AZuD=ne0X{J|rmC5|33`xqZ*;6~JK0%@e^ zz6MD$aTZJZkvU6toa`8N#?tq7@;F;vIM!p?<36p;NFD$u6)j zjVv**a+02$a248~TP4S6T5=MVEzg&A+}Ew9tZp?Vin3-J5>t-tIhMqdYx;7|v?bOX zzPsW}&(~y2qVClk*D}{o(jQ5#@l40YZNn&2>WtlJ`k0p+x-U`jb=ODPtC^O?xJpX| zZFGo06+e9ZnwhB2z86w|`0~YPsOcmPM?aKgG8PFXNoQA7o)Zj3v(LqoYzwwdQu`eV tBP&ymJKd5c-L%8rrPK_I=ZU_c!w~tvIyXXu@5jQ}x#{?SqyO**egd>jjL!f7 literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/gifaceref.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/gifaceref.exe new file mode 100644 index 0000000000000000000000000000000000000000..c8e2ed12315baaa9bf645032bb2d111de1cba5f5 GIT binary patch literal 5120 zcmeHK-ESOM6+d%#v%6k9CUN3?l+cXVi7<9EUdNV5!`fLp>!b^|hgQG~eIWeKomubN zxJmj7x$ArGIrpBA-#K???)ChQS1CqBarB1|iQd4-EwAXK$u^dIPyecy?smO1@P;<` z&cO1zerGZ?r{4T0$Bd2}W^1`*;0r||Pg+vu3*7Nh+4i4Lj1_85tw3Vrl>A{97K z^d1*sZ@WpHBC^^jWxQ+*~PGSfF6Uq-FJsY|jrkSNL&uFSjVa+!tjI1%99UprhhOo3jzlQ_| zzf1HH#-ngQxD_`Z53Vdx4|v8tcy*;%z<3JsYb?*$ZW$vtxX@lY{(5&8 z82b3^I2{Z3h;hQT>c~VP0&ayriII6Epi0lCaIJWrYjuA3nCI0IIs-aS=RqC%D(G#+ z|3vX0(+8M&Mq~P-#+ttqzZ41jyq7ILo|s+mbkBJ z6QI3f0v-yYK>yU){Lk9UsEI~L2Uz-p_Bx$_^qi7@Oz+a?AdM>N2PfXA0Z5B_sQGm* z3+d;f)a7emg!E>#_Ljz)zm257De3J<^Q6dQ?T<=gpJyR)je3OuGC>DX<1~6d`T(7z zmw{-ESnqkz0r~=QEnhFDlxlsHv!d%G@G@K8re6@LQp` z@I6|g2a4(%^La%V=>~m+%6PJ33fY3-clH%A2W$z<3F<;U1)k~{em!_&7;hJ7ufl$a zJ_EiFk2JqA@ogCIY8Q}h=Lb*&CT{E*EjRC0o3@;yK>C3pHzh5G-+8M071y(^GA(WS zfvnTD@;7BAh$Q2(YugYl*YS<3(vhB3q2jF5tV_=<+w$hvK8l?RJAB}JP`)aI$QW|x z+CFZKjyQ_HEL(a@(%Y~q(x-637ks+&LschL+u+?7WYEf=i@TqF4l%-<9@*A$tHK2KSLoV=nkefPRDpi`EC!I$X za3?X~&qer)PB4Cc%BabpbUAX+$wyk9yV0r+oEX=oF9Ql`%V8U!5wen6V{U4!RPqB8 z=|9GCCx+bAM5z?uim;zi^lUsLwN_e>iMU6tV3{??^#iNoQ$d!SwVL!^u&Pz*v^QzN z4VIdXhU*2gI=fks4c=^06^*uEdI}#BuC~o6rt_OY_wW5B@$lC-uKe`=>3e6h{zFRL zyZyD*lM@eqc%Z+pOG_nn>hC+OrQ$mE_2Xl$!A^_onwG*k<{=7^;DJ?+u-j9yL|-a4 zMBGoslR~88{56Utp`FxDbtOe#Pv|qL_4TK;=$iB_e_)rzv6novvEVv8xh$`H?zesR za3VVI8Mnc_&fI^u*1dqJblLT0H>G-G)T=I~QMLJe!;SGQ>3PLHCI1T*5b7SH6K$VB zIu|hR&Wax|qQy^`U*Bh*?YEiiYV3vRRrH_bakL1Q!uDW>=&#|jn#kc^K(tCrR05r) z>)?uXjTRsmL9c-4c0c~%zxlM@+b%^De6sCbEvUIwGRcD<3n#0DPlwjXRaR$+t(LKB zV%EpHNdfd+NMZX${53e$fGL2Mh56b(o;Ht%aOhXco-%rrgcqF-5;b<;mrw<@0NyKBL@id(;E z`gLPtETh*=$6CXYzuFlMu5^9JSrJE1fIGr2MEK_cs2sD7@bg>KjfQPi)J4NE8;#6p z=ppc$eo%DQ+$Y3yKBMdq+n2ahAZ8?E#*??2z$vSXp0$DdPEGnx=ykm1RYz<4!4Xku z^0_%DH>9oGOeZs@UvxIyZ%HqsH?8Rk?o%k^nrZtoN=i8y-3Ltz`sgm~xzU{>Kp{8U b+93$M+fUo4u7Do?ub9Wj{%QOFtH6H%HU-QJ literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.anycpu.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.anycpu.exe new file mode 100644 index 0000000000000000000000000000000000000000..44ef8db84c0d42a418b1ad6dcf4cd46be22c58d5 GIT binary patch literal 3584 zcmeHJ&vO(-6n?W=s1PItN+F1aoe5M?luQ;9g`yI&AqlvckS#U|RTd@8&UUhcGt*=D z?7HiL$_1;u;mxBz&Q@`-N=mUj=r#X=2M(URz}d3IuX|?MO^6z=%G>no_g=q#{k=ES zZ!-VRUFsvEJjRnJME5akDjNRxYz@nUuYEg6U+-EUx^K;`4=vVx#bPN|r5iHOjUth- zDrd40F+XB63l$cM8h7^W8917SF3%FpS$%Yi|6b~x_K2=9~JKq?KOYhIa5;?`q?I0&~lOJu`a@9x=HlHX4`gjMwCG}-u=+u z>e=Tcyp=#7)5XV{Ng%@w%@8BH=}09#Xa-vm!p>}9>QE8r9mxX$M}zeyR&=aQz~OfR z)(x~**A=9(Ei6gn=sOi8799+44!7@=(Sk2Q; z!Fi)_=JXjIeg_5MzhDgCCMqMsPg<@d(vMaZMA{EbI-TLA3Ngrdsx*9QsWgMR0A0_+ z7XnemtO+LT(te^{TKUZyr2}bB`E<>crz2;%Vr3vhxRXZdbtKPe7W|Ik_h8Yay*1bK zUOEiE!)Rp&kv^ewCd#`;`{>{#4Ptd4P11{W2z-!+aK~N-E-gE>n_dNfiH=czjW*Gj z(2>VevM764+A=;bYK?%Or#cS;;kZ%TiyIDaaVn?xk3!`M8TeJIv{k}GTBzRQUPAM( zACcoFLS_rj)kc)~A$O)l82bU26)u~;#}%apH}OSul?QIiNNOs z_({9F+6xS!A|(P&*QB5DIX~h$hg~Zq@Ed~o`TU{V>t7tceD}v!zPk4I<9pQq&4<^Q z4~;$i7;lo*$H>Yv%j(aQWexUQ+0{CtpTc79z%}W{S41@1@_4MlF4m>^Kw0^oavjk! z!`Om4cOYH5F)ie5i<>f;5_0a;0{woXLmnemG}3>Q<;=Ze=%NRa;MugB_N1D=_2s{? z*SE0i&1*doQZc$x$^%T%Eo;IniUQVAXV3iJ~A#k70V z_xVSEbnd3vn6b%h)_1)ptg+4*+cLQ%5ywXl;)ofMek(N{CB17At1hex>nh0uxW-~oOD`*e0~oE%dF8mE@=AUbaF%|Tl=yQkqD z!&7IviU|7qrLoPKvlcSDu7W+l+D?8^VB)(_f*$r3iVLH z8lt)ZP_lpAhpqJJyC23UTVcSOTq?AV3Hy{&uo;g$QNy=q!d_auc=D{xRN_W8HxLn@ zu-jbOljrvgjJrzluo|=(0z_)UZpi4I^6ETv)ydHJq)=idIq8Y;oU1~odCF#?8~H0- zCCk01ArxazgOzF=?Ko*~K!lGaP(^NtBf#5$M#4XA(0K0l%f@}O+2S< zvkzx0?lsVu+nElFG9?4<8+ram5W3&yq4hMz%oHfj+VU`}oMyBEVsMr1ONJ=%@Xho~Zy!|F0^H MKC|-N@IR=)pMJ)$UH||9 literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.exe new file mode 100644 index 0000000000000000000000000000000000000000..efd7c7da9bd1e4cedb3d50b2d1c963352f2fb4b0 GIT binary patch literal 3584 zcmeHJO>7%Q6n^VCRhkm3(5kc&Dw9nsszNtz5@=L8sq@a_<3gLYz2MqT)v!I9EdA${`0%2&s1tly7F&aS~c+uT@_=Z{BJh7zu6X+bFY4vqq_(158ksD?+>ole8uWgY)Us|o*P9X zW);q4BVvBUW|zw>6jkmF4D_E$Q1wlr5Ypp1hE!$487Y^(OV=DRzHKX`swV+%o&_%|5n2XT$ zJTx7M3T90(S(lFz9n{KS)+ilIY62X+W=2O&YlXExMR)*voksE3X%hUF;a|d{NqcLq z=fi|8fL?1Q29Z9eQIqAm(LOysPC2Z-NaOSpodD0#Abm|Q1DBQ^Iz+F4A3^Ty7VV=u z&^6W$S@7MV!jh;q0zOGK9t6VSEl#E6;ZdkOAp^fc<+h4>NXwP?xfj!t>qq2xv5@J4 zv(kuSKjhAg2 zxr)Mpl+tR$rDZE7xbGPwk}s4y&1C*Q8s&Dx$fT$LqR=)tVF^ zDeGu@*YyUDmYJ6RO`SK9tlXFpa<0YA>6w$|+^GiozM^BECRQ}kv%xavT`_dg<0xo6 z>886%OKyGXG4|Rc>^gXBSB6Bi%yb+4iy~2B*CpScCi){;Ha>;S80K{<(+%)BT7k5H zj(rvS0{DE=z3Ip7gTFg((*&mMQabCmzALS<&Klb~xww1t<|cCFjA#S5QPU~XQL9*W zVO6-FF2(Q@&=UG4dk0A^V2a`8!@l{5OfBP+r_R4IszBELEQ8q2&a-$A3NJ$Esqfi` z!8ea9-t}FFuY`9OOCDXMJBY?i7t+u7AlgJkj5v*@U~(^~c3rj3-Kj%skKbd=)KNmLz-w=y-WcC?Z#CUIbWQpm>e{DJ zuYzZY(+hx#{cjvX>B09u6)v^HfHk>PXay7Yc_(i(9(kgQ-~1l z&xmc}u(#q~18umS>aa-uVFNgMwIux}djBR@PndPIla+zGdC(%ghHkctyvYL=Xg*=P zY9VTh54f~h!=Li-+k#`#DaXW#_>0Rw8Mt^fc4 literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.ia64.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.ia64.exe new file mode 100644 index 0000000000000000000000000000000000000000..1d50f54d8bd706751503aac96a8e40ac6216699e GIT binary patch literal 3072 zcmeHI&u<$=6n^VCRhp8hl&Z86Dw9n>p&}bM4YVprn8OOQ5yfpkBM$$RFc*D-_Q-y2%5xRO;vQ4VdNId%|; zh!r^tYXNfuwy;`Yz9?~PV4!~_fzB_&NTui&|1+0_=nDa7>ZD4wZ)I(IfTiXQf#!$O5O<_wJ<)2L5a8S9nI#fggwxR*TW2lx+v zOq2)0Ps%Ptp&OJXOgaf}ivI9Mff#Icio;hoatjzU@YOgx=ZPXlB?uW;PZAwf&L74F zIu-9N9p_ZO-Qr}=i1a56kI*EIp$R**1bsv6ZxB(Us+Csbae5BAS9^H|lRl@{G|D^L zyKy>8gUCKjSvo;ypa*G)?$EQ~rEH6i0l}hY=mkpe(mweLzT(*ugGO2=(bS44)jWQM zD%|sgm5c1at@##jaLUIoAo3C0x3LB*F!hr z%WlANI6EZp8^W$0eDc!o_kVtI<%??R?cmL|U#aiAkG3|?O#bp2o+P7(k&$MG(U&H} z80<3$mjmRiI)(Mrsq3L#y(WUihQq6h>v|;=AIkWkbm0?qxDKTBd&P)$Ph-L*jNS9% zr#}A=@yY>lHGdxnBJt7Og!N^XXlw67K2P-9o|D^3O`>X(3iK}YBCWy7(JEbopMze4 zt>lOF!@pX%I*_QDWK3h+1FNG8I<`qRg}`xf2XSBqc2 zU#GtZr~yt9s$9g&2O!<0D$pK&0`qdHQ9E?0hOC85L)VOIe#@}SdiFf3 ztJKsC%Ro@yE5&VDueF-QRTtD+t&S@1@M})$edd8Bs02O^R@uMX&OX(i)pM$PGmCym zaP`q$4=mY#&cjrCc=yMtnTGGNIu9kTj%o9}l`$C)98tozXWHCYUmCk)GKu@OWP2ju z(`J)PbLPrG|CB8y_lsVW0U(gmW-SaZOQ*tpTaNjz6ACGIqA^GKmu=}=_46k4aZB%T z8Ex)e4N#1=!Ez;z+c;`=F~Y|ZtODD|@+-~RYSnWceHmMJwQ7#X2vJy*Q7+gKhvYM1 z>UmgOa;JuCxtaKgg#3dVc=A#{bnEygl({@4>V+06gLH5f8(2eK&da>cJ?1GrZQ3#y z)W!QeG+E7^b@0tW8+U9^@?=vQWc&a&E$ZW4+^5FdO+dlacZP}?VGDpEz7HM%x7cba8vXC;3cE*N`hFDOZofT#%UZlWzEbyA zRf?n;2|p6^%M}sEHR#9Lfb{HGCP;0 zXjk($a*3L8En86hq@Q0jA*$V(A$op4G6-m^2;Av|ZtnVDJOP~D0OX{yoznkRb7!9^ zs9Og;BLcYOBr5Uf8E!=ydVMyo5nYChP9lR?Cu+H5G_bSVcAFwFr#a-X6?FjwoX?`q z_aQ_EpHPk<;qb;J&(sL^@5@bc4M+BKqRN|dmO;;Gv<^9W=Z*Z)Lq|36Rs_^{`A%F0 z%0&24+m$r&qjg0SJIPJcpSV!L7;U|a6K5`z=Gjit*X_hy5Lel1VaPi3Jg{9me^`gH zC##Kgbf0;9cDH6mN4gBRA&*zN2vy8ce{A%ZjA+r>TI+T<#;CU%uPkWd3mi2l?-=ju zSOKH#eFg-06(o>&k)6DTajwPqkspe}geZR-=F{L?2VgucaHsx;qN|rdv)*hozHlJtSti8kg%-bAz0SvumxTU zlzn>jS8{tUCT`Ph^e$~MR(K2`s11#;%Q62KLGu8*x9Ps;w9bC*!GiwzUyi2`+^R!A>#yR>W>eIBf{4{j$ zuO6-mbk)gjtH1RPuqHZhVykeG5Xa{oB#9Y8pH3|=LyuZvugj=nzl)T4F}+M~4&5NA zMNTQRe8$%wf%K`#$@5Oho@w4Ic>=u7uiNV9&vSMK&)_sR%_Eqb=g}YJt}-`a_JB*C zx5(h-^ox}hD literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.x86.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/hello.x86.exe new file mode 100644 index 0000000000000000000000000000000000000000..1e0c064f6f2b319995056f48890cf4036bdb9caf GIT binary patch literal 3584 zcmeHJ&2Jk;6o2cuB~9C?e5kY%l*y)*LPa)i8nbiueb5;et4zsuJZ(`~~I2ACLnlF6E3W%5P@ZaS|1hbJgd}ypMVF=J(#t zzRld5H>rn+vKS8^65R#YR50`ZPwQCjf9c15x^v*(z+G$h-oRqbSFA3@nsh_vxltry zR^d!GBIZYIdcMp;QRU9z!+j^y(4`roS*wSd{6VpE+6HB;gH~?>3QUtTh>2koF!aR0 zGKmW$gI{x6$ADc^4;4NkI%591JXI4H`rRg4(Q<)kLlf&R~B#`2UW{45paHNtRG=r@GVShTnI#d99NAf_x(O|uS6&-5_aQIEZ zx{Z$Lx`H&e4DF*DBMPur!?KdoAnl#TNMc)k2>bi!^oh(6YT9=i2bW);vUEg{hSfal z*hAdfRB99?Mfdw5KUg&(Lwq{WL(g>3QJNvO@>y1(nA$Kl|uD>hHDESL%eW_hRPgigfGOL^RX#cwOUMtV!{{vL4voGM&)( zn|1ZAQs?e(wGmyvEaXg!n@X7~a_&?EeLvA5PZ28^>G7O0=DlJ>>-t`w2j8A&a_dX~ zVXr;HuJ`W<0!#7^-Gp?jfc~F>kkVgMM1LmB#xk231z)BzUB^5_3y_L5PuHLqF<*hK z>6h&Ne>!oEA)PLzJPW=htg-5zVIitZ5^;R=AdZ+3>D#I4Bg$UOwz=kBIcS@yVg5B)?Jgl^g=Rg16h+^q?a-yE)f*LNAd z65d@bIdqZkKzlHKM`sfo-w4Dr~Ym+jA?Vmd}`O(>oYo))Y|T6jhehlh#{y-4dfr=iEPiVo0rZ}-%DMKN#w8K z8KRm2(6L?jVJqGL>DTbOR)RJ|fJjZ)4H;cfUX6#Y8V-F=3ME$KVNZk?TopRaGd2s|$Y13u zUfy~dLNT@(tXSpfz;SyUB77WyDsn>{Ki8hD*8|@(4cKw(b$cX<5X**&i_xmsBc8Li z*@v?g_Zn!&?No(+BETU((s@Eq^wWMqyHN}5tDP>@oIACokdB2-pR>O(74)J>eWK?#X)8xTTDY-j2$taqc` zH6#cjpDKETGyDNaaNvMMh2X}8Lq!igqy7P?fW)anl<&=~>unUZoU6WM=KYvAZ@%|- z=6U&@&oBg_$Z_u;aGhMJYUhVfJua7C{-K2L4&Io!u9j|0T-x#zy&XsGxY5zAMi@q^ zZWpvZ*oOmfm3RSuan zS;4tbviOCg$3eRg^I}?K_J6=L)w$ryNnl0fDo~a}?4=Fh>Akl9qibL!=Ql$AeuA`n zso6=%{}!xVvk7Flsaev%h8HJsi<-q&r63 zpAvm8h??X=G^q>E0S867t4>P7wAuSl(dI8#Ky3XXMHE>|aU3skeiLUocPI45vm2P#uw{ZEn(@qzK__WNao{&m-%V1}!AkQz(@L@G9we3~ zjFQxEC8(KZx7}_u19L8Ajho%nWU(fi#z4w*Vi!e{YUSv9j)BH#)_*U4K=I_s!%9G zsnP*u)Bbs~pDgg3$a+=&F^TO#4+p**7%q zo?6bq-EY3NUd~97--#r>fXiKJU6Nek%U) zZ$D0dukf>(QY3e$WCk*M--=NiymRO69W#s>^4>+(Y05UqOI&Txn(z)bkkT)r=IGmE zg;*6arS$S?Z|@Un%=(nsW87Z_P1|o?V5d;L;Ssw)hxa^W6lqABV=A|{ZO`9jwhiki zXN%7X>(fVGV}yinMR06CfKzR#;(cN*+)2u)i|OVrwShh(>nU5l!XE#k^!ANaW{Z*pIU`(nIrE8%>r7RyQ&L#ixT z`gw~c)dQpNkIB_?mHQ)hmM&|Q<}z_-RBU}7^x0dbL4BlFQX{G9IU-Fg?j}*~^2r%s+-gD16_uO-T z=iHCixwmf6HX`ald-RCtE_$Y-;ZJ6(7|y@)ZJzGzxOecbHGA*iLe1BruHt3ohQf2B zC{9F03e|{&ABm~?vIygfC~D|&+zrqu_LRzDp%kQ+oz`;TDZ@`XvuL``8e zk2wYB^}>l`CpdgB1>irU4SYaULIggC1LZ{d(Xxg}eZVxrw##K2g^XRLf%BJVrqItq z=YC)^h%4xsV6x7?K(vFE->u`cC(Q|POldH_R`M)YSo$-B+i8eiMe^5Z9Q;GWZ^OdG z-pu*8n_h(6Yvht(`%R$aC|8a4@!nIEhxRO;qUUHIc%BZ@SM(BavFy-JdKvtAI!ryQ zw23~4&Nw?{(f*D|G&&bo8-YASH5ml)iX&T+O6kp`Pe$?$_AWEjVSR$>70$jx*teYma6G{Qd4Sh6F-hF$-r$HNlzr$kV+$wlucwe3|0KV zPuktl6cU0&Iu0aVQGOz4{YWzU;TlQoc0e%+S^-y(tB_+_0#DF~#;U+qOui5HfAQ0m zrCS&7{CexNn;-4?l={AT|Lw(nBlkbSDYLc-vU-GN_4SZt<@>Dc+8yBiS;+0VqTKq$ zIGS#Gvd-x&)Kt8pEs>pjUf>MNf~CJw=YDiYuAPn5bW56InnFwIR0BT0ctH=7C>rU% z$#Uji3B00vk-*9HHC>lVdV@=UW3N5N&XZTyMMy=jG=_|gXFcEhbzzN_-wX>;U7W#l5n;c-8_&U05~7U7SxJqmdaW`nu;ff?B|oz{`hy`7x1JjZc9(zY(fHCVCCG z+gkIV!s?nl6Q{mm9Rc40j&;{}5xxrET`UE>BHhM&w-f%HO=5f_U=L6)7q^S=VfPlU zV5X#&u@Vg$Ota9I&5X0iwoYw>Y8kWmo5gsFCjNY8=gc{Nr;4mSd7TlHPYLs5-2Mjg zPOuXjv+Cxid2tor zm@)hE!nvW7w$O&=VlCKARpRkY+8YqzqX<-y8)Esn_C&oN_?~%t z9k*V$htmj&YUpGpT8g)b=a_BgVQnqF1|H*fro*D-dkx@})spg?_yjCVy~U`veu;2^-gT?4(ZY*tH!8NYu@E_u8Iz zc4j*>>)0_yDdi_c2vYGQQBbiUh(7Qq6_fyi=Ak_B5D5v1rwXNlhYB8osD#9iT)uN> z*1HZ?k_VnpuYJ!w=iKu@XYSk``S>-`h$w>j-g`thvGVAZ@c!TmwiCO4o}iyJ+}?dt z8NR)Ha?bShlIzU6Mp4fjw(a=(w9wtMt(&$!Fgl?Zoq|X=HO2RarpE?}h82xI@7z9J z@pgw)rBSIT+5`?39=}Qf=$O5j40J4N5H~OxKd*EJ6MP;T^?rtEi~O&yAsL9!9PCao z-b-|ci*WC_7=-cf{X`x2?%j{p*Fu+4^`M`skx%<#!3X_jBLMbfu3_AuO>jiq^e8oM_pp>E6!%{mSfCNmv~u5A`!J+>bA#IU2A6c zNrm>0N^603VCjqIY6N+$P+JgTHFo$xjBHTu?C{W<@yl^SdTaS1@miV7YG*UoPYY^P zt>`irRMthMZO}*b&AV1B^;_opRZ2&X;+bS2gM462?L-7o2f@S}Q;C=ZZag0CY{5b? z2X^9!{+&N;iEUj~fW=}?18==W`xV5iqWL=Z^GikaSPqCz!mLFT9j@}{4I_7 zf00m$Fy0z@U3v=q1r^*v?cmiR28A>fdFG)O&9=SzndX#j ziY3z$?u2mX%{=x4hQVQt3(HuLm{&CyDzX^1rcKNA7puFKGEjD1>^+5CE>j7(ChyvO z*Kj0=+$)vfbcY5^ujF`~*9Jx^#Y~YUp?hFsjL+hBIQ=#;ho;6{2F5 z`cawZC}0x!G*ji@f(7-#r7O@`seVyC{+^r;HI>{9mU0z!$qEpL0D5z?b^%9_4NsZP6@6e*K)k!=%B79)t zM$poYo%(o8YuO|Xsgalh1Ndar#Wb~E)nZBlv!fxVvIL^SH&ID6#I!^pU$0P%Z4nT@ zPT+#VU(rdm?VM|r&N%j3p-^P!k|$*=zdKZjk6~`deRw;rtm6{{6aMb69HC7w9{)~E z`MX$o^<`GbAHCo?Wfy1Dg}lg{)`dyo`4`asA=B_YQJl6+>{m{obg3{+*TQ=?OwbP* z*BSfoQMr#-cXG!acW^<-^Hv_=LZk~8->LA6Z6E2q68ql(Ro=aHqAS~B@CmHz?FM%g z)M-Qh+y;EszegAxS$cdmiB@{?`;Utsj=%O3{W;i{oMH7a)+zi(%K;A3IItlar8A(1 z08aqt@yp2F)rwuo2*H!#iUte4R(A&^ZwmJW7j{hCQw40=G((OQ+Doi8iCqI+5BmoB zkaIu<4TGAM zTE`(#l6NN)oH=L^aZCf!$Eb{WR%XvWDwSl95B7Cf<~0Tz4i%`3{Czy<_1RVP;vBgz zxfXrM--Bck)wB?u{y;sb(%oOYk$rNZXzBC9^>Ah$OLnI-NnO}^r+_p1Sn}-Ti33k0 zb$p`if?+wfIF?)#Uh>JFrg%1dxfgX9u)Sl+vTGmp@^hkScn6AR-gP`@#y^mEiboBv zn4a%W>P5pgXK+GH)p~;|U0*XcgpY=gYsY@u{*XQ6JY+lvlTr`9J%PIde1}iYiU>lA1X9ZGdRKK-b@$kF zZ-0#*0C}#R9pDzJK*{32N824yfBOsRn^M0 zLgk05yiie%Xid9=g99U3>cuHw*6G0u@4j}az1tlWhW0!CX;FQtc7B*tah13PDUw|3 zLeADN6x&?X3-qAW3mmY&9h!-$3x0hLxFUQB_%@5nOet9fp4_AOhk^pw!7lVu-ffUt zH_@93>9P!;Hrv2``%}H@n%LB6wzZWqzicLyERVgt5(Ir~8 zD03x9Z8`L!sesQI>xlASz@egp{fuM$K^WrZz>DZRc|14DMh8w}qVmRslVz7$ubp;_ z?kmM}r_ae|y$FbZ;TrygH8K2#@Rh{)VLc{`Kd2iM-Q^03tdpmU;pxjWWzrI5p~DkF zR3#OVR;HiMVV?-UJ7;h>?Tyul&8{}j)V4CAGQ5=b;S@&EhY#>3@mItGsZBa@Si=!& zdM&@G#QF`++W5MaK0i8z0<8xzg{N?gxWIY@yPVZC#D_4#9QkeB2j5YaD%;@TM4LT7 z7p=7deF1@AUDrVnxobgyS-)yLvxP=niwrHOY{iLgV4?cHt|ge($tCek2MV{AL?&}_ zms(-sH?%t$HJW~)O+}k)eoe;;gSx#P0PjO2@j>(N;I-Saigi~2Y#~Ev9`;T zx=*b`^MnILP}m?gn3r#Z|U@EM$7=UiN5DQly9P zHD>!-WR8dxwAg>b6WQBcr!VOdc-6*?v;UZ$4fYYRI`z;vhCYTzH360W&#-vrQEl)z J?|*p$e*p+}20;J- literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/libres.dll b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/libres.dll new file mode 100644 index 0000000000000000000000000000000000000000..66a2b194d2fe39848e377e9128c3ce98549b0384 GIT binary patch literal 3072 zcmeHJO=ule6#nMrrKD*aD%R3~rV~=7_%l4yCoL*EOHl@jLg<`-zs?O+le2x#yn0d+vA6 z+25+2(&Z4Q@1 zn9V6?LMUncGGl{-cA*})?*jYve`n5A6N0_WJ14RWe3Y%rTxMDV_Ujf zE>(*z>lYGiIrJj6fy-QLiIH^H1_rfscWfwkloj`a7Vmq9ihBJ6C}Mzp6m7TW4))+dI2;cnzroNQbeS4ax5>gIT9)0e z;kmYag_2Y+_RqA{$k)t$cz!0TuLkM`1b#JEiBk^(OjGpYbu^M1KZjpMc|A#019R0k zR4s*5OQSfmISZ>{>Nk`#9yOYNpyINMFZwl=z!<#LkHQ5NcxzfpPNw`u)zwrXTPR_4 zRsFzE*E?Q=2C7k2^}4D*?WDX4Ep1e5fgir9>RM!3J+`jxtHCRWXPy|E`+nEw7q)JF z`ZM~zx%ArNVDb6~46yRHW%c!0*{vIrk5I`SJQI7(*(jV?tEr~It*pe+TZwhxr{BK) z{l@#h{P^}4zi!?b->k&et2c|;U69RYMYcuyC$;X3@thxz;!+UIcz$S_s+4ZDc()&g z?V7Ov1-JBRI%HnaF2v@17j9#hAbC5^xK16?#2d6Z$=*jEkrl z`ZE79uZ%@ZDWiPamv574L&p@*`YWPJ8F-S2taf~fyC1TT4X*@aLt+ouFAojspzISxtoL+Kr!KE0a8zTOrhQqj7-zLjtZP)u zSRpRx*gZSM$({5V{7!wj7IPE?6oO8c9 z_d921?(FE>A0q)E$?@O;aGSG~tkREGOI&W-_e~qVZob=nTa4W8o}9G;z2R3mCi|vc+*n+<%}f`#-${Xy#lnW|Hd4<5d>G6w00eX5Y>{2~3D($CpmiL(@@ z5T}n~TeEcj>^*`VQ4Oth30LhPF+9T|XW}8TvQBBsIjXrOo||wCFY&evDLtjMqx2=E zf5DGj{X^-5kaj^F6iu*{{zyf>Pv;n0CmU(n>Fd zruMUFp?-&2N&@e9&TuWtmB1Zw9?vowt=$n8BeiIq8DRy`K@ioS+rYJpqObPeBauoLLu_DO{l*e#$7bW;-sY4_09&`V50#glkm z9ERNC81-=!s7;(wk+-NXz@om0T`H2nbGVEQdT@n2YTPGa4LR1F!*)KWJ8^=@QKHUb zA4>RvE!>RjWDC)X8=R9%%=sD)7 z8P0kY*f?i!~FYbvv}mMiAyr+pHR)iLufJvmC-8yG%Ls zd=%VyZ_Y$vFj#cU6K23GpzI;Two68N4mq=GxiM_mt;E*2;eta>UX;^`7?nM5&N4AC zNyLmY6LmMV95YjJL(}(aMbn?R%4UGEdN>&J%_`MNZ8WNKFldCPT*q*Ys##Ihlvfz} z5lsu{QATCsCPSW6vux8}-6aYbq2;*~rfn=JYt1e(I|<`b$+E3*vB4p3K6nDu%i)Nz z=&dCk`EOco1$o;pI5p2-Q_^|QQ#Xx|o38Ha0y;0;`}D<;tK!se?^$zqk-l~5?DVdI z``5Ilu9U8cuFfXv&ONCXJ-M}m^VaQ*3$e8$2_e#(knHN}N_R1xkl~K*RNpwZL2T0Y zG`Ah%K72l!T+iWus;^ng39T=cBrvVehqax3iM?Ai8EH%NWmly3$~S#d+i}`AY9~E+ zc%f|8WV0q`eeYr*mg93+VtNNxzR&vnsGb$Mel{4Z9pGu z33Uc^g2%-=k=*%Rct~8r-c)^pUun4nd_7*5hJP`^f7%D2hi z|5`a2RUlTc#`DVAy>=~6M=+}apLr~POZaNR<%8-e*nXZFz$8}59uRbKxlEU<}?&xoT?=yRVLp+znDn8HM1HK|MPi@^kIvIJD^8D6Yn2=(i=U^|9|Yj-#LAf_y7O^ literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/mma.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/mma.exe new file mode 100644 index 0000000000000000000000000000000000000000..78632f8dd47b46bcc7963e693e1a81675b63dc2e GIT binary patch literal 3584 zcmeHJU2GIp6h5=vnzlfLNDyMg%Px{iV7i4W4cXG|LJP%~R<v{ppbLN*^X1Q$FXpT8vf$PhbwXKgrj|~tFYfW@^BE6@Y?FzMPOSF~{6gEje zC$TU*89Z`f*kYjzIE7#CG=~RzNllb#CR(ok>w6@IE_4cUbCS;xeJ-1@kd6>7U8uVm znGr?Mm3Ir|T7l5$0iO-9Uzg2?O%)K~hNOrQ9npQ^n~)T?446Bj2V0dgK(G7U_TZ?n z9)U&1S^yk=S!n0cSEyf-#1^Aw3K-FPVA3Gtk=gze<*5Uw+d9z7HtIn8BX;B3SO=oI-7~x5T=Kzx2Td!zKrbo3&^xSgIlT&9Dm(Ttx)j(f60! zz;d|0({qZJ&HWtr%a+LnMFy!i0xNIXR#52=@HX?MfRkA_||>y-mB-I{<`bL!x#L=f4%bh z$_<+yVf!wh*}L>mdHA(+ubxR>`u-fzr%44xEk8(})#XO6dVlM>!#h2HV3w<%sF%dK zUa;kz!i2w{SVnP+FEMqO7^diIIP`?mw81s}M34QAer6H9JUrJBA!Nh*aRS2W3{iKi z?r=Fv^iyb7%I;V<_DRg>!&nDsKe!U{C6R{AXCLD&dbB#o5E+P?mG!zAKrB=DNKd>Q}vhC1j^S1b{qXN z$bn2)9q>B%StWNUEW_ZZmFG@WS)__WGmY6JXR5@}qi~EydReiITkW2d7LVVp&W+)m zM+GXO&H$aCUqv0itfiW(A9V_NI_R1WMC@PB;V51E=#zBctYfn>_XX}^Z=y?2B^Y;2 zuYm87-o(WC;O3qL6M^9t4BK;gZ=%9QqHo8twzMGxck*_HA%H7-6D8l>F3cJ37-F+y znZ75ysbI6|Iol24=;f{ia}3v-;v$%A%!W{m)q)KbI3{FJnTH5pd_d(I4$_ZQ`in)| zGS%SHjbbs;8Ab^Fk_d*}DeornY)Pnd$St^8!kDW>GBiGavILyGFy>oj%;{+^ZZhiD zYE%ZQ$HAyEOLE!`^D?)YE!WgRFn$Rxd@sn^v-$M l)19>@z#-jPeM1oB+rCY=+yNH;2K!~}El0S0@PFKazW@a#-Dv;- literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/moda.netmodule b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/moda.netmodule new file mode 100644 index 0000000000000000000000000000000000000000..8cc49983e620a143a87e240bfaf12c0e484e2d3b GIT binary patch literal 2048 zcmeHH%}*0i5dUo}-_nR00tfN6pfQ-N6+iHRq%B~>uC-XLc9L0W@9>lYR4>k2mvXX5a42t>=gXI6!N2 z6Idr?$^`t+>=C&W$KNOLwrwN1ZcJ|^=a+3yRJAJWVnvjSuB&`uNug`5uw5}eTM!ks zB+bsw_JJt%+ypRf#PDEYWOD1YIugkaqctol7Fxfj2nDSSEoOp%d|Wrv7GjYUvNOez zX#x%fPXi-0+=8bmpb*KsLIyavtK%<50Z<3q)JpnxgJd;*x#|=C;9AKSG!WHIT0jC= zG_`b8DXJkuX5Q0GYX@b3+z$1h#E+?PJJ%LN6RHB}p)-ts%F@_;ByFIBREqC{CSGkn zjpo6=*eOcdK8Rf5YR-tV^ITVk%(QtSJv=nbIhx=Q=R4T{5E!8F*DM!&ZM$WUM0_F} z$Mr81@P%Z0yXem^OpO!PNx#H;&QTU26StB-8VldWFXJ4#!`}GLlW%)bXiya+6&h98 zjEgu!<1Qml{4sH+a1VE3(D}VMMs>41C)oQEmxK6npgrlyB0;_`Ft!EUq6r(i*MnlF*{JXx`vhQ-UPNvS2* z*J7av%@UINuRlkfS2G{dQ?ah(w-;!AcmMW{-t+ZmG~q;C!06-A%*VQK>SFbpawk?x zvg+H)onO}Ko@c~cj0EL*lM2!W>@&-vq3@Ko?rXz#XH4mF$C)YGZa5Pu%_WEL5&h9l ZKx6`GpY1UL5q?kgp*{Tj=Kp#EzX6R`o`L`X literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/modb.netmodule b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/modb.netmodule new file mode 100644 index 0000000000000000000000000000000000000000..38522b293594af6daa2c4c0412a9e316d60a7097 GIT binary patch literal 2048 zcmeHHOHUI~6#k~A2t}HrgvbKC1vLbd5dpsBtHW8xns4KS6iKg?P@)09_Cg-QsD_d(N5foI5jAWbZ1*tbS z#?OVVXNG|ZErJ(w>9M`L?I4kA(CPwEkszArBrS+D#4H3U$}w)HJ&k#C!kQ>DF(B#x z4|M2q5z%G`kPpnmWd=BTc;@J+0BC}Jsw01YK#J;~T=Pgb^YSU@4-n!e&nE%Q>yETk zF~pFeFke$kTtyimTjlC&_H!m--Iq|6pvp-ZFhU5 ziw2E%Bby)3YGHTY>q@WQqhIM6=pEpj#bA;AO5FJf=%*%M*v@;7X)n5D;wQy;ubp#r zYSf-i7oDSXH*=(uYyYbk>?6NR+V=12|K;Fs2imS8r1UMS}?9|6x>%>*_?S&OT< zL@Qs$ILW6ZWB7nKbbV04l7C6GqK$HF&j`-G#C5;RqVGL9lS6`XO<4Hp6fNKdMTiY0G=-X24@rAL~4WD6SzQhF98x2PP;G>~6+Jz2uEu`G)o zMhhFtegM7bDJM+nw<@-0mZUzUN@dfMPF^}IW>LBb6C5vireRv9w?636_Kk`sG3dIo zWLO6gcT|l@M>4EJ6|4}_AV!oTjE+A>RQPIjYis0f)2pdZ>GZ=NeQn=R_kQEv?biOC zXLJe)x=3s11P-$t!1_Y=QH;+mz%*Z7UZKQ@y6BinA8Y@o2LrBfozPJP9nP?tW zv#GoQ!4m#K7ySWUu&62(b%T(AAbtW%7D(N&0*UaQJ2SCOtI|yci=6Sf=W)M#9{0{2 zdG&)YF#(`V-rECiQwlj|eDpBj^s$%k9K+X7?@rye8oN^)SG-tlM`15=`>NvxL71qv zR#6%#FHrThmgrhtIQz~&2K1kGlO7u8hBT92e^^1%cnB21w1q6cuYe9>|mb`(Y~;6 z0d}IVCA2@4oSZWa{3AczTXqyj9Zs9toE(?$2`xhotG6TVhXk5hx9FBwhsh)4081mL zQMaZukJMJeB-9j3u>k%IH5Kr4u0M|Wk)WTxzyFP_|BCFlcH%_$?R6c8Y1Gm2zP7I2 zu8u0IA9upY_u3V;siW8ngTC;@!OW!=ey8Nyh?%!8 zt<))nSdKMGX-Q3goS4J&S$Sd>EC*SXoOxxmP#zF8M$hGzppR$znbokH`uYt7VcQSe zcGvfF6%kK^oSloHCzM(9;;Vmt=iIq)@y6#rEdBb$-G#=qaho9!T@CF~t$3G4eZb}A zFsl3hDmN46thF{p2x{*Hlrs)Lu>Qjxu+01ULiQCMsUy1q)ra^6B;Str9H3qjE2Da; zMr9K%T;_Nl>(o}ThKsaUIKD|;=x+J`U&T9Z9QklImu1S4u*NHQ$6{0$5#xC9p&2v4 zM+nXQtofL3aMq1BnBI>cAxv@qE8$2hpfUkqs=dm z&qwGLQ&WSOo>{R>#5Q(JRXto`G?;7anD}eCUpklgMK5AKI#12?)8zV)*;DqN@Fd2& u8ulZ7Nl&r|=h$~lWZ%@k!)pF*o%D4;Pk0AZ_Mc(!+7r%m5dMF;1AhY+5$^#2 literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/pinvoke.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/pinvoke.exe new file mode 100644 index 0000000000000000000000000000000000000000..2bd10bf8beb4f1198851ba58f3cd8ffa384d476d GIT binary patch literal 4096 zcmeHK&2JM&6o2bD5C@3p7YY@E!2t=OX7gD}Y8{2W5QktIOIrHYdH*en8 z?9SUve|($Th$xM*zE1Q2GegecSEE%dcO81zMc-$h9DZO;JvltLoqA9D5^w%R78s65Z%i3ji5bb~j6T^!hAc2v? zU?ec5YH@=y@$*cp7?3lxQLde6ulZ}vb+)EL_h9!5(>bE2T!gJ~ooM$~*>-rb5xUXt z0KbtSBz7W~6U=G$i8YgJJ#KIY1krU{$JzyFV#|TpR1Q3TxBms5bo^lI7?SEdPUFRo#w}y17FTu9?zcbe zKRI}kO}3K{oQI>H&xr10{($LXqP=i2W{qEv10R3Syel0)A-lI;|O< znr1Dpz3c*+G_qW!Z^Xcc73NML>Nc7cy!8&{shf6E(QsdO7w7;u_B{ifqIp9*hF$<} zGZjjcrnjg-g7yO+pu@mNDPw4xb|F%m-k~9S+d5?B@Fop#4puvzfW`DG%(TE$aGY}k zEPB5|5{*o&a>bWtDDuLpx*=`3ENN0H3Sw7j-z!mZB~D~OGo??Yo6xwF5fv{?DjhgU zUVBwZ(~cLC?Iuc7`R1gSpJK{aw3B!$q@|l-naW0QAxLnJDq?wDH)~(2gozhO`Q{~9rUwiLT#}Buz&hH;y z`>LH%sZ3@kr8C``Oom@6Y_Zb9vN{-bby)Sg?I1rrbE$n-v=d!a;l#2lO?fDNQ=8wSJUDu2uaF_Zn9qW$svkF4~PM zoT_!xP4%eVbF=>+ligXQl zf-Zq7;J&;Fz5qOF?oOgd>1QwaCfy2W>jJ*>x31=mY@Qt4u#@EBww16M(gG>7>j?3# zIjlO6##nbKft~_agZt@wFlr&D1X>>Ci!ZUXYIORk@f)TRX!JYW#MXv>9^PYejh(2) zkAQAJE{mq_Jajd*o3Zqx3p59x-EQb}Hi^*<5xb9iITU~=icGXs{nE#3i3{HzO7j`^Woe$ zC$7O5@{XYypo%^s6aTpnTj|-4k4Mff2fnCE9i!)rW(Vy4tdOCr%J|+G&0e0H>^+qg zapHt!$5){o&92Bed-lwp&Jib$Wl-{01Pp}nXttum)3LiG11IhcJXfn&EhN3J3Qjw5 zU{?pSB5*=)LB`4aW^XVh#D=j#S)$t|D=iV>0|`-uP5}4QD`QdQd#-7Awi89!zM6$Z zSK_1)E~stBGnh5|;5(LXMZ;&EhXftEf;eS)7Ht_lcTvXMv^vzVDgaG8Xfq!|SeJ_co5qe)s>?3^}MS#LcU*m+p@M*t+ SZC60l|7YN9_6@vt75Ez!HQdJl literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/switch.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/switch.exe new file mode 100644 index 0000000000000000000000000000000000000000..114083242cc32328f47be8daa13ae6f111ee0280 GIT binary patch literal 3584 zcmeHJO>9(E6h3cS#-SBbKuTHAUZ!ZU*w+DS__3waKcL#u3DcHfjPT~oZTs~7jPJe~ zW?Yyq)WnU!#KbKzy3&OvCK8D;apQ`;OP0iiY>f-?JNLcmv=y-~HJtXId(XM&=R4=U zd*95xdXw6Ss2$_sL!#T5nev)Ho~>bfci(rr>6@K*58pOs?;c)Qb(E-t!AfX(!nS-r zh(t+>u<8rP7gO^^;RR)B?%LIHBne%ZCYm+csQ;&ihmkTeOR>t?7z8fveNp+PxUhVDuz& zy4T!$Y;U@+%j`_|2{U~x-92z%pl6_OV4yd36piT^po!wk6NW|;ms2}o=FAs!r%s$g z5a4ye?_>18gI*%(m%J`Uq2sS8EOj6FIrJ|UDTBK3Hcqdjy6ojVBL1!T-k>ZC*9`;g}#wXe|@`V=yIH_3qYI*rT) z<*F;sk-FhT_NpoCk_z#uB~RHw=sG1THdG`%nlHT}?TF?q$0yT{f{?5bt&Mlh%T+&e zJZVk_Ud3@`Sd?MSv8AF|VMR{hUzV;_*DEz1;mMS$k)*_t&9GH+TqkO@c4J%`Z=2B5 zt>3w{O3;ba43I2k2qu&~BI+?ZPlJZBH4QjFFtZUT*e6 zs{2Z4RW1eoblsK}hP1F61~(Kxhoi~+&q>blTJY+x)I29d*CvB-x-NA?bhD&1%Pzl% zxIv#Kk=LvLCQISX(k)oyGkQ9{O*fPhzq^IM(XT#2&(3QbBE-x1B;15>D^E0)Y8l+0 zAo?ZV*2<~WFy~%UfD>x0+fO08B3s9)Y|0~Go5LI3vR#6029PWbF;Ahtfd#)zZwmz`C=$Azv zWP>^8#&oiv+ zDZoF#Em;MQ2v1^jRjqosHm-?#Fb?brmL9t30-5+nKe*C^J3ow!)je0#WT@Dd6`tig%Th&48?zyl5bMEa$`W^H)YyawA2*=#Ef4AE z8sn9U>)870G_6V{I}}HV!m5g9{N-Sqcur)sA95>cS3~4XWN1S9Ruwp9xez)v+~6xx zZ8Pf0W>f)c#lh8RSNV>el{M)Km-%ScQZs%ncvFU1QFX>`d?C=rWy@7EDM|+!dIXv# o^r21IM~2p$0E3aC<`aUzPx}dNy8|NrT~#=_ZI360|Dz843H|$}82|tP literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/text_file.txt b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/text_file.txt new file mode 100644 index 0000000000..ea780ea5b4 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/text_file.txt @@ -0,0 +1 @@ +Cecil ftw! diff --git a/src/Libraries/Mono.Cecil/Test/Resources/assemblies/varargs.exe b/src/Libraries/Mono.Cecil/Test/Resources/assemblies/varargs.exe new file mode 100644 index 0000000000000000000000000000000000000000..4e3acf4cda6b588ed03f99dc4657124bbbc34e01 GIT binary patch literal 2048 zcmeHH&rcIk5dL22mQtj#qFjveQP4ERYzV{<5@Jf_w}6B~G+tzBUrOV4m%MHX5+%ly zM-Rroz!-0O;6RKA{{f6wFQx~s{sSJwneHwi0gP9}WZ%qu-^{+5H~ZR|2QSeCAWCa* z57;Kll5ObI)iVkwuYOEot7WHiTTJhCF07QRa#gz}ZB=B!avax_%S!5+Bg>8)xto_2 zx2VjvwnTTZ_1q{hEh4z{V|OI1R!35_in!lY#Am;!$x2#TTC5})igDj8p~Vsb;#ufi zM4xXw2R49y3SOjveBd8zvcS1x1AieUKquIjIN^zX1el&$_XzKDuM}$>An2P=LnN?d zYGu2Hpoc8coD-vUNU}ig5d0_ibJ|bm-XbvYP6BlS(8KdPQpwLfO}F>Pk)Q;6KXn1W zkRd10102u4mAseaVi`JELX)>D`G}H=L-JS6keBGm<)?B2oaoPDtVwV217&>vr%93gIt@C}aTYMOrEUBHA&F%jo6}j>zB<3=D_N(2QHG+3FVZkE@=lU|5$XJ*6$r)tIk2Ub&)( zs#TQZO;}FRRxk@3TeGyKX?~Sz!PRzo8Dp-CoTX7Ey#ch9U||C;96X|0_v+uCKAHM7 z{(kKFrJ>sO*D$0Isg@=KB5DYcq?w7B5fQ`jc-)AJB-?1SNE!6*hjiF1@P&POfDe1& xeLdhF-gfoqx|*@dj^C(KX3^&RK>ujhAhQkcOr0HnVUeJ8}v=>K{GzX5YSeQ5vy literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/CustomAttributes.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/CustomAttributes.cs new file mode 100644 index 0000000000..4c52c7c512 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/CustomAttributes.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +[assembly: Foo ("bingo")] + +[assembly: TypeForwardedTo (typeof (System.Diagnostics.DebuggableAttribute))] + +enum Bingo : short { + Fuel = 2, + Binga = 4, +} + +/* +in System.Security.AccessControl + + [Flags] + public enum AceFlags : byte { + None = 0, + ObjectInherit = 0x01, + ContainerInherit = 0x02, + NoPropagateInherit = 0x04, + InheritOnly = 0x08, + InheritanceFlags = ObjectInherit | ContainerInherit | NoPropagateInherit | InheritOnly, + Inherited = 0x10, + SuccessfulAccess = 0x40, + FailedAccess = 0x80, + AuditFlags = SuccessfulAccess | FailedAccess, + } +*/ + +class FooAttribute : Attribute { + + internal class Token { + } + + public FooAttribute () + { + } + + public FooAttribute (string str) + { + } + + public FooAttribute (sbyte a, byte b, bool c, bool d, ushort e, short f, char g) + { + } + + public FooAttribute (int a, uint b, float c, long d, ulong e, double f) + { + } + + public FooAttribute (char [] chars) + { + } + + public FooAttribute (object a, object b) + { + } + + public FooAttribute (Bingo bingo) + { + } + + public FooAttribute (System.Security.AccessControl.AceFlags flags) + { + } + + public FooAttribute (Type type) + { + } + + public int Bang { get { return 0; } set {} } + public string Fiou { get { return "fiou"; } set {} } + + public object Pan; + public string [] PanPan; + + public Type Chose; +} + +[Foo ("bar")] +class Hamster { +} + +[Foo ((string) null)] +class Dentist { +} + +[Foo (-12, 242, true, false, 4242, -1983, 'c')] +class Steven { +} + +[Foo (-100000, 200000, 12.12f, long.MaxValue, ulong.MaxValue, 64.646464)] +class Seagull { +} + +[Foo (new char [] { 'c', 'e', 'c', 'i', 'l' })] +class Rifle { +} + +[Foo ("2", 2)] +class Worm { +} + +[Foo (new object [] { "2", 2, 'c' }, new object [] { new object [] { 1, 2, 3}, null })] +class Sheep { +} + +[Foo (Bang = 42, PanPan = new string [] { "yo", "yo" }, Pan = new object [] { 1, "2", '3' }, Fiou = null)] +class Angola { +} + +[Foo (Pan = "fiouuu")] +class BoxedStringField { +} + +[Foo (Bingo.Fuel)] +class Zero { +} + +[Foo (System.Security.AccessControl.AceFlags.NoPropagateInherit)] +class Ace { +} + +[Foo (new object [] { Bingo.Fuel, Bingo.Binga }, null, Pan = System.Security.AccessControl.AceFlags.NoPropagateInherit)] +class Bzzz { +} + +[Foo (typeof (Bingo))] +class Typed { +} + +[Foo (typeof (FooAttribute.Token))] +class NestedTyped { +} + +[Foo (Chose = typeof (Typed))] +class Truc { +} + +[Foo (Chose = (Type) null)] +class Machin { +} + +[Foo (typeof (Dictionary<,>))] +class OpenGeneric { +} + +[Foo (typeof (Dictionary[,]>))] +class ClosedGeneric { +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Events.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Events.cs new file mode 100644 index 0000000000..22311060f6 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Events.cs @@ -0,0 +1,8 @@ +using System; + +delegate void Pan (object sender, EventArgs args); + +abstract class Foo { + + public abstract event Pan Bar; +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Fields.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Fields.cs new file mode 100644 index 0000000000..b85a57d1ce --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Fields.cs @@ -0,0 +1,41 @@ +using System; +using System.Runtime.InteropServices; + +class Foo { + Bar bar; +} + +class Bar { + volatile int oiseau; +} + +class Baz { + bool @bool; + char @char; + sbyte @sbyte; + byte @byte; + short int16; + ushort uint16; + int int32; + uint uint32; + long int64; + ulong uint64; + float single; + double @double; + string @string; + object @object; +} + +enum Pim { + Pam = 1, + Poum = 2, +} + +class PanPan { + + public const PanPan Peter = null; + public const string QQ = "qq"; + public const string nil = null; + public const object obj = null; + public const int [] ints = null; +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Generics.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Generics.cs new file mode 100644 index 0000000000..3f6b1f966c --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Generics.cs @@ -0,0 +1,121 @@ +using System; +using System.Collections.Generic; + +class Foo {} + +abstract class Bar { + + T bang; + + public abstract Bar Self (); + + public abstract Bar SelfString (); +} + +abstract class Baz { + + public abstract TBang Gazonk (object o); + + public abstract Bar Gazoo (); +} + +class Zap {} +interface IZoom {} + +class Bongo where T : Zap, IZoom { + + enum Dang { + Ding = 2, + Dong = 12, + } +} + +class Parent {} +class Child : Parent { + public T [] array; +} +class TamChild : Child {} +class RecChild : Child {} + +class Tamtam { + + static void Foo (TFoo tf) + { + } + + static void Bar () + { + Foo (2); + } + + static List Beta () + { + return new List (); + } + + static List Charlie () + { + return new List (); + } +} + +class It { + + public IEnumerable> Pwow () + { + yield return new Foo (); + yield return new Foo (); + yield return new Foo (); + } + + public void ReadPwow () + { + foreach (Foo foo in Pwow ()) + Tac (foo); + } + + public void Tac (T t) + { + } +} + +class Duel where T2 : T1 where T3 : T2 {} + +class ChildReader { + + public int Read (TamChild t) + { + return t.array.Length; + } +} + +struct Nilible where T : struct { + public T t; +} + +class Null { + + public static int Compare (Nilible x, Nilible y) where T : struct + { + return Comparer.Default.Compare (x.t, y.t); + } +} + +public class DoubleFuncClass { + public void Test () { Test (); Test (); } + public void Test () { Test (); Test (); } + public void Test () { Test (); Test (); } +} + +public class DoubleFuncClass { + public void Test () { Test (); Test (); } + public void Test () { Test (); Test (); } + public void Test () { Test (); Test (); } +} + +public class LaMatrix { + public static T At (T[,] m, int i, int j) + { + return m [i, j]; + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Interfaces.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Interfaces.cs new file mode 100644 index 0000000000..486c268a4b --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Interfaces.cs @@ -0,0 +1,22 @@ +using System; + +interface IFoo {} +interface IBar : IFoo {} + +abstract class Bar : IBar {} + +interface IBingo { + void Foo (); + void Bar (); +} + +class Bingo : IBingo { + + void IBingo.Foo () + { + } + + void IBingo.Bar () + { + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Layouts.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Layouts.cs new file mode 100644 index 0000000000..3a332fd88d --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Layouts.cs @@ -0,0 +1,16 @@ +using System; +using System.Runtime.InteropServices; + +[StructLayout (LayoutKind.Explicit, Size = 16)] +public struct Foo { + [FieldOffset (0)] public ushort Bar; + [FieldOffset (2)] public ushort Baz; + [FieldOffset (4)] public uint Gazonk; +} + +class Babar { +} + +class Locke { + public int [] integers = new int [] { 1, 2, 3, 4 }; +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Methods.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Methods.cs new file mode 100644 index 0000000000..36c0383a68 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Methods.cs @@ -0,0 +1,21 @@ +using System; +using System.Runtime.InteropServices; + +abstract class Foo { + public abstract void Bar (int a); +} + +class Bar { + + [DllImport ("foo.dll")] + public extern static void Pan ([MarshalAs (UnmanagedType.I4)] int i); +} + +public class Baz { + + public void PrintAnswer () + { + Console.WriteLine ("answer: {0}", 42); + } +} + diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/NestedTypes.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/NestedTypes.cs new file mode 100644 index 0000000000..2129e6b258 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/NestedTypes.cs @@ -0,0 +1,16 @@ +class Foo { + class Bar { + class Baz { + } + } +} + +class Bingo { + public class Fuel { + } + + public static Fuel GetFuel () + { + return null; + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/cs/Properties.cs b/src/Libraries/Mono.Cecil/Test/Resources/cs/Properties.cs new file mode 100644 index 0000000000..961a81a92b --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/cs/Properties.cs @@ -0,0 +1,18 @@ +using System; + +abstract class Foo { + + public abstract int Bar { get; } + public abstract string Baz { get; set; } + public abstract string Gazonk { set; } +} + +abstract class Bar { + + public abstract Foo this [int a, string s] { set; } +} + +class Baz { + + public string Bingo { get; set; } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/il/hello.il b/src/Libraries/Mono.Cecil/Test/Resources/il/hello.il new file mode 100644 index 0000000000..a71b8fb4bc --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/il/hello.il @@ -0,0 +1,84 @@ +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89) + .ver 2:0:0:0 +} + +.assembly Hello {} + +.module Hello.dll + +.class private auto ansi Foo { + + .method public specialname rtspecialname instance void .ctor () cil managed + { + ldarg.0 + call instance void [mscorlib]System.Object::.ctor () + ret + } + + .method public static void Bar (int32 a, int32 b) + { + .locals init (int32 res) + ldarg.0 + ldarg.1 + mul + stloc.0 + ldloc.0 + call void Foo::Baz (int32) + ret + } + + .method public static void Baz (int32 a) + { + ret + } + + .method public void Gazonk () + { + ldarg 0 + pop + ret + } + + .method public static void PrintEmpty () + { + ldsfld string [mscorlib]System.String::Empty + call void [mscorlib]System.Console::WriteLine(string) + ret + } + + .method public static bool TestFilter (bool b) cil managed + { + .maxstack 2 + .locals init (bool flag) + beginTry: + newobj instance void [mscorlib]System.Exception::.ctor () + throw + leave endCatch + startFilter: + pop + ldarg.0 + endfilter + startCatch: + ldc.i4.1 + stloc.0 + leave return + leave endCatch + endCatch: + L_001b: ldc.i4.0 + L_001c: stloc.0 + return: + L_001d: ldloc.0 + L_001e: ret + .try beginTry to startFilter filter startFilter handler startCatch to endCatch + } + + .method public static !!T GetState(string var, [opt] !!T defaultValue) cil managed + { + .param [2] = nullref + + ldarg.1 + ret + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/il/methodspecs.il b/src/Libraries/Mono.Cecil/Test/Resources/il/methodspecs.il new file mode 100644 index 0000000000..b8006f322b --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/il/methodspecs.il @@ -0,0 +1,43 @@ + +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) + .ver 2:0:0:0 +} + +.assembly MethodSpecs +{ +} + +.module MethodSpecs.dll + +.class private auto ansi beforefieldinit Tamtam + extends [mscorlib]System.Object +{ + .method private hidebysig static void Foo(!!TFoo tf) cil managed + { + // Code size 1 (0x1) + .maxstack 8 + IL_0000: ret + } // end of method Tamtam::Foo + + .method private hidebysig static void Bar() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldc.i4.2 + IL_0001: call void Tamtam::Foo(!!0) + IL_0006: ret + } // end of method Tamtam::Bar + + .method public hidebysig specialname rtspecialname + instance void .ctor() cil managed + { + // Code size 7 (0x7) + .maxstack 8 + IL_0000: ldarg.0 + IL_0001: call instance void [mscorlib]System.Object::.ctor() + IL_0006: ret + } // end of method Tamtam::.ctor + +} // end of class Tamtam diff --git a/src/Libraries/Mono.Cecil/Test/Resources/il/others.il b/src/Libraries/Mono.Cecil/Test/Resources/il/others.il new file mode 100644 index 0000000000..60713af30d --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/il/others.il @@ -0,0 +1,81 @@ +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89) + .ver 2:0:0:0 +} + +.assembly Others {} + +.module Others.dll + +.class private auto ansi Others { + + .field private string _context + + .method public specialname instance string get_Context () cil managed + { + ldarg.0 + ldfld string Others::_context + ret + } + + .method public specialname instance void set_Context (string val) cil managed + { + ldarg.0 + ldarg.1 + stfld string Others::_context + ret + } + + .method public specialname instance void let_Context (string val) cil managed + { + ldarg.0 + ldarg.1 + stfld string Others::_context + ret + } + + .method public specialname instance void bet_Context (string val) cil managed + { + ldarg.0 + ldarg.1 + stfld string Others::_context + ret + } + + .property instance string Context () { + .get instance string Others::get_Context () + .set instance void Others::set_Context (string val) + .other instance void Others::let_Context (string val) + .other instance void Others::bet_Context (string val) + } + + .field private class [mscorlib]System.EventHandler _handler + + .method public specialname instance void remove_Handler (class [mscorlib]System.EventHandler) cil managed + { + ret + } + + .method public specialname instance void add_Handler (class [mscorlib]System.EventHandler) cil managed + { + ret + } + + .method public specialname instance void dang_Handler (class [mscorlib]System.EventHandler) cil managed + { + ret + } + + .method public specialname instance void fang_Handler (class [mscorlib]System.EventHandler) cil managed + { + ret + } + + .event [mscorlib]System.EventHandler Handler { + .removeon instance void Others::remove_Handler (class [mscorlib]System.EventHandler) + .addon instance void Others::add_Handler (class [mscorlib]System.EventHandler) + .other instance void Others::dang_Handler (class [mscorlib]System.EventHandler) + .other instance void Others::fang_Handler (class [mscorlib]System.EventHandler) + } +} diff --git a/src/Libraries/Mono.Cecil/Test/Resources/il/types.il b/src/Libraries/Mono.Cecil/Test/Resources/il/types.il new file mode 100644 index 0000000000..4c9acafb5e --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/Resources/il/types.il @@ -0,0 +1,46 @@ +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89) + .ver 2:0:0:0 +} + +.assembly Types {} + +.module Types.dll + +.class private auto ansi Types { + + .field public int32[,] rank_two + .field public int32[0...,0...] rank_two_low_bound_zero + .field public int32[-1...4] rank_one_low_bound_m1 + + .method public specialname rtspecialname instance void .ctor () cil managed + { + ldarg.0 + call instance void [mscorlib]System.Object::.ctor () + ret + } +} + +.class interface private abstract auto ansi IFoo +{ +} + +.class interface private abstract auto ansi IBar + implements IFoo +{ +} + +.class interface private abstract IBaz + implements IBar, IFoo +{ +} + +.class private Fields { + + .field private static literal int32 int32_int16 = int16(0x0001) + .field private static literal int16 int16_int32 = int32(0x00000001) + .field private static literal char char_int16 = int16(0x0001) + .field private static literal int16 int16_char = char(0x0073) + .field private static literal int32 int32_nullref = nullref +} diff --git a/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/license.txt b/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/license.txt new file mode 100644 index 0000000000..4beb762c93 --- /dev/null +++ b/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/license.txt @@ -0,0 +1,15 @@ +Copyright © 2002-2007 Charlie Poole +Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov +Copyright © 2000-2002 Philip A. Craig + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required. + +Portions Copyright © 2002-2007 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.core.dll b/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.core.dll new file mode 100644 index 0000000000000000000000000000000000000000..a31edfdd9e8d70f4455253951c5113a17b081595 GIT binary patch literal 90112 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 Di0l1l literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.framework.dll b/src/Libraries/Mono.Cecil/Test/libs/nunit-2.4.8/nunit.framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..2a0a0aa3266b37dbaaa6c418500da203a2fa67eb GIT binary patch literal 77824 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 literal 0 HcmV?d00001 diff --git a/src/Libraries/Mono.Cecil/readme.txt b/src/Libraries/Mono.Cecil/readme.txt deleted file mode 100644 index ed579a856d..0000000000 --- a/src/Libraries/Mono.Cecil/readme.txt +++ /dev/null @@ -1,25 +0,0 @@ -See http://www.mono-project.com/Cecil -Cecil 0.9: http://evain.net/blog/articles/2010/04/12/mono-cecil-0-9-cecil-light - -* License - - Copyright (c) 2008 - 2011 Jb Evain - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.