void ProcessCondition(InstructionBlock block)
        {
            var @else = block.Successors [0];
            var then  = block.Successors [1];

            var child = GetFirstCommonChild(then, @else);

            if (child == null)
            {
                child = @else;
            }

            var data = new ConditionData(then, @else);

            if (child != @else)
            {
                var then_end = GetBlock(@else.Index - 1);
                var last     = then_end.Last;

                if (IsGoto(last) && then_end.Successors [0] == child)
                {
                    Annotate(last, Annotation.Skip);
                }

                data.AddElseData(@else, child);
            }

            Annotate(block.Last, Annotation.Condition, data);

            ProcessTwoWayBlockSuccessors(block);
        }
예제 #2
0
        void ProcessConditionBranches(ConditionData data, IfStatement conditional)
        {
            MoveStatementsToBlock(data.Then, conditional.Then);

            if (data.Else != null && !IsElseUnecessary(conditional))
            {
                conditional.Else = new BlockStatement();

                MoveStatementsToBlock(data.Else, conditional.Else);

                if (IsEmptyThenCondition(conditional))
                {
                    SwapConditionBranches(conditional);
                }
            }
        }