Browse Source

Fix ReflectionDisassembler so that we can re-generate the IL files for the PInvoke test.

pull/1198/head
Daniel Grunwald 7 years ago
parent
commit
f290d81535
  1. 15
      ICSharpCode.Decompiler.Tests/Helpers/Tester.cs
  2. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.il
  3. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.opt.il
  4. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.opt.roslyn.il
  5. 6
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.roslyn.il
  6. 20
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  7. 12
      ICSharpCode.Decompiler/Metadata/Dom.cs
  8. 9
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

15
ICSharpCode.Decompiler.Tests/Helpers/Tester.cs

@ -111,19 +111,20 @@ namespace ICSharpCode.Decompiler.Tests.Helpers @@ -111,19 +111,20 @@ namespace ICSharpCode.Decompiler.Tests.Helpers
public static string Disassemble(string sourceFileName, string outputFile, AssemblerOptions asmOptions)
{
if (asmOptions.HasFlag(AssemblerOptions.UseOwnDisassembler)) {
using (var module = new PEReader(new FileStream(sourceFileName, FileMode.Open)))
using (var peFileStream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read))
using (var peFile = new PEFile(sourceFileName, peFileStream, PEStreamOptions.Default))
using (var writer = new StringWriter()) {
//module.Name = Path.GetFileNameWithoutExtension(outputFile);
var metadata = peFile.GetMetadataReader();
var output = new PlainTextOutput(writer);
ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None);
rd.DetectControlStructure = false;
//rd.WriteAssemblyReferences(module);
/*if (module.Assembly != null)
rd.WriteAssemblyHeader(module.Assembly);
rd.WriteAssemblyReferences(metadata);
if (metadata.IsAssembly)
rd.WriteAssemblyHeader(peFile);
output.WriteLine();
rd.WriteModuleHeader(module, skipMVID: true);
rd.WriteModuleHeader(peFile, skipMVID: true);
output.WriteLine();
rd.WriteModuleContents(module);*/
rd.WriteModuleContents(peFile);
File.WriteAllText(outputFile, ReplacePrivImplDetails(writer.ToString()));
}

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.il

@ -25,7 +25,11 @@ @@ -25,7 +25,11 @@
.ver 0:0:0:0
}
.module PInvoke
.module PInvoke.dll
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WindowsCui
.corflags 0x00000001 // ILOnly
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = (
01 00 00 00

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.opt.il

@ -25,7 +25,11 @@ @@ -25,7 +25,11 @@
.ver 0:0:0:0
}
.module PInvoke.opt
.module PInvoke.opt.dll
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WindowsCui
.corflags 0x00000001 // ILOnly
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = (
01 00 00 00

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.opt.roslyn.il

@ -28,7 +28,11 @@ @@ -28,7 +28,11 @@
.ver 0:0:0:0
}
.module PInvoke.opt.roslyn
.module PInvoke.dll
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WindowsCui
.corflags 0x00000001 // ILOnly
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = (
01 00 00 00

6
ICSharpCode.Decompiler.Tests/TestCases/Pretty/PInvoke.roslyn.il

@ -28,7 +28,11 @@ @@ -28,7 +28,11 @@
.ver 0:0:0:0
}
.module PInvoke.roslyn
.module PInvoke.dll
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WindowsCui
.corflags 0x00000001 // ILOnly
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = (
01 00 00 00

20
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -343,14 +343,17 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -343,14 +343,17 @@ namespace ICSharpCode.Decompiler.Disassembler
blob.Reset();
WriteXmlSecurityDeclaration(blob.ReadUTF8(blob.RemainingBytes));
} else {
string currentAssemblyName = null;
if (metadata.IsAssembly) {
currentAssemblyName = metadata.GetString(metadata.GetAssemblyDefinition().Name);
}
int count = blob.ReadCompressedInteger();
for (int i = 0; i < count; i++) {
var typeName = blob.ReadSerializedString();
string[] nameParts = typeName.Split(new[] { ", " }, 2, StringSplitOptions.None);
if (nameParts.Length != 2)
string[] nameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None);
if (nameParts.Length < 2)
throw new NotImplementedException();
var referencedModule = module.AssemblyResolver.Resolve(AssemblyNameReference.Parse(nameParts[1]));
if (referencedModule == module) {
if (nameParts[1] == currentAssemblyName) {
output.Write("class ");
output.Write(DisassemblerHelpers.Escape(typeName));
} else {
@ -1462,15 +1465,14 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1462,15 +1465,14 @@ namespace ICSharpCode.Decompiler.Disassembler
CloseBlock();
}
public void WriteAssemblyReferences(PEFile module)
public void WriteAssemblyReferences(MetadataReader metadata)
{
var metadata = module.GetMetadataReader();
foreach (var m in module.ModuleReferences) {
foreach (var m in metadata.GetModuleReferences()) {
var mref = metadata.GetModuleReference(m);
output.WriteLine(".module extern {0}", DisassemblerHelpers.Escape(metadata.GetString(mref.Name)));
}
foreach (var a in module.AssemblyReferences) {
var aref = metadata.GetAssemblyReference(a.Handle);
foreach (var a in metadata.AssemblyReferences) {
var aref = metadata.GetAssemblyReference(a);
output.Write(".assembly extern ");
if ((aref.Flags & AssemblyFlags.WindowsRuntime) == AssemblyFlags.WindowsRuntime)
output.Write("windowsruntime ");

12
ICSharpCode.Decompiler/Metadata/Dom.cs

@ -92,8 +92,6 @@ namespace ICSharpCode.Decompiler.Metadata @@ -92,8 +92,6 @@ namespace ICSharpCode.Decompiler.Metadata
public class PEFile : IDisposable
{
Stream stream;
public string FileName { get; }
public PEReader Reader { get; }
public IAssemblyResolver AssemblyResolver { get; set; }
@ -140,19 +138,11 @@ namespace ICSharpCode.Decompiler.Metadata @@ -140,19 +138,11 @@ namespace ICSharpCode.Decompiler.Metadata
}
public ImmutableArray<AssemblyReference> AssemblyReferences => GetMetadataReader().AssemblyReferences.Select(r => new AssemblyReference(this, r)).ToImmutableArray();
public ImmutableArray<ModuleReferenceHandle> ModuleReferences => GetModuleReferences().ToImmutableArray();
public ImmutableArray<ModuleReferenceHandle> ModuleReferences => GetMetadataReader().GetModuleReferences().ToImmutableArray();
public ImmutableArray<TypeDefinition> TypeDefinitions => Reader.GetMetadataReader().GetTopLevelTypeDefinitions().Select(t => new TypeDefinition(this, t)).ToImmutableArray();
public ImmutableArray<TypeReference> TypeReferences => Reader.GetMetadataReader().TypeReferences.Select(t => new TypeReference(this, t)).ToImmutableArray();
public ImmutableArray<Resource> Resources => GetResources().ToImmutableArray();
IEnumerable<ModuleReferenceHandle> GetModuleReferences()
{
var rowCount = GetMetadataReader().GetTableRowCount(TableIndex.ModuleRef);
for (int row = 1; row <= rowCount; row++) {
yield return MetadataTokens.ModuleReferenceHandle(row);
}
}
IEnumerable<Resource> GetResources()
{
var metadata = GetMetadataReader();

9
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -411,5 +411,14 @@ namespace ICSharpCode.Decompiler.Metadata @@ -411,5 +411,14 @@ namespace ICSharpCode.Decompiler.Metadata
}
return MetadataTokens.ParameterHandle((index + 1) & 0xFFFFFF);
}
public static IEnumerable<ModuleReferenceHandle> GetModuleReferences(this MetadataReader metadata)
{
var rowCount = metadata.GetTableRowCount(TableIndex.ModuleRef);
for (int row = 1; row <= rowCount; row++) {
yield return MetadataTokens.ModuleReferenceHandle(row);
}
}
}
}

Loading…
Cancel
Save