From 9a78b855767ece37b250126aa74be56a71820006 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 20 Sep 2017 23:37:50 +0200 Subject: [PATCH] Fix bug in TransformArrayInitializers: local storage was deleted. --- .../IL/Transforms/TransformArrayInitializers.cs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs index 80aca9757..bbe722027 100644 --- a/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs +++ b/ICSharpCode.Decompiler/IL/Transforms/TransformArrayInitializers.cs @@ -64,9 +64,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms return true; } if (arrayLength.Length == 1) { - ILVariable finalStore; 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 values, out instructionsToRemove)) { context.Step("HandleSimpleArrayInitializer", inst); var block = new Block(BlockType.ArrayInitializer); var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, v.Type); @@ -79,13 +78,12 @@ namespace ICSharpCode.Decompiler.IL.Transforms } )); block.FinalInstruction = new LdLoc(tempStore); - body.Instructions[pos].ReplaceWith(new StLoc(finalStore ?? v, block)); + body.Instructions[pos].ReplaceWith(new StLoc(v, block)); RemoveInstructions(body, pos + 1, instructionsToRemove); - //body.Instructions.RemoveRange(pos + 1, values.Length + 1); ILInlining.InlineIfPossible(body, ref pos, context); 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 ILVariable finalStore, out values, out instructionsToRemove)) { context.Step("HandleJaggedArrayInitializer", inst); var block = new Block(BlockType.ArrayInitializer); var tempStore = context.Function.RegisterVariable(VariableKind.InitializerTarget, v.Type); @@ -170,11 +168,10 @@ namespace ICSharpCode.Decompiler.IL.Transforms /// /// Handle simple case where RuntimeHelpers.InitializeArray is not used. /// - bool HandleSimpleArrayInitializer(Block block, int pos, ILVariable store, int length, out ILVariable finalStore, out ILInstruction[] values, out int instructionsToRemove) + bool HandleSimpleArrayInitializer(Block block, int pos, ILVariable store, int length, out ILInstruction[] values, out int instructionsToRemove) { instructionsToRemove = 0; values = null; - finalStore = null; values = new ILInstruction[length]; int index = 0; int elementCount = 0; @@ -193,14 +190,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms elementCount++; instructionsToRemove++; } - ILInstruction array; if (pos + elementCount >= block.Instructions.Count) return false; - if (block.Instructions[pos + elementCount].MatchStLoc(out finalStore, out array) && array.MatchLdLoc(store)) { - instructionsToRemove++; - } else { - finalStore = store; - } return elementCount > 0; }