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

Loading…
Cancel
Save