From 76a8a4449c1007a12a281bd86ea2cbe1a4934e89 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 27 Aug 2019 12:11:25 +0200 Subject: [PATCH] #1671: Do not crash if a generic local function is encountered. Emit warning instead. --- .../IL/Transforms/LocalFunctionDecompiler.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/LocalFunctionDecompiler.cs b/ICSharpCode.Decompiler/IL/Transforms/LocalFunctionDecompiler.cs index 8c52794f0..5adbdf4e0 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/LocalFunctionDecompiler.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/LocalFunctionDecompiler.cs @@ -44,6 +44,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms struct LocalFunctionInfo { public List UseSites; + public IMethod Method; public ILFunction Definition; } @@ -70,8 +71,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms var cancellationToken = context.CancellationToken; // Find all local functions declared inside this method, including nested local functions or local functions declared in lambdas. FindUseSites(function, context, localFunctions); - foreach (var (method, info) in localFunctions) { + foreach (var (_, info) in localFunctions) { cancellationToken.ThrowIfCancellationRequested(); + if (info.Definition == null) { + function.Warnings.Add($"Could not decode local function '{info.Method}'"); + continue; + } + var firstUseSite = info.UseSites[0]; context.StepStartGroup($"Transform " + info.Definition.Name, info.Definition); try { @@ -126,10 +132,13 @@ namespace ICSharpCode.Decompiler.IL.Transforms context.StepStartGroup($"Read local function '{targetMethod.Name}'", inst); info = new LocalFunctionInfo() { UseSites = new List() { inst }, + Method = targetMethod, Definition = ReadLocalFunctionDefinition(context.Function, targetMethod) }; localFunctions.Add((MethodDefinitionHandle)targetMethod.MetadataToken, info); - FindUseSites(info.Definition, context, localFunctions); + if (info.Definition != null) { + FindUseSites(info.Definition, context, localFunctions); + } context.StepEndGroup(); } else { info.UseSites.Add(inst);