Browse Source

Fix #2130: Crash in mouseover of string literal token

pull/2134/head
Siegfried Pammer 5 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 @@ -303,8 +303,11 @@ namespace ICSharpCode.Decompiler.Disassembler
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 (spaceBefore)
@ -312,13 +315,15 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -312,13 +315,15 @@ namespace ICSharpCode.Decompiler.Disassembler
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
{
output.WriteReference(module, handle.GetValueOrDefault(), metadataToken.ToString("X8"), "metadata");
output.WriteReference(module, handle.GetValueOrDefault(),
metadataToken.ToString(format), "metadata");
}
output.Write(" */");
if (spaceAfter)
@ -332,7 +337,8 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -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 methodDefinition = metadata.GetMethodDefinition(handle);
@ -362,7 +368,8 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -362,7 +368,8 @@ namespace ICSharpCode.Decompiler.Disassembler
methodBodyDisassembler.Disassemble(module, handle);
}
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

2
ICSharpCode.Decompiler/SRMExtensions.cs

@ -32,6 +32,8 @@ namespace ICSharpCode.Decompiler @@ -32,6 +32,8 @@ namespace ICSharpCode.Decompiler
kind == HandleKind.MethodDefinition || kind == HandleKind.PropertyDefinition
|| kind == HandleKind.FieldDefinition || kind == HandleKind.EventDefinition
|| 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)
{

9
ILSpy/TextView/DecompilerTextView.cs

@ -403,10 +403,15 @@ namespace ICSharpCode.ILSpy.TextView @@ -403,10 +403,15 @@ namespace ICSharpCode.ILSpy.TextView
}
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
{
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)
return null;
var document = CreateTooltipForEntity(resolved);

BIN
msbuild.binlog

Binary file not shown.
Loading…
Cancel
Save