From 53a9ed47f7fdaadeb4e55087f8927852ac27b8f6 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Sep 2017 13:20:18 +0200 Subject: [PATCH] Fix second part of #547 --- .../IL/Transforms/TransformArrayInitializers.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs index 383b83d71..12b1e8e01 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs +++ b/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().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)