Browse Source

#3068: Introduce MetadataFile for pure ECMA-335 streams and as base class for PEFile

pull/3149/head
Siegfried Pammer 2 years ago
parent
commit
942131f487
  1. 5
      ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs
  2. 4
      ICSharpCode.Decompiler/Disassembler/DisassemblerSignatureTypeProvider.cs
  3. 14
      ICSharpCode.Decompiler/Disassembler/IEntityProcessor.cs
  4. 28
      ICSharpCode.Decompiler/Disassembler/SortByNameProcessor.cs
  5. 26
      ICSharpCode.Decompiler/IL/InstructionOutputExtensions.cs
  6. 2
      ICSharpCode.Decompiler/Metadata/MetadataGenericContext.cs
  7. 41
      ICSharpCode.Decompiler/Metadata/PEFile.cs
  8. 2
      ICSharpCode.Decompiler/Output/ITextOutput.cs
  9. 4
      ICSharpCode.Decompiler/Output/PlainTextOutput.cs
  10. 53
      ICSharpCode.ILSpyX/LoadedAssembly.cs
  11. 2
      ICSharpCode.ILSpyX/LoadedAssemblyExtensions.cs
  12. 4
      ICSharpCode.ILSpyX/PdbProvider/DebugInfoUtils.cs
  13. 9
      ICSharpCode.ILSpyX/PdbProvider/PortableDebugInfoProvider.cs
  14. 6
      ILSpy/EntityReference.cs
  15. 6
      ILSpy/ExtensionMethods.cs
  16. 4
      ILSpy/MainWindow.xaml.cs
  17. 35
      ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs
  18. 21
      ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs
  19. 31
      ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs
  20. 34
      ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs
  21. 38
      ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs
  22. 34
      ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs
  23. 39
      ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs
  24. 42
      ILSpy/Metadata/CorTables/EventTableTreeNode.cs
  25. 35
      ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs
  26. 33
      ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs
  27. 35
      ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs
  28. 32
      ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs
  29. 39
      ILSpy/Metadata/CorTables/FieldTableTreeNode.cs
  30. 32
      ILSpy/Metadata/CorTables/FileTableTreeNode.cs
  31. 41
      ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs
  32. 36
      ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs
  33. 43
      ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs
  34. 38
      ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs
  35. 36
      ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs
  36. 38
      ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs
  37. 42
      ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs
  38. 37
      ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs
  39. 35
      ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs
  40. 43
      ILSpy/Metadata/CorTables/MethodTableTreeNode.cs
  41. 30
      ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs
  42. 34
      ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs
  43. 37
      ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs
  44. 30
      ILSpy/Metadata/CorTables/ParamTableTreeNode.cs
  45. 39
      ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs
  46. 36
      ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs
  47. 32
      ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs
  48. 53
      ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs
  49. 37
      ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs
  50. 20
      ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs
  51. 6
      ILSpy/Metadata/DebugDirectoryTreeNode.cs
  52. 31
      ILSpy/Metadata/DebugMetadataTablesTreeNode.cs
  53. 24
      ILSpy/Metadata/DebugMetadataTreeNode.cs
  54. 44
      ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs
  55. 38
      ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs
  56. 39
      ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs
  57. 33
      ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs
  58. 42
      ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs
  59. 29
      ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs
  60. 43
      ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs
  61. 46
      ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs
  62. 16
      ILSpy/Metadata/Heaps/BlobHeapTreeNode.cs
  63. 6
      ILSpy/Metadata/Heaps/GuidHeapTreeNode.cs
  64. 15
      ILSpy/Metadata/Heaps/StringHeapTreeNode.cs
  65. 16
      ILSpy/Metadata/Heaps/UserStringHeapTreeNode.cs
  66. 15
      ILSpy/Metadata/MetadataHeapTreeNode.cs
  67. 23
      ILSpy/Metadata/MetadataTableTreeNode.cs
  68. 240
      ILSpy/Metadata/MetadataTablesTreeNode.cs
  69. 8
      ILSpy/Metadata/MetadataTreeNode.cs
  70. 6
      ILSpy/TextView/AvalonEditTextOutput.cs
  71. 3
      ILSpy/TextView/DecompilerTextView.cs

5
ICSharpCode.Decompiler/Disassembler/DisassemblerHelpers.cs

@ -17,7 +17,6 @@ @@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
@ -26,8 +25,6 @@ using ICSharpCode.Decompiler.IL; @@ -26,8 +25,6 @@ using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.Util;
using SRM = System.Reflection.Metadata;
namespace ICSharpCode.Decompiler.Disassembler
{
public enum ILNameSyntax
@ -72,7 +69,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -72,7 +69,7 @@ namespace ICSharpCode.Decompiler.Disassembler
writer.WriteLocalReference(OffsetToString(offset.Value), offset);
}
public static void WriteTo(this SRM.ExceptionRegion exceptionHandler, Metadata.PEFile module, MetadataGenericContext context, ITextOutput writer)
public static void WriteTo(this ExceptionRegion exceptionHandler, MetadataFile module, MetadataGenericContext context, ITextOutput writer)
{
writer.Write(".try ");
WriteOffsetReference(writer, exceptionHandler.TryOffset);

4
ICSharpCode.Decompiler/Disassembler/DisassemblerSignatureTypeProvider.cs

@ -27,11 +27,11 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -27,11 +27,11 @@ namespace ICSharpCode.Decompiler.Disassembler
{
public class DisassemblerSignatureTypeProvider : ISignatureTypeProvider<Action<ILNameSyntax>, MetadataGenericContext>
{
readonly PEFile module;
readonly MetadataFile module;
readonly MetadataReader metadata;
readonly ITextOutput output;
public DisassemblerSignatureTypeProvider(PEFile module, ITextOutput output)
public DisassemblerSignatureTypeProvider(MetadataFile module, ITextOutput output)
{
this.module = module ?? throw new ArgumentNullException(nameof(module));
this.output = output ?? throw new ArgumentNullException(nameof(output));

14
ICSharpCode.Decompiler/Disassembler/IEntityProcessor.cs

@ -27,18 +27,18 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -27,18 +27,18 @@ namespace ICSharpCode.Decompiler.Disassembler
{
public interface IEntityProcessor
{
IReadOnlyCollection<InterfaceImplementationHandle> Process(PEFile module, IReadOnlyCollection<InterfaceImplementationHandle> items);
IReadOnlyCollection<InterfaceImplementationHandle> Process(MetadataFile module, IReadOnlyCollection<InterfaceImplementationHandle> items);
IReadOnlyCollection<TypeDefinitionHandle> Process(PEFile module, IReadOnlyCollection<TypeDefinitionHandle> items);
IReadOnlyCollection<TypeDefinitionHandle> Process(MetadataFile module, IReadOnlyCollection<TypeDefinitionHandle> items);
IReadOnlyCollection<MethodDefinitionHandle> Process(PEFile module, IReadOnlyCollection<MethodDefinitionHandle> items);
IReadOnlyCollection<MethodDefinitionHandle> Process(MetadataFile module, IReadOnlyCollection<MethodDefinitionHandle> items);
IReadOnlyCollection<PropertyDefinitionHandle> Process(PEFile module, IReadOnlyCollection<PropertyDefinitionHandle> items);
IReadOnlyCollection<PropertyDefinitionHandle> Process(MetadataFile module, IReadOnlyCollection<PropertyDefinitionHandle> items);
IReadOnlyCollection<EventDefinitionHandle> Process(PEFile module, IReadOnlyCollection<EventDefinitionHandle> items);
IReadOnlyCollection<EventDefinitionHandle> Process(MetadataFile module, IReadOnlyCollection<EventDefinitionHandle> items);
IReadOnlyCollection<FieldDefinitionHandle> Process(PEFile module, IReadOnlyCollection<FieldDefinitionHandle> items);
IReadOnlyCollection<FieldDefinitionHandle> Process(MetadataFile module, IReadOnlyCollection<FieldDefinitionHandle> items);
IReadOnlyCollection<CustomAttributeHandle> Process(PEFile module, IReadOnlyCollection<CustomAttributeHandle> items);
IReadOnlyCollection<CustomAttributeHandle> Process(MetadataFile module, IReadOnlyCollection<CustomAttributeHandle> items);
}
}

28
ICSharpCode.Decompiler/Disassembler/SortByNameProcessor.cs

@ -30,52 +30,52 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -30,52 +30,52 @@ namespace ICSharpCode.Decompiler.Disassembler
{
public class SortByNameProcessor : IEntityProcessor
{
public IReadOnlyCollection<InterfaceImplementationHandle> Process(PEFile module,
public IReadOnlyCollection<InterfaceImplementationHandle> Process(MetadataFile module,
IReadOnlyCollection<InterfaceImplementationHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
public IReadOnlyCollection<TypeDefinitionHandle> Process(PEFile module,
public IReadOnlyCollection<TypeDefinitionHandle> Process(MetadataFile module,
IReadOnlyCollection<TypeDefinitionHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
public IReadOnlyCollection<MethodDefinitionHandle> Process(PEFile module,
public IReadOnlyCollection<MethodDefinitionHandle> Process(MetadataFile module,
IReadOnlyCollection<MethodDefinitionHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
public IReadOnlyCollection<PropertyDefinitionHandle> Process(PEFile module,
public IReadOnlyCollection<PropertyDefinitionHandle> Process(MetadataFile module,
IReadOnlyCollection<PropertyDefinitionHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
public IReadOnlyCollection<EventDefinitionHandle> Process(PEFile module,
public IReadOnlyCollection<EventDefinitionHandle> Process(MetadataFile module,
IReadOnlyCollection<EventDefinitionHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
public IReadOnlyCollection<FieldDefinitionHandle> Process(PEFile module,
public IReadOnlyCollection<FieldDefinitionHandle> Process(MetadataFile module,
IReadOnlyCollection<FieldDefinitionHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
public IReadOnlyCollection<CustomAttributeHandle> Process(PEFile module,
public IReadOnlyCollection<CustomAttributeHandle> Process(MetadataFile module,
IReadOnlyCollection<CustomAttributeHandle> items)
{
return items.OrderBy(item => GetSortKey(item, module)).ToArray();
}
private static string GetSortKey(TypeDefinitionHandle handle, PEFile module) =>
private static string GetSortKey(TypeDefinitionHandle handle, MetadataFile module) =>
handle.GetFullTypeName(module.Metadata).ToILNameString();
private static string GetSortKey(MethodDefinitionHandle handle, PEFile module)
private static string GetSortKey(MethodDefinitionHandle handle, MetadataFile module)
{
PlainTextOutput output = new PlainTextOutput();
MethodDefinition definition = module.Metadata.GetMethodDefinition(handle);
@ -97,22 +97,22 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -97,22 +97,22 @@ namespace ICSharpCode.Decompiler.Disassembler
return output.ToString();
}
private static string GetSortKey(InterfaceImplementationHandle handle, PEFile module) =>
private static string GetSortKey(InterfaceImplementationHandle handle, MetadataFile module) =>
module.Metadata.GetInterfaceImplementation(handle)
.Interface
.GetFullTypeName(module.Metadata)
.ToILNameString();
private static string GetSortKey(FieldDefinitionHandle handle, PEFile module) =>
private static string GetSortKey(FieldDefinitionHandle handle, MetadataFile module) =>
module.Metadata.GetString(module.Metadata.GetFieldDefinition(handle).Name);
private static string GetSortKey(PropertyDefinitionHandle handle, PEFile module) =>
private static string GetSortKey(PropertyDefinitionHandle handle, MetadataFile module) =>
module.Metadata.GetString(module.Metadata.GetPropertyDefinition(handle).Name);
private static string GetSortKey(EventDefinitionHandle handle, PEFile module) =>
private static string GetSortKey(EventDefinitionHandle handle, MetadataFile module) =>
module.Metadata.GetString(module.Metadata.GetEventDefinition(handle).Name);
private static string GetSortKey(CustomAttributeHandle handle, PEFile module) =>
private static string GetSortKey(CustomAttributeHandle handle, MetadataFile module) =>
module.Metadata.GetCustomAttribute(handle)
.Constructor
.GetDeclaringType(module.Metadata)

26
ICSharpCode.Decompiler/IL/InstructionOutputExtensions.cs

@ -69,7 +69,7 @@ namespace ICSharpCode.Decompiler.IL @@ -69,7 +69,7 @@ namespace ICSharpCode.Decompiler.IL
output.Write($"[{interval.Start:x4}..{interval.InclusiveEnd:x4}] ");
}
public static void WriteTo(this EntityHandle entity, PEFile module, ITextOutput output, Metadata.MetadataGenericContext genericContext, ILNameSyntax syntax = ILNameSyntax.Signature)
public static void WriteTo(this EntityHandle entity, MetadataFile module, ITextOutput output, Metadata.MetadataGenericContext genericContext, ILNameSyntax syntax = ILNameSyntax.Signature)
{
if (entity.IsNil)
{
@ -138,7 +138,7 @@ namespace ICSharpCode.Decompiler.IL @@ -138,7 +138,7 @@ namespace ICSharpCode.Decompiler.IL
case HandleKind.FieldDefinition:
{
var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)entity);
signature = fd.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), new Metadata.MetadataGenericContext(fd.GetDeclaringType(), module));
signature = fd.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), new Metadata.MetadataGenericContext(fd.GetDeclaringType(), metadata));
signature(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' ');
((EntityHandle)fd.GetDeclaringType()).WriteTo(module, output, default, ILNameSyntax.TypeName);
@ -149,7 +149,7 @@ namespace ICSharpCode.Decompiler.IL @@ -149,7 +149,7 @@ namespace ICSharpCode.Decompiler.IL
case HandleKind.MethodDefinition:
{
var md = metadata.GetMethodDefinition((MethodDefinitionHandle)entity);
methodSignature = md.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), new Metadata.MetadataGenericContext((MethodDefinitionHandle)entity, module));
methodSignature = md.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), new Metadata.MetadataGenericContext((MethodDefinitionHandle)entity, metadata));
methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' ');
@ -198,7 +198,7 @@ namespace ICSharpCode.Decompiler.IL @@ -198,7 +198,7 @@ namespace ICSharpCode.Decompiler.IL
if (j > 0)
output.Write(", ");
var constraint = metadata.GetGenericParameterConstraint(constraints[j]);
constraint.Type.WriteTo(module, output, new Metadata.MetadataGenericContext((MethodDefinitionHandle)entity, module), ILNameSyntax.TypeName);
constraint.Type.WriteTo(module, output, new Metadata.MetadataGenericContext((MethodDefinitionHandle)entity, metadata), ILNameSyntax.TypeName);
}
output.Write(") ");
}
@ -227,7 +227,7 @@ namespace ICSharpCode.Decompiler.IL @@ -227,7 +227,7 @@ namespace ICSharpCode.Decompiler.IL
methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' ');
WriteParent(output, module, metadata, mr.Parent, genericContext, syntax);
WriteParent(output, module, mr.Parent, genericContext, syntax);
output.Write("::");
output.WriteReference(module, entity, DisassemblerHelpers.Escape(memberName));
WriteParameterList(output, methodSignature);
@ -236,7 +236,7 @@ namespace ICSharpCode.Decompiler.IL @@ -236,7 +236,7 @@ namespace ICSharpCode.Decompiler.IL
var fieldSignature = mr.DecodeFieldSignature(new DisassemblerSignatureTypeProvider(module, output), genericContext);
fieldSignature(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' ');
WriteParent(output, module, metadata, mr.Parent, genericContext, syntax);
WriteParent(output, module, mr.Parent, genericContext, syntax);
output.Write("::");
output.WriteReference(module, entity, DisassemblerHelpers.Escape(memberName));
break;
@ -279,7 +279,7 @@ namespace ICSharpCode.Decompiler.IL @@ -279,7 +279,7 @@ namespace ICSharpCode.Decompiler.IL
methodSignature.Header.WriteTo(output);
methodSignature.ReturnType(ILNameSyntax.SignatureNoNamedTypeParameters);
output.Write(' ');
WriteParent(output, module, metadata, memberReference.Parent, genericContext, syntax);
WriteParent(output, module, memberReference.Parent, genericContext, syntax);
output.Write("::");
output.Write(DisassemblerHelpers.Escape(memberName));
WriteTypeParameterList(output, syntax, substitution);
@ -352,24 +352,24 @@ namespace ICSharpCode.Decompiler.IL @@ -352,24 +352,24 @@ namespace ICSharpCode.Decompiler.IL
}
}
static void WriteParent(ITextOutput output, PEFile module, MetadataReader metadata, EntityHandle parentHandle, Metadata.MetadataGenericContext genericContext, ILNameSyntax syntax)
static void WriteParent(ITextOutput output, MetadataFile metadataFile, EntityHandle parentHandle, Metadata.MetadataGenericContext genericContext, ILNameSyntax syntax)
{
switch (parentHandle.Kind)
{
case HandleKind.MethodDefinition:
var methodDef = metadata.GetMethodDefinition((MethodDefinitionHandle)parentHandle);
((EntityHandle)methodDef.GetDeclaringType()).WriteTo(module, output, genericContext, syntax);
var methodDef = metadataFile.Metadata.GetMethodDefinition((MethodDefinitionHandle)parentHandle);
((EntityHandle)methodDef.GetDeclaringType()).WriteTo(metadataFile, output, genericContext, syntax);
break;
case HandleKind.ModuleReference:
output.Write('[');
var moduleRef = metadata.GetModuleReference((ModuleReferenceHandle)parentHandle);
output.Write(metadata.GetString(moduleRef.Name));
var moduleRef = metadataFile.Metadata.GetModuleReference((ModuleReferenceHandle)parentHandle);
output.Write(metadataFile.Metadata.GetString(moduleRef.Name));
output.Write(']');
break;
case HandleKind.TypeDefinition:
case HandleKind.TypeReference:
case HandleKind.TypeSpecification:
parentHandle.WriteTo(module, output, genericContext, syntax);
parentHandle.WriteTo(metadataFile, output, genericContext, syntax);
break;
}
}

2
ICSharpCode.Decompiler/Metadata/MetadataGenericContext.cs

@ -29,7 +29,7 @@ namespace ICSharpCode.Decompiler.Metadata @@ -29,7 +29,7 @@ namespace ICSharpCode.Decompiler.Metadata
readonly TypeDefinitionHandle declaringType;
readonly MethodDefinitionHandle method;
public MetadataGenericContext(MethodDefinitionHandle method, PEFile module)
public MetadataGenericContext(MethodDefinitionHandle method, MetadataFile module)
{
this.metadata = module.Metadata;
this.method = method;

41
ICSharpCode.Decompiler/Metadata/PEFile.cs

@ -32,6 +32,33 @@ using ICSharpCode.Decompiler.Util; @@ -32,6 +32,33 @@ using ICSharpCode.Decompiler.Util;
namespace ICSharpCode.Decompiler.Metadata
{
public class MetadataFile
{
public string FileName { get; }
public MetadataReader Metadata { get; }
public virtual int MetadataOffset { get; }
public virtual bool IsEmbedded { get; }
public MetadataFile(string fileName, MetadataReaderProvider metadata, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, int metadataOffset = 0, bool isEmbedded = false)
{
this.FileName = fileName;
this.Metadata = metadata.GetMetadataReader(metadataOptions);
this.MetadataOffset = metadataOffset;
this.IsEmbedded = isEmbedded;
}
private protected MetadataFile(string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default)
{
this.FileName = fileName ?? throw new ArgumentNullException(nameof(fileName));
_ = reader ?? throw new ArgumentNullException(nameof(reader));
if (!reader.HasMetadata)
throw new PEFileNotSupportedException("PE file does not contain any managed metadata.");
this.Metadata = reader.GetMetadataReader(metadataOptions);
}
}
/// <summary>
/// PEFile is the main class the decompiler uses to represent a metadata assembly/module.
/// Every file on disk can be loaded into a standalone PEFile instance.
@ -46,11 +73,9 @@ namespace ICSharpCode.Decompiler.Metadata @@ -46,11 +73,9 @@ namespace ICSharpCode.Decompiler.Metadata
/// decompiled type systems.
/// </remarks>
[DebuggerDisplay("{FileName}")]
public class PEFile : IDisposable, TypeSystem.IModuleReference
public class PEFile : MetadataFile, IDisposable, TypeSystem.IModuleReference
{
public string FileName { get; }
public PEReader Reader { get; }
public MetadataReader Metadata { get; }
public PEFile(string fileName, PEStreamOptions streamOptions = PEStreamOptions.Default, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default)
: this(fileName, new PEReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), streamOptions), metadataOptions)
@ -63,16 +88,16 @@ namespace ICSharpCode.Decompiler.Metadata @@ -63,16 +88,16 @@ namespace ICSharpCode.Decompiler.Metadata
}
public PEFile(string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default)
: base(fileName, reader, metadataOptions)
{
this.FileName = fileName ?? throw new ArgumentNullException(nameof(fileName));
this.Reader = reader ?? throw new ArgumentNullException(nameof(reader));
if (!reader.HasMetadata)
throw new PEFileNotSupportedException("PE file does not contain any managed metadata.");
this.Metadata = reader.GetMetadataReader(metadataOptions);
this.Reader = reader;
}
public bool IsAssembly => Metadata.IsAssembly;
public override bool IsEmbedded => false;
public override int MetadataOffset => Reader.PEHeaders.MetadataStartOffset;
string? name;
public string Name {

2
ICSharpCode.Decompiler/Output/ITextOutput.cs

@ -34,7 +34,7 @@ namespace ICSharpCode.Decompiler @@ -34,7 +34,7 @@ namespace ICSharpCode.Decompiler
void Write(string text);
void WriteLine();
void WriteReference(OpCodeInfo opCode, bool omitSuffix = false);
void WriteReference(PEFile module, Handle handle, string text, string protocol = "decompile", bool isDefinition = false);
void WriteReference(MetadataFile metadata, Handle handle, string text, string protocol = "decompile", bool isDefinition = false);
void WriteReference(IType type, string text, bool isDefinition = false);
void WriteReference(IMember member, string text, bool isDefinition = false);
void WriteLocalReference(string text, object reference, bool isDefinition = false);

4
ICSharpCode.Decompiler/Output/PlainTextOutput.cs

@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler @@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler
}
}
public void WriteReference(PEFile module, Handle handle, string text, string protocol = "decompile", bool isDefinition = false)
public void WriteReference(MetadataFile module, Handle handle, string text, string protocol = "decompile", bool isDefinition = false)
{
Write(text);
}
@ -225,7 +225,7 @@ namespace ICSharpCode.Decompiler @@ -225,7 +225,7 @@ namespace ICSharpCode.Decompiler
actions.Add(target => target.WriteReference(opCode));
}
public void WriteReference(PEFile module, Handle handle, string text, string protocol = "decompile", bool isDefinition = false)
public void WriteReference(MetadataFile module, Handle handle, string text, string protocol = "decompile", bool isDefinition = false)
{
actions.Add(target => target.WriteReference(module, handle, text, protocol, isDefinition));
}

53
ICSharpCode.ILSpyX/LoadedAssembly.cs

@ -50,32 +50,39 @@ namespace ICSharpCode.ILSpyX @@ -50,32 +50,39 @@ namespace ICSharpCode.ILSpyX
/// * a non-existant file
/// * a file of unknown format that could not be loaded
/// * a .nupkg file or .NET core bundle
/// * a standalone portable pdb file or metadata stream
/// * a file that is still being loaded in the background
/// </summary>
[DebuggerDisplay("[LoadedAssembly {shortName}]")]
public sealed class LoadedAssembly
{
/// <summary>
/// Maps from PEFile (successfully loaded .NET module) back to the LoadedAssembly instance
/// Maps from MetadataFile (successfully loaded .NET module) back to the LoadedAssembly instance
/// that was used to load the module.
/// </summary>
internal static readonly ConditionalWeakTable<PEFile, LoadedAssembly> loadedAssemblies = new ConditionalWeakTable<PEFile, LoadedAssembly>();
internal static readonly ConditionalWeakTable<MetadataFile, LoadedAssembly> loadedAssemblies = new ConditionalWeakTable<MetadataFile, LoadedAssembly>();
public sealed class LoadResult
{
public PEFile? PEFile { get; }
public Exception? PEFileLoadException { get; }
public MetadataFile? MetadataFile { get; }
public PEFile? PEFile => MetadataFile as PEFile;
public Exception? FileLoadException { get; }
public LoadedPackage? Package { get; }
public LoadResult(PEFile peFile)
{
this.PEFile = peFile ?? throw new ArgumentNullException(nameof(peFile));
this.MetadataFile = peFile ?? throw new ArgumentNullException(nameof(peFile));
}
public LoadResult(Exception peFileLoadException, LoadedPackage package)
public LoadResult(Exception fileLoadException, LoadedPackage package)
{
this.PEFileLoadException = peFileLoadException ?? throw new ArgumentNullException(nameof(peFileLoadException));
this.FileLoadException = fileLoadException ?? throw new ArgumentNullException(nameof(fileLoadException));
this.Package = package ?? throw new ArgumentNullException(nameof(package));
}
public LoadResult(Exception fileLoadException, MetadataFile metadataFile)
{
this.FileLoadException = fileLoadException ?? throw new ArgumentNullException(nameof(fileLoadException));
this.MetadataFile = metadataFile ?? throw new ArgumentNullException(nameof(metadataFile));
}
}
readonly Task<LoadResult> loadingTask;
@ -170,7 +177,7 @@ namespace ICSharpCode.ILSpyX @@ -170,7 +177,7 @@ namespace ICSharpCode.ILSpyX
if (loadResult.PEFile != null)
return loadResult.PEFile;
else
throw loadResult.PEFileLoadException!;
throw loadResult.FileLoadException!;
}
/// <summary>
@ -260,8 +267,10 @@ namespace ICSharpCode.ILSpyX @@ -260,8 +267,10 @@ namespace ICSharpCode.ILSpyX
get {
if (IsLoaded && !HasLoadError)
{
PEFile? module = GetPEFileOrNull();
var metadata = module?.Metadata;
var result = GetLoadResultAsync().GetAwaiter().GetResult();
if (result.PEFile != null)
{
var metadata = result.PEFile.Metadata;
string? versionOrInfo = null;
if (metadata != null)
{
@ -281,11 +290,13 @@ namespace ICSharpCode.ILSpyX @@ -281,11 +290,13 @@ namespace ICSharpCode.ILSpyX
return ShortName;
return string.Format("{0} ({1})", ShortName, versionOrInfo);
}
else
else if (result.MetadataFile != null)
{
return ShortName;
return ShortName + " (Metadata)";
}
}
return ShortName;
}
}
/// <summary>
@ -374,6 +385,24 @@ namespace ICSharpCode.ILSpyX @@ -374,6 +385,24 @@ namespace ICSharpCode.ILSpyX
return new LoadResult(loadAssemblyException, zip);
}
catch (InvalidDataException)
{
// Not a compressed module, try other options below
}
// or it could be a standalone portable PDB
try
{
using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
var metadata = MetadataReaderProvider.FromMetadataStream(fileStream, MetadataStreamOptions.PrefetchMetadata);
var metadataFile = new MetadataFile(fileName, metadata);
lock (loadedAssemblies)
{
loadedAssemblies.Add(metadataFile, this);
}
return new LoadResult(loadAssemblyException, metadataFile);
}
}
catch (Exception)
{
throw loadAssemblyException;
}

2
ICSharpCode.ILSpyX/LoadedAssemblyExtensions.cs

@ -52,7 +52,7 @@ namespace ICSharpCode.ILSpyX @@ -52,7 +52,7 @@ namespace ICSharpCode.ILSpyX
return GetLoadedAssembly(file).GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(settings));
}
public static LoadedAssembly GetLoadedAssembly(this PEFile file)
public static LoadedAssembly GetLoadedAssembly(this MetadataFile file)
{
if (file == null)
throw new ArgumentNullException(nameof(file));

4
ICSharpCode.ILSpyX/PdbProvider/DebugInfoUtils.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.ILSpyX.PdbProvider @@ -39,7 +39,7 @@ namespace ICSharpCode.ILSpyX.PdbProvider
// try to open portable pdb file/embedded pdb info:
if (TryOpenPortablePdb(module, out var provider, out var pdbFileName))
{
return new PortableDebugInfoProvider(module.FileName, provider, pdbFileName);
return new PortableDebugInfoProvider(module.FileName, provider, MetadataReaderOptions.Default, pdbFileName);
}
else
{
@ -80,7 +80,7 @@ namespace ICSharpCode.ILSpyX.PdbProvider @@ -80,7 +80,7 @@ namespace ICSharpCode.ILSpyX.PdbProvider
{
stream.Position = 0;
var provider = MetadataReaderProvider.FromPortablePdbStream(stream);
return new PortableDebugInfoProvider(module.FileName, provider, pdbFileName);
return new PortableDebugInfoProvider(module.FileName, provider, MetadataReaderOptions.Default, pdbFileName);
}
}

9
ICSharpCode.ILSpyX/PdbProvider/PortableDebugInfoProvider.cs

@ -23,6 +23,7 @@ using System.IO; @@ -23,6 +23,7 @@ using System.IO;
using System.Reflection.Metadata;
using ICSharpCode.Decompiler.DebugInfo;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.Util;
#nullable enable
@ -34,15 +35,18 @@ namespace ICSharpCode.ILSpyX.PdbProvider @@ -34,15 +35,18 @@ namespace ICSharpCode.ILSpyX.PdbProvider
string? pdbFileName;
string moduleFileName;
readonly MetadataReaderProvider provider;
MetadataReaderOptions options;
bool hasError;
internal bool IsEmbedded => pdbFileName == null;
public PortableDebugInfoProvider(string moduleFileName, MetadataReaderProvider provider,
MetadataReaderOptions options = MetadataReaderOptions.Default,
string? pdbFileName = null)
{
this.moduleFileName = moduleFileName ?? throw new ArgumentNullException(nameof(moduleFileName));
this.provider = provider ?? throw new ArgumentNullException(nameof(provider));
this.options = options;
this.pdbFileName = pdbFileName;
}
@ -233,5 +237,10 @@ namespace ICSharpCode.ILSpyX.PdbProvider @@ -233,5 +237,10 @@ namespace ICSharpCode.ILSpyX.PdbProvider
return extraTypeInfo.TupleElementNames != null || extraTypeInfo.DynamicFlags != null;
}
public MetadataFile ToMetadataFile()
{
return new MetadataFile(SourceFileName, provider, options, 0, IsEmbedded);
}
}
}

6
ILSpy/EntityReference.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.ILSpy @@ -28,7 +28,7 @@ namespace ICSharpCode.ILSpy
[DebuggerDisplay("EntityReference Module={Module}, Handle={Handle}, Protocol={Protocol}")]
public class EntityReference
{
readonly PEFile? peFile;
readonly MetadataFile? peFile;
public string Module { get; }
public Handle Handle { get; }
public string Protocol { get; }
@ -46,7 +46,7 @@ namespace ICSharpCode.ILSpy @@ -46,7 +46,7 @@ namespace ICSharpCode.ILSpy
this.Protocol = protocol ?? "decompile";
}
public EntityReference(PEFile module, Handle handle, string protocol = "decompile")
public EntityReference(MetadataFile module, Handle handle, string protocol = "decompile")
{
this.peFile = module;
this.Module = module.FileName;
@ -54,7 +54,7 @@ namespace ICSharpCode.ILSpy @@ -54,7 +54,7 @@ namespace ICSharpCode.ILSpy
this.Protocol = protocol;
}
public PEFile? ResolveAssembly(AssemblyList context)
public MetadataFile? ResolveAssembly(AssemblyList context)
{
return peFile ?? context.FindAssembly(Module)?.GetPEFileOrNull();
}

6
ILSpy/ExtensionMethods.cs

@ -19,17 +19,13 @@ @@ -19,17 +19,13 @@
#nullable enable
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.Decompiler.Util;
using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpyX;
namespace ICSharpCode.ILSpy
@ -76,7 +72,7 @@ namespace ICSharpCode.ILSpy @@ -76,7 +72,7 @@ namespace ICSharpCode.ILSpy
return result;
}
public static ICompilation? GetTypeSystemWithCurrentOptionsOrNull(this PEFile file)
public static ICompilation? GetTypeSystemWithCurrentOptionsOrNull(this MetadataFile file)
{
return LoadedAssemblyExtensions.GetLoadedAssembly(file)
.GetTypeSystemOrNull(DecompilerTypeSystem.GetOptions(MainWindow.Instance.CurrentDecompilerSettings));

4
ILSpy/MainWindow.xaml.cs

@ -1307,7 +1307,7 @@ namespace ICSharpCode.ILSpy @@ -1307,7 +1307,7 @@ namespace ICSharpCode.ILSpy
break;
case EntityReference unresolvedEntity:
string protocol = unresolvedEntity.Protocol ?? "decompile";
PEFile file = unresolvedEntity.ResolveAssembly(assemblyList);
PEFile file = unresolvedEntity.ResolveAssembly(assemblyList) as PEFile;
if (file == null)
{
break;
@ -1378,7 +1378,7 @@ namespace ICSharpCode.ILSpy @@ -1378,7 +1378,7 @@ namespace ICSharpCode.ILSpy
{
e.Handled = true;
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = ".NET assemblies|*.dll;*.exe;*.winmd|Nuget Packages (*.nupkg)|*.nupkg|All files|*.*";
dlg.Filter = ".NET assemblies|*.dll;*.exe;*.winmd|Nuget Packages (*.nupkg)|*.nupkg|Portable Program Database (*.pdb)|*.pdb|All files|*.*";
dlg.Multiselect = true;
dlg.RestoreDirectory = true;
if (dlg.ShowDialog() == true)

35
ILSpy/Metadata/CorTables/AssemblyRefTableTreeNode.cs

@ -29,12 +29,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -29,12 +29,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class AssemblyRefTableTreeNode : MetadataTableTreeNode
{
public AssemblyRefTableTreeNode(PEFile module)
: base(HandleKind.AssemblyReference, module)
public AssemblyRefTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.AssemblyReference, metadataFile)
{
}
public override object Text => $"23 AssemblyRef ({module.Metadata.GetTableRowCount(TableIndex.AssemblyRef)})";
public override object Text => $"23 AssemblyRef ({metadataFile.Metadata.GetTableRowCount(TableIndex.AssemblyRef)})";
public override object Icon => Images.Literal;
@ -44,13 +44,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,13 +44,12 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var list = new List<AssemblyRefEntry>();
AssemblyRefEntry scrollTargetEntry = default;
foreach (var row in metadata.AssemblyReferences)
foreach (var row in metadataFile.Metadata.AssemblyReferences)
{
AssemblyRefEntry entry = new AssemblyRefEntry(module, row);
AssemblyRefEntry entry = new AssemblyRefEntry(metadataFile, row);
if (scrollTarget == MetadataTokens.GetRowNumber(row))
{
scrollTargetEntry = entry;
@ -71,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -71,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct AssemblyRefEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly AssemblyReferenceHandle handle;
readonly System.Reflection.Metadata.AssemblyReference assemblyRef;
@ -81,9 +78,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -81,9 +78,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.AssemblyRef)
+ metadata.GetTableRowSize(TableIndex.AssemblyRef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.AssemblyRef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.AssemblyRef) * (RID - 1);
public Version Version => assemblyRef.Version;
@ -101,26 +98,24 @@ namespace ICSharpCode.ILSpy.Metadata @@ -101,26 +98,24 @@ namespace ICSharpCode.ILSpy.Metadata
get {
if (assemblyRef.PublicKeyOrToken.IsNil)
return null;
System.Collections.Immutable.ImmutableArray<byte> token = metadata.GetBlobContent(assemblyRef.PublicKeyOrToken);
System.Collections.Immutable.ImmutableArray<byte> token = metadataFile.Metadata.GetBlobContent(assemblyRef.PublicKeyOrToken);
return token.ToHexString(token.Length);
}
}
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(assemblyRef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(assemblyRef.Name);
public string Name => metadataFile.Metadata.GetString(assemblyRef.Name);
public string CultureTooltip => $"{MetadataTokens.GetHeapOffset(assemblyRef.Culture):X} \"{Culture}\"";
public string Culture => metadata.GetString(assemblyRef.Culture);
public string Culture => metadataFile.Metadata.GetString(assemblyRef.Culture);
public AssemblyRefEntry(PEFile module, AssemblyReferenceHandle handle)
public AssemblyRefEntry(MetadataFile metadataFile, AssemblyReferenceHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.assemblyRef = metadata.GetAssemblyReference(handle);
this.assemblyRef = metadataFile.Metadata.GetAssemblyReference(handle);
}
}

21
ILSpy/Metadata/CorTables/AssemblyTableTreeNode.cs

@ -17,7 +17,6 @@ @@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
@ -29,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -29,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class AssemblyTableTreeNode : MetadataTableTreeNode
{
public AssemblyTableTreeNode(PEFile module)
: base(HandleKind.AssemblyDefinition, module)
public AssemblyTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.AssemblyDefinition, metadataFile)
{
}
public override object Text => $"20 Assembly ({module.Metadata.GetTableRowCount(TableIndex.Assembly)})";
public override object Text => $"20 Assembly ({metadataFile.Metadata.GetTableRowCount(TableIndex.Assembly)})";
public override object Icon => Images.Literal;
@ -44,9 +43,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,9 +43,9 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
if (module.IsAssembly)
if (metadataFile.Metadata.IsAssembly)
{
view.ItemsSource = new[] { new AssemblyEntry(module) };
view.ItemsSource = new[] { new AssemblyEntry(metadataFile.Metadata, metadataFile.MetadataOffset) };
}
else
{
@ -57,10 +56,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -57,10 +56,9 @@ namespace ICSharpCode.ILSpy.Metadata
return true;
}
struct AssemblyEntry
readonly struct AssemblyEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly AssemblyDefinition assembly;
@ -96,11 +94,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -96,11 +94,10 @@ namespace ICSharpCode.ILSpy.Metadata
public string Culture => metadata.GetString(assembly.Culture);
public AssemblyEntry(PEFile module)
public AssemblyEntry(MetadataReader metadata, int metadataOffset)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadata = metadata;
this.metadataOffset = metadataOffset;
this.assembly = metadata.GetAssemblyDefinition();
}
}

31
ILSpy/Metadata/CorTables/ClassLayoutTableTreeNode.cs

@ -23,20 +23,18 @@ using System.Reflection.Metadata; @@ -23,20 +23,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class ClassLayoutTableTreeNode : MetadataTableTreeNode
{
public ClassLayoutTableTreeNode(PEFile module)
: base((HandleKind)0x0F, module)
public ClassLayoutTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x0F, metadataFile)
{
}
public override object Text => $"0F ClassLayout ({module.Metadata.GetTableRowCount(TableIndex.ClassLayout)})";
public override object Text => $"0F ClassLayout ({metadataFile.Metadata.GetTableRowCount(TableIndex.ClassLayout)})";
public override object Icon => Images.Literal;
@ -46,18 +44,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -46,18 +44,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var list = new List<ClassLayoutEntry>();
var length = metadata.GetTableRowCount(TableIndex.ClassLayout);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
var length = metadataFile.Metadata.GetTableRowCount(TableIndex.ClassLayout);
ReadOnlySpan<byte> ptr = metadataFile.Metadata.AsReadOnlySpan();
ClassLayoutEntry scrollTargetEntry = default;
for (int rid = 1; rid <= length; rid++)
{
ClassLayoutEntry entry = new ClassLayoutEntry(module, ptr, metadataOffset, rid);
ClassLayoutEntry entry = new ClassLayoutEntry(metadataFile, ptr, rid);
if (scrollTarget == rid)
{
scrollTargetEntry = entry;
@ -92,8 +88,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -92,8 +88,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ClassLayoutEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ClassLayout classLayout;
public int RID { get; }
@ -107,11 +102,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -107,11 +102,11 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, classLayout.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference("metadata", classLayout.Parent));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, classLayout.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, classLayout.Parent);
[ColumnInfo("X4", Kind = ColumnKind.Other)]
public ushort PackingSize => classLayout.PackingSize;
@ -119,14 +114,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -119,14 +114,14 @@ namespace ICSharpCode.ILSpy.Metadata
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public uint ClassSize => classLayout.ClassSize;
public ClassLayoutEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public ClassLayoutEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var metadata = metadataFile.Metadata;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.ClassLayout)
+ metadata.GetTableRowSize(TableIndex.ClassLayout) * (row - 1);
this.Offset = metadataOffset + rowOffset;
this.Offset = metadataFile.MetadataOffset + rowOffset;
this.classLayout = new ClassLayout(ptr.Slice(rowOffset), metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4);
this.parentTooltip = null;
}

34
ILSpy/Metadata/CorTables/ConstantTableTreeNode.cs

@ -21,8 +21,6 @@ using System.Reflection.Metadata; @@ -21,8 +21,6 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.ViewModels;
@ -30,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -30,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class ConstantTableTreeNode : MetadataTableTreeNode
{
public ConstantTableTreeNode(PEFile module)
: base((HandleKind)0x0B, module)
public ConstantTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x0B, metadataFile)
{
}
public override object Text => $"0B Constant ({module.Metadata.GetTableRowCount(TableIndex.Constant)})";
public override object Text => $"0B Constant ({metadataFile.Metadata.GetTableRowCount(TableIndex.Constant)})";
public override object Icon => Images.Literal;
@ -45,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<ConstantEntry>();
ConstantEntry scrollTargetEntry = default;
for (int row = 1; row <= metadata.GetTableRowCount(TableIndex.Constant); row++)
{
ConstantEntry entry = new ConstantEntry(module, MetadataTokens.ConstantHandle(row));
ConstantEntry entry = new ConstantEntry(metadataFile, MetadataTokens.ConstantHandle(row));
if (scrollTarget == row)
{
scrollTargetEntry = entry;
@ -73,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ConstantEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly EntityHandle handle;
readonly Constant constant;
@ -83,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.Constant)
+ metadata.GetTableRowSize(TableIndex.Constant) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Constant)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Constant) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public ConstantTypeCode Type => constant.TypeCode;
@ -97,11 +93,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -97,11 +93,11 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, constant.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, constant.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, constant.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, constant.Parent);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Value => MetadataTokens.GetHeapOffset(constant.Value);
@ -112,13 +108,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -112,13 +108,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public ConstantEntry(PEFile module, ConstantHandle handle)
public ConstantEntry(MetadataFile metadataFile, ConstantHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.constant = metadata.GetConstant(handle);
this.constant = metadataFile.Metadata.GetConstant(handle);
this.parentTooltip = null;
}
}

38
ILSpy/Metadata/CorTables/CustomAttributeTableTreeNode.cs

@ -21,20 +21,18 @@ using System.Reflection.Metadata; @@ -21,20 +21,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class CustomAttributeTableTreeNode : MetadataTableTreeNode
{
public CustomAttributeTableTreeNode(PEFile module)
: base(HandleKind.CustomAttribute, module)
public CustomAttributeTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.CustomAttribute, metadataFile)
{
}
public override object Text => $"0C CustomAttribute ({module.Metadata.GetTableRowCount(TableIndex.CustomAttribute)})";
public override object Text => $"0C CustomAttribute ({metadataFile.Metadata.GetTableRowCount(TableIndex.CustomAttribute)})";
public override object Icon => Images.Literal;
@ -44,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<CustomAttributeEntry>();
CustomAttributeEntry scrollTargetEntry = default;
foreach (var row in metadata.CustomAttributes)
{
CustomAttributeEntry entry = new CustomAttributeEntry(module, row);
CustomAttributeEntry entry = new CustomAttributeEntry(metadataFile, row);
if (scrollTarget == MetadataTokens.GetRowNumber(row))
{
scrollTargetEntry = entry;
@ -73,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct CustomAttributeEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly CustomAttributeHandle handle;
readonly CustomAttribute customAttr;
@ -83,31 +79,31 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,31 +79,31 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.CustomAttribute)
+ metadata.GetTableRowSize(TableIndex.CustomAttribute) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.CustomAttribute)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.CustomAttribute) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Parent => MetadataTokens.GetToken(customAttr.Parent);
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, customAttr.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, customAttr.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, customAttr.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, customAttr.Parent);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Constructor => MetadataTokens.GetToken(customAttr.Constructor);
public void OnConstructorClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, customAttr.Constructor, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, customAttr.Constructor, protocol: "metadata"));
}
string constructorTooltip;
public string ConstructorTooltip => GenerateTooltip(ref constructorTooltip, module, customAttr.Constructor);
public string ConstructorTooltip => GenerateTooltip(ref constructorTooltip, metadataFile, customAttr.Constructor);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Value => MetadataTokens.GetHeapOffset(customAttr.Value);
@ -118,13 +114,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -118,13 +114,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public CustomAttributeEntry(PEFile module, CustomAttributeHandle handle)
public CustomAttributeEntry(MetadataFile metadataFile, CustomAttributeHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.customAttr = metadata.GetCustomAttribute(handle);
this.customAttr = metadataFile.Metadata.GetCustomAttribute(handle);
this.parentTooltip = null;
this.constructorTooltip = null;
}

34
ILSpy/Metadata/CorTables/DeclSecurityTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class DeclSecurityTableTreeNode : MetadataTableTreeNode
{
public DeclSecurityTableTreeNode(PEFile module)
: base(HandleKind.DeclarativeSecurityAttribute, module)
public DeclSecurityTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.DeclarativeSecurityAttribute, metadataFile)
{
}
public override object Text => $"0E DeclSecurity ({module.Metadata.GetTableRowCount(TableIndex.DeclSecurity)})";
public override object Text => $"0E DeclSecurity ({metadataFile.Metadata.GetTableRowCount(TableIndex.DeclSecurity)})";
public override object Icon => Images.Literal;
@ -45,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<DeclSecurityEntry>();
DeclSecurityEntry scrollTargetEntry = default;
foreach (var row in metadata.DeclarativeSecurityAttributes)
{
var entry = new DeclSecurityEntry(module, row);
var entry = new DeclSecurityEntry(metadataFile, row);
if (scrollTarget == MetadataTokens.GetRowNumber(row))
{
scrollTargetEntry = entry;
@ -74,9 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -74,9 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct DeclSecurityEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly DeclarativeSecurityAttributeHandle handle;
readonly DeclarativeSecurityAttribute declSecAttr;
@ -84,20 +80,20 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,20 +80,20 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.DeclSecurity)
+ metadata.GetTableRowSize(TableIndex.DeclSecurity) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.DeclSecurity)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.DeclSecurity) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Parent => MetadataTokens.GetToken(declSecAttr.Parent);
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, declSecAttr.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, declSecAttr.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, declSecAttr.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, declSecAttr.Parent);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public DeclarativeSecurityAction Action => declSecAttr.Action;
@ -117,13 +113,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -117,13 +113,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public DeclSecurityEntry(PEFile module, DeclarativeSecurityAttributeHandle handle)
public DeclSecurityEntry(MetadataFile metadataFile, DeclarativeSecurityAttributeHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.declSecAttr = metadata.GetDeclarativeSecurityAttribute(handle);
this.declSecAttr = metadataFile.Metadata.GetDeclarativeSecurityAttribute(handle);
this.parentTooltip = null;
}
}

39
ILSpy/Metadata/CorTables/EventMapTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class EventMapTableTreeNode : MetadataTableTreeNode
{
public EventMapTableTreeNode(PEFile module)
: base((HandleKind)0x12, module)
public EventMapTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x12, metadataFile)
{
}
public override object Text => $"12 EventMap ({module.Metadata.GetTableRowCount(TableIndex.EventMap)})";
public override object Text => $"12 EventMap ({metadataFile.Metadata.GetTableRowCount(TableIndex.EventMap)})";
public override object Icon => Images.Literal;
@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<EventMapEntry>();
EventMapEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.EventMap);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
for (int rid = 1; rid <= length; rid++)
{
EventMapEntry entry = new EventMapEntry(module, ptr, metadataOffset, rid);
EventMapEntry entry = new EventMapEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct EventMapEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly EventMap eventMap;
public int RID { get; }
@ -104,33 +100,32 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,33 +100,32 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, eventMap.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, eventMap.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, eventMap.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, eventMap.Parent);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int EventList => MetadataTokens.GetToken(eventMap.EventList);
public void OnEventListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, eventMap.EventList, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, eventMap.EventList, protocol: "metadata"));
}
string eventListTooltip;
public string EventListTooltip => GenerateTooltip(ref eventListTooltip, module, eventMap.EventList);
public string EventListTooltip => GenerateTooltip(ref eventListTooltip, metadataFile, eventMap.EventList);
public EventMapEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public EventMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.EventMap)
+ metadata.GetTableRowSize(TableIndex.EventMap) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int eventDefSize = metadata.GetTableRowCount(TableIndex.Event) < ushort.MaxValue ? 2 : 4;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.EventMap)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.EventMap) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int eventDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Event) < ushort.MaxValue ? 2 : 4;
this.eventMap = new EventMap(ptr.Slice(rowOffset), typeDefSize, eventDefSize);
this.parentTooltip = null;
this.eventListTooltip = null;

42
ILSpy/Metadata/CorTables/EventTableTreeNode.cs

@ -22,8 +22,6 @@ using System.Reflection.Metadata; @@ -22,8 +22,6 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TreeNodes;
@ -32,12 +30,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -32,12 +30,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class EventTableTreeNode : MetadataTableTreeNode
{
public EventTableTreeNode(PEFile module)
: base(HandleKind.EventDefinition, module)
public EventTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.EventDefinition, metadataFile)
{
}
public override object Text => $"14 Event ({module.Metadata.GetTableRowCount(TableIndex.Event)})";
public override object Text => $"14 Event ({metadataFile.Metadata.GetTableRowCount(TableIndex.Event)})";
public override object Icon => Images.Literal;
@ -47,14 +45,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -47,14 +45,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<EventDefEntry>();
EventDefEntry scrollTargetEntry = default;
foreach (var row in metadata.EventDefinitions)
{
EventDefEntry entry = new EventDefEntry(module, row);
EventDefEntry entry = new EventDefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -76,9 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -76,9 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct EventDefEntry : IMemberTreeNode
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly EventDefinitionHandle handle;
readonly EventDefinition eventDef;
@ -86,9 +82,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,9 +82,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.Event)
+ metadata.GetTableRowSize(TableIndex.Event) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Event)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Event) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public EventAttributes Attributes => eventDef.Attributes;
@ -99,28 +95,30 @@ namespace ICSharpCode.ILSpy.Metadata @@ -99,28 +95,30 @@ namespace ICSharpCode.ILSpy.Metadata
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(eventDef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(eventDef.Name);
public string Name => metadataFile.Metadata.GetString(eventDef.Name);
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
IEntity IMemberTreeNode.Member {
get {
return ((MetadataModule)metadataFile.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule)?.GetDefinition(handle);
}
}
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Type => MetadataTokens.GetToken(eventDef.Type);
public void OnTypeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, eventDef.Type, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, eventDef.Type, protocol: "metadata"));
}
string typeTooltip;
public string TypeTooltip => GenerateTooltip(ref typeTooltip, module, eventDef.Type);
public string TypeTooltip => GenerateTooltip(ref typeTooltip, metadataFile, eventDef.Type);
public EventDefEntry(PEFile module, EventDefinitionHandle handle)
public EventDefEntry(MetadataFile metadataFile, EventDefinitionHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.eventDef = metadata.GetEventDefinition(handle);
this.eventDef = metadataFile.Metadata.GetEventDefinition(handle);
this.typeTooltip = null;
}
}

35
ILSpy/Metadata/CorTables/ExportedTypeTableTreeNode.cs

@ -22,19 +22,18 @@ using System.Reflection.Metadata; @@ -22,19 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ExportedTypeTableTreeNode : MetadataTableTreeNode
{
public ExportedTypeTableTreeNode(PEFile module)
: base(HandleKind.ExportedType, module)
public ExportedTypeTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.ExportedType, metadataFile)
{
}
public override object Text => $"27 ExportedType ({module.Metadata.GetTableRowCount(TableIndex.ExportedType)})";
public override object Text => $"27 ExportedType ({metadataFile.Metadata.GetTableRowCount(TableIndex.ExportedType)})";
public override object Icon => Images.Literal;
@ -44,13 +43,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,13 +43,13 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<ExportedTypeEntry>();
ExportedTypeEntry scrollTargetEntry = default;
foreach (var row in metadata.ExportedTypes)
{
ExportedTypeEntry entry = new ExportedTypeEntry(module.Reader.PEHeaders.MetadataStartOffset, module, row, metadata.GetExportedType(row));
ExportedTypeEntry entry = new ExportedTypeEntry(metadataFile, row, metadataFile.Metadata.GetExportedType(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -72,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ExportedTypeEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ExportedTypeHandle handle;
readonly ExportedType type;
@ -82,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.ExportedType)
+ metadata.GetTableRowSize(TableIndex.ExportedType) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ExportedType)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.ExportedType) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public TypeAttributes Attributes => type.Attributes;
@ -104,28 +101,26 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,28 +101,26 @@ namespace ICSharpCode.ILSpy.Metadata
public string TypeNameTooltip => $"{MetadataTokens.GetHeapOffset(type.Name):X} \"{TypeName}\"";
public string TypeName => metadata.GetString(type.Name);
public string TypeName => metadataFile.Metadata.GetString(type.Name);
public string TypeNamespaceTooltip => $"{MetadataTokens.GetHeapOffset(type.Namespace):X} \"{TypeNamespace}\"";
public string TypeNamespace => metadata.GetString(type.Namespace);
public string TypeNamespace => metadataFile.Metadata.GetString(type.Namespace);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Implementation => MetadataTokens.GetToken(type.Implementation);
public void OnImplementationClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, type.Implementation, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, type.Implementation, protocol: "metadata"));
}
string implementationTooltip;
public string ImplementationTooltip => GenerateTooltip(ref implementationTooltip, module, type.Implementation);
public string ImplementationTooltip => GenerateTooltip(ref implementationTooltip, metadataFile, type.Implementation);
public ExportedTypeEntry(int metadataOffset, PEFile module, ExportedTypeHandle handle, ExportedType type)
public ExportedTypeEntry(MetadataFile metadataFile, ExportedTypeHandle handle, ExportedType type)
{
this.metadataOffset = metadataOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.type = type;
this.implementationTooltip = null;

33
ILSpy/Metadata/CorTables/FieldLayoutTableTreeNode.cs

@ -23,20 +23,18 @@ using System.Reflection.Metadata; @@ -23,20 +23,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldLayoutTableTreeNode : MetadataTableTreeNode
{
public FieldLayoutTableTreeNode(PEFile module)
: base((HandleKind)0x10, module)
public FieldLayoutTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x10, metadataFile)
{
}
public override object Text => $"10 FieldLayout ({module.Metadata.GetTableRowCount(TableIndex.FieldLayout)})";
public override object Text => $"10 FieldLayout ({metadataFile.Metadata.GetTableRowCount(TableIndex.FieldLayout)})";
public override object Icon => Images.Literal;
@ -46,17 +44,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -46,17 +44,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<FieldLayoutEntry>();
FieldLayoutEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.FieldLayout);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
for (int rid = 1; rid <= length; rid++)
{
FieldLayoutEntry entry = new FieldLayoutEntry(module, ptr, metadataOffset, rid);
FieldLayoutEntry entry = new FieldLayoutEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -90,8 +87,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -90,8 +87,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct FieldLayoutEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly FieldLayout fieldLayout;
public int RID { get; }
@ -105,24 +101,23 @@ namespace ICSharpCode.ILSpy.Metadata @@ -105,24 +101,23 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnFieldClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, fieldLayout.Field, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, fieldLayout.Field, protocol: "metadata"));
}
string fieldTooltip;
public string FieldTooltip => GenerateTooltip(ref fieldTooltip, module, fieldLayout.Field);
public string FieldTooltip => GenerateTooltip(ref fieldTooltip, metadataFile, fieldLayout.Field);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public int FieldOffset => fieldLayout.Offset;
public FieldLayoutEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public FieldLayoutEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.FieldLayout)
+ metadata.GetTableRowSize(TableIndex.FieldLayout) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int fieldDefSize = metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldLayout)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.FieldLayout) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int fieldDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
this.fieldLayout = new FieldLayout(ptr.Slice(rowOffset), fieldDefSize);
this.fieldTooltip = null;
}

35
ILSpy/Metadata/CorTables/FieldMarshalTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldMarshalTableTreeNode : MetadataTableTreeNode
{
public FieldMarshalTableTreeNode(PEFile module)
: base((HandleKind)0x0D, module)
public FieldMarshalTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x0D, metadataFile)
{
}
public override object Text => $"0D FieldMarshal ({module.Metadata.GetTableRowCount(TableIndex.FieldMarshal)})";
public override object Text => $"0D FieldMarshal ({metadataFile.Metadata.GetTableRowCount(TableIndex.FieldMarshal)})";
public override object Icon => Images.Literal;
@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<FieldMarshalEntry>();
FieldMarshalEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.FieldMarshal);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
for (int rid = 1; rid <= length; rid++)
{
FieldMarshalEntry entry = new FieldMarshalEntry(module, ptr, metadataOffset, rid);
FieldMarshalEntry entry = new FieldMarshalEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct FieldMarshalEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly FieldMarshal fieldMarshal;
public int RID { get; }
@ -104,25 +100,24 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,25 +100,24 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, fieldMarshal.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, fieldMarshal.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, fieldMarshal.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, fieldMarshal.Parent);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int NativeType => MetadataTokens.GetHeapOffset(fieldMarshal.NativeType);
public FieldMarshalEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public FieldMarshalEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.FieldMarshal)
+ metadata.GetTableRowSize(TableIndex.FieldMarshal) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int hasFieldMarshalRefSize = metadata.ComputeCodedTokenSize(32768, TableMask.Field | TableMask.Param);
int blobHeapSize = metadata.GetHeapSize(HeapIndex.Blob) < ushort.MaxValue ? 2 : 4;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldMarshal)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.FieldMarshal) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int hasFieldMarshalRefSize = metadataFile.Metadata.ComputeCodedTokenSize(32768, TableMask.Field | TableMask.Param);
int blobHeapSize = metadataFile.Metadata.GetHeapSize(HeapIndex.Blob) < ushort.MaxValue ? 2 : 4;
this.fieldMarshal = new FieldMarshal(ptr.Slice(rowOffset), blobHeapSize, hasFieldMarshalRefSize);
this.parentTooltip = null;
}

32
ILSpy/Metadata/CorTables/FieldRVATableTreeNode.cs

@ -23,20 +23,18 @@ using System.Reflection.Metadata; @@ -23,20 +23,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldRVATableTreeNode : MetadataTableTreeNode
{
public FieldRVATableTreeNode(PEFile module)
: base((HandleKind)0x1D, module)
public FieldRVATableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x1D, metadataFile)
{
}
public override object Text => $"1D FieldRVA ({module.Metadata.GetTableRowCount(TableIndex.FieldRva)})";
public override object Text => $"1D FieldRVA ({metadataFile.Metadata.GetTableRowCount(TableIndex.FieldRva)})";
public override object Icon => Images.Literal;
@ -46,17 +44,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -46,17 +44,17 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<FieldRVAEntry>();
FieldRVAEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.FieldRva);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
int metadataOffset = metadataFile.MetadataOffset;
for (int rid = 1; rid <= length; rid++)
{
FieldRVAEntry entry = new FieldRVAEntry(module, ptr, metadataOffset, rid);
FieldRVAEntry entry = new FieldRVAEntry(metadataFile, metadataOffset, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -90,8 +88,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -90,8 +88,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct FieldRVAEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly FieldRVA fieldRVA;
public int RID { get; }
@ -105,24 +102,23 @@ namespace ICSharpCode.ILSpy.Metadata @@ -105,24 +102,23 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnFieldClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, fieldRVA.Field, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, fieldRVA.Field, protocol: "metadata"));
}
string fieldTooltip;
public string FieldTooltip => GenerateTooltip(ref fieldTooltip, module, fieldRVA.Field);
public string FieldTooltip => GenerateTooltip(ref fieldTooltip, metadataFile, fieldRVA.Field);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public int FieldOffset => fieldRVA.Offset;
public FieldRVAEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public FieldRVAEntry(MetadataFile metadataFile, int metadataOffset, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.FieldRva)
+ metadata.GetTableRowSize(TableIndex.FieldRva) * (row - 1);
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.FieldRva)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.FieldRva) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int fieldDefSize = metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
int fieldDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Field) < ushort.MaxValue ? 2 : 4;
this.fieldRVA = new FieldRVA(ptr.Slice(rowOffset), fieldDefSize);
this.fieldTooltip = null;
}

39
ILSpy/Metadata/CorTables/FieldTableTreeNode.cs

@ -21,13 +21,8 @@ using System.Collections.Generic; @@ -21,13 +21,8 @@ using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TreeNodes;
@ -36,12 +31,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -36,12 +31,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class FieldTableTreeNode : MetadataTableTreeNode
{
public FieldTableTreeNode(PEFile module)
: base(HandleKind.FieldDefinition, module)
public FieldTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.FieldDefinition, metadataFile)
{
}
public override object Text => $"04 Field ({module.Metadata.GetTableRowCount(TableIndex.Field)})";
public override object Text => $"04 Field ({metadataFile.Metadata.GetTableRowCount(TableIndex.Field)})";
public override object Icon => Images.Literal;
@ -50,7 +45,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -50,7 +45,7 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.Title = Text.ToString();
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<FieldDefEntry>();
@ -58,7 +53,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -58,7 +53,7 @@ namespace ICSharpCode.ILSpy.Metadata
foreach (var row in metadata.FieldDefinitions)
{
var entry = new FieldDefEntry(module, row);
var entry = new FieldDefEntry(metadataFile, row);
if (scrollTarget == entry.RID)
{
scrollTargetEntry = entry;
@ -80,9 +75,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -80,9 +75,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct FieldDefEntry : IMemberTreeNode
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly FieldDefinitionHandle handle;
readonly FieldDefinition fieldDef;
@ -90,9 +83,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -90,9 +83,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.Field)
+ metadata.GetTableRowSize(TableIndex.Field) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Field)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Field) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public FieldAttributes Attributes => fieldDef.Attributes;
@ -104,25 +97,23 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,25 +97,23 @@ namespace ICSharpCode.ILSpy.Metadata
FlagGroup.CreateMultipleChoiceGroup(typeof(FieldAttributes), "Flags:", (int)otherFlagsMask, (int)(fieldDef.Attributes & otherFlagsMask), includeAll: false),
};
public string Name => metadata.GetString(fieldDef.Name);
public string Name => metadataFile.Metadata.GetString(fieldDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(fieldDef.Name):X} \"{Name}\"";
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
IEntity IMemberTreeNode.Member => ((MetadataModule)metadataFile.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule)?.GetDefinition(handle);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Signature => MetadataTokens.GetHeapOffset(fieldDef.Signature);
string signatureTooltip;
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, module, handle);
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, metadataFile, handle);
public FieldDefEntry(PEFile module, FieldDefinitionHandle handle)
public FieldDefEntry(MetadataFile metadataFile, FieldDefinitionHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.fieldDef = metadata.GetFieldDefinition(handle);
this.fieldDef = metadataFile.Metadata.GetFieldDefinition(handle);
this.signatureTooltip = null;
}
}

32
ILSpy/Metadata/CorTables/FileTableTreeNode.cs

@ -27,12 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -27,12 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
class FileTableTreeNode : MetadataTableTreeNode
{
public FileTableTreeNode(PEFile module)
: base(HandleKind.AssemblyFile, module)
public FileTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.AssemblyFile, metadataFile)
{
}
public override object Text => $"26 File ({module.Metadata.GetTableRowCount(TableIndex.File)})";
public override object Text => $"26 File ({metadataFile.Metadata.GetTableRowCount(TableIndex.File)})";
public override object Icon => Images.Literal;
@ -42,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -42,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<FileEntry>();
FileEntry scrollTargetEntry = default;
foreach (var row in metadata.AssemblyFiles)
{
FileEntry entry = new FileEntry(module, row);
FileEntry entry = new FileEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -71,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -71,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct FileEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly AssemblyFileHandle handle;
readonly AssemblyFile assemblyFile;
@ -81,16 +79,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -81,16 +79,16 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.File)
+ metadata.GetTableRowSize(TableIndex.File) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.File)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.File) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public int Attributes => assemblyFile.ContainsMetadata ? 1 : 0;
public string AttributesTooltip => assemblyFile.ContainsMetadata ? "ContainsMetaData" : "ContainsNoMetaData";
public string Name => metadata.GetString(assemblyFile.Name);
public string Name => metadataFile.Metadata.GetString(assemblyFile.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(assemblyFile.Name):X} \"{Name}\"";
@ -101,18 +99,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -101,18 +99,16 @@ namespace ICSharpCode.ILSpy.Metadata
get {
if (assemblyFile.HashValue.IsNil)
return null;
System.Collections.Immutable.ImmutableArray<byte> token = metadata.GetBlobContent(assemblyFile.HashValue);
System.Collections.Immutable.ImmutableArray<byte> token = metadataFile.Metadata.GetBlobContent(assemblyFile.HashValue);
return token.ToHexString(token.Length);
}
}
public FileEntry(PEFile module, AssemblyFileHandle handle)
public FileEntry(MetadataFile metadataFile, AssemblyFileHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.assemblyFile = metadata.GetAssemblyFile(handle);
this.assemblyFile = metadataFile.Metadata.GetAssemblyFile(handle);
}
}

41
ILSpy/Metadata/CorTables/GenericParamConstraintTableTreeNode.cs

@ -21,7 +21,6 @@ using System.Reflection.Metadata; @@ -21,7 +21,6 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
@ -29,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -29,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class GenericParamConstraintTableTreeNode : MetadataTableTreeNode
{
public GenericParamConstraintTableTreeNode(PEFile module)
: base(HandleKind.GenericParameterConstraint, module)
public GenericParamConstraintTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.GenericParameterConstraint, metadataFile)
{
}
public override object Text => $"2C GenericParamConstraint ({module.Metadata.GetTableRowCount(TableIndex.GenericParamConstraint)})";
public override object Text => $"2C GenericParamConstraint ({metadataFile.Metadata.GetTableRowCount(TableIndex.GenericParamConstraint)})";
public override object Icon => Images.Literal;
@ -44,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<GenericParamConstraintEntry>();
GenericParamConstraintEntry scrollTargetEntry = default;
for (int row = 1; row <= metadata.GetTableRowCount(TableIndex.GenericParamConstraint); row++)
{
GenericParamConstraintEntry entry = new GenericParamConstraintEntry(module, MetadataTokens.GenericParameterConstraintHandle(row));
GenericParamConstraintEntry entry = new GenericParamConstraintEntry(metadataFile, MetadataTokens.GenericParameterConstraintHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -72,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct GenericParamConstraintEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly GenericParameterConstraintHandle handle;
readonly GenericParameterConstraint genericParamConstraint;
@ -82,16 +79,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,16 +79,16 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.GenericParamConstraint)
+ metadata.GetTableRowSize(TableIndex.GenericParamConstraint) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.GenericParamConstraint)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.GenericParamConstraint) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Owner => MetadataTokens.GetToken(genericParamConstraint.Parameter);
public void OnOwnerClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, genericParamConstraint.Parameter, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, genericParamConstraint.Parameter, protocol: "metadata"));
}
string ownerTooltip;
@ -101,9 +98,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -101,9 +98,9 @@ namespace ICSharpCode.ILSpy.Metadata
if (ownerTooltip == null)
{
ITextOutput output = new PlainTextOutput();
var p = metadata.GetGenericParameter(genericParamConstraint.Parameter);
output.Write("parameter " + p.Index + (p.Name.IsNil ? "" : " (" + metadata.GetString(p.Name) + ")") + " of ");
p.Parent.WriteTo(module, output, default);
var p = metadataFile.Metadata.GetGenericParameter(genericParamConstraint.Parameter);
output.Write("parameter " + p.Index + (p.Name.IsNil ? "" : " (" + metadataFile.Metadata.GetString(p.Name) + ")") + " of ");
p.Parent.WriteTo(metadataFile, output, default);
ownerTooltip = output.ToString();
}
return ownerTooltip;
@ -115,19 +112,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -115,19 +112,17 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnTypeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, genericParamConstraint.Type, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, genericParamConstraint.Type, protocol: "metadata"));
}
string typeTooltip;
public string TypeTooltip => GenerateTooltip(ref typeTooltip, module, genericParamConstraint.Type);
public string TypeTooltip => GenerateTooltip(ref typeTooltip, metadataFile, genericParamConstraint.Type);
public GenericParamConstraintEntry(PEFile module, GenericParameterConstraintHandle handle)
public GenericParamConstraintEntry(MetadataFile metadataFile, GenericParameterConstraintHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.genericParamConstraint = metadata.GetGenericParameterConstraint(handle);
this.genericParamConstraint = metadataFile.Metadata.GetGenericParameterConstraint(handle);
this.ownerTooltip = null;
this.typeTooltip = null;
}

36
ILSpy/Metadata/CorTables/GenericParamTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class GenericParamTableTreeNode : MetadataTableTreeNode
{
public GenericParamTableTreeNode(PEFile module)
: base(HandleKind.GenericParameter, module)
public GenericParamTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.GenericParameter, metadataFile)
{
}
public override object Text => $"2A GenericParam ({module.Metadata.GetTableRowCount(TableIndex.GenericParam)})";
public override object Text => $"2A GenericParam ({metadataFile.Metadata.GetTableRowCount(TableIndex.GenericParam)})";
public override object Icon => Images.Literal;
@ -49,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -49,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<GenericParamEntry>();
GenericParamEntry scrollTargetEntry = default;
for (int row = 1; row <= module.Metadata.GetTableRowCount(TableIndex.GenericParam); row++)
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.GenericParam); row++)
{
GenericParamEntry entry = new GenericParamEntry(module, MetadataTokens.GenericParameterHandle(row));
GenericParamEntry entry = new GenericParamEntry(metadataFile, MetadataTokens.GenericParameterHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -72,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct GenericParamEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly GenericParameterHandle handle;
readonly GenericParameter genericParam;
@ -82,9 +78,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,9 +78,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.GenericParam)
+ metadata.GetTableRowSize(TableIndex.GenericParam) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.GenericParam)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.GenericParam) * (RID - 1);
public int Number => genericParam.Index;
@ -101,23 +97,21 @@ namespace ICSharpCode.ILSpy.Metadata @@ -101,23 +97,21 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnOwnerClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, genericParam.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, genericParam.Parent, protocol: "metadata"));
}
string ownerTooltip;
public string OwnerTooltip => GenerateTooltip(ref ownerTooltip, module, genericParam.Parent);
public string OwnerTooltip => GenerateTooltip(ref ownerTooltip, metadataFile, genericParam.Parent);
public string Name => metadata.GetString(genericParam.Name);
public string Name => metadataFile.Metadata.GetString(genericParam.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(genericParam.Name):X} \"{Name}\"";
public GenericParamEntry(PEFile module, GenericParameterHandle handle)
public GenericParamEntry(MetadataFile metadataFile, GenericParameterHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.genericParam = metadata.GetGenericParameter(handle);
this.genericParam = metadataFile.Metadata.GetGenericParameter(handle);
this.ownerTooltip = null;
}
}

43
ILSpy/Metadata/CorTables/ImplMapTableTreeNode.cs

@ -23,8 +23,6 @@ using System.Reflection.Metadata; @@ -23,8 +23,6 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using Mono.Cecil;
@ -33,12 +31,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -33,12 +31,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
class ImplMapTableTreeNode : MetadataTableTreeNode
{
public ImplMapTableTreeNode(PEFile module)
: base((HandleKind)0x1C, module)
public ImplMapTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x1C, metadataFile)
{
}
public override object Text => $"1C ImplMap ({module.Metadata.GetTableRowCount(TableIndex.ImplMap)})";
public override object Text => $"1C ImplMap ({metadataFile.Metadata.GetTableRowCount(TableIndex.ImplMap)})";
public override object Icon => Images.Literal;
@ -50,17 +48,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -50,17 +48,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<ImplMapEntry>();
ImplMapEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.ImplMap);
var span = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
for (int rid = 1; rid <= length; rid++)
{
ImplMapEntry entry = new ImplMapEntry(module, span, metadataOffset, rid);
ImplMapEntry entry = new ImplMapEntry(metadataFile, span, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -98,8 +95,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -98,8 +95,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ImplMapEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ImplMap implMap;
public int RID { get; }
@ -124,38 +120,37 @@ namespace ICSharpCode.ILSpy.Metadata @@ -124,38 +120,37 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnMemberForwardedClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, implMap.MemberForwarded, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, implMap.MemberForwarded, protocol: "metadata"));
}
string memberForwardedTooltip;
public string MemberForwardedTooltip => GenerateTooltip(ref memberForwardedTooltip, module, implMap.MemberForwarded);
public string MemberForwardedTooltip => GenerateTooltip(ref memberForwardedTooltip, metadataFile, implMap.MemberForwarded);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int ImportScope => MetadataTokens.GetToken(implMap.ImportScope);
public void OnImportScopeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, implMap.ImportScope, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, implMap.ImportScope, protocol: "metadata"));
}
string importScopeTooltip;
public string ImportScopeTooltip => GenerateTooltip(ref importScopeTooltip, module, implMap.ImportScope);
public string ImportScopeTooltip => GenerateTooltip(ref importScopeTooltip, metadataFile, implMap.ImportScope);
public string ImportName => metadata.GetString(implMap.ImportName);
public string ImportName => metadataFile.Metadata.GetString(implMap.ImportName);
public string ImportNameTooltip => $"{MetadataTokens.GetHeapOffset(implMap.ImportName):X} \"{ImportName}\"";
public ImplMapEntry(PEFile module, ReadOnlySpan<byte> span, int metadataOffset, int row)
public ImplMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> span, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.ImplMap)
+ metadata.GetTableRowSize(TableIndex.ImplMap) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int moduleRefSize = metadata.GetTableRowCount(TableIndex.ModuleRef) < ushort.MaxValue ? 2 : 4;
int memberForwardedTagRefSize = metadata.ComputeCodedTokenSize(32768, TableMask.MethodDef | TableMask.Field);
int stringHandleSize = metadata.GetHeapSize(HeapIndex.String) < ushort.MaxValue ? 2 : 4;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ImplMap)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.ImplMap) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int moduleRefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.ModuleRef) < ushort.MaxValue ? 2 : 4;
int memberForwardedTagRefSize = metadataFile.Metadata.ComputeCodedTokenSize(32768, TableMask.MethodDef | TableMask.Field);
int stringHandleSize = metadataFile.Metadata.GetHeapSize(HeapIndex.String) < ushort.MaxValue ? 2 : 4;
this.implMap = new ImplMap(span.Slice(rowOffset), moduleRefSize, memberForwardedTagRefSize, stringHandleSize);
this.importScopeTooltip = null;
this.memberForwardedTooltip = null;

38
ILSpy/Metadata/CorTables/InterfaceImplTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class InterfaceImplTableTreeNode : MetadataTableTreeNode
{
public InterfaceImplTableTreeNode(PEFile module)
: base((HandleKind)0x09, module)
public InterfaceImplTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x09, metadataFile)
{
}
public override object Text => $"09 InterfaceImpl ({module.Metadata.GetTableRowCount(TableIndex.InterfaceImpl)})";
public override object Text => $"09 InterfaceImpl ({metadataFile.Metadata.GetTableRowCount(TableIndex.InterfaceImpl)})";
public override object Icon => Images.Literal;
@ -45,17 +43,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,17 +43,17 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<InterfaceImplEntry>();
InterfaceImplEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.InterfaceImpl);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
int metadataOffset = metadataFile.MetadataOffset;
for (int rid = 1; rid <= length; rid++)
{
InterfaceImplEntry entry = new InterfaceImplEntry(module, ptr, metadataOffset, rid);
InterfaceImplEntry entry = new InterfaceImplEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -89,8 +87,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,8 +87,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct InterfaceImplEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly InterfaceImpl interfaceImpl;
public int RID { get; }
@ -104,32 +101,31 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,32 +101,31 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnClassClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, interfaceImpl.Class, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, interfaceImpl.Class, protocol: "metadata"));
}
string classTooltip;
public string ClassTooltip => GenerateTooltip(ref classTooltip, module, interfaceImpl.Class);
public string ClassTooltip => GenerateTooltip(ref classTooltip, metadataFile, interfaceImpl.Class);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Interface => MetadataTokens.GetToken(interfaceImpl.Interface);
public void OnInterfaceClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, interfaceImpl.Interface, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, interfaceImpl.Interface, protocol: "metadata"));
}
string interfaceTooltip;
public string InterfaceTooltip => GenerateTooltip(ref interfaceTooltip, module, interfaceImpl.Interface);
public string InterfaceTooltip => GenerateTooltip(ref interfaceTooltip, metadataFile, interfaceImpl.Interface);
public InterfaceImplEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public InterfaceImplEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.InterfaceImpl)
+ metadata.GetTableRowSize(TableIndex.InterfaceImpl) * (row - 1);
this.Offset = metadataOffset + rowOffset;
this.interfaceImpl = new InterfaceImpl(ptr.Slice(rowOffset), metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4, metadata.ComputeCodedTokenSize(16384, TableMask.TypeDef | TableMask.TypeRef | TableMask.TypeSpec));
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.InterfaceImpl)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.InterfaceImpl) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
this.interfaceImpl = new InterfaceImpl(ptr.Slice(rowOffset), metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4, metadataFile.Metadata.ComputeCodedTokenSize(16384, TableMask.TypeDef | TableMask.TypeRef | TableMask.TypeSpec));
this.interfaceTooltip = null;
this.classTooltip = null;
}

36
ILSpy/Metadata/CorTables/ManifestResourceTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class ManifestResourceTableTreeNode : MetadataTableTreeNode
{
public ManifestResourceTableTreeNode(PEFile module)
: base(HandleKind.ManifestResource, module)
public ManifestResourceTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.ManifestResource, metadataFile)
{
}
public override object Text => $"28 ManifestResource ({module.Metadata.GetTableRowCount(TableIndex.ManifestResource)})";
public override object Text => $"28 ManifestResource ({metadataFile.Metadata.GetTableRowCount(TableIndex.ManifestResource)})";
public override object Icon => Images.Literal;
@ -45,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<ManifestResourceEntry>();
ManifestResourceEntry scrollTargetEntry = default;
foreach (var row in metadata.ManifestResources)
{
ManifestResourceEntry entry = new ManifestResourceEntry(module, row);
ManifestResourceEntry entry = new ManifestResourceEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -74,9 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -74,9 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ManifestResourceEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ManifestResourceHandle handle;
readonly ManifestResource manifestResource;
@ -84,16 +80,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,16 +80,16 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.ManifestResource)
+ metadata.GetTableRowSize(TableIndex.ManifestResource) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ManifestResource)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.ManifestResource) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public ManifestResourceAttributes Attributes => manifestResource.Attributes;
public object AttributesTooltip => manifestResource.Attributes.ToString();
public string Name => metadata.GetString(manifestResource.Name);
public string Name => metadataFile.Metadata.GetString(manifestResource.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(manifestResource.Name):X} \"{Name}\"";
@ -102,19 +98,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -102,19 +98,17 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnImplementationClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, manifestResource.Implementation, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, manifestResource.Implementation, protocol: "metadata"));
}
string implementationTooltip;
public string ImplementationTooltip => GenerateTooltip(ref implementationTooltip, module, manifestResource.Implementation);
public string ImplementationTooltip => GenerateTooltip(ref implementationTooltip, metadataFile, manifestResource.Implementation);
public ManifestResourceEntry(PEFile module, ManifestResourceHandle handle)
public ManifestResourceEntry(MetadataFile metadataFile, ManifestResourceHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.manifestResource = metadata.GetManifestResource(handle);
this.manifestResource = metadataFile.Metadata.GetManifestResource(handle);
this.implementationTooltip = null;
}
}

38
ILSpy/Metadata/CorTables/MemberRefTableTreeNode.cs

@ -21,20 +21,18 @@ using System.Reflection.Metadata; @@ -21,20 +21,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MemberRefTableTreeNode : MetadataTableTreeNode
{
public MemberRefTableTreeNode(PEFile module)
: base(HandleKind.MemberReference, module)
public MemberRefTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.MemberReference, metadataFile)
{
}
public override object Text => $"0A MemberRef ({module.Metadata.GetTableRowCount(TableIndex.MemberRef)})";
public override object Text => $"0A MemberRef ({metadataFile.Metadata.GetTableRowCount(TableIndex.MemberRef)})";
public override object Icon => Images.Literal;
@ -44,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<MemberRefEntry>();
MemberRefEntry scrollTargetEntry = default;
foreach (var row in metadata.MemberReferences)
{
MemberRefEntry entry = new MemberRefEntry(module, row);
MemberRefEntry entry = new MemberRefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -73,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct MemberRefEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly MemberReferenceHandle handle;
readonly MemberReference memberRef;
@ -83,22 +79,22 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,22 +79,22 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.MemberRef)
+ metadata.GetTableRowSize(TableIndex.MemberRef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.MemberRef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.MemberRef) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Parent => MetadataTokens.GetToken(memberRef.Parent);
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, memberRef.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, memberRef.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, memberRef.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, memberRef.Parent);
public string Name => metadata.GetString(memberRef.Name);
public string Name => metadataFile.Metadata.GetString(memberRef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(memberRef.Name):X} \"{Name}\"";
@ -106,15 +102,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -106,15 +102,13 @@ namespace ICSharpCode.ILSpy.Metadata
public int Signature => MetadataTokens.GetHeapOffset(memberRef.Signature);
string signatureTooltip;
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, module, handle);
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, metadataFile, handle);
public MemberRefEntry(PEFile module, MemberReferenceHandle handle)
public MemberRefEntry(MetadataFile metadataFile, MemberReferenceHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.memberRef = metadata.GetMemberReference(handle);
this.memberRef = metadataFile.Metadata.GetMemberReference(handle);
this.signatureTooltip = null;
this.parentTooltip = null;
}

42
ILSpy/Metadata/CorTables/MethodImplTableTreeNode.cs

@ -21,20 +21,18 @@ using System.Reflection.Metadata; @@ -21,20 +21,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodImplTableTreeNode : MetadataTableTreeNode
{
public MethodImplTableTreeNode(PEFile module)
: base((HandleKind)0x19, module)
public MethodImplTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x19, metadataFile)
{
}
public override object Text => $"19 MethodImpl ({module.Metadata.GetTableRowCount(TableIndex.MethodImpl)})";
public override object Text => $"19 MethodImpl ({metadataFile.Metadata.GetTableRowCount(TableIndex.MethodImpl)})";
public override object Icon => Images.Literal;
@ -48,9 +46,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -48,9 +46,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<MethodImplEntry>();
MethodImplEntry scrollTargetEntry = default;
for (int row = 1; row <= module.Metadata.GetTableRowCount(TableIndex.MethodImpl); row++)
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.MethodImpl); row++)
{
MethodImplEntry entry = new MethodImplEntry(module, MetadataTokens.MethodImplementationHandle(row));
MethodImplEntry entry = new MethodImplEntry(metadataFile, MetadataTokens.MethodImplementationHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -72,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct MethodImplEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly MethodImplementationHandle handle;
readonly MethodImplementation methodImpl;
@ -82,50 +78,48 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,50 +78,48 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int MethodDeclaration => MetadataTokens.GetToken(methodImpl.MethodDeclaration);
public void OnMethodDeclarationClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, methodImpl.MethodDeclaration, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, methodImpl.MethodDeclaration, protocol: "metadata"));
}
string methodDeclarationTooltip;
public string MethodDeclarationTooltip => GenerateTooltip(ref methodDeclarationTooltip, module, methodImpl.MethodDeclaration);
public string MethodDeclarationTooltip => GenerateTooltip(ref methodDeclarationTooltip, metadataFile, methodImpl.MethodDeclaration);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int MethodBody => MetadataTokens.GetToken(methodImpl.MethodBody);
public void OnMethodBodyClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, methodImpl.MethodBody, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, methodImpl.MethodBody, protocol: "metadata"));
}
string methodBodyTooltip;
public string MethodBodyTooltip => GenerateTooltip(ref methodBodyTooltip, module, methodImpl.MethodBody);
public string MethodBodyTooltip => GenerateTooltip(ref methodBodyTooltip, metadataFile, methodImpl.MethodBody);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Type => MetadataTokens.GetToken(methodImpl.Type);
public void OnTypeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, methodImpl.Type, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, methodImpl.Type, protocol: "metadata"));
}
string typeTooltip;
public string TypeTooltip => GenerateTooltip(ref typeTooltip, module, methodImpl.Type);
public string TypeTooltip => GenerateTooltip(ref typeTooltip, metadataFile, methodImpl.Type);
public MethodImplEntry(PEFile module, MethodImplementationHandle handle)
public MethodImplEntry(MetadataFile metadataFile, MethodImplementationHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.methodImpl = metadata.GetMethodImplementation(handle);
this.methodImpl = metadataFile.Metadata.GetMethodImplementation(handle);
this.typeTooltip = null;
this.methodBodyTooltip = null;
this.methodDeclarationTooltip = null;

37
ILSpy/Metadata/CorTables/MethodSemanticsTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodSemanticsTableTreeNode : MetadataTableTreeNode
{
public MethodSemanticsTableTreeNode(PEFile module)
: base((HandleKind)0x18, module)
public MethodSemanticsTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x18, metadataFile)
{
}
public override object Text => $"18 MethodSemantics ({module.Metadata.GetTableRowCount(TableIndex.MethodSemantics)})";
public override object Text => $"18 MethodSemantics ({metadataFile.Metadata.GetTableRowCount(TableIndex.MethodSemantics)})";
public override object Icon => Images.Literal;
@ -45,14 +43,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,14 +43,13 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var list = new List<MethodSemanticsEntry>();
MethodSemanticsEntry scrollTargetEntry = default;
foreach (var row in metadata.GetMethodSemantics())
foreach (var row in metadataFile.Metadata.GetMethodSemantics())
{
MethodSemanticsEntry entry = new MethodSemanticsEntry(module, row.Handle, row.Semantics, row.Method, row.Association);
MethodSemanticsEntry entry = new MethodSemanticsEntry(metadataFile, row.Handle, row.Semantics, row.Method, row.Association);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -74,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -74,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct MethodSemanticsEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly Handle handle;
readonly MethodSemanticsAttributes semantics;
readonly MethodDefinitionHandle method;
@ -86,9 +81,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,9 +81,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public MethodSemanticsAttributes Semantics => semantics;
@ -100,28 +95,26 @@ namespace ICSharpCode.ILSpy.Metadata @@ -100,28 +95,26 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnMethodClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, method, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, method, protocol: "metadata"));
}
string methodTooltip;
public string MethodTooltip => GenerateTooltip(ref methodTooltip, module, method);
public string MethodTooltip => GenerateTooltip(ref methodTooltip, metadataFile, method);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Association => MetadataTokens.GetToken(association);
public void OnAssociationClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, association, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, association, protocol: "metadata"));
}
string associationTooltip;
public string AssociationTooltip => GenerateTooltip(ref associationTooltip, module, association);
public string AssociationTooltip => GenerateTooltip(ref associationTooltip, metadataFile, association);
public MethodSemanticsEntry(PEFile module, Handle handle, MethodSemanticsAttributes semantics, MethodDefinitionHandle method, EntityHandle association)
public MethodSemanticsEntry(MetadataFile metadataFile, Handle handle, MethodSemanticsAttributes semantics, MethodDefinitionHandle method, EntityHandle association)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.semantics = semantics;
this.method = method;

35
ILSpy/Metadata/CorTables/MethodSpecTableTreeNode.cs

@ -22,19 +22,18 @@ using System.Reflection.Metadata.Ecma335; @@ -22,19 +22,18 @@ using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodSpecTableTreeNode : MetadataTableTreeNode
{
public MethodSpecTableTreeNode(PEFile module)
: base(HandleKind.MethodSpecification, module)
public MethodSpecTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.MethodSpecification, metadataFile)
{
}
public override object Text => $"2B MethodSpec ({module.Metadata.GetTableRowCount(TableIndex.MethodSpec)})";
public override object Text => $"2B MethodSpec ({metadataFile.Metadata.GetTableRowCount(TableIndex.MethodSpec)})";
public override object Icon => Images.Literal;
@ -44,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -44,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<MethodSpecEntry>();
MethodSpecEntry scrollTargetEntry = default;
foreach (var row in metadata.GetMethodSpecifications())
{
MethodSpecEntry entry = new MethodSpecEntry(module, row);
MethodSpecEntry entry = new MethodSpecEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -73,9 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,9 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct MethodSpecEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly MethodSpecificationHandle handle;
readonly MethodSpecification methodSpec;
@ -83,20 +80,20 @@ namespace ICSharpCode.ILSpy.Metadata @@ -83,20 +80,20 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.MethodSpec)
+ metadata.GetTableRowSize(TableIndex.MethodSpec) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.MethodSpec)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.MethodSpec) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Method => MetadataTokens.GetToken(methodSpec.Method);
public void OnMethodClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, methodSpec.Method, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, methodSpec.Method, protocol: "metadata"));
}
string methodTooltip;
public string MethodTooltip => GenerateTooltip(ref methodTooltip, module, methodSpec.Method);
public string MethodTooltip => GenerateTooltip(ref methodTooltip, metadataFile, methodSpec.Method);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Signature => MetadataTokens.GetHeapOffset(methodSpec.Signature);
@ -104,7 +101,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,7 +101,7 @@ namespace ICSharpCode.ILSpy.Metadata
public string SignatureTooltip {
get {
ITextOutput output = new PlainTextOutput();
var signature = methodSpec.DecodeSignature(new DisassemblerSignatureTypeProvider(module, output), default);
var signature = methodSpec.DecodeSignature(new DisassemblerSignatureTypeProvider(metadataFile, output), default);
bool first = true;
foreach (var type in signature)
{
@ -118,13 +115,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -118,13 +115,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public MethodSpecEntry(PEFile module, MethodSpecificationHandle handle)
public MethodSpecEntry(MetadataFile metadataFile, MethodSpecificationHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.methodSpec = metadata.GetMethodSpecification(handle);
this.methodSpec = metadataFile.Metadata.GetMethodSpecification(handle);
this.methodTooltip = null;
}
}

43
ILSpy/Metadata/CorTables/MethodTableTreeNode.cs

@ -16,18 +16,13 @@ @@ -16,18 +16,13 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Controls;
using System.Windows.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TreeNodes;
@ -36,12 +31,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -36,12 +31,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodTableTreeNode : MetadataTableTreeNode
{
public MethodTableTreeNode(PEFile module)
: base(HandleKind.MethodDefinition, module)
public MethodTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.MethodDefinition, metadataFile)
{
}
public override object Text => $"06 Method ({module.Metadata.GetTableRowCount(TableIndex.MethodDef)})";
public override object Text => $"06 Method ({metadataFile.Metadata.GetTableRowCount(TableIndex.MethodDef)})";
public override object Icon => Images.Literal;
@ -51,13 +46,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -51,13 +46,13 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<MethodDefEntry>();
MethodDefEntry scrollTargetEntry = default;
foreach (var row in metadata.MethodDefinitions)
{
MethodDefEntry entry = new MethodDefEntry(module, row);
MethodDefEntry entry = new MethodDefEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -79,9 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,9 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct MethodDefEntry : IMemberTreeNode
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly MethodDefinitionHandle handle;
readonly MethodDefinition methodDef;
@ -89,9 +82,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,9 +82,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.MethodDef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.MethodDef) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public MethodAttributes Attributes => methodDef.Attributes;
@ -114,7 +107,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -114,7 +107,7 @@ namespace ICSharpCode.ILSpy.Metadata
public int RVA => methodDef.RelativeVirtualAddress;
public string Name => metadata.GetString(methodDef.Name);
public string Name => metadataFile.Metadata.GetString(methodDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(methodDef.Name):X} \"{Name}\"";
@ -123,14 +116,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -123,14 +116,14 @@ namespace ICSharpCode.ILSpy.Metadata
string signatureTooltip;
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, module, handle);
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, metadataFile, handle);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int ParamList => MetadataTokens.GetToken(methodDef.GetParameters().FirstOrDefault());
public void OnParamListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, methodDef.GetParameters().FirstOrDefault(), protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, methodDef.GetParameters().FirstOrDefault(), protocol: "metadata"));
}
string paramListTooltip;
@ -139,19 +132,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -139,19 +132,17 @@ namespace ICSharpCode.ILSpy.Metadata
var param = methodDef.GetParameters().FirstOrDefault();
if (param.IsNil)
return null;
return GenerateTooltip(ref paramListTooltip, module, param);
return GenerateTooltip(ref paramListTooltip, metadataFile, param);
}
}
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
IEntity IMemberTreeNode.Member => ((MetadataModule)metadataFile.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule)?.GetDefinition(handle);
public MethodDefEntry(PEFile module, MethodDefinitionHandle handle)
public MethodDefEntry(MetadataFile metadataFile, MethodDefinitionHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.methodDef = metadata.GetMethodDefinition(handle);
this.methodDef = metadataFile.Metadata.GetMethodDefinition(handle);
this.signatureTooltip = null;
this.paramListTooltip = null;
}

30
ILSpy/Metadata/CorTables/ModuleRefTableTreeNode.cs

@ -27,12 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -27,12 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class ModuleRefTableTreeNode : MetadataTableTreeNode
{
public ModuleRefTableTreeNode(PEFile module)
: base(HandleKind.ModuleReference, module)
public ModuleRefTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.ModuleReference, metadataFile)
{
}
public override object Text => $"1A ModuleRef ({module.Metadata.GetTableRowCount(TableIndex.ModuleRef)})";
public override object Text => $"1A ModuleRef ({metadataFile.Metadata.GetTableRowCount(TableIndex.ModuleRef)})";
public override object Icon => Images.Literal;
@ -42,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -42,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<ModuleRefEntry>();
ModuleRefEntry scrollTargetEntry = default;
foreach (var row in metadata.GetModuleReferences())
{
ModuleRefEntry entry = new ModuleRefEntry(module, row);
ModuleRefEntry entry = new ModuleRefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -71,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -71,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ModuleRefEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ModuleReferenceHandle handle;
readonly ModuleReference moduleRef;
@ -81,21 +79,19 @@ namespace ICSharpCode.ILSpy.Metadata @@ -81,21 +79,19 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.ModuleRef)
+ metadata.GetTableRowSize(TableIndex.ModuleRef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ModuleRef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.ModuleRef) * (RID - 1);
public string Name => metadata.GetString(moduleRef.Name);
public string Name => metadataFile.Metadata.GetString(moduleRef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(moduleRef.Name):X} \"{Name}\"";
public ModuleRefEntry(PEFile module, ModuleReferenceHandle handle)
public ModuleRefEntry(MetadataFile metadataFile, ModuleReferenceHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.moduleRef = metadata.GetModuleReference(handle);
this.moduleRef = metadataFile.Metadata.GetModuleReference(handle);
}
}

34
ILSpy/Metadata/CorTables/ModuleTableTreeNode.cs

@ -27,12 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -27,12 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class ModuleTableTreeNode : MetadataTableTreeNode
{
public ModuleTableTreeNode(PEFile module)
: base(HandleKind.ModuleDefinition, module)
public ModuleTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.ModuleDefinition, metadataFile)
{
}
public override object Text => $"00 Module ({module.Metadata.GetTableRowCount(TableIndex.Module)})";
public override object Text => $"00 Module ({metadataFile.Metadata.GetTableRowCount(TableIndex.Module)})";
public override object Icon => Images.Literal;
@ -46,7 +46,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -46,7 +46,7 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<ModuleEntry>();
ModuleEntry scrollTargetEntry = default;
list.Add(new ModuleEntry(module, EntityHandle.ModuleDefinition));
list.Add(new ModuleEntry(metadataFile, EntityHandle.ModuleDefinition));
view.ItemsSource = list;
@ -62,9 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -62,9 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ModuleEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ModuleDefinitionHandle handle;
readonly ModuleDefinition moduleDef;
@ -72,38 +70,36 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,38 +70,36 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.Module)
+ metadata.GetTableRowSize(TableIndex.Module) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Module)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Module) * (RID - 1);
public int Generation => moduleDef.Generation;
public string Name => metadata.GetString(moduleDef.Name);
public string Name => metadataFile.Metadata.GetString(moduleDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(moduleDef.Name):X} \"{Name}\"";
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Mvid => MetadataTokens.GetHeapOffset(moduleDef.Mvid);
public string MvidTooltip => metadata.GetGuid(moduleDef.Mvid).ToString();
public string MvidTooltip => metadataFile.Metadata.GetGuid(moduleDef.Mvid).ToString();
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int GenerationId => MetadataTokens.GetHeapOffset(moduleDef.GenerationId);
public string GenerationIdTooltip => moduleDef.GenerationId.IsNil ? null : metadata.GetGuid(moduleDef.GenerationId).ToString();
public string GenerationIdTooltip => moduleDef.GenerationId.IsNil ? null : metadataFile.Metadata.GetGuid(moduleDef.GenerationId).ToString();
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int BaseGenerationId => MetadataTokens.GetHeapOffset(moduleDef.BaseGenerationId);
public string BaseGenerationIdTooltip => moduleDef.BaseGenerationId.IsNil ? null : metadata.GetGuid(moduleDef.BaseGenerationId).ToString();
public string BaseGenerationIdTooltip => moduleDef.BaseGenerationId.IsNil ? null : metadataFile.Metadata.GetGuid(moduleDef.BaseGenerationId).ToString();
public ModuleEntry(PEFile module, ModuleDefinitionHandle handle)
public ModuleEntry(MetadataFile metadataFile, ModuleDefinitionHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.moduleDef = metadata.GetModuleDefinition();
this.moduleDef = metadataFile.Metadata.GetModuleDefinition();
}
}

37
ILSpy/Metadata/CorTables/NestedClassTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class NestedClassTableTreeNode : MetadataTableTreeNode
{
public NestedClassTableTreeNode(PEFile module)
: base((HandleKind)0x29, module)
public NestedClassTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x29, metadataFile)
{
}
public override object Text => $"29 NestedClass ({module.Metadata.GetTableRowCount(TableIndex.NestedClass)})";
public override object Text => $"29 NestedClass ({metadataFile.Metadata.GetTableRowCount(TableIndex.NestedClass)})";
public override object Icon => Images.Literal;
@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<NestedClassEntry>();
NestedClassEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.NestedClass);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
for (int rid = 1; rid <= length; rid++)
{
NestedClassEntry entry = new NestedClassEntry(module, ptr, metadataOffset, rid);
NestedClassEntry entry = new NestedClassEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct NestedClassEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly NestedClass nestedClass;
public int RID { get; }
@ -104,32 +100,31 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,32 +100,31 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnNestedClassClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, nestedClass.Nested, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, nestedClass.Nested, protocol: "metadata"));
}
string nestedClassTooltip;
public string NestedClassTooltip => GenerateTooltip(ref nestedClassTooltip, module, nestedClass.Nested);
public string NestedClassTooltip => GenerateTooltip(ref nestedClassTooltip, metadataFile, nestedClass.Nested);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int EnclosingClass => MetadataTokens.GetToken(nestedClass.Enclosing);
public void OnEnclosingClassClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, nestedClass.Enclosing, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, nestedClass.Enclosing, protocol: "metadata"));
}
string enclosingClassTooltip;
public string EnclosingClassTooltip => GenerateTooltip(ref enclosingClassTooltip, module, nestedClass.Enclosing);
public string EnclosingClassTooltip => GenerateTooltip(ref enclosingClassTooltip, metadataFile, nestedClass.Enclosing);
public NestedClassEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public NestedClassEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.NestedClass)
+ metadata.GetTableRowSize(TableIndex.NestedClass) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.NestedClass)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.NestedClass) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
this.nestedClass = new NestedClass(ptr.Slice(rowOffset), typeDefSize);
this.nestedClassTooltip = null;
this.enclosingClassTooltip = null;

30
ILSpy/Metadata/CorTables/ParamTableTreeNode.cs

@ -28,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -28,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class ParamTableTreeNode : MetadataTableTreeNode
{
public ParamTableTreeNode(PEFile module)
: base(HandleKind.Parameter, module)
public ParamTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.Parameter, metadataFile)
{
}
public override object Text => $"08 Param ({module.Metadata.GetTableRowCount(TableIndex.Param)})";
public override object Text => $"08 Param ({metadataFile.Metadata.GetTableRowCount(TableIndex.Param)})";
public override object Icon => Images.Literal;
@ -47,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -47,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<ParamEntry>();
ParamEntry scrollTargetEntry = default;
for (int row = 1; row <= module.Metadata.GetTableRowCount(TableIndex.Param); row++)
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.Param); row++)
{
ParamEntry entry = new ParamEntry(module, MetadataTokens.ParameterHandle(row));
ParamEntry entry = new ParamEntry(metadataFile, MetadataTokens.ParameterHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -71,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -71,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct ParamEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ParameterHandle handle;
readonly Parameter param;
@ -81,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -81,9 +79,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.Param)
+ metadata.GetTableRowSize(TableIndex.Param) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Param)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Param) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public ParameterAttributes Attributes => param.Attributes;
@ -92,19 +90,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -92,19 +90,17 @@ namespace ICSharpCode.ILSpy.Metadata
FlagGroup.CreateMultipleChoiceGroup(typeof(ParameterAttributes), selectedValue: (int)param.Attributes, includeAll: false)
};
public string Name => metadata.GetString(param.Name);
public string Name => metadataFile.Metadata.GetString(param.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(param.Name):X} \"{Name}\"";
public int Sequence => param.SequenceNumber;
public ParamEntry(PEFile module, ParameterHandle handle)
public ParamEntry(MetadataFile metadataFile, ParameterHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.param = metadata.GetParameter(handle);
this.param = metadataFile.Metadata.GetParameter(handle);
}
}

39
ILSpy/Metadata/CorTables/PropertyMapTableTreeNode.cs

@ -22,20 +22,18 @@ using System.Reflection.Metadata; @@ -22,20 +22,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class PropertyMapTableTreeNode : MetadataTableTreeNode
{
public PropertyMapTableTreeNode(PEFile module)
: base((HandleKind)0x15, module)
public PropertyMapTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x15, metadataFile)
{
}
public override object Text => $"15 PropertyMap ({module.Metadata.GetTableRowCount(TableIndex.PropertyMap)})";
public override object Text => $"15 PropertyMap ({metadataFile.Metadata.GetTableRowCount(TableIndex.PropertyMap)})";
public override object Icon => Images.Literal;
@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata @@ -45,17 +43,16 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<PropertyMapEntry>();
PropertyMapEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.PropertyMap);
ReadOnlySpan<byte> ptr = metadata.AsReadOnlySpan();
int metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
for (int rid = 1; rid <= length; rid++)
{
PropertyMapEntry entry = new PropertyMapEntry(module, ptr, metadataOffset, rid);
PropertyMapEntry entry = new PropertyMapEntry(metadataFile, ptr, rid);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -89,8 +86,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct PropertyMapEntry
{
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly PropertyMap propertyMap;
public int RID { get; }
@ -104,33 +100,32 @@ namespace ICSharpCode.ILSpy.Metadata @@ -104,33 +100,32 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, propertyMap.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, propertyMap.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, propertyMap.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, propertyMap.Parent);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int PropertyList => MetadataTokens.GetToken(propertyMap.PropertyList);
public void OnPropertyListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, propertyMap.PropertyList, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, propertyMap.PropertyList, protocol: "metadata"));
}
string propertyListTooltip;
public string PropertyListTooltip => GenerateTooltip(ref propertyListTooltip, module, propertyMap.PropertyList);
public string PropertyListTooltip => GenerateTooltip(ref propertyListTooltip, metadataFile, propertyMap.PropertyList);
public PropertyMapEntry(PEFile module, ReadOnlySpan<byte> ptr, int metadataOffset, int row)
public PropertyMapEntry(MetadataFile metadataFile, ReadOnlySpan<byte> ptr, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
var rowOffset = metadata.GetTableMetadataOffset(TableIndex.PropertyMap)
+ metadata.GetTableRowSize(TableIndex.PropertyMap) * (row - 1);
this.Offset = metadataOffset + rowOffset;
int typeDefSize = metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int propertyDefSize = metadata.GetTableRowCount(TableIndex.Property) < ushort.MaxValue ? 2 : 4;
var rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.PropertyMap)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.PropertyMap) * (row - 1);
this.Offset = metadataFile.MetadataOffset + rowOffset;
int typeDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef) < ushort.MaxValue ? 2 : 4;
int propertyDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.Property) < ushort.MaxValue ? 2 : 4;
this.propertyMap = new PropertyMap(ptr.Slice(rowOffset), typeDefSize, propertyDefSize);
this.propertyListTooltip = null;
this.parentTooltip = null;

36
ILSpy/Metadata/CorTables/PropertyTableTreeNode.cs

@ -22,8 +22,6 @@ using System.Reflection.Metadata; @@ -22,8 +22,6 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TreeNodes;
@ -32,12 +30,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -32,12 +30,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class PropertyTableTreeNode : MetadataTableTreeNode
{
public PropertyTableTreeNode(PEFile module)
: base(HandleKind.PropertyDefinition, module)
public PropertyTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.PropertyDefinition, metadataFile)
{
}
public override object Text => $"17 Property ({module.Metadata.GetTableRowCount(TableIndex.Property)})";
public override object Text => $"17 Property ({metadataFile.Metadata.GetTableRowCount(TableIndex.Property)})";
public override object Icon => Images.Literal;
@ -47,14 +45,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -47,14 +45,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<PropertyDefEntry>();
PropertyDefEntry scrollTargetEntry = default;
foreach (var row in metadata.PropertyDefinitions)
{
PropertyDefEntry entry = new PropertyDefEntry(module, row);
PropertyDefEntry entry = new PropertyDefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -76,9 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -76,9 +74,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct PropertyDefEntry : IMemberTreeNode
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly PropertyDefinitionHandle handle;
readonly PropertyDefinition propertyDef;
@ -86,9 +82,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -86,9 +82,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.Property)
+ metadata.GetTableRowSize(TableIndex.Property) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Property)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Property) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public PropertyAttributes Attributes => propertyDef.Attributes;
@ -97,25 +93,23 @@ namespace ICSharpCode.ILSpy.Metadata @@ -97,25 +93,23 @@ namespace ICSharpCode.ILSpy.Metadata
FlagGroup.CreateMultipleChoiceGroup(typeof(PropertyAttributes), selectedValue: (int)propertyDef.Attributes, includeAll: false),
};
public string Name => metadata.GetString(propertyDef.Name);
public string Name => metadataFile.Metadata.GetString(propertyDef.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(propertyDef.Name):X} \"{Name}\"";
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
IEntity IMemberTreeNode.Member => ((MetadataModule)metadataFile.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Signature => MetadataTokens.GetHeapOffset(propertyDef.Signature);
string signatureTooltip;
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, module, handle);
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, metadataFile, handle);
public PropertyDefEntry(PEFile module, PropertyDefinitionHandle handle)
public PropertyDefEntry(MetadataFile metadataFile, PropertyDefinitionHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.propertyDef = metadata.GetPropertyDefinition(handle);
this.propertyDef = metadataFile.Metadata.GetPropertyDefinition(handle);
this.signatureTooltip = null;
}
}

32
ILSpy/Metadata/CorTables/StandAloneSigTableTreeNode.cs

@ -21,20 +21,18 @@ using System.Reflection.Metadata; @@ -21,20 +21,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
class StandAloneSigTableTreeNode : MetadataTableTreeNode
{
public StandAloneSigTableTreeNode(PEFile module)
: base(HandleKind.StandaloneSignature, module)
public StandAloneSigTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.StandaloneSignature, metadataFile)
{
}
public override object Text => $"11 StandAloneSig ({module.Metadata.GetTableRowCount(TableIndex.StandAloneSig)})";
public override object Text => $"11 StandAloneSig ({metadataFile.Metadata.GetTableRowCount(TableIndex.StandAloneSig)})";
public override object Icon => Images.Literal;
@ -48,9 +46,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -48,9 +46,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<StandAloneSigEntry>();
StandAloneSigEntry scrollTargetEntry = default;
for (int row = 1; row <= module.Metadata.GetTableRowCount(TableIndex.StandAloneSig); row++)
for (int row = 1; row <= metadataFile.Metadata.GetTableRowCount(TableIndex.StandAloneSig); row++)
{
StandAloneSigEntry entry = new StandAloneSigEntry(module, MetadataTokens.StandaloneSignatureHandle(row));
StandAloneSigEntry entry = new StandAloneSigEntry(metadataFile, MetadataTokens.StandaloneSignatureHandle(row));
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -72,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,9 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct StandAloneSigEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly StandaloneSignatureHandle handle;
readonly StandaloneSignature standaloneSig;
@ -82,23 +78,21 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,23 +78,21 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.StandAloneSig)
+ metadata.GetTableRowSize(TableIndex.StandAloneSig) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.StandAloneSig)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.StandAloneSig) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Signature => MetadataTokens.GetHeapOffset(standaloneSig.Signature);
string signatureTooltip;
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, module, handle);
public string SignatureTooltip => GenerateTooltip(ref signatureTooltip, metadataFile, handle);
public StandAloneSigEntry(PEFile module, StandaloneSignatureHandle handle)
public StandAloneSigEntry(MetadataFile metadataFile, StandaloneSignatureHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.standaloneSig = metadata.GetStandaloneSignature(handle);
this.standaloneSig = metadataFile.Metadata.GetStandaloneSignature(handle);
this.signatureTooltip = null;
}
}

53
ILSpy/Metadata/CorTables/TypeDefTableTreeNode.cs

@ -24,7 +24,6 @@ using System.Reflection.Metadata.Ecma335; @@ -24,7 +24,6 @@ using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.TreeNodes;
@ -33,12 +32,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -33,12 +32,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class TypeDefTableTreeNode : MetadataTableTreeNode
{
public TypeDefTableTreeNode(PEFile module)
: base(HandleKind.TypeDefinition, module)
public TypeDefTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.TypeDefinition, metadataFile)
{
}
public override object Text => $"02 TypeDef ({module.Metadata.GetTableRowCount(TableIndex.TypeDef)})";
public override object Text => $"02 TypeDef ({metadataFile.Metadata.GetTableRowCount(TableIndex.TypeDef)})";
public override object Icon => Images.Literal;
@ -48,14 +47,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -48,14 +47,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<TypeDefEntry>();
TypeDefEntry scrollTargetEntry = default;
foreach (var row in metadata.TypeDefinitions)
{
TypeDefEntry entry = new TypeDefEntry(module, row);
TypeDefEntry entry = new TypeDefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -77,9 +76,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -77,9 +76,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct TypeDefEntry : IMemberTreeNode
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly TypeDefinitionHandle handle;
readonly TypeDefinition typeDef;
@ -87,9 +84,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -87,9 +84,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.TypeDef)
+ metadata.GetTableRowSize(TableIndex.TypeDef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.TypeDef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.TypeDef) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Other)]
public TypeAttributes Attributes => typeDef.Attributes;
@ -107,36 +104,36 @@ namespace ICSharpCode.ILSpy.Metadata @@ -107,36 +104,36 @@ namespace ICSharpCode.ILSpy.Metadata
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(typeDef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(typeDef.Name);
public string Name => metadataFile.Metadata.GetString(typeDef.Name);
public string NamespaceTooltip => $"{MetadataTokens.GetHeapOffset(typeDef.Namespace):X} \"{Namespace}\"";
public string Namespace => metadata.GetString(typeDef.Namespace);
public string Namespace => metadataFile.Metadata.GetString(typeDef.Namespace);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int BaseType => MetadataTokens.GetToken(typeDef.BaseType);
public void OnBaseTypeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, typeDef.BaseType, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, typeDef.BaseType, protocol: "metadata"));
}
public string BaseTypeTooltip {
get {
var output = new PlainTextOutput();
var provider = new DisassemblerSignatureTypeProvider(module, output);
var provider = new DisassemblerSignatureTypeProvider(metadataFile, output);
if (typeDef.BaseType.IsNil)
return null;
switch (typeDef.BaseType.Kind)
{
case HandleKind.TypeDefinition:
provider.GetTypeFromDefinition(module.Metadata, (TypeDefinitionHandle)typeDef.BaseType, 0)(ILNameSyntax.Signature);
provider.GetTypeFromDefinition(metadataFile.Metadata, (TypeDefinitionHandle)typeDef.BaseType, 0)(ILNameSyntax.Signature);
return output.ToString();
case HandleKind.TypeReference:
provider.GetTypeFromReference(module.Metadata, (TypeReferenceHandle)typeDef.BaseType, 0)(ILNameSyntax.Signature);
provider.GetTypeFromReference(metadataFile.Metadata, (TypeReferenceHandle)typeDef.BaseType, 0)(ILNameSyntax.Signature);
return output.ToString();
case HandleKind.TypeSpecification:
provider.GetTypeFromSpecification(module.Metadata, new Decompiler.Metadata.MetadataGenericContext(default(TypeDefinitionHandle), module), (TypeSpecificationHandle)typeDef.BaseType, 0)(ILNameSyntax.Signature);
provider.GetTypeFromSpecification(metadataFile.Metadata, new Decompiler.Metadata.MetadataGenericContext(default(TypeDefinitionHandle), metadataFile.Metadata), (TypeSpecificationHandle)typeDef.BaseType, 0)(ILNameSyntax.Signature);
return output.ToString();
default:
return null;
@ -149,7 +146,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -149,7 +146,7 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnFieldListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, typeDef.GetFields().FirstOrDefault(), protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, typeDef.GetFields().FirstOrDefault(), protocol: "metadata"));
}
string fieldListTooltip;
@ -158,7 +155,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -158,7 +155,7 @@ namespace ICSharpCode.ILSpy.Metadata
var field = typeDef.GetFields().FirstOrDefault();
if (field.IsNil)
return null;
return GenerateTooltip(ref fieldListTooltip, module, field);
return GenerateTooltip(ref fieldListTooltip, metadataFile, field);
}
}
@ -167,7 +164,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -167,7 +164,7 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnMethodListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, typeDef.GetMethods().FirstOrDefault(), protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, typeDef.GetMethods().FirstOrDefault(), protocol: "metadata"));
}
string methodListTooltip;
@ -176,19 +173,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -176,19 +173,17 @@ namespace ICSharpCode.ILSpy.Metadata
var method = typeDef.GetMethods().FirstOrDefault();
if (method.IsNil)
return null;
return GenerateTooltip(ref methodListTooltip, module, method);
return GenerateTooltip(ref methodListTooltip, metadataFile, method);
}
}
IEntity IMemberTreeNode.Member => ((MetadataModule)module.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
IEntity IMemberTreeNode.Member => ((MetadataModule)metadataFile.GetTypeSystemWithCurrentOptionsOrNull()?.MainModule).GetDefinition(handle);
public TypeDefEntry(PEFile module, TypeDefinitionHandle handle)
public TypeDefEntry(MetadataFile metadataFile, TypeDefinitionHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.typeDef = metadata.GetTypeDefinition(handle);
this.typeDef = metadataFile.Metadata.GetTypeDefinition(handle);
this.methodListTooltip = null;
this.fieldListTooltip = null;
}

37
ILSpy/Metadata/CorTables/TypeRefTableTreeNode.cs

@ -21,19 +21,18 @@ using System.Reflection.Metadata; @@ -21,19 +21,18 @@ using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class TypeRefTableTreeNode : MetadataTableTreeNode
{
public TypeRefTableTreeNode(PEFile module)
: base(HandleKind.TypeReference, module)
public TypeRefTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.TypeReference, metadataFile)
{
}
public override object Text => $"01 TypeRef ({module.Metadata.GetTableRowCount(TableIndex.TypeRef)})";
public override object Text => $"01 TypeRef ({metadataFile.Metadata.GetTableRowCount(TableIndex.TypeRef)})";
public override object Icon => Images.Literal;
@ -43,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -43,14 +42,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<TypeRefEntry>();
TypeRefEntry scrollTargetEntry = default;
foreach (var row in metadata.TypeReferences)
{
TypeRefEntry entry = new TypeRefEntry(module, row);
TypeRefEntry entry = new TypeRefEntry(metadataFile, row);
if (entry.RID == this.scrollTarget)
{
scrollTargetEntry = entry;
@ -72,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -72,9 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct TypeRefEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly TypeReferenceHandle handle;
readonly TypeReference typeRef;
@ -82,36 +79,34 @@ namespace ICSharpCode.ILSpy.Metadata @@ -82,36 +79,34 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public int Offset => metadataOffset
+ metadata.GetTableMetadataOffset(TableIndex.TypeRef)
+ metadata.GetTableRowSize(TableIndex.TypeRef) * (RID - 1);
public int Offset => metadataFile.MetadataOffset
+ metadataFile.Metadata.GetTableMetadataOffset(TableIndex.TypeRef)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.TypeRef) * (RID - 1);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int ResolutionScope => MetadataTokens.GetToken(typeRef.ResolutionScope);
public void OnResolutionScopeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, typeRef.ResolutionScope, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, typeRef.ResolutionScope, protocol: "metadata"));
}
string resolutionScopeTooltip;
public string ResolutionScopeTooltip => GenerateTooltip(ref resolutionScopeTooltip, module, typeRef.ResolutionScope);
public string ResolutionScopeTooltip => GenerateTooltip(ref resolutionScopeTooltip, metadataFile, typeRef.ResolutionScope);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(typeRef.Name):X} \"{Name}\"";
public string Name => metadata.GetString(typeRef.Name);
public string Name => metadataFile.Metadata.GetString(typeRef.Name);
public string NamespaceTooltip => $"{MetadataTokens.GetHeapOffset(typeRef.Namespace):X} \"{Namespace}\"";
public string Namespace => metadata.GetString(typeRef.Namespace);
public string Namespace => metadataFile.Metadata.GetString(typeRef.Namespace);
public TypeRefEntry(PEFile module, TypeReferenceHandle handle)
public TypeRefEntry(MetadataFile metadataFile, TypeReferenceHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.typeRef = metadata.GetTypeReference(handle);
this.typeRef = metadataFile.Metadata.GetTypeReference(handle);
this.resolutionScopeTooltip = null;
}
}

20
ILSpy/Metadata/CorTables/TypeSpecTableTreeNode.cs

@ -28,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -28,12 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class TypeSpecTableTreeNode : MetadataTableTreeNode
{
public TypeSpecTableTreeNode(PEFile module)
: base(HandleKind.TypeSpecification, module)
public TypeSpecTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.TypeSpecification, metadataFile)
{
}
public override object Text => $"1B TypeSpec ({module.Metadata.GetTableRowCount(TableIndex.TypeSpec)})";
public override object Text => $"1B TypeSpec ({metadataFile.Metadata.GetTableRowCount(TableIndex.TypeSpec)})";
public override object Icon => Images.Literal;
@ -43,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -43,14 +43,14 @@ namespace ICSharpCode.ILSpy.Metadata
tabPage.SupportsLanguageSwitching = false;
var view = Helpers.PrepareDataGrid(tabPage, this);
var metadata = module.Metadata;
var metadata = metadataFile.Metadata;
var list = new List<TypeSpecEntry>();
TypeSpecEntry scrollTargetEntry = default;
foreach (var row in metadata.GetTypeSpecifications())
{
TypeSpecEntry entry = new TypeSpecEntry(module, row);
TypeSpecEntry entry = new TypeSpecEntry(metadataFile, row);
if (scrollTarget.Equals(row))
{
scrollTargetEntry = entry;
@ -73,7 +73,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,7 +73,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct TypeSpecEntry
{
readonly int metadataOffset;
readonly PEFile module;
readonly MetadataFile module;
readonly MetadataReader metadata;
readonly TypeSpecificationHandle handle;
readonly TypeSpecification typeSpec;
@ -97,11 +97,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -97,11 +97,11 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public TypeSpecEntry(PEFile module, TypeSpecificationHandle handle)
public TypeSpecEntry(MetadataFile metadataFile, TypeSpecificationHandle handle)
{
this.metadataOffset = module.Reader.PEHeaders.MetadataStartOffset;
this.module = module;
this.metadata = module.Metadata;
this.module = metadataFile;
this.metadataOffset = metadataFile.MetadataOffset;
this.metadata = metadataFile.Metadata;
this.handle = handle;
this.typeSpec = metadata.GetTypeSpecification(handle);
}

6
ILSpy/Metadata/DebugDirectoryTreeNode.cs

@ -18,15 +18,11 @@ @@ -18,15 +18,11 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Reflection.PortableExecutable;
using System.Windows.Controls;
using System.Windows.Data;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
@ -79,7 +75,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,7 +75,7 @@ namespace ICSharpCode.ILSpy.Metadata
case DebugDirectoryEntryType.EmbeddedPortablePdb:
var embeddedPortablePdbReader = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry).GetMetadataReader();
this.Children.Add(new DebugMetadataTreeNode(module, isEmbedded: true, provider: embeddedPortablePdbReader));
this.Children.Add(new DebugMetadataTreeNode(module));
break;
case DebugDirectoryEntryType.PdbChecksum:

31
ILSpy/Metadata/DebugMetadataTablesTreeNode.cs

@ -16,13 +16,10 @@ @@ -16,13 +16,10 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.Collections.Generic;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
@ -30,15 +27,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -30,15 +27,11 @@ namespace ICSharpCode.ILSpy.Metadata
{
class DebugMetadataTablesTreeNode : ILSpyTreeNode
{
private PEFile module;
private bool isEmbedded;
private MetadataReader provider;
private MetadataFile metadataFile;
public DebugMetadataTablesTreeNode(PEFile module, bool isEmbedded, MetadataReader provider)
public DebugMetadataTablesTreeNode(MetadataFile metadataFile)
{
this.module = module;
this.isEmbedded = isEmbedded;
this.provider = provider;
this.metadataFile = metadataFile;
this.LazyLoading = true;
}
@ -49,23 +42,23 @@ namespace ICSharpCode.ILSpy.Metadata @@ -49,23 +42,23 @@ namespace ICSharpCode.ILSpy.Metadata
protected override void LoadChildren()
{
if (ShowTable(TableIndex.Document))
this.Children.Add(new DocumentTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new DocumentTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodDebugInformation))
this.Children.Add(new MethodDebugInformationTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new MethodDebugInformationTableTreeNode(metadataFile));
if (ShowTable(TableIndex.LocalScope))
this.Children.Add(new LocalScopeTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new LocalScopeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.LocalVariable))
this.Children.Add(new LocalVariableTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new LocalVariableTableTreeNode(metadataFile));
if (ShowTable(TableIndex.LocalConstant))
this.Children.Add(new LocalConstantTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new LocalConstantTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ImportScope))
this.Children.Add(new ImportScopeTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new ImportScopeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.StateMachineMethod))
this.Children.Add(new StateMachineMethodTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new StateMachineMethodTableTreeNode(metadataFile));
if (ShowTable(TableIndex.CustomDebugInformation))
this.Children.Add(new CustomDebugInformationTableTreeNode(this.module, this.provider, isEmbedded));
this.Children.Add(new CustomDebugInformationTableTreeNode(metadataFile));
bool ShowTable(TableIndex table) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || this.provider.GetTableRowCount(table) > 0;
bool ShowTable(TableIndex table) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || metadataFile.Metadata.GetTableRowCount(table) > 0;
}
public override bool View(TabPageModel tabPage)

24
ILSpy/Metadata/DebugMetadataTreeNode.cs

@ -18,11 +18,9 @@ @@ -18,11 +18,9 @@
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
@ -30,16 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -30,16 +28,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
class DebugMetadataTreeNode : ILSpyTreeNode
{
private PEFile module;
private MetadataReader provider;
private bool isEmbedded;
private MetadataFile metadataFile;
public DebugMetadataTreeNode(PEFile module, bool isEmbedded, MetadataReader provider)
public DebugMetadataTreeNode(MetadataFile metadataFile)
{
this.module = module;
this.provider = provider;
this.isEmbedded = isEmbedded;
this.Text = "Debug Metadata (" + (isEmbedded ? "Embedded" : "From portable PDB") + ")";
this.metadataFile = metadataFile;
this.Text = "Debug Metadata (" + (metadataFile.IsEmbedded ? "Embedded" : "From portable PDB") + ")";
this.LazyLoading = true;
}
@ -62,11 +56,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -62,11 +56,11 @@ namespace ICSharpCode.ILSpy.Metadata
protected override void LoadChildren()
{
this.Children.Add(new DebugMetadataTablesTreeNode(module, this.isEmbedded, this.provider));
this.Children.Add(new StringHeapTreeNode(module, this.provider));
this.Children.Add(new UserStringHeapTreeNode(module, this.provider));
this.Children.Add(new GuidHeapTreeNode(module, this.provider));
this.Children.Add(new BlobHeapTreeNode(module, this.provider));
this.Children.Add(new DebugMetadataTablesTreeNode(metadataFile));
this.Children.Add(new StringHeapTreeNode(metadataFile));
this.Children.Add(new UserStringHeapTreeNode(metadataFile));
this.Children.Add(new GuidHeapTreeNode(metadataFile));
this.Children.Add(new BlobHeapTreeNode(metadataFile));
}
public MetadataTableTreeNode FindNodeByHandleKind(HandleKind kind)

44
ILSpy/Metadata/DebugTables/CustomDebugInformationTableTreeNode.cs

@ -19,33 +19,25 @@ @@ -19,33 +19,25 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.DebugInfo;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class CustomDebugInformationTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public CustomDebugInformationTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.CustomDebugInformation, module, metadata)
public CustomDebugInformationTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.CustomDebugInformation, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"37 CustomDebugInformation ({metadata.GetTableRowCount(TableIndex.CustomDebugInformation)})";
public override object Text => $"37 CustomDebugInformation ({metadataFile.Metadata.GetTableRowCount(TableIndex.CustomDebugInformation)})";
public override object Icon => Images.Literal;
@ -62,9 +54,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -62,9 +54,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<CustomDebugInformationEntry>();
CustomDebugInformationEntry scrollTargetEntry = default;
foreach (var row in metadata.CustomDebugInformation)
foreach (var row in metadataFile.Metadata.CustomDebugInformation)
{
CustomDebugInformationEntry entry = new CustomDebugInformationEntry(module, metadata, isEmbedded, row);
CustomDebugInformationEntry entry = new CustomDebugInformationEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -105,8 +97,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -105,8 +97,7 @@ namespace ICSharpCode.ILSpy.Metadata
class CustomDebugInformationEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly CustomDebugInformationHandle handle;
readonly CustomDebugInformation debugInfo;
internal readonly CustomDebugInformationKind kind;
@ -202,11 +193,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -202,11 +193,11 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, debugInfo.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, debugInfo.Parent, protocol: "metadata"));
}
string parentTooltip;
public string ParentTooltip => GenerateTooltip(ref parentTooltip, module, debugInfo.Parent);
public string ParentTooltip => GenerateTooltip(ref parentTooltip, metadataFile, debugInfo.Parent);
string kindString;
public string Kind {
@ -217,7 +208,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -217,7 +208,7 @@ namespace ICSharpCode.ILSpy.Metadata
Guid guid;
if (kind != CustomDebugInformationKind.None)
{
guid = metadata.GetGuid(debugInfo.Kind);
guid = metadataFile.Metadata.GetGuid(debugInfo.Kind);
}
else
{
@ -251,7 +242,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -251,7 +242,7 @@ namespace ICSharpCode.ILSpy.Metadata
get {
if (debugInfo.Value.IsNil)
return "<nil>";
return metadata.GetBlobReader(debugInfo.Value).ToHexString();
return metadataFile.Metadata.GetBlobReader(debugInfo.Value).ToHexString();
}
}
@ -265,7 +256,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -265,7 +256,7 @@ namespace ICSharpCode.ILSpy.Metadata
if (debugInfo.Value.IsNil)
return null;
var reader = metadata.GetBlobReader(debugInfo.Value);
var reader = metadataFile.Metadata.GetBlobReader(debugInfo.Value);
ArrayList list;
switch (kind)
@ -324,15 +315,14 @@ namespace ICSharpCode.ILSpy.Metadata @@ -324,15 +315,14 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public CustomDebugInformationEntry(PEFile module, MetadataReader metadata, bool isEmbedded, CustomDebugInformationHandle handle)
public CustomDebugInformationEntry(MetadataFile metadataFile, CustomDebugInformationHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.CustomDebugInformation)
+ metadata.GetTableRowSize(TableIndex.CustomDebugInformation) * (MetadataTokens.GetRowNumber(handle) - 1);
this.module = module;
this.metadata = metadata;
this.metadataFile = metadataFile;
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.CustomDebugInformation)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.CustomDebugInformation) * (MetadataTokens.GetRowNumber(handle) - 1);
this.handle = handle;
this.debugInfo = metadata.GetCustomDebugInformation(handle);
this.kind = GetKind(metadata, debugInfo.Kind);
this.debugInfo = metadataFile.Metadata.GetCustomDebugInformation(handle);
this.kind = GetKind(metadataFile.Metadata, debugInfo.Kind);
}
}

38
ILSpy/Metadata/DebugTables/DocumentTableTreeNode.cs

@ -18,7 +18,6 @@ @@ -18,7 +18,6 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
@ -30,15 +29,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -30,15 +29,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class DocumentTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public DocumentTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.Document, module, metadata)
public DocumentTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.Document, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"30 Document ({metadata.GetTableRowCount(TableIndex.Document)})";
public override object Text => $"30 Document ({metadataFile.Metadata.GetTableRowCount(TableIndex.Document)})";
public override object Icon => Images.Literal;
@ -51,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -51,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<DocumentEntry>();
DocumentEntry scrollTargetEntry = default;
foreach (var row in metadata.Documents)
foreach (var row in metadataFile.Metadata.Documents)
{
DocumentEntry entry = new DocumentEntry(metadata, isEmbedded, row);
DocumentEntry entry = new DocumentEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -73,10 +69,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,10 +69,10 @@ namespace ICSharpCode.ILSpy.Metadata
return true;
}
struct DocumentEntry
readonly struct DocumentEntry
{
readonly int? offset;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly DocumentHandle handle;
readonly Document document;
@ -84,9 +80,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,9 +80,9 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public object Offset => offset == null ? "n/a" : (object)offset;
public object Offset => offset == null ? "n/a" : offset;
public string Name => metadata.GetString(document.Name);
public string Name => metadataFile.Metadata.GetString(document.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(document.Name):X} \"{Name}\"";
@ -97,7 +93,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -97,7 +93,7 @@ namespace ICSharpCode.ILSpy.Metadata
get {
if (document.HashAlgorithm.IsNil)
return null;
Guid guid = metadata.GetGuid(document.HashAlgorithm);
Guid guid = metadataFile.Metadata.GetGuid(document.HashAlgorithm);
if (guid == KnownGuids.HashAlgorithmSHA1)
return "SHA1 [ff1816ec-aa5e-4d10-87f7-6f4963833460]";
if (guid == KnownGuids.HashAlgorithmSHA256)
@ -113,7 +109,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -113,7 +109,7 @@ namespace ICSharpCode.ILSpy.Metadata
get {
if (document.Hash.IsNil)
return null;
System.Collections.Immutable.ImmutableArray<byte> token = metadata.GetBlobContent(document.Hash);
System.Collections.Immutable.ImmutableArray<byte> token = metadataFile.Metadata.GetBlobContent(document.Hash);
return token.ToHexString(token.Length);
}
}
@ -125,7 +121,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -125,7 +121,7 @@ namespace ICSharpCode.ILSpy.Metadata
get {
if (document.Language.IsNil)
return null;
Guid guid = metadata.GetGuid(document.Language);
Guid guid = metadataFile.Metadata.GetGuid(document.Language);
if (guid == KnownGuids.CSharpLanguageGuid)
return "Visual C# [3f5162f8-07c6-11d3-9053-00c04fa302a1]";
if (guid == KnownGuids.VBLanguageGuid)
@ -136,13 +132,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -136,13 +132,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public DocumentEntry(MetadataReader metadata, bool isEmbedded, DocumentHandle handle)
public DocumentEntry(MetadataFile metadataFile, DocumentHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.Document)
+ metadata.GetTableRowSize(TableIndex.Document) * (MetadataTokens.GetRowNumber(handle) - 1);
this.metadata = metadata;
this.metadataFile = metadataFile;
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.Document)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.Document) * (MetadataTokens.GetRowNumber(handle) - 1);
this.handle = handle;
this.document = metadata.GetDocument(handle);
this.document = metadataFile.Metadata.GetDocument(handle);
}
}

39
ILSpy/Metadata/DebugTables/ImportScopeTableTreeNode.cs

@ -16,32 +16,23 @@ @@ -16,32 +16,23 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class ImportScopeTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public ImportScopeTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.ImportScope, module, metadata)
public ImportScopeTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.ImportScope, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"35 ImportScope ({metadata.GetTableRowCount(TableIndex.ImportScope)})";
public override object Text => $"35 ImportScope ({metadataFile.Metadata.GetTableRowCount(TableIndex.ImportScope)})";
public override object Icon => Images.Literal;
@ -54,9 +45,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -54,9 +45,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<ImportScopeEntry>();
ImportScopeEntry scrollTargetEntry = default;
foreach (var row in metadata.ImportScopes)
foreach (var row in metadataFile.Metadata.ImportScopes)
{
ImportScopeEntry entry = new ImportScopeEntry(module, metadata, isEmbedded, row);
ImportScopeEntry entry = new ImportScopeEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -76,11 +67,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -76,11 +67,10 @@ namespace ICSharpCode.ILSpy.Metadata
return true;
}
struct ImportScopeEntry
readonly struct ImportScopeEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly ImportScopeHandle handle;
readonly ImportScope localScope;
@ -88,27 +78,26 @@ namespace ICSharpCode.ILSpy.Metadata @@ -88,27 +78,26 @@ namespace ICSharpCode.ILSpy.Metadata
public int Token => MetadataTokens.GetToken(handle);
public object Offset => offset == null ? "n/a" : (object)offset;
public object Offset => offset == null ? "n/a" : offset;
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int Parent => MetadataTokens.GetToken(localScope.Parent);
public void OnParentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, localScope.Parent, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, localScope.Parent, protocol: "metadata"));
}
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Imports => MetadataTokens.GetHeapOffset(localScope.ImportsBlob);
public ImportScopeEntry(PEFile module, MetadataReader metadata, bool isEmbedded, ImportScopeHandle handle)
public ImportScopeEntry(MetadataFile metadataFile, ImportScopeHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.ImportScope)
+ metadata.GetTableRowSize(TableIndex.ImportScope) * (MetadataTokens.GetRowNumber(handle) - 1);
this.module = module;
this.metadata = metadata;
this.metadataFile = metadataFile;
this.handle = handle;
this.localScope = metadata.GetImportScope(handle);
this.localScope = metadataFile.Metadata.GetImportScope(handle);
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.ImportScope)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.ImportScope) * (MetadataTokens.GetRowNumber(handle) - 1);
}
}

33
ILSpy/Metadata/DebugTables/LocalConstantTableTreeNode.cs

@ -16,30 +16,23 @@ @@ -16,30 +16,23 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class LocalConstantTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public LocalConstantTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.LocalConstant, module, metadata)
public LocalConstantTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.LocalConstant, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"34 LocalConstant ({metadata.GetTableRowCount(TableIndex.LocalConstant)})";
public override object Text => $"34 LocalConstant ({metadataFile.Metadata.GetTableRowCount(TableIndex.LocalConstant)})";
public override object Icon => Images.Literal;
@ -52,9 +45,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -52,9 +45,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<LocalConstantEntry>();
LocalConstantEntry scrollTargetEntry = default;
foreach (var row in metadata.LocalConstants)
foreach (var row in metadataFile.Metadata.LocalConstants)
{
LocalConstantEntry entry = new LocalConstantEntry(module, metadata, isEmbedded, row);
LocalConstantEntry entry = new LocalConstantEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -77,8 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -77,8 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct LocalConstantEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly LocalConstantHandle handle;
readonly LocalConstant localConst;
@ -88,21 +80,20 @@ namespace ICSharpCode.ILSpy.Metadata @@ -88,21 +80,20 @@ namespace ICSharpCode.ILSpy.Metadata
public object Offset => offset == null ? "n/a" : (object)offset;
public string Name => metadata.GetString(localConst.Name);
public string Name => metadataFile.Metadata.GetString(localConst.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(localConst.Name):X} \"{Name}\"";
[ColumnInfo("X8", Kind = ColumnKind.HeapOffset)]
public int Signature => MetadataTokens.GetHeapOffset(localConst.Signature);
public LocalConstantEntry(PEFile module, MetadataReader metadata, bool isEmbedded, LocalConstantHandle handle)
public LocalConstantEntry(MetadataFile metadataFile, LocalConstantHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.LocalConstant)
+ metadata.GetTableRowSize(TableIndex.LocalConstant) * (MetadataTokens.GetRowNumber(handle) - 1);
this.module = module;
this.metadata = metadata;
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.LocalConstant)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.LocalConstant) * (MetadataTokens.GetRowNumber(handle) - 1);
this.metadataFile = metadataFile;
this.handle = handle;
this.localConst = metadata.GetLocalConstant(handle);
this.localConst = metadataFile.Metadata.GetLocalConstant(handle);
}
}

42
ILSpy/Metadata/DebugTables/LocalScopeTableTreeNode.cs

@ -16,32 +16,24 @@ @@ -16,32 +16,24 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class LocalScopeTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public LocalScopeTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.LocalScope, module, metadata)
public LocalScopeTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.LocalScope, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"32 LocalScope ({metadata.GetTableRowCount(TableIndex.LocalScope)})";
public override object Text => $"32 LocalScope ({metadataFile.Metadata.GetTableRowCount(TableIndex.LocalScope)})";
public override object Icon => Images.Literal;
@ -54,9 +46,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -54,9 +46,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<LocalScopeEntry>();
LocalScopeEntry scrollTargetEntry = default;
foreach (var row in metadata.LocalScopes)
foreach (var row in metadataFile.Metadata.LocalScopes)
{
LocalScopeEntry entry = new LocalScopeEntry(module, metadata, isEmbedded, row);
LocalScopeEntry entry = new LocalScopeEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -79,8 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -79,8 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct LocalScopeEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly LocalScopeHandle handle;
readonly LocalScope localScope;
@ -95,18 +86,18 @@ namespace ICSharpCode.ILSpy.Metadata @@ -95,18 +86,18 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnMethodClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, localScope.Method, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, localScope.Method, protocol: "metadata"));
}
string methodTooltip;
public string MethodTooltip => GenerateTooltip(ref methodTooltip, module, localScope.Method);
public string MethodTooltip => GenerateTooltip(ref methodTooltip, metadataFile, localScope.Method);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int ImportScope => MetadataTokens.GetToken(localScope.ImportScope);
public void OnImportScopeClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, localScope.ImportScope, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, localScope.ImportScope, protocol: "metadata"));
}
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -114,7 +105,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -114,7 +105,7 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnVariableListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, localScope.GetLocalVariables().FirstOrDefault(), protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, localScope.GetLocalVariables().FirstOrDefault(), protocol: "metadata"));
}
[ColumnInfo("X8", Kind = ColumnKind.Token)]
@ -122,21 +113,20 @@ namespace ICSharpCode.ILSpy.Metadata @@ -122,21 +113,20 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnConstantListClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, localScope.GetLocalConstants().FirstOrDefault(), protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, localScope.GetLocalConstants().FirstOrDefault(), protocol: "metadata"));
}
public int StartOffset => localScope.StartOffset;
public int Length => localScope.Length;
public LocalScopeEntry(PEFile module, MetadataReader metadata, bool isEmbedded, LocalScopeHandle handle)
public LocalScopeEntry(MetadataFile metadataFile, LocalScopeHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.LocalScope)
+ metadata.GetTableRowSize(TableIndex.LocalScope) * (MetadataTokens.GetRowNumber(handle) - 1);
this.module = module;
this.metadata = metadata;
this.metadataFile = metadataFile;
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.LocalScope)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.LocalScope) * (MetadataTokens.GetRowNumber(handle) - 1);
this.handle = handle;
this.localScope = metadata.GetLocalScope(handle);
this.localScope = metadataFile.Metadata.GetLocalScope(handle);
this.methodTooltip = null;
}
}

29
ILSpy/Metadata/DebugTables/LocalVariableTableTreeNode.cs

@ -27,15 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -27,15 +27,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class LocalVariableTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public LocalVariableTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.LocalVariable, module, metadata)
public LocalVariableTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.LocalVariable, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"33 LocalVariable ({metadata.GetTableRowCount(TableIndex.LocalVariable)})";
public override object Text => $"33 LocalVariable ({metadataFile.Metadata.GetTableRowCount(TableIndex.LocalVariable)})";
public override object Icon => Images.Literal;
@ -48,9 +45,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -48,9 +45,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<LocalVariableEntry>();
LocalVariableEntry scrollTargetEntry = default;
foreach (var row in metadata.LocalVariables)
foreach (var row in metadataFile.Metadata.LocalVariables)
{
LocalVariableEntry entry = new LocalVariableEntry(module, metadata, isEmbedded, row);
LocalVariableEntry entry = new LocalVariableEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -73,8 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -73,8 +70,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct LocalVariableEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly LocalVariableHandle handle;
readonly LocalVariable localVar;
@ -93,18 +89,17 @@ namespace ICSharpCode.ILSpy.Metadata @@ -93,18 +89,17 @@ namespace ICSharpCode.ILSpy.Metadata
public int Index => localVar.Index;
public string Name => metadata.GetString(localVar.Name);
public string Name => metadataFile.Metadata.GetString(localVar.Name);
public string NameTooltip => $"{MetadataTokens.GetHeapOffset(localVar.Name):X} \"{Name}\"";
public LocalVariableEntry(PEFile module, MetadataReader metadata, bool isEmbedded, LocalVariableHandle handle)
public LocalVariableEntry(MetadataFile metadataFile, LocalVariableHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.LocalVariable)
+ metadata.GetTableRowSize(TableIndex.LocalVariable) * (MetadataTokens.GetRowNumber(handle) - 1);
this.module = module;
this.metadata = metadata;
this.metadataFile = metadataFile;
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.LocalVariable)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.LocalVariable) * (MetadataTokens.GetRowNumber(handle) - 1);
this.handle = handle;
this.localVar = metadata.GetLocalVariable(handle);
this.localVar = metadataFile.Metadata.GetLocalVariable(handle);
}
}

43
ILSpy/Metadata/DebugTables/MethodDebugInformationTableTreeNode.cs

@ -16,9 +16,7 @@ @@ -16,9 +16,7 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
@ -31,15 +29,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -31,15 +29,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
internal class MethodDebugInformationTableTreeNode : DebugMetadataTableTreeNode
{
private readonly bool isEmbedded;
public MethodDebugInformationTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base(HandleKind.MethodDebugInformation, module, metadata)
public MethodDebugInformationTableTreeNode(MetadataFile metadataFile)
: base(HandleKind.MethodDebugInformation, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"31 MethodDebugInformation ({metadata.GetTableRowCount(TableIndex.MethodDebugInformation)})";
public override object Text => $"31 MethodDebugInformation ({metadataFile.Metadata.GetTableRowCount(TableIndex.MethodDebugInformation)})";
public override object Icon => Images.Literal;
@ -52,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -52,9 +47,9 @@ namespace ICSharpCode.ILSpy.Metadata
var list = new List<MethodDebugInformationEntry>();
MethodDebugInformationEntry scrollTargetEntry = default;
foreach (var row in metadata.MethodDebugInformation)
foreach (var row in metadataFile.Metadata.MethodDebugInformation)
{
MethodDebugInformationEntry entry = new MethodDebugInformationEntry(module, metadata, isEmbedded, row);
MethodDebugInformationEntry entry = new MethodDebugInformationEntry(metadataFile, row);
if (entry.RID == scrollTarget)
{
scrollTargetEntry = entry;
@ -77,8 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -77,8 +72,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct MethodDebugInformationEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly MethodDebugInformationHandle handle;
readonly MethodDebugInformation debugInfo;
@ -93,15 +87,15 @@ namespace ICSharpCode.ILSpy.Metadata @@ -93,15 +87,15 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnDocumentClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, debugInfo.Document, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, debugInfo.Document, protocol: "metadata"));
}
public string DocumentTooltip {
get {
if (debugInfo.Document.IsNil)
return null;
var document = metadata.GetDocument(debugInfo.Document);
return $"{MetadataTokens.GetHeapOffset(document.Name):X} \"{metadata.GetString(document.Name)}\"";
var document = metadataFile.Metadata.GetDocument(debugInfo.Document);
return $"{MetadataTokens.GetHeapOffset(document.Name):X} \"{metadataFile.Metadata.GetString(document.Name)}\"";
}
}
@ -126,7 +120,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -126,7 +120,7 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnLocalSignatureClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, debugInfo.LocalSignature, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, debugInfo.LocalSignature, protocol: "metadata"));
}
public string LocalSignatureTooltip {
@ -134,9 +128,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -134,9 +128,9 @@ namespace ICSharpCode.ILSpy.Metadata
if (debugInfo.LocalSignature.IsNil)
return null;
ITextOutput output = new PlainTextOutput();
var context = new MetadataGenericContext(default(TypeDefinitionHandle), metadata);
StandaloneSignature localSignature = module.Metadata.GetStandaloneSignature(debugInfo.LocalSignature);
var signatureDecoder = new DisassemblerSignatureTypeProvider(module, output);
var context = new MetadataGenericContext(default(TypeDefinitionHandle), metadataFile.Metadata);
StandaloneSignature localSignature = metadataFile.Metadata.GetStandaloneSignature(debugInfo.LocalSignature);
var signatureDecoder = new DisassemblerSignatureTypeProvider(metadataFile, output);
int index = 0;
foreach (var item in localSignature.DecodeLocalSignature(signatureDecoder, context))
{
@ -150,14 +144,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -150,14 +144,13 @@ namespace ICSharpCode.ILSpy.Metadata
}
}
public MethodDebugInformationEntry(PEFile module, MetadataReader metadata, bool isEmbedded, MethodDebugInformationHandle handle)
public MethodDebugInformationEntry(MetadataFile metadataFile, MethodDebugInformationHandle handle)
{
this.offset = isEmbedded ? null : (int?)metadata.GetTableMetadataOffset(TableIndex.MethodDebugInformation)
+ metadata.GetTableRowSize(TableIndex.MethodDebugInformation) * (MetadataTokens.GetRowNumber(handle) - 1);
this.module = module;
this.metadata = metadata;
this.metadataFile = metadataFile;
this.offset = metadataFile.IsEmbedded ? null : (int?)metadataFile.Metadata.GetTableMetadataOffset(TableIndex.MethodDebugInformation)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.MethodDebugInformation) * (MetadataTokens.GetRowNumber(handle) - 1);
this.handle = handle;
this.debugInfo = metadata.GetMethodDebugInformation(handle);
this.debugInfo = metadataFile.Metadata.GetMethodDebugInformation(handle);
}
}

46
ILSpy/Metadata/DebugTables/StateMachineMethodTableTreeNode.cs

@ -16,31 +16,23 @@ @@ -16,31 +16,23 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
{
internal class StateMachineMethodTableTreeNode : DebugMetadataTableTreeNode
{
readonly bool isEmbedded;
public StateMachineMethodTableTreeNode(PEFile module, MetadataReader metadata, bool isEmbedded)
: base((HandleKind)0x36, module, metadata)
public StateMachineMethodTableTreeNode(MetadataFile metadataFile)
: base((HandleKind)0x36, metadataFile)
{
this.isEmbedded = isEmbedded;
}
public override object Text => $"36 StateMachineMethod ({metadata.GetTableRowCount(TableIndex.StateMachineMethod)})";
public override object Text => $"36 StateMachineMethod ({metadataFile.Metadata.GetTableRowCount(TableIndex.StateMachineMethod)})";
public override object Icon => Images.Literal;
@ -52,13 +44,13 @@ namespace ICSharpCode.ILSpy.Metadata @@ -52,13 +44,13 @@ namespace ICSharpCode.ILSpy.Metadata
var view = Helpers.PrepareDataGrid(tabPage, this);
var list = new List<StateMachineMethodEntry>();
StateMachineMethodEntry scrollTargetEntry = default;
var length = metadata.GetTableRowCount(TableIndex.StateMachineMethod);
var reader = metadata.AsBlobReader();
reader.Offset = metadata.GetTableMetadataOffset(TableIndex.StateMachineMethod);
var length = metadataFile.Metadata.GetTableRowCount(TableIndex.StateMachineMethod);
var reader = metadataFile.Metadata.AsBlobReader();
reader.Offset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.StateMachineMethod);
for (int rid = 1; rid <= length; rid++)
{
StateMachineMethodEntry entry = new StateMachineMethodEntry(module, ref reader, isEmbedded, rid);
StateMachineMethodEntry entry = new StateMachineMethodEntry(metadataFile, ref reader, rid);
if (scrollTarget == rid)
{
scrollTargetEntry = entry;
@ -81,8 +73,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -81,8 +73,7 @@ namespace ICSharpCode.ILSpy.Metadata
struct StateMachineMethodEntry
{
readonly int? offset;
readonly PEFile module;
readonly MetadataReader metadata;
readonly MetadataFile metadataFile;
readonly MethodDefinitionHandle moveNextMethod;
readonly MethodDefinitionHandle kickoffMethod;
@ -97,33 +88,32 @@ namespace ICSharpCode.ILSpy.Metadata @@ -97,33 +88,32 @@ namespace ICSharpCode.ILSpy.Metadata
public void OnMoveNextMethodClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, moveNextMethod, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, moveNextMethod, protocol: "metadata"));
}
string moveNextMethodTooltip;
public string MoveNextMethodTooltip => GenerateTooltip(ref moveNextMethodTooltip, module, moveNextMethod);
public string MoveNextMethodTooltip => GenerateTooltip(ref moveNextMethodTooltip, metadataFile, moveNextMethod);
[ColumnInfo("X8", Kind = ColumnKind.Token)]
public int KickoffMethod => MetadataTokens.GetToken(kickoffMethod);
public void OnKickofMethodClick()
{
MainWindow.Instance.JumpToReference(new EntityReference(module, kickoffMethod, protocol: "metadata"));
MainWindow.Instance.JumpToReference(new EntityReference(metadataFile, kickoffMethod, protocol: "metadata"));
}
string kickoffMethodTooltip;
public string KickoffMethodTooltip => GenerateTooltip(ref kickoffMethodTooltip, module, kickoffMethod);
public string KickoffMethodTooltip => GenerateTooltip(ref kickoffMethodTooltip, metadataFile, kickoffMethod);
public StateMachineMethodEntry(PEFile module, ref BlobReader reader, bool isEmbedded, int row)
public StateMachineMethodEntry(MetadataFile metadataFile, ref BlobReader reader, int row)
{
this.module = module;
this.metadata = module.Metadata;
this.metadataFile = metadataFile;
this.RID = row;
int rowOffset = metadata.GetTableMetadataOffset(TableIndex.StateMachineMethod)
+ metadata.GetTableRowSize(TableIndex.StateMachineMethod) * (row - 1);
this.offset = isEmbedded ? null : (int?)rowOffset;
int rowOffset = metadataFile.Metadata.GetTableMetadataOffset(TableIndex.StateMachineMethod)
+ metadataFile.Metadata.GetTableRowSize(TableIndex.StateMachineMethod) * (row - 1);
this.offset = metadataFile.IsEmbedded ? null : (int?)rowOffset;
int methodDefSize = metadata.GetTableRowCount(TableIndex.MethodDef) < ushort.MaxValue ? 2 : 4;
int methodDefSize = metadataFile.Metadata.GetTableRowCount(TableIndex.MethodDef) < ushort.MaxValue ? 2 : 4;
this.moveNextMethod = MetadataTokens.MethodDefinitionHandle(methodDefSize == 2 ? reader.ReadInt16() : reader.ReadInt32());
this.kickoffMethod = MetadataTokens.MethodDefinitionHandle(methodDefSize == 2 ? reader.ReadInt16() : reader.ReadInt32());
this.kickoffMethodTooltip = null;

16
ILSpy/Metadata/Heaps/BlobHeapTreeNode.cs

@ -16,22 +16,13 @@ @@ -16,22 +16,13 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.DebugInfo;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpyX;
namespace ICSharpCode.ILSpy.Metadata
{
@ -39,11 +30,12 @@ namespace ICSharpCode.ILSpy.Metadata @@ -39,11 +30,12 @@ namespace ICSharpCode.ILSpy.Metadata
{
readonly List<BlobHeapEntry> list;
public BlobHeapTreeNode(PEFile module, MetadataReader metadata)
: base(HandleKind.Blob, module, metadata)
public BlobHeapTreeNode(MetadataFile metadataFile)
: base(HandleKind.Blob, metadataFile)
{
list = new List<BlobHeapEntry>();
var metadata = metadataFile.Metadata;
BlobHandle handle = MetadataTokens.BlobHandle(0);
do
{

6
ILSpy/Metadata/Heaps/GuidHeapTreeNode.cs

@ -16,7 +16,6 @@ @@ -16,7 +16,6 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections.Generic;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
@ -30,10 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -30,10 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata
{
readonly List<GuidHeapEntry> list;
public GuidHeapTreeNode(PEFile module, MetadataReader metadata)
: base(HandleKind.Guid, module, metadata)
public GuidHeapTreeNode(MetadataFile metadataFile)
: base(HandleKind.Guid, metadataFile)
{
list = new List<GuidHeapEntry>();
var metadata = metadataFile.Metadata;
int count = metadata.GetHeapSize(HeapIndex.Guid) >> 4;
for (int i = 1; i <= count; i++)
{

15
ILSpy/Metadata/Heaps/StringHeapTreeNode.cs

@ -16,21 +16,11 @@ @@ -16,21 +16,11 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.DebugInfo;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
@ -39,10 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -39,10 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata
{
readonly List<StringHeapEntry> list;
public StringHeapTreeNode(PEFile module, MetadataReader metadata)
: base(HandleKind.String, module, metadata)
public StringHeapTreeNode(MetadataFile metadataFile)
: base(HandleKind.String, metadataFile)
{
list = new List<StringHeapEntry>();
var metadata = metadataFile.Metadata;
StringHandle handle = MetadataTokens.StringHandle(0);
do
{

16
ILSpy/Metadata/Heaps/UserStringHeapTreeNode.cs

@ -16,21 +16,11 @@ @@ -16,21 +16,11 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.DebugInfo;
using ICSharpCode.Decompiler.Disassembler;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
namespace ICSharpCode.ILSpy.Metadata
@ -39,11 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -39,11 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata
{
readonly List<UserStringHeapEntry> list;
public UserStringHeapTreeNode(PEFile module, MetadataReader metadata)
: base(HandleKind.UserString, module, metadata)
public UserStringHeapTreeNode(MetadataFile metadataFile)
: base(HandleKind.UserString, metadataFile)
{
list = new List<UserStringHeapEntry>();
var metadata = metadataFile.Metadata;
UserStringHandle handle = MetadataTokens.UserStringHandle(0);
do
{

15
ILSpy/Metadata/MetadataHeapTreeNode.cs

@ -16,33 +16,26 @@ @@ -16,33 +16,26 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Windows.Controls;
using System.Windows.Threading;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TextView;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
using ICSharpCode.TreeView;
namespace ICSharpCode.ILSpy.Metadata
{
internal abstract class MetadataHeapTreeNode : ILSpyTreeNode
{
protected PEFile module;
protected MetadataReader metadata;
protected MetadataFile metadataFile;
protected int scrollTarget;
public HandleKind Kind { get; }
public MetadataHeapTreeNode(HandleKind kind, PEFile module, MetadataReader metadata)
public MetadataHeapTreeNode(HandleKind kind, MetadataFile metadataFile)
{
this.module = module;
this.Kind = kind;
this.metadata = metadata;
this.metadataFile = metadataFile;
}
internal void ScrollTo(Handle handle)
@ -53,7 +46,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -53,7 +46,7 @@ namespace ICSharpCode.ILSpy.Metadata
protected void ScrollItemIntoView(DataGrid view, object item)
{
view.Loaded += View_Loaded;
view.Dispatcher.BeginInvoke((Action)(() => view.SelectItem(item)), DispatcherPriority.Background);
view.Dispatcher.BeginInvoke(() => view.SelectItem(item), DispatcherPriority.Background);
}
private void View_Loaded(object sender, System.Windows.RoutedEventArgs e)

23
ILSpy/Metadata/MetadataTableTreeNode.cs

@ -23,28 +23,28 @@ using System.Windows.Controls; @@ -23,28 +23,28 @@ using System.Windows.Controls;
using System.Windows.Threading;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.IL;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.TreeNodes;
namespace ICSharpCode.ILSpy.Metadata
{
internal abstract class MetadataTableTreeNode : ILSpyTreeNode
{
protected PEFile module;
protected readonly MetadataFile metadataFile;
protected int scrollTarget;
public HandleKind Kind { get; }
public MetadataTableTreeNode(HandleKind kind, PEFile module)
public MetadataTableTreeNode(HandleKind kind, MetadataFile metadataFile)
{
this.module = module;
this.Kind = kind;
this.metadataFile = metadataFile;
}
internal void ScrollTo(Handle handle)
{
this.scrollTarget = module.Metadata.GetRowNumber((EntityHandle)handle);
this.scrollTarget = metadataFile.Metadata.GetRowNumber((EntityHandle)handle);
}
protected void ScrollItemIntoView(DataGrid view, object item)
@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.Metadata
this.scrollTarget = default;
}
protected static string GenerateTooltip(ref string tooltip, PEFile module, EntityHandle handle)
protected static string GenerateTooltip(ref string tooltip, MetadataFile module, EntityHandle handle)
{
if (tooltip == null)
{
@ -71,7 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -71,7 +71,7 @@ namespace ICSharpCode.ILSpy.Metadata
return null;
}
ITextOutput output = new PlainTextOutput();
var context = new MetadataGenericContext(default(TypeDefinitionHandle), module);
var context = new MetadataGenericContext(default(TypeDefinitionHandle), module.Metadata);
var metadata = module.Metadata;
switch (handle.Kind)
{
@ -84,7 +84,7 @@ namespace ICSharpCode.ILSpy.Metadata @@ -84,7 +84,7 @@ namespace ICSharpCode.ILSpy.Metadata
output.Write(metadata.GetString(moduleReference.Name));
break;
case HandleKind.AssemblyReference:
var asmRef = new Decompiler.Metadata.AssemblyReference(module, (AssemblyReferenceHandle)handle);
var asmRef = new Decompiler.Metadata.AssemblyReference(metadata, (AssemblyReferenceHandle)handle);
output.Write(asmRef.ToString());
break;
case HandleKind.Parameter:
@ -132,12 +132,9 @@ namespace ICSharpCode.ILSpy.Metadata @@ -132,12 +132,9 @@ namespace ICSharpCode.ILSpy.Metadata
internal abstract class DebugMetadataTableTreeNode : MetadataTableTreeNode
{
protected MetadataReader metadata;
public DebugMetadataTableTreeNode(HandleKind kind, PEFile module, MetadataReader metadata)
: base(kind, module)
public DebugMetadataTableTreeNode(HandleKind kind, MetadataFile metadataFile)
: base(kind, metadataFile)
{
this.metadata = metadata;
}
}
}

240
ILSpy/Metadata/MetadataTablesTreeNode.cs

@ -16,12 +16,12 @@ @@ -16,12 +16,12 @@
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System.Collections.Generic;
using System;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.ILSpy.Options;
using ICSharpCode.ILSpy.TreeNodes;
using ICSharpCode.ILSpy.ViewModels;
@ -29,11 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata @@ -29,11 +29,11 @@ namespace ICSharpCode.ILSpy.Metadata
{
class MetadataTablesTreeNode : ILSpyTreeNode
{
private PEFile module;
readonly MetadataFile metadataFile;
public MetadataTablesTreeNode(PEFile module)
public MetadataTablesTreeNode(MetadataFile metadataFile)
{
this.module = module;
this.metadataFile = metadataFile;
this.LazyLoading = true;
}
@ -43,77 +43,169 @@ namespace ICSharpCode.ILSpy.Metadata @@ -43,77 +43,169 @@ namespace ICSharpCode.ILSpy.Metadata
protected override void LoadChildren()
{
if (ShowTable(TableIndex.Module))
this.Children.Add(new ModuleTableTreeNode(module));
if (ShowTable(TableIndex.TypeRef))
this.Children.Add(new TypeRefTableTreeNode(module));
if (ShowTable(TableIndex.TypeDef))
this.Children.Add(new TypeDefTableTreeNode(module));
if (ShowTable(TableIndex.Field))
this.Children.Add(new FieldTableTreeNode(module));
if (ShowTable(TableIndex.MethodDef))
this.Children.Add(new MethodTableTreeNode(module));
if (ShowTable(TableIndex.Param))
this.Children.Add(new ParamTableTreeNode(module));
if (ShowTable(TableIndex.InterfaceImpl))
this.Children.Add(new InterfaceImplTableTreeNode(module));
if (ShowTable(TableIndex.MemberRef))
this.Children.Add(new MemberRefTableTreeNode(module));
if (ShowTable(TableIndex.Constant))
this.Children.Add(new ConstantTableTreeNode(module));
if (ShowTable(TableIndex.CustomAttribute))
this.Children.Add(new CustomAttributeTableTreeNode(module));
if (ShowTable(TableIndex.FieldMarshal))
this.Children.Add(new FieldMarshalTableTreeNode(module));
if (ShowTable(TableIndex.DeclSecurity))
this.Children.Add(new DeclSecurityTableTreeNode(module));
if (ShowTable(TableIndex.ClassLayout))
this.Children.Add(new ClassLayoutTableTreeNode(module));
if (ShowTable(TableIndex.FieldLayout))
this.Children.Add(new FieldLayoutTableTreeNode(module));
if (ShowTable(TableIndex.StandAloneSig))
this.Children.Add(new StandAloneSigTableTreeNode(module));
if (ShowTable(TableIndex.EventMap))
this.Children.Add(new EventMapTableTreeNode(module));
if (ShowTable(TableIndex.Event))
this.Children.Add(new EventTableTreeNode(module));
if (ShowTable(TableIndex.PropertyMap))
this.Children.Add(new PropertyMapTableTreeNode(module));
if (ShowTable(TableIndex.Property))
this.Children.Add(new PropertyTableTreeNode(module));
if (ShowTable(TableIndex.MethodSemantics))
this.Children.Add(new MethodSemanticsTableTreeNode(module));
if (ShowTable(TableIndex.MethodImpl))
this.Children.Add(new MethodImplTableTreeNode(module));
if (ShowTable(TableIndex.ModuleRef))
this.Children.Add(new ModuleRefTableTreeNode(module));
if (ShowTable(TableIndex.TypeSpec))
this.Children.Add(new TypeSpecTableTreeNode(module));
if (ShowTable(TableIndex.ImplMap))
this.Children.Add(new ImplMapTableTreeNode(module));
if (ShowTable(TableIndex.FieldRva))
this.Children.Add(new FieldRVATableTreeNode(module));
if (ShowTable(TableIndex.Assembly))
this.Children.Add(new AssemblyTableTreeNode(module));
if (ShowTable(TableIndex.AssemblyRef))
this.Children.Add(new AssemblyRefTableTreeNode(module));
if (ShowTable(TableIndex.File))
this.Children.Add(new FileTableTreeNode(module));
if (ShowTable(TableIndex.ExportedType))
this.Children.Add(new ExportedTypeTableTreeNode(module));
if (ShowTable(TableIndex.ManifestResource))
this.Children.Add(new ManifestResourceTableTreeNode(module));
if (ShowTable(TableIndex.NestedClass))
this.Children.Add(new NestedClassTableTreeNode(module));
if (ShowTable(TableIndex.GenericParam))
this.Children.Add(new GenericParamTableTreeNode(module));
if (ShowTable(TableIndex.MethodSpec))
this.Children.Add(new MethodSpecTableTreeNode(module));
if (ShowTable(TableIndex.GenericParamConstraint))
this.Children.Add(new GenericParamConstraintTableTreeNode(module));
if (ShowTable(TableIndex.Module, metadataFile.Metadata))
this.Children.Add(new ModuleTableTreeNode(metadataFile));
if (ShowTable(TableIndex.TypeRef, metadataFile.Metadata))
this.Children.Add(new TypeRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.TypeDef, metadataFile.Metadata))
this.Children.Add(new TypeDefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Field, metadataFile.Metadata))
this.Children.Add(new FieldTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodDef, metadataFile.Metadata))
this.Children.Add(new MethodTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Param, metadataFile.Metadata))
this.Children.Add(new ParamTableTreeNode(metadataFile));
if (ShowTable(TableIndex.InterfaceImpl, metadataFile.Metadata))
this.Children.Add(new InterfaceImplTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MemberRef, metadataFile.Metadata))
this.Children.Add(new MemberRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Constant, metadataFile.Metadata))
this.Children.Add(new ConstantTableTreeNode(metadataFile));
if (ShowTable(TableIndex.CustomAttribute, metadataFile.Metadata))
this.Children.Add(new CustomAttributeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.FieldMarshal, metadataFile.Metadata))
this.Children.Add(new FieldMarshalTableTreeNode(metadataFile));
if (ShowTable(TableIndex.DeclSecurity, metadataFile.Metadata))
this.Children.Add(new DeclSecurityTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ClassLayout, metadataFile.Metadata))
this.Children.Add(new ClassLayoutTableTreeNode(metadataFile));
if (ShowTable(TableIndex.FieldLayout, metadataFile.Metadata))
this.Children.Add(new FieldLayoutTableTreeNode(metadataFile));
if (ShowTable(TableIndex.StandAloneSig, metadataFile.Metadata))
this.Children.Add(new StandAloneSigTableTreeNode(metadataFile));
if (ShowTable(TableIndex.EventMap, metadataFile.Metadata))
this.Children.Add(new EventMapTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Event, metadataFile.Metadata))
this.Children.Add(new EventTableTreeNode(metadataFile));
if (ShowTable(TableIndex.PropertyMap, metadataFile.Metadata))
this.Children.Add(new PropertyMapTableTreeNode(metadataFile));
if (ShowTable(TableIndex.Property, metadataFile.Metadata))
this.Children.Add(new PropertyTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodSemantics, metadataFile.Metadata))
this.Children.Add(new MethodSemanticsTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodImpl, metadataFile.Metadata))
this.Children.Add(new MethodImplTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ModuleRef, metadataFile.Metadata))
this.Children.Add(new ModuleRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.TypeSpec, metadataFile.Metadata))
this.Children.Add(new TypeSpecTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ImplMap, metadataFile.Metadata))
this.Children.Add(new ImplMapTableTreeNode(metadataFile));
if (ShowTable(TableIndex.FieldRva, metadataFile.Metadata))
this.Children.Add(new FieldRVATableTreeNode(metadataFile));
if (ShowTable(TableIndex.Assembly, metadataFile.Metadata))
this.Children.Add(new AssemblyTableTreeNode(metadataFile));
if (ShowTable(TableIndex.AssemblyRef, metadataFile.Metadata))
this.Children.Add(new AssemblyRefTableTreeNode(metadataFile));
if (ShowTable(TableIndex.File, metadataFile.Metadata))
this.Children.Add(new FileTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ExportedType, metadataFile.Metadata))
this.Children.Add(new ExportedTypeTableTreeNode(metadataFile));
if (ShowTable(TableIndex.ManifestResource, metadataFile.Metadata))
this.Children.Add(new ManifestResourceTableTreeNode(metadataFile));
if (ShowTable(TableIndex.NestedClass, metadataFile.Metadata))
this.Children.Add(new NestedClassTableTreeNode(metadataFile));
if (ShowTable(TableIndex.GenericParam, metadataFile.Metadata))
this.Children.Add(new GenericParamTableTreeNode(metadataFile));
if (ShowTable(TableIndex.MethodSpec, metadataFile.Metadata))
this.Children.Add(new MethodSpecTableTreeNode(metadataFile));
if (ShowTable(TableIndex.GenericParamConstraint, metadataFile.Metadata))
this.Children.Add(new GenericParamConstraintTableTreeNode(metadataFile));
}
bool ShowTable(TableIndex table) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || module.Metadata.GetTableRowCount(table) > 0;
internal static bool ShowTable(TableIndex table, MetadataReader metadata) => !MainWindow.Instance.CurrentDisplaySettings.HideEmptyMetadataTables || metadata.GetTableRowCount(table) > 0;
internal static MetadataTableTreeNode CreateTableTreeNode(TableIndex table, MetadataFile metadataFile)
{
switch (table)
{
case TableIndex.Module:
return new ModuleTableTreeNode(metadataFile);
case TableIndex.TypeRef:
return new TypeRefTableTreeNode(metadataFile);
case TableIndex.TypeDef:
return new TypeDefTableTreeNode(metadataFile);
case TableIndex.Field:
return new FieldTableTreeNode(metadataFile);
case TableIndex.MethodDef:
return new MethodTableTreeNode(metadataFile);
case TableIndex.Param:
return new ParamTableTreeNode(metadataFile);
case TableIndex.InterfaceImpl:
return new InterfaceImplTableTreeNode(metadataFile);
case TableIndex.MemberRef:
return new MemberRefTableTreeNode(metadataFile);
case TableIndex.Constant:
return new ConstantTableTreeNode(metadataFile);
case TableIndex.CustomAttribute:
return new CustomAttributeTableTreeNode(metadataFile);
case TableIndex.FieldMarshal:
return new FieldMarshalTableTreeNode(metadataFile);
case TableIndex.DeclSecurity:
return new DeclSecurityTableTreeNode(metadataFile);
case TableIndex.ClassLayout:
return new ClassLayoutTableTreeNode(metadataFile);
case TableIndex.FieldLayout:
return new FieldLayoutTableTreeNode(metadataFile);
case TableIndex.StandAloneSig:
return new StandAloneSigTableTreeNode(metadataFile);
case TableIndex.EventMap:
return new EventMapTableTreeNode(metadataFile);
case TableIndex.Event:
return new EventTableTreeNode(metadataFile);
case TableIndex.PropertyMap:
return new PropertyMapTableTreeNode(metadataFile);
case TableIndex.Property:
return new PropertyTableTreeNode(metadataFile);
case TableIndex.MethodSemantics:
return new MethodSemanticsTableTreeNode(metadataFile);
case TableIndex.MethodImpl:
return new MethodImplTableTreeNode(metadataFile);
case TableIndex.ModuleRef:
return new ModuleRefTableTreeNode(metadataFile);
case TableIndex.TypeSpec:
return new TypeSpecTableTreeNode(metadataFile);
case TableIndex.ImplMap:
return new ImplMapTableTreeNode(metadataFile);
case TableIndex.FieldRva:
return new FieldRVATableTreeNode(metadataFile);
case TableIndex.Assembly:
return new AssemblyTableTreeNode(metadataFile);
case TableIndex.AssemblyRef:
return new AssemblyRefTableTreeNode(metadataFile);
case TableIndex.File:
return new FileTableTreeNode(metadataFile);
case TableIndex.ExportedType:
return new ExportedTypeTableTreeNode(metadataFile);
case TableIndex.ManifestResource:
return new ManifestResourceTableTreeNode(metadataFile);
case TableIndex.NestedClass:
return new NestedClassTableTreeNode(metadataFile);
case TableIndex.GenericParam:
return new GenericParamTableTreeNode(metadataFile);
case TableIndex.MethodSpec:
return new MethodSpecTableTreeNode(metadataFile);
case TableIndex.GenericParamConstraint:
return new GenericParamConstraintTableTreeNode(metadataFile);
case TableIndex.Document:
return new DocumentTableTreeNode(metadataFile);
case TableIndex.MethodDebugInformation:
return new MethodDebugInformationTableTreeNode(metadataFile);
case TableIndex.LocalScope:
return new LocalScopeTableTreeNode(metadataFile);
case TableIndex.LocalVariable:
return new LocalVariableTableTreeNode(metadataFile);
case TableIndex.LocalConstant:
return new LocalConstantTableTreeNode(metadataFile);
case TableIndex.ImportScope:
return new ImportScopeTableTreeNode(metadataFile);
case TableIndex.StateMachineMethod:
return new StateMachineMethodTableTreeNode(metadataFile);
case TableIndex.CustomDebugInformation:
return new CustomDebugInformationTableTreeNode(metadataFile);
default:
throw new ArgumentException($"Unsupported table index: {table}");
}
}
public override bool View(TabPageModel tabPage)

8
ILSpy/Metadata/MetadataTreeNode.cs

@ -68,10 +68,10 @@ namespace ICSharpCode.ILSpy.Metadata @@ -68,10 +68,10 @@ namespace ICSharpCode.ILSpy.Metadata
this.Children.Add(new DataDirectoriesTreeNode(module));
this.Children.Add(new DebugDirectoryTreeNode(module));
this.Children.Add(new MetadataTablesTreeNode(module));
this.Children.Add(new StringHeapTreeNode(module, module.Metadata));
this.Children.Add(new UserStringHeapTreeNode(module, module.Metadata));
this.Children.Add(new GuidHeapTreeNode(module, module.Metadata));
this.Children.Add(new BlobHeapTreeNode(module, module.Metadata));
this.Children.Add(new StringHeapTreeNode(module));
this.Children.Add(new UserStringHeapTreeNode(module));
this.Children.Add(new GuidHeapTreeNode(module));
this.Children.Add(new BlobHeapTreeNode(module));
}
public MetadataTableTreeNode FindNodeByHandleKind(HandleKind kind)

6
ILSpy/TextView/AvalonEditTextOutput.cs

@ -260,7 +260,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -260,7 +260,7 @@ namespace ICSharpCode.ILSpy.TextView
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = opCode });
}
public void WriteReference(PEFile module, Handle handle, string text, string protocol = "decompile", bool isDefinition = false)
public void WriteReference(MetadataFile metadata, Handle handle, string text, string protocol = "decompile", bool isDefinition = false)
{
WriteIndent();
int start = this.TextLength;
@ -268,9 +268,9 @@ namespace ICSharpCode.ILSpy.TextView @@ -268,9 +268,9 @@ namespace ICSharpCode.ILSpy.TextView
int end = this.TextLength;
if (isDefinition)
{
this.DefinitionLookup.AddDefinition((module, handle), this.TextLength);
this.DefinitionLookup.AddDefinition((metadata, handle), this.TextLength);
}
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = new EntityReference(module, handle, protocol), IsDefinition = isDefinition });
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = new EntityReference(metadata, handle, protocol), IsDefinition = isDefinition });
}
public void WriteReference(IType type, string text, bool isDefinition = false)

3
ILSpy/TextView/DecompilerTextView.cs

@ -51,6 +51,7 @@ using ICSharpCode.Decompiler; @@ -51,6 +51,7 @@ using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.CSharp.OutputVisitor;
using ICSharpCode.Decompiler.CSharp.ProjectDecompiler;
using ICSharpCode.Decompiler.Documentation;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using ICSharpCode.ILSpy.AvalonEdit;
using ICSharpCode.ILSpy.Options;
@ -410,7 +411,7 @@ namespace ICSharpCode.ILSpy.TextView @@ -410,7 +411,7 @@ namespace ICSharpCode.ILSpy.TextView
}
else if (segment.Reference is EntityReference unresolvedEntity)
{
var module = unresolvedEntity.ResolveAssembly(MainWindow.Instance.CurrentAssemblyList);
var module = unresolvedEntity.ResolveAssembly(MainWindow.Instance.CurrentAssemblyList) as PEFile;
if (module == null)
return null;
var typeSystem = new DecompilerTypeSystem(module,

Loading…
Cancel
Save