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 {