private bool performLeaveReproduction() { bool result = false; ArrayList leaveBlocks = new ArrayList(); foreach (BasicBlock block in blockList) { int count = block.Body.Count; if (count > 0 && count <= 2) { Node lastNode = block.Body[count - 1]; if (lastNode is Leave && lastNode.Parent is MethodBodyBlock) { leaveBlocks.Add(block); } } } ArrayList leaveBlocksToRemove = new ArrayList(); foreach (BasicBlock block in leaveBlocks) { Node opt = (block.Body.Count == 2) ? block.Body[0] : null; ArrayList prevBlocksToRemove = new ArrayList(); foreach (BasicBlock b in block.Prev) { if (b.Next.Count == 1 && b.Body.Count > 0) { NodeArray body = b.Body; Node lastNode = body[body.Count - 1]; if (!(lastNode is Branch)) { result = true; prevBlocksToRemove.Add(b); if (opt != null) { Node n = opt.Clone(); n.Options[BasicBlock.BASIC_BLOCK_OPTION] = b; body.Add(n); lastNode = lastNode.Next = n; } Node l = new Leave(); l.Options[BasicBlock.BASIC_BLOCK_OPTION] = b; body.Add(l); lastNode.Next = l; } } } foreach (BasicBlock b in prevBlocksToRemove) { b.Next.Remove(block); block.Prev.Remove(b); } if (block.Prev.Count == 0) { leaveBlocksToRemove.Add(block); } } foreach (BasicBlock block in leaveBlocksToRemove) { blockList.Remove(block); } return(result); }