Browse Source

Fix #2130: Crash in mouseover of string literal token

pull/2134/head
Siegfried Pammer 6 years ago
parent
commit
f128c1c16b
  1. 19
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 2
      ICSharpCode.Decompiler/SRMExtensions.cs
  3. 9
      ILSpy/TextView/DecompilerTextView.cs
  4. BIN
      msbuild.binlog

19
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -303,8 +303,11 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Unindent(); output.Unindent();
} }
internal static void WriteMetadataToken(ITextOutput output, PEFile module, Handle? handle, int metadataToken, bool spaceAfter, bool spaceBefore, bool showMetadataTokens, bool base10) internal static void WriteMetadataToken(ITextOutput output, PEFile module, Handle? handle,
int metadataToken, bool spaceAfter, bool spaceBefore, bool showMetadataTokens, bool base10)
{ {
// handle can be null in case of errors, if that's the case, we always want to print a comment,
// with the metadataToken.
if (showMetadataTokens || handle == null) if (showMetadataTokens || handle == null)
{ {
if (spaceBefore) if (spaceBefore)
@ -312,13 +315,15 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write(' '); output.Write(' ');
} }
output.Write("/* "); output.Write("/* ");
if (base10) string format = base10 ? null : "X8";
if (handle == null || !handle.Value.IsEntityHandle())
{ {
output.WriteReference(module, handle.GetValueOrDefault(), metadataToken.ToString(), "metadata"); output.Write(metadataToken.ToString(format));
} }
else else
{ {
output.WriteReference(module, handle.GetValueOrDefault(), metadataToken.ToString("X8"), "metadata"); output.WriteReference(module, handle.GetValueOrDefault(),
metadataToken.ToString(format), "metadata");
} }
output.Write(" */"); output.Write(" */");
if (spaceAfter) if (spaceAfter)
@ -332,7 +337,8 @@ namespace ICSharpCode.Decompiler.Disassembler
} }
} }
void DisassembleMethodBlock(PEFile module, MethodDefinitionHandle handle, GenericContext genericContext) void DisassembleMethodBlock(PEFile module, MethodDefinitionHandle handle,
GenericContext genericContext)
{ {
var metadata = module.Metadata; var metadata = module.Metadata;
var methodDefinition = metadata.GetMethodDefinition(handle); var methodDefinition = metadata.GetMethodDefinition(handle);
@ -362,7 +368,8 @@ namespace ICSharpCode.Decompiler.Disassembler
methodBodyDisassembler.Disassemble(module, handle); methodBodyDisassembler.Disassemble(module, handle);
} }
var declaringType = metadata.GetTypeDefinition(methodDefinition.GetDeclaringType()); var declaringType = metadata.GetTypeDefinition(methodDefinition.GetDeclaringType());
CloseBlock("end of method " + DisassemblerHelpers.Escape(metadata.GetString(declaringType.Name)) + "::" + DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name))); CloseBlock("end of method " + DisassemblerHelpers.Escape(metadata.GetString(declaringType.Name))
+ "::" + DisassemblerHelpers.Escape(metadata.GetString(methodDefinition.Name)));
} }
#region Write Security Declarations #region Write Security Declarations

2
ICSharpCode.Decompiler/SRMExtensions.cs

@ -32,6 +32,8 @@ namespace ICSharpCode.Decompiler
kind == HandleKind.MethodDefinition || kind == HandleKind.PropertyDefinition kind == HandleKind.MethodDefinition || kind == HandleKind.PropertyDefinition
|| kind == HandleKind.FieldDefinition || kind == HandleKind.EventDefinition || kind == HandleKind.FieldDefinition || kind == HandleKind.EventDefinition
|| kind == HandleKind.MemberReference || kind == HandleKind.MethodSpecification; || kind == HandleKind.MemberReference || kind == HandleKind.MethodSpecification;
public static bool IsEntityHandle(this Handle handle) =>
handle.IsNil || (byte)handle.Kind < 112;
public static bool IsValueType(this TypeDefinitionHandle handle, MetadataReader reader) public static bool IsValueType(this TypeDefinitionHandle handle, MetadataReader reader)
{ {

9
ILSpy/TextView/DecompilerTextView.cs

@ -403,10 +403,15 @@ namespace ICSharpCode.ILSpy.TextView
} }
else if (segment.Reference is EntityReference unresolvedEntity) else if (segment.Reference is EntityReference unresolvedEntity)
{ {
var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Module, unresolvedEntity.Module.GetAssemblyResolver(), TypeSystemOptions.Default | TypeSystemOptions.Uncached); var typeSystem = new DecompilerTypeSystem(unresolvedEntity.Module,
unresolvedEntity.Module.GetAssemblyResolver(),
TypeSystemOptions.Default | TypeSystemOptions.Uncached);
try try
{ {
IEntity resolved = typeSystem.MainModule.ResolveEntity((EntityHandle)unresolvedEntity.Handle); Handle handle = unresolvedEntity.Handle;
if (!handle.IsEntityHandle())
return null;
IEntity resolved = typeSystem.MainModule.ResolveEntity((EntityHandle)handle);
if (resolved == null) if (resolved == null)
return null; return null;
var document = CreateTooltipForEntity(resolved); var document = CreateTooltipForEntity(resolved);

BIN
msbuild.binlog

Binary file not shown.
Loading…
Cancel
Save