private static boolean existsPath(Statement from, Statement to) { for (StatEdge edge : to.getAllPredecessorEdges()) { if (from.containsStatementStrict(edge.getSource())) { return true; } } return false; }
private static void setRetEdgesUnlabeled(RootStatement root) { Statement exit = root.getDummyExit(); for (StatEdge edge : exit.getAllPredecessorEdges()) { List<Exprent> lst = edge.getSource().getExprents(); if (edge.getType() == StatEdge.TYPE_FINALLYEXIT || (lst != null && !lst.isEmpty() && lst.get(lst.size() - 1).type == Exprent.EXPRENT_EXIT)) { edge.labeled = false; } } }
private static boolean isOnlyEdge(StatEdge edge) { Statement stat = edge.getDestination(); for (StatEdge ed : stat.getAllPredecessorEdges()) { if (ed != edge) { if (ed.getType() == StatEdge.TYPE_REGULAR) { Statement source = ed.getSource(); if (source.type == Statement.TYPE_BASICBLOCK || (source.type == Statement.TYPE_IF && ((IfStatement)source).iftype == IfStatement.IFTYPE_IF) || (source.type == Statement.TYPE_DO && ((DoStatement)source).getLooptype() != DoStatement.LOOP_DO)) { return false; } } else { return false; } } } return true; }
set.add(stat.id); for (StatEdge prededge : stat.getAllPredecessorEdges()) { if ((prededge.getType() & edgetype) != 0) { Statement pred = prededge.getSource(); for (StatEdge prededge : stat.getAllPredecessorEdges()) { if ((prededge.getType() & edgetype) != 0) { Statement pred = prededge.getSource();
if (lastData.getAllPredecessorEdges().size() > 1) { // break edges issingle = true;
private void calcIDoms() { orderStatements(); colOrderedIDoms.putWithKey(statement.getFirst().id, statement.getFirst().id); // exclude first statement List<Integer> lstIds = colOrderedIDoms.getLstKeys().subList(1, colOrderedIDoms.getLstKeys().size()); while (true) { boolean changed = false; for (Integer id : lstIds) { Statement stat = statement.getStats().getWithKey(id); Integer idom = null; for (StatEdge edge : stat.getAllPredecessorEdges()) { if (colOrderedIDoms.getWithKey(edge.getSource().id) != null) { idom = getCommonIDom(idom, edge.getSource().id, colOrderedIDoms); } } Integer oldidom = colOrderedIDoms.putWithKey(idom, id); if (!idom.equals(oldidom)) { changed = true; } } if (!changed) { break; } } }
public void replaceStatement(Statement oldstat, Statement newstat) { for (StatEdge edge : oldstat.getAllPredecessorEdges()) { oldstat.removePredecessor(edge); edge.getSource().changeEdgeNode(DIRECTION_FORWARD, edge, newstat);
for (StatEdge edge : st.getAllPredecessorEdges()) { st.removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, first);
for (StatEdge edge : st.getAllPredecessorEdges()) { edge.getSource().removeSuccessor(edge); st.removeSuccessor(sucedge); for (StatEdge edge : st.getAllPredecessorEdges()) { if (sucedge.getType() != StatEdge.TYPE_REGULAR) { edge.getSource().changeEdgeType(Statement.DIRECTION_FORWARD, edge, sucedge.getType());
private static void removeLastEmptyStatement(DoStatement dostat, Statement stat) { if (stat == dostat.getFirst()) { BasicBlockStatement bstat = new BasicBlockStatement(new BasicBlock( DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER))); bstat.setExprents(new ArrayList<>()); dostat.replaceStatement(stat, bstat); } else { for (StatEdge edge : stat.getAllPredecessorEdges()) { edge.getSource().changeEdgeType(Statement.DIRECTION_FORWARD, edge, StatEdge.TYPE_CONTINUE); stat.removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, dostat); dostat.addPredecessor(edge); dostat.addLabeledEdge(edge); } // parent is a sequence statement stat.getParent().getStats().removeWithKey(stat.id); } }
for (StatEdge prededge : head.getAllPredecessorEdges()) {
for (StatEdge edge : dest.getAllPredecessorEdges()) { if (!edge.explicit && stat.containsStatementStrict(edge.getSource()) && MergeHelper.isDirectPath(edge.getSource().getParent(), bstat)) {
private static boolean existsPath(Statement from, Statement to) { for (StatEdge edge : to.getAllPredecessorEdges()) { if (from.containsStatementStrict(edge.getSource())) { return true; } } return false; }
private static void setRetEdgesUnlabeled(RootStatement root) { Statement exit = root.getDummyExit(); for (StatEdge edge : exit.getAllPredecessorEdges()) { List<Exprent> lst = edge.getSource().getExprents(); if (edge.getType() == StatEdge.TYPE_FINALLYEXIT || (lst != null && !lst.isEmpty() && lst.get(lst.size() - 1).type == Exprent.EXPRENT_EXIT)) { edge.labeled = false; } } }
set.add(stat.id); for (StatEdge prededge : stat.getAllPredecessorEdges()) { if ((prededge.getType() & edgetype) != 0) { Statement pred = prededge.getSource(); for (StatEdge prededge : stat.getAllPredecessorEdges()) { if ((prededge.getType() & edgetype) != 0) { Statement pred = prededge.getSource();
private static boolean isOnlyEdge(StatEdge edge) { Statement stat = edge.getDestination(); for (StatEdge ed : stat.getAllPredecessorEdges()) { if (ed != edge) { if (ed.getType() == StatEdge.TYPE_REGULAR) { Statement source = ed.getSource(); if (source.type == Statement.TYPE_BASICBLOCK || (source.type == Statement.TYPE_IF && ((IfStatement)source).iftype == IfStatement.IFTYPE_IF) || (source.type == Statement.TYPE_DO && ((DoStatement)source).getLooptype() != DoStatement.LOOP_DO)) { return false; } } else { return false; } } } return true; }
private void calcIDoms() { orderStatements(); colOrderedIDoms.putWithKey(statement.getFirst().id, statement.getFirst().id); // exclude first statement List<Integer> lstIds = colOrderedIDoms.getLstKeys().subList(1, colOrderedIDoms.getLstKeys().size()); while (true) { boolean changed = false; for (Integer id : lstIds) { Statement stat = statement.getStats().getWithKey(id); Integer idom = null; for (StatEdge edge : stat.getAllPredecessorEdges()) { if (colOrderedIDoms.getWithKey(edge.getSource().id) != null) { idom = getCommonIDom(idom, edge.getSource().id, colOrderedIDoms); } } Integer oldidom = colOrderedIDoms.putWithKey(idom, id); if (!idom.equals(oldidom)) { changed = true; } } if (!changed) { break; } } }
public void replaceStatement(Statement oldstat, Statement newstat) { for (StatEdge edge : oldstat.getAllPredecessorEdges()) { oldstat.removePredecessor(edge); edge.getSource().changeEdgeNode(DIRECTION_FORWARD, edge, newstat);
for (StatEdge edge : st.getAllPredecessorEdges()) { edge.getSource().removeSuccessor(edge); st.removeSuccessor(sucedge); for (StatEdge edge : st.getAllPredecessorEdges()) { if (sucedge.getType() != StatEdge.TYPE_REGULAR) { edge.getSource().changeEdgeType(Statement.DIRECTION_FORWARD, edge, sucedge.getType());
private static void removeLastEmptyStatement(DoStatement dostat, Statement stat) { if (stat == dostat.getFirst()) { BasicBlockStatement bstat = new BasicBlockStatement(new BasicBlock( DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER))); bstat.setExprents(new ArrayList<>()); dostat.replaceStatement(stat, bstat); } else { for (StatEdge edge : stat.getAllPredecessorEdges()) { edge.getSource().changeEdgeType(Statement.DIRECTION_FORWARD, edge, StatEdge.TYPE_CONTINUE); stat.removePredecessor(edge); edge.getSource().changeEdgeNode(Statement.DIRECTION_FORWARD, edge, dostat); dostat.addPredecessor(edge); dostat.addLabeledEdge(edge); } // parent is a sequence statement stat.getParent().getStats().removeWithKey(stat.id); } }