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
public static string Disassemble(string sourceFileName, string outputFile, AssemblerOptions asmOptions) public static string Disassemble(string sourceFileName, string outputFile, AssemblerOptions asmOptions)
{ {
if (asmOptions.HasFlag(AssemblerOptions.UseOwnDisassembler)) { 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()) { using (var writer = new StringWriter()) {
//module.Name = Path.GetFileNameWithoutExtension(outputFile); var metadata = peFile.GetMetadataReader();
var output = new PlainTextOutput(writer); var output = new PlainTextOutput(writer);
ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None); ReflectionDisassembler rd = new ReflectionDisassembler(output, CancellationToken.None);
rd.DetectControlStructure = false; rd.DetectControlStructure = false;
//rd.WriteAssemblyReferences(module); rd.WriteAssemblyReferences(metadata);
/*if (module.Assembly != null) if (metadata.IsAssembly)
rd.WriteAssemblyHeader(module.Assembly); rd.WriteAssemblyHeader(peFile);
output.WriteLine(); output.WriteLine();
rd.WriteModuleHeader(module, skipMVID: true); rd.WriteModuleHeader(peFile, skipMVID: true);
output.WriteLine(); output.WriteLine();
rd.WriteModuleContents(module);*/ rd.WriteModuleContents(peFile);
File.WriteAllText(outputFile, ReplacePrivImplDetails(writer.ToString())); File.WriteAllText(outputFile, ReplacePrivImplDetails(writer.ToString()));
} }

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

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

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

@ -25,7 +25,11 @@
.ver 0:0:0:0 .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 .corflags 0x00000001 // ILOnly
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = (
01 00 00 00 01 00 00 00

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

@ -28,7 +28,11 @@
.ver 0:0:0:0 .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 .corflags 0x00000001 // ILOnly
.custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = ( .custom instance void [mscorlib]System.Security.UnverifiableCodeAttribute::.ctor() = (
01 00 00 00 01 00 00 00

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

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

20
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

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

12
ICSharpCode.Decompiler/Metadata/Dom.cs

@ -92,8 +92,6 @@ namespace ICSharpCode.Decompiler.Metadata
public class PEFile : IDisposable public class PEFile : IDisposable
{ {
Stream stream;
public string FileName { get; } public string FileName { get; }
public PEReader Reader { get; } public PEReader Reader { get; }
public IAssemblyResolver AssemblyResolver { get; set; } public IAssemblyResolver AssemblyResolver { get; set; }
@ -140,19 +138,11 @@ namespace ICSharpCode.Decompiler.Metadata
} }
public ImmutableArray<AssemblyReference> AssemblyReferences => GetMetadataReader().AssemblyReferences.Select(r => new AssemblyReference(this, r)).ToImmutableArray(); 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<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<TypeReference> TypeReferences => Reader.GetMetadataReader().TypeReferences.Select(t => new TypeReference(this, t)).ToImmutableArray();
public ImmutableArray<Resource> Resources => GetResources().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() IEnumerable<Resource> GetResources()
{ {
var metadata = GetMetadataReader(); var metadata = GetMetadataReader();

9
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -411,5 +411,14 @@ namespace ICSharpCode.Decompiler.Metadata
} }
return MetadataTokens.ParameterHandle((index + 1) & 0xFFFFFF); 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