Browse Source

Always create a block when inverting an if.

This keeps the ILAst more uniform and ensures extraction is possible for the code in the then statement.
pull/2069/head
Daniel Grunwald 5 years ago
parent
commit
696fdca923
  1. 15
      ICSharpCode.Decompiler/IL/ControlFlow/ConditionDetection.cs

15
ICSharpCode.Decompiler/IL/ControlFlow/ConditionDetection.cs

@ -362,16 +362,11 @@ namespace ICSharpCode.Decompiler.IL.ControlFlow
//save a copy //save a copy
var thenInst = ifInst.TrueInst; var thenInst = ifInst.TrueInst;
if (ifInst != block.Instructions.SecondToLastOrDefault()) { // extract "else...; exit".
// extract "else...; exit". // Note that this will only extract instructions that were previously inlined from another block
// Note that this will only extract instructions that were previously inlined from another block // (via InlineExitBranch), so the instructions are already fully-transformed.
// (via InlineExitBranch), so the instructions are already fully-transformed. // So it's OK to move them into a nested block again (which hides them from the following block transforms).
// So it's OK to move them into a nested block again (which hides them from the following block transforms). ifInst.TrueInst = ExtractBlock(block, block.Instructions.IndexOf(ifInst) + 1, block.Instructions.Count);
ifInst.TrueInst = ExtractBlock(block, block.Instructions.IndexOf(ifInst) + 1, block.Instructions.Count);
} else {
block.Instructions.RemoveAt(block.Instructions.Count - 1);
ifInst.TrueInst = exitInst;
}
if (thenInst is Block thenBlock) { if (thenInst is Block thenBlock) {
block.Instructions.AddRange(thenBlock.Instructions); block.Instructions.AddRange(thenBlock.Instructions);

Loading…
Cancel
Save