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);
}
}
}
}
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);
}
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);
}
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);
}
}
}
Aggregations