Browse Source

fix InvalidCastException in HandleDelegateConstruction

pull/728/head
Siegfried Pammer 10 years ago
parent
commit
74d92b6157
  1. 18
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

18
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -426,13 +426,19 @@ namespace ICSharpCode.Decompiler.CSharp
TranslatedExpression HandleDelegateConstruction(CallInstruction inst) TranslatedExpression HandleDelegateConstruction(CallInstruction inst)
{ {
var func = (LdFtn)inst.Arguments[1]; ILInstruction func = inst.Arguments[1];
var target = TranslateTarget(func.Method, inst.Arguments[0], func.OpCode == OpCode.LdFtn); IMethod method;
return new ObjectCreateExpression(ConvertType(inst.Method.DeclaringType), new MemberReferenceExpression(target, func.Method.Name)) if (func.OpCode == OpCode.LdFtn) {
method = ((LdFtn)func).Method;
} else {
method = ((LdVirtFtn)func).Method;
}
var target = TranslateTarget(method, inst.Arguments[0], func.OpCode == OpCode.LdFtn);
return new ObjectCreateExpression(ConvertType(inst.Method.DeclaringType), new MemberReferenceExpression(target, method.Name))
.WithILInstruction(inst) .WithILInstruction(inst)
.WithRR(new ConversionResolveResult(func.Method.DeclaringType, .WithRR(new ConversionResolveResult(method.DeclaringType,
new MemberResolveResult(target.ResolveResult, func.Method), new MemberResolveResult(target.ResolveResult, method),
Conversion.MethodGroupConversion(func.Method, func.OpCode == OpCode.LdVirtFtn, false))); // TODO handle extension methods capturing the first argument Conversion.MethodGroupConversion(method, func.OpCode == OpCode.LdVirtFtn, false))); // TODO handle extension methods capturing the first argument
} }
TranslatedExpression TranslateTarget(IMember member, ILInstruction target, bool nonVirtualInvocation) TranslatedExpression TranslateTarget(IMember member, ILInstruction target, bool nonVirtualInvocation)

Loading…
Cancel
Save