diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index e1f4d4bad..b658fff1d 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -1476,7 +1476,7 @@ namespace ICSharpCode.Decompiler.CSharp { var stloc = block.Instructions.FirstOrDefault() as StLoc; var final = block.FinalInstruction as LdLoc; - if (stloc == null || final == null || stloc.Variable != final.Variable) + if (stloc == null || final == null || stloc.Variable != final.Variable || stloc.Variable.Kind != VariableKind.InitializerTarget) throw new ArgumentException("given Block is invalid!"); InitializedObjectResolveResult initObjRR; TranslatedExpression expr; @@ -1582,7 +1582,7 @@ namespace ICSharpCode.Decompiler.CSharp var stloc = block.Instructions.FirstOrDefault() as StLoc; var final = block.FinalInstruction as LdLoc; IType type; - if (stloc == null || final == null || !stloc.Value.MatchNewArr(out type) || stloc.Variable != final.Variable) + if (stloc == null || final == null || !stloc.Value.MatchNewArr(out type) || stloc.Variable != final.Variable || stloc.Variable.Kind != VariableKind.InitializerTarget) throw new ArgumentException("given Block is invalid!"); var newArr = (NewArr)stloc.Value; diff --git a/ICSharpCode.Decompiler/IL/ILVariable.cs b/ICSharpCode.Decompiler/IL/ILVariable.cs index 42414186b..9671877c8 100644 --- a/ICSharpCode.Decompiler/IL/ILVariable.cs +++ b/ICSharpCode.Decompiler/IL/ILVariable.cs @@ -42,6 +42,11 @@ namespace ICSharpCode.Decompiler.IL /// ForeachLocal, /// + /// A local variable used inside an array, collection or + /// object initializer block to denote the object being initialized. + /// + InitializerTarget, + /// /// A parameter. /// Parameter, diff --git a/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs b/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs index 22e3db204..f09728368 100644 --- a/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs +++ b/ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs @@ -157,6 +157,9 @@ namespace ICSharpCode.Decompiler.IL case VariableKind.StackSlot: name = "S_"; break; + case VariableKind.InitializerTarget: + name = "I_"; + break; default: throw new NotSupportedException(); } diff --git a/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs b/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs index 87ccaf75f..05120f617 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs @@ -75,7 +75,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms switch (v.Kind) { case VariableKind.Parameter: // ignore break; - case VariableKind.StackSlot: // keep generated names + case VariableKind.InitializerTarget: // keep generated names AddExistingName(v.Name); break; default: diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs index 12b1e8e01..80aca9757 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs @@ -56,7 +56,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms int initArrayPos; if (ForwardScanInitializeArrayRuntimeHelper(body, pos + 1, v, elementType, arrayLength, out values, out initArrayPos)) { context.Step("ForwardScanInitializeArrayRuntimeHelper", inst); - var tempStore = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type); + var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, v.Type); var block = BlockFromInitializer(tempStore, elementType, arrayLength, values); body.Instructions[pos].ReplaceWith(new StLoc(v, block)); body.Instructions.RemoveAt(initArrayPos); @@ -69,7 +69,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (HandleSimpleArrayInitializer(body, pos + 1, v, arrayLength[0], out finalStore, out values, out instructionsToRemove)) { context.Step("HandleSimpleArrayInitializer", inst); var block = new Block(BlockType.ArrayInitializer); - var tempStore = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type); + var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, v.Type); block.Instructions.Add(new StLoc(tempStore, new NewArr(elementType, arrayLength.Select(l => new LdcI4(l)).ToArray()))); block.Instructions.AddRange(values.SelectWithIndex( (i, value) => { @@ -88,7 +88,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms if (HandleJaggedArrayInitializer(body, pos + 1, v, arrayLength[0], out finalStore, out values, out instructionsToRemove)) { context.Step("HandleJaggedArrayInitializer", inst); var block = new Block(BlockType.ArrayInitializer); - var tempStore = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type); + var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, v.Type); block.Instructions.Add(new StLoc(tempStore, new NewArr(elementType, arrayLength.Select(l => new LdcI4(l)).ToArray()))); block.Instructions.AddRange(values.SelectWithIndex((i, value) => StElem(new LdLoc(tempStore), new[] { new LdcI4(i) }, value, elementType))); block.FinalInstruction = new LdLoc(tempStore); diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs index 550ec0c1d..571bb04c4 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs @@ -101,7 +101,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms ILVariable finalSlot; if (initializerBlock == null) { initializerBlock = new Block(blockType); - finalSlot = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type); + finalSlot = context.Function.RegisterVariable(VariableKind.InitializerTarget, v.Type); initializerBlock.FinalInstruction = new LdLoc(finalSlot); initializerBlock.Instructions.Add(new StLoc(finalSlot, initInst.Clone())); } else {