Browse Source

Fix second part of #547

pull/863/head
Siegfried Pammer 8 years ago
parent
commit
53a9ed47f7
  1. 13
      ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs

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

@ -55,7 +55,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
ILInstruction[] values;
int initArrayPos;
if (ForwardScanInitializeArrayRuntimeHelper(body, pos + 1, v, elementType, arrayLength, out values, out initArrayPos)) {
context.Step($"ForwardScanInitializeArrayRuntimeHelper", inst);
context.Step("ForwardScanInitializeArrayRuntimeHelper", inst);
var tempStore = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type);
var block = BlockFromInitializer(tempStore, elementType, arrayLength, values);
body.Instructions[pos].ReplaceWith(new StLoc(v, block));
@ -67,7 +67,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
ILVariable finalStore;
int instructionsToRemove;
if (HandleSimpleArrayInitializer(body, pos + 1, v, arrayLength[0], out finalStore, out values, out instructionsToRemove)) {
context.Step($"HandleSimpleArrayInitializer", inst);
context.Step("HandleSimpleArrayInitializer", inst);
var block = new Block(BlockType.ArrayInitializer);
var tempStore = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type);
block.Instructions.Add(new StLoc(tempStore, new NewArr(elementType, arrayLength.Select(l => new LdcI4(l)).ToArray())));
@ -86,7 +86,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
return true;
}
if (HandleJaggedArrayInitializer(body, pos + 1, v, arrayLength[0], out finalStore, out values, out instructionsToRemove)) {
context.Step($"HandleJaggedArrayInitializer", inst);
context.Step("HandleJaggedArrayInitializer", inst);
var block = new Block(BlockType.ArrayInitializer);
var tempStore = context.Function.RegisterVariable(VariableKind.StackSlot, v.Type);
block.Instructions.Add(new StLoc(tempStore, new NewArr(elementType, arrayLength.Select(l => new LdcI4(l)).ToArray())));
@ -154,7 +154,6 @@ namespace ICSharpCode.Decompiler.IL.Transforms
throw new ArgumentException("void is not a valid element type!");
case KnownTypeCode.IntPtr:
case KnownTypeCode.UIntPtr:
return new LdNull();
default:
return new LdNull();
}
@ -185,10 +184,10 @@ namespace ICSharpCode.Decompiler.IL.Transforms
if (index >= length)
break;
if (!block.Instructions[i].MatchStObj(out target, out value, out type) || value.Descendants.OfType<IInstructionWithVariableOperand>().Any(inst => inst.Variable == store))
return false;
break;
var ldelem = target as LdElema;
if (ldelem == null || !ldelem.Array.MatchLdLoc(store) || ldelem.Indices.Count != 1 || !ldelem.Indices[0].MatchLdcI4(out index))
return false;
break;
values[index] = value;
index++;
elementCount++;
@ -202,7 +201,7 @@ namespace ICSharpCode.Decompiler.IL.Transforms
} else {
finalStore = store;
}
return true;
return elementCount > 0;
}
bool HandleJaggedArrayInitializer(Block block, int pos, ILVariable store, int length, out ILVariable finalStore, out ILInstruction[] values, out int instructionsToRemove)

Loading…
Cancel
Save