From c3aab802ea475297b5ffee7f272dbe9413cdb5b7 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Mon, 21 Aug 2017 18:28:57 +0200 Subject: [PATCH] Fix bugs in TransformCollectionAndObjectInitializers --- ...ransformCollectionAndObjectInitializers.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs index 2225b33b1..8bd9abfb9 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs @@ -33,6 +33,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms case NewObj newObjInst: if (DelegateConstruction.IsDelegateConstruction(newObjInst) || DelegateConstruction.IsPotentialClosure(context, newObjInst)) return false; + if (newObjInst.Method.DeclaringType.Kind != TypeKind.Struct && v.Kind != VariableKind.StackSlot) + return false; break; case DefaultValue defaultVal: break; @@ -117,8 +119,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms this.Index = index; } - public IMember Member; - public ILVariable Index; + public readonly IMember Member; + public readonly ILVariable Index; public override string ToString() => $"[{Member}, {Index}]"; @@ -134,7 +136,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms case CallInstruction call: if (!(call is CallVirt || call is Call)) goto default; method = call.Method; - if (method.IsStatic) goto default; + if (!IsMethodApplicable(method)) goto default; instruction = call.Arguments[0]; if (values == null) { values = new List(call.Arguments.Skip(1)); @@ -184,11 +186,20 @@ namespace ICSharpCode.Decompiler.IL.Transforms break; } } - if (kind != AccessPathKind.Invalid && values.OfType().Any(ld => ld.Variable == target)) + if (kind != AccessPathKind.Invalid && values.SelectMany(v => v.Descendants).OfType().Any(ld => ld.Variable == target)) kind = AccessPathKind.Invalid; return (kind, path, values, target); } + static bool IsMethodApplicable(IMethod method) + { + if (method.IsStatic) + return false; + if (method.IsAccessor) + return true; + return "Add".Equals(method.Name, StringComparison.Ordinal); + } + public override bool Equals(object obj) { if (obj is AccessPathElement)