Browse Source

Fix incorrect detection of object initializer

pull/734/merge
Siegfried Pammer 8 years ago
parent
commit
ad12146f51
  1. 6
      ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs
  2. 3
      ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

6
ICSharpCode.Decompiler/IL/Transforms/DelegateConstruction.cs

@ -99,6 +99,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -99,6 +99,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return opCode == OpCode.LdFtn || opCode == OpCode.LdVirtFtn || (allowTransformed && opCode == OpCode.ILFunction);
}
internal static bool IsPotentialClosure(BlockTransformContext context, NewObj inst)
{
var decompilationContext = new SimpleTypeResolveContext(context.TypeSystem.Resolve(context.Function.Method));
return IsPotentialClosure(decompilationContext.CurrentTypeDefinition, inst.Method.DeclaringTypeDefinition);
}
static bool IsAnonymousMethod(ITypeDefinition decompiledTypeDefinition, IMethod method)
{

3
ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

@ -31,6 +31,9 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -31,6 +31,9 @@ namespace ICSharpCode.Decompiler.IL.Transforms
if (inst.MatchStLoc(out var v, out var initInst)) {
switch (initInst) {
case NewObj newObjInst:
if (DelegateConstruction.IsDelegateConstruction(newObjInst) || DelegateConstruction.IsPotentialClosure(context, newObjInst))
return false;
break;
case DefaultValue defaultVal:
break;
default:

Loading…
Cancel
Save