Search in sources :

Example 6 with BooleanBranchIntermediate

use of org.candle.decompiler.intermediate.code.BooleanBranchIntermediate in project candle-decompiler by bradsdavis.

the class Else method visitAbstractIntermediate.

@Override
public void visitAbstractIntermediate(AbstractIntermediate line) {
    // for all lines...
    List<AbstractIntermediate> predecessors = Graphs.predecessorListOf(igc.getGraph(), line);
    if (predecessors.size() == 0) {
        return;
    }
    TreeSet<GoToIntermediate> gotoIntermediates = new TreeSet<GoToIntermediate>(new IntermediateComparator());
    for (AbstractIntermediate predecessor : predecessors) {
        if (predecessor instanceof GoToIntermediate) {
            gotoIntermediates.add((GoToIntermediate) predecessor);
        }
    }
    if (gotoIntermediates.size() == 0) {
        return;
    }
    // now, the largest should be...
    GoToIntermediate maxGotoForBranch = gotoIntermediates.pollLast();
    if (maxGotoForBranch.getInstruction().getPosition() > line.getInstruction().getPosition()) {
        return;
    }
    // find the element directly after this one...
    SortedSet<AbstractIntermediate> elseBranchElements = igc.getOrderedIntermediate().subSet(maxGotoForBranch, false, line, false);
    AbstractIntermediate ai = igc.getSinglePredecessor(elseBranchElements.first());
    if (!(ai instanceof IfIntermediate || ai instanceof ElseIfIntermediate)) {
        return;
    }
    // get the first element...
    if (elseBranchElements.size() > 0) {
        AbstractIntermediate firstElseBlockElement = elseBranchElements.first();
        if (firstElseBlockElement instanceof StatementIntermediate) {
            // we should add the ELSE right away...
            addElseBlock(firstElseBlockElement, maxGotoForBranch);
            return;
        }
        if (firstElseBlockElement instanceof BooleanBranchIntermediate) {
            // only add ELSE if the child of conditional doesn't go to the target.
            BooleanBranchIntermediate ci = (BooleanBranchIntermediate) firstElseBlockElement;
            if (igc.getFalseTarget(ci) == line || igc.getTrueTarget(ci) == line) {
                // do nothing.
                return;
            }
            // else if this is an ElseIf, probably should be an IF.
            if (firstElseBlockElement instanceof ElseIfIntermediate) {
                IfIntermediate ifIntermediate = new IfIntermediate(firstElseBlockElement.getInstruction(), ((BooleanBranchIntermediate) firstElseBlockElement).getExpression());
                igc.getGraph().addVertex(ifIntermediate);
                igc.redirectPredecessors(firstElseBlockElement, ifIntermediate);
                igc.redirectSuccessors(firstElseBlockElement, ifIntermediate);
                igc.getGraph().removeVertex(firstElseBlockElement);
                // add the else between this conditional.
                addElseBlock(ifIntermediate, maxGotoForBranch);
            }
        }
    }
}
Also used : AbstractIntermediate(org.candle.decompiler.intermediate.code.AbstractIntermediate) GoToIntermediate(org.candle.decompiler.intermediate.code.GoToIntermediate) TreeSet(java.util.TreeSet) IfIntermediate(org.candle.decompiler.intermediate.code.conditional.IfIntermediate) ElseIfIntermediate(org.candle.decompiler.intermediate.code.conditional.ElseIfIntermediate) StatementIntermediate(org.candle.decompiler.intermediate.code.StatementIntermediate) IntermediateComparator(org.candle.decompiler.intermediate.code.IntermediateComparator) BooleanBranchIntermediate(org.candle.decompiler.intermediate.code.BooleanBranchIntermediate) ElseIfIntermediate(org.candle.decompiler.intermediate.code.conditional.ElseIfIntermediate)

Example 7 with BooleanBranchIntermediate

use of org.candle.decompiler.intermediate.code.BooleanBranchIntermediate in project candle-decompiler by bradsdavis.

the class MethodIntermediateVisitor method visitIFNE.

@Override
public void visitIFNE(IFNE instruction) {
    Expression left = context.getExpressions().pop();
    SingleConditional conditional = new SingleConditional(context.getCurrentInstruction(), left, false);
    BooleanBranchIntermediate line = new BooleanBranchIntermediate(context.getCurrentInstruction(), conditional);
    context.pushIntermediateToInstruction(line);
}
Also used : TypedExpression(org.candle.decompiler.intermediate.expression.TypedExpression) Expression(org.candle.decompiler.intermediate.expression.Expression) SingleConditional(org.candle.decompiler.intermediate.expression.SingleConditional) BooleanBranchIntermediate(org.candle.decompiler.intermediate.code.BooleanBranchIntermediate)

Example 8 with BooleanBranchIntermediate

use of org.candle.decompiler.intermediate.code.BooleanBranchIntermediate in project candle-decompiler by bradsdavis.

the class MethodIntermediateVisitor method processMultiConditionalStatement.

public void processMultiConditionalStatement(OperationType operation, Expression left, Expression right) {
    MultiConditional conditional = new MultiConditional(context.getCurrentInstruction(), left, right, operation);
    // context.getExpressions().push(conditional);
    BooleanBranchIntermediate line = new BooleanBranchIntermediate(this.context.getCurrentInstruction(), conditional);
    // check to see whether you need to negate.
    // if the conditional's target is greater than the conditional's next statement, don't negate.
    BranchHandle branchHandle = (BranchHandle) context.getCurrentInstruction();
    int next = branchHandle.getNext().getPosition();
    int target = branchHandle.getTarget().getPosition();
    // Important.  Make sure the expression "true" is pointed towards the lower branch.
    if (target > next) {
        line.getExpression().negate();
    }
    context.pushIntermediateToInstruction(line);
}
Also used : BooleanBranchIntermediate(org.candle.decompiler.intermediate.code.BooleanBranchIntermediate) MultiConditional(org.candle.decompiler.intermediate.expression.MultiConditional)

Example 9 with BooleanBranchIntermediate

use of org.candle.decompiler.intermediate.code.BooleanBranchIntermediate in project candle-decompiler by bradsdavis.

the class ElseIf method visitIfIntermediate.

@Override
public void visitIfIntermediate(IfIntermediate line) {
    // check to see if the predecessor is an if block.
    List<AbstractIntermediate> predecessors = Graphs.predecessorListOf(igc.getGraph(), line);
    if (predecessors.size() != 1) {
        return;
    }
    // otherwise, see if it is another IF.
    if (predecessors.get(0) instanceof BooleanBranchIntermediate) {
        // check to see whether it is on the ELSE side.
        BooleanBranchIntermediate parent = (BooleanBranchIntermediate) predecessors.get(0);
        LOG.debug(parent.getClass());
        if (!(parent instanceof IfIntermediate)) {
            return;
        }
        if (igc.getFalseTarget(parent) == line) {
            // then this could be an IF block.
            ElseIfIntermediate eii = new ElseIfIntermediate(line.getInstruction(), line.getExpression());
            igc.getGraph().addVertex(eii);
            igc.redirectPredecessors(line, eii);
            igc.redirectSuccessors(line, eii);
            igc.getGraph().removeVertex(line);
        }
    }
}
Also used : AbstractIntermediate(org.candle.decompiler.intermediate.code.AbstractIntermediate) IfIntermediate(org.candle.decompiler.intermediate.code.conditional.IfIntermediate) ElseIfIntermediate(org.candle.decompiler.intermediate.code.conditional.ElseIfIntermediate) BooleanBranchIntermediate(org.candle.decompiler.intermediate.code.BooleanBranchIntermediate) ElseIfIntermediate(org.candle.decompiler.intermediate.code.conditional.ElseIfIntermediate)

Aggregations

BooleanBranchIntermediate (org.candle.decompiler.intermediate.code.BooleanBranchIntermediate)9 Expression (org.candle.decompiler.intermediate.expression.Expression)5 TypedExpression (org.candle.decompiler.intermediate.expression.TypedExpression)5 MultiConditional (org.candle.decompiler.intermediate.expression.MultiConditional)4 AbstractIntermediate (org.candle.decompiler.intermediate.code.AbstractIntermediate)3 GoToIntermediate (org.candle.decompiler.intermediate.code.GoToIntermediate)2 StatementIntermediate (org.candle.decompiler.intermediate.code.StatementIntermediate)2 ElseIfIntermediate (org.candle.decompiler.intermediate.code.conditional.ElseIfIntermediate)2 IfIntermediate (org.candle.decompiler.intermediate.code.conditional.IfIntermediate)2 NullLiteral (org.candle.decompiler.intermediate.expression.NullLiteral)2 SingleConditional (org.candle.decompiler.intermediate.expression.SingleConditional)2 TreeSet (java.util.TreeSet)1 InstructionHandle (org.apache.bcel.generic.InstructionHandle)1 IntermediateComparator (org.candle.decompiler.intermediate.code.IntermediateComparator)1