Browse Source

#1671: Do not crash if a generic local function is encountered. Emit warning instead.

pull/1686/head
Siegfried Pammer 6 years ago
parent
commit
76a8a4449c
  1. 13
      ICSharpCode.Decompiler/IL/Transforms/LocalFunctionDecompiler.cs

13
ICSharpCode.Decompiler/IL/Transforms/LocalFunctionDecompiler.cs

@ -44,6 +44,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
struct LocalFunctionInfo struct LocalFunctionInfo
{ {
public List<CallInstruction> UseSites; public List<CallInstruction> UseSites;
public IMethod Method;
public ILFunction Definition; public ILFunction Definition;
} }
@ -70,8 +71,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms
var cancellationToken = context.CancellationToken; var cancellationToken = context.CancellationToken;
// Find all local functions declared inside this method, including nested local functions or local functions declared in lambdas. // Find all local functions declared inside this method, including nested local functions or local functions declared in lambdas.
FindUseSites(function, context, localFunctions); FindUseSites(function, context, localFunctions);
foreach (var (method, info) in localFunctions) { foreach (var (_, info) in localFunctions) {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
if (info.Definition == null) {
function.Warnings.Add($"Could not decode local function '{info.Method}'");
continue;
}
var firstUseSite = info.UseSites[0]; var firstUseSite = info.UseSites[0];
context.StepStartGroup($"Transform " + info.Definition.Name, info.Definition); context.StepStartGroup($"Transform " + info.Definition.Name, info.Definition);
try { try {
@ -126,10 +132,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms
context.StepStartGroup($"Read local function '{targetMethod.Name}'", inst); context.StepStartGroup($"Read local function '{targetMethod.Name}'", inst);
info = new LocalFunctionInfo() { info = new LocalFunctionInfo() {
UseSites = new List<CallInstruction>() { inst }, UseSites = new List<CallInstruction>() { inst },
Method = targetMethod,
Definition = ReadLocalFunctionDefinition(context.Function, targetMethod) Definition = ReadLocalFunctionDefinition(context.Function, targetMethod)
}; };
localFunctions.Add((MethodDefinitionHandle)targetMethod.MetadataToken, info); localFunctions.Add((MethodDefinitionHandle)targetMethod.MetadataToken, info);
FindUseSites(info.Definition, context, localFunctions); if (info.Definition != null) {
FindUseSites(info.Definition, context, localFunctions);
}
context.StepEndGroup(); context.StepEndGroup();
} else { } else {
info.UseSites.Add(inst); info.UseSites.Add(inst);

Loading…
Cancel
Save