Browse Source

Add VariableKind.InitializerTarget to separate stack slots should be renamed from purely generated helper variables in initializer blocks.

pull/863/head
Siegfried Pammer 8 years ago
parent
commit
ed6a2db37c
  1. 4
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 5
      ICSharpCode.Decompiler/IL/ILVariable.cs
  3. 3
      ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs
  4. 2
      ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs
  5. 6
      ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs
  6. 2
      ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

4
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1476,7 +1476,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -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 @@ -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;

5
ICSharpCode.Decompiler/IL/ILVariable.cs

@ -42,6 +42,11 @@ namespace ICSharpCode.Decompiler.IL @@ -42,6 +42,11 @@ namespace ICSharpCode.Decompiler.IL
/// </summary>
ForeachLocal,
/// <summary>
/// A local variable used inside an array, collection or
/// object initializer block to denote the object being initialized.
/// </summary>
InitializerTarget,
/// <summary>
/// A parameter.
/// </summary>
Parameter,

3
ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs

@ -157,6 +157,9 @@ namespace ICSharpCode.Decompiler.IL @@ -157,6 +157,9 @@ namespace ICSharpCode.Decompiler.IL
case VariableKind.StackSlot:
name = "S_";
break;
case VariableKind.InitializerTarget:
name = "I_";
break;
default:
throw new NotSupportedException();
}

2
ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

@ -75,7 +75,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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:

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

@ -56,7 +56,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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 @@ -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 @@ -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);

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

@ -101,7 +101,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -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 {

Loading…
Cancel
Save