Browse Source

Fix #3522: Improve error handling in DebugDirectoryTreeNode by reusing ErrorTreeNode.

pull/3551/head
Siegfried Pammer 4 months ago
parent
commit
4d38900dc0
  1. 54
      ILSpy/Metadata/DebugDirectoryTreeNode.cs
  2. 66
      ILSpy/TreeNodes/ThreadingSupport.cs

54
ILSpy/Metadata/DebugDirectoryTreeNode.cs

@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Reflection.PortableExecutable;
@ -68,30 +69,37 @@ namespace ICSharpCode.ILSpy.Metadata @@ -68,30 +69,37 @@ namespace ICSharpCode.ILSpy.Metadata
{
foreach (var entry in module.Reader.ReadDebugDirectory())
{
switch (entry.Type)
try
{
case DebugDirectoryEntryType.CodeView:
var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry);
this.Children.Add(new CodeViewTreeNode(codeViewData));
break;
case DebugDirectoryEntryType.EmbeddedPortablePdb:
var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true);
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)"));
break;
case DebugDirectoryEntryType.PdbChecksum:
var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry);
this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData));
break;
case DebugDirectoryEntryType.Unknown:
case DebugDirectoryEntryType.Coff:
case DebugDirectoryEntryType.Reproducible:
default:
this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry));
break;
switch (entry.Type)
{
case DebugDirectoryEntryType.CodeView:
var codeViewData = module.Reader.ReadCodeViewDebugDirectoryData(entry);
this.Children.Add(new CodeViewTreeNode(codeViewData));
break;
case DebugDirectoryEntryType.EmbeddedPortablePdb:
var embeddedPortablePdbProvider = module.Reader.ReadEmbeddedPortablePdbDebugDirectoryData(entry);
var embeddedPortablePdbMetadataFile = new MetadataFile(MetadataFile.MetadataFileKind.ProgramDebugDatabase, module.FileName, embeddedPortablePdbProvider, isEmbedded: true);
this.Children.Add(new MetadataTreeNode(embeddedPortablePdbMetadataFile, "Debug Metadata (Embedded)"));
break;
case DebugDirectoryEntryType.PdbChecksum:
var pdbChecksumData = module.Reader.ReadPdbChecksumDebugDirectoryData(entry);
this.Children.Add(new PdbChecksumTreeNode(pdbChecksumData));
break;
case DebugDirectoryEntryType.Unknown:
case DebugDirectoryEntryType.Coff:
case DebugDirectoryEntryType.Reproducible:
default:
this.Children.Add(new DebugDirectoryEntryTreeNode(module, entry));
break;
}
}
catch (BadImageFormatException ex)
{
this.Children.Add(new ErrorTreeNode(ex));
}
}
}

66
ILSpy/TreeNodes/ThreadingSupport.cs

@ -31,6 +31,8 @@ using ICSharpCode.Decompiler; @@ -31,6 +31,8 @@ using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Properties;
using ICSharpCode.ILSpyX.TreeView;
#nullable enable
namespace ICSharpCode.ILSpy.TreeNodes
{
/// <summary>
@ -40,7 +42,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -40,7 +42,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{
readonly Stopwatch stopwatch = new Stopwatch();
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
Task<List<SharpTreeNode>> loadChildrenTask;
Task<List<SharpTreeNode>>? loadChildrenTask;
public bool IsRunning {
get { return loadChildrenTask != null && !loadChildrenTask.IsCompleted; }
@ -67,7 +69,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -67,7 +69,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
CancellationToken ct = cancellationTokenSource.Token;
var fetchChildrenEnumerable = fetchChildren(ct);
Task<List<SharpTreeNode>> thisTask = null;
Task<List<SharpTreeNode>>? thisTask = null;
thisTask = new Task<List<SharpTreeNode>>(
delegate {
List<SharpTreeNode> result = new List<SharpTreeNode>();
@ -103,7 +105,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -103,7 +105,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
{
foreach (Exception ex in continuation.Exception.InnerExceptions)
{
node.Children.Add(new ErrorTreeNode(ex.ToString()));
node.Children.Add(new ErrorTreeNode(ex));
}
}
}
@ -148,29 +150,6 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -148,29 +150,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
sealed class ErrorTreeNode : ILSpyTreeNode
{
readonly string text;
public override object Text {
get { return text; }
}
public ErrorTreeNode(string text)
{
this.text = text;
}
public override FilterResult Filter(LanguageSettings settings)
{
return FilterResult.Match;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
}
}
[ExportContextMenuEntry(Header = nameof(Resources.CopyErrorMessage))]
[Shared]
sealed class CopyErrorMessageContextMenu : IContextMenuEntry
@ -201,4 +180,39 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -201,4 +180,39 @@ namespace ICSharpCode.ILSpy.TreeNodes
}
}
}
sealed class ErrorTreeNode : ILSpyTreeNode
{
public Exception? Exception { get; }
public override object Text { get; }
public override object Icon => Images.Load(this, "Images/Warning");
public ErrorTreeNode(Exception exception)
: this(exception.Message)
{
this.Exception = exception;
}
public ErrorTreeNode(string text)
{
this.Text = text;
}
public override FilterResult Filter(LanguageSettings settings)
{
return FilterResult.Match;
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
output.WriteLine(this.Text.ToString());
output.WriteLine();
if (this.Exception != null)
{
output.WriteLine(this.Exception.ToString());
}
}
}
}

Loading…
Cancel
Save