Exemple #1
0
        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);
        }