boolean (DoStatement stat) { // search for an if condition at the entrance of the loop Statement first = stat.getFirst(); while (first.type == StatementType.SEQUENCE) { first = first.getFirst(); } // found an if statement if (first.type == StatementType.IF) { IfStatement firstif = (IfStatement)first; if (firstif.getFirst().getExprents().isEmpty()) { if (firstif.iftype == IfStatement.IFTYPE_IF) { if (firstif.getIfstat() == null) { StatEdge ifedge = firstif.getIfEdge(); if (isDirectPath(stat, ifedge.getDestination())) { // exit condition identified stat.setLoopType(LoopType.WHILE); // negate condition (while header) IfExprent ifexpr = (IfExprent)firstif.getHeadexprent().copy(); ifexpr.negateIf(); stat.setConditionExprent(ifexpr.getCondition()); // remove edges firstif.getFirst().removeSuccessor(ifedge); firstif.removeSuccessor(firstif.getAllSuccessorEdges().get(0)); if (stat.getAllSuccessorEdges().isEmpty()) { ifedge.setSource(stat); if (ifedge.closure == stat) { ifedge.closure = stat.getParent(); } stat.addSuccessor(ifedge); } // remove empty if statement as it is now part of the loop if (firstif == stat.getFirst()) { BasicBlockStatement bstat = new BasicBlockStatement(new BasicBlock( DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER))); bstat.setExprents(new ArrayList<>()); stat.replaceStatement(firstif, bstat); } else { // precondition: sequence must contain more than one statement! Statement sequence = firstif.getParent(); sequence.getStats().removeWithKey(firstif.id); sequence.setFirst(sequence.getStats().get(0)); } return true; } } else { StatEdge elseedge = firstif.getAllSuccessorEdges().get(0); if (isDirectPath(stat, elseedge.getDestination())) { // exit condition identified stat.setLoopType(LoopType.WHILE); // no need to negate the while condition stat.setConditionExprent(((IfExprent)firstif.getHeadexprent().copy()).getCondition()); // remove edges StatEdge ifedge = firstif.getIfEdge(); firstif.getFirst().removeSuccessor(ifedge); firstif.removeSuccessor(elseedge); if (stat.getAllSuccessorEdges().isEmpty()) { elseedge.setSource(stat); if (elseedge.closure == stat) { elseedge.closure = stat.getParent(); } stat.addSuccessor(elseedge); } if (firstif.getIfstat() == null) { BasicBlockStatement bstat = new BasicBlockStatement(new BasicBlock( DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER))); bstat.setExprents(new ArrayList<>()); ifedge.setSource(bstat); bstat.addSuccessor(ifedge); stat.replaceStatement(firstif, bstat); } else { // replace the if statement with its content first.getParent().replaceStatement(first, firstif.getIfstat()); // lift closures for (StatEdge prededge : elseedge.getDestination().getPredecessorEdges(EdgeType.BREAK)) { if (stat.containsStatementStrict(prededge.closure)) { stat.addLabeledEdge(prededge); } } LabelHelper.lowClosures(stat); } return true; } } } } } return false; }