From 725ee24994a234b5372f1d4c0e4167c367dd7aba Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 6 Jun 2018 19:19:30 +0200 Subject: [PATCH] Fix assertions if references are missing in dynamic code. --- .../IL/Transforms/DynamicCallSiteTransform.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/DynamicCallSiteTransform.cs b/ICSharpCode.Decompiler/IL/Transforms/DynamicCallSiteTransform.cs index 3cdcdb145..73902eb50 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/DynamicCallSiteTransform.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/DynamicCallSiteTransform.cs @@ -145,12 +145,18 @@ namespace ICSharpCode.Decompiler.IL.Transforms ); case BinderMethodKind.Convert: deadArguments.AddRange(targetInvokeCall.Arguments.Take(2)); - return new DynamicConvertInstruction( + ILInstruction result = new DynamicConvertInstruction( binderFlags: callsite.Flags, context: callsite.Context, type: callsite.ConvertTargetType, argument: targetInvokeCall.Arguments[2] ); + if (result.ResultType == StackType.Unknown) { + // if references are missing, we need to coerce the primitive type to None. + // Otherwise we will get loads of assertions. + result = new Conv(result, PrimitiveType.None, ((DynamicConvertInstruction)result).IsChecked, Sign.None); + } + return result; case BinderMethodKind.GetIndex: deadArguments.AddRange(targetInvokeCall.Arguments.Take(2)); return new DynamicGetIndexInstruction(