public static boolean isBreakEdgeLabeled(Statement source, Statement closure) { if (closure.type == Statement.TYPE_DO || closure.type == Statement.TYPE_SWITCH) { Statement parent = source.getParent(); return parent != closure && (parent.type == Statement.TYPE_DO || parent.type == Statement.TYPE_SWITCH || isBreakEdgeLabeled(parent, closure)); } else { return true; } } }
private static Integer getFirstProtectedRange(Statement stat) { while (true) { Statement parent = stat.getParent(); if (parent == null) { break; } if (parent.type == Statement.TYPE_CATCHALL || parent.type == Statement.TYPE_TRYCATCH) { if (parent.getFirst() == stat) { return parent.id; } } else if (parent.type == Statement.TYPE_SYNCRONIZED) { if (((SynchronizedStatement)parent).getBody() == stat) { return parent.id; } } stat = parent; } return null; }
StatEdge edge_example = lstEdges.get(0); Statement closure = stat.getParent(); if (!closure.containsStatementStrict(edge_example.closure)) { closure = edge_example.closure; StatEdge edge_example = lstEdges.get(0); Statement closure = stat.getParent(); if (!closure.containsStatementStrict(edge_example.closure)) { closure = edge_example.closure;
Statement parent = stat.getParent(); if (parent == null) { return false;
Statement dest = edge.getDestination(); if (dest.type != Statement.TYPE_DUMMYEXIT) { Statement parent = dest.getParent();
Statement parent = current.getParent(); if (parent == null) { break;
Statement stat = stack.removeLast(); Statement parent = stat.getParent(); if (parent != null && parent.type == Statement.TYPE_CATCHALL && stat == parent.getFirst() && !parent.isCopied()) {
public static void destroyAndFlattenStatement(Statement stat) { destroyStatementContent(stat, false); BasicBlockStatement bstat = new BasicBlockStatement(new BasicBlock( DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER))); if (stat.getExprents() == null) { bstat.setExprents(new ArrayList<>()); } else { bstat.setExprents(DecHelper.copyExprentList(stat.getExprents())); } stat.getParent().replaceStatement(stat, bstat); }
private static boolean sameCatchRanges(StatEdge edge) { Statement from = edge.getSource(); Statement to = edge.getDestination(); while (true) { Statement parent = from.getParent(); if (parent.containsStatementStrict(to)) { break; } if (parent.type == Statement.TYPE_TRYCATCH || parent.type == Statement.TYPE_CATCHALL) { if (parent.getFirst() == from) { return false; } } else if (parent.type == Statement.TYPE_SYNCRONIZED) { if (parent.getStats().get(1) == from) { return false; } } from = parent; } return true; }
for (VarExprent var : getAllVars(lstSpecial)) { if (var.getIndex() == index) { stat = stat.getParent(); break;
private static Statement getNextStatement(Statement stat) { Statement parent = stat.getParent(); switch (parent.type) { case Statement.TYPE_ROOT: return ((RootStatement)parent).getDummyExit(); case Statement.TYPE_DO: return parent; case Statement.TYPE_SEQUENCE: SequenceStatement sequence = (SequenceStatement)parent; if (sequence.getStats().getLast() != stat) { for (int i = sequence.getStats().size() - 1; i >= 0; i--) { if (sequence.getStats().get(i) == stat) { return sequence.getStats().get(i + 1); } } } } return getNextStatement(parent); }
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); } }
private static boolean removeReturnCheck(Statement stat, StructMethod mt) { Statement parent = stat.getParent();
Statement parent = source.getParent(); source.removeSuccessor(edge);
stat.getAllSuccessorEdges().get(0).getType() == StatEdge.TYPE_BREAK && stat.getLabelEdges().isEmpty()) { Statement parent = stat.getParent(); if (stat != parent.getFirst() || (parent.type != Statement.TYPE_IF && parent.type != Statement.TYPE_SWITCH)) { MergeHelper.isDirectPath(edge.getSource().getParent(), bstat)) {
first.getParent().replaceStatement(first, firstif.getIfstat());
private static Statement getNextBreakLift(Statement stat, StatEdge edge, HashMap<Integer, Boolean> statLabeled, Statement max) { Statement closure = stat.getParent(); while (closure != null && closure != max && !closure.containsStatementStrict(edge.getDestination())) { boolean edge_labeled = LowBreakHelper.isBreakEdgeLabeled(edge.getSource(), closure); boolean stat_labeled = statLabeled.containsKey(closure.id) ? statLabeled.get(closure.id) : closure.isLabeled(); if (stat_labeled || !edge_labeled) { return closure; } closure = closure.getParent(); } return null; }
private static Statement getNextBreakLift(Statement stat, StatEdge edge) { Statement closure = stat.getParent(); while (closure != null && !closure.containsStatementStrict(edge.getDestination())) { boolean labeled = isBreakEdgeLabeled(edge.getSource(), closure); if (closure.isLabeled() || !labeled) { return closure; } closure = closure.getParent(); } return null; } }
public static void destroyAndFlattenStatement(Statement stat) { destroyStatementContent(stat, false); BasicBlockStatement bstat = new BasicBlockStatement(new BasicBlock( DecompilerContext.getCounterContainer().getCounterAndIncrement(CounterContainer.STATEMENT_COUNTER))); if (stat.getExprents() == null) { bstat.setExprents(new ArrayList<>()); } else { bstat.setExprents(DecHelper.copyExprentList(stat.getExprents())); } stat.getParent().replaceStatement(stat, bstat); }