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; } } }
public static void removeRedundantReturns(RootStatement root) { DummyExitStatement dummyExit = root.getDummyExit(); for (StatEdge edge : dummyExit.getAllPredecessorEdges()) { if (!edge.explicit) { Statement source = edge.getSource(); List<Exprent> lstExpr = source.getExprents(); if (lstExpr != null && !lstExpr.isEmpty()) { Exprent expr = lstExpr.get(lstExpr.size() - 1); if (expr.type == Exprent.EXPRENT_EXIT) { ExitExprent ex = (ExitExprent)expr; if (ex.getExitType() == ExitExprent.EXIT_RETURN && ex.getValue() == null) { // remove redundant return dummyExit.addBytecodeOffsets(ex.bytecode); lstExpr.remove(lstExpr.size() - 1); } } } } } } }
public DirectGraph buildDirectGraph(RootStatement root) { this.root = root; graph = new DirectGraph(); flattenStatement(); // dummy exit node Statement dummyexit = root.getDummyExit(); DirectNode node = new DirectNode(DirectNode.NODE_DIRECT, dummyexit, dummyexit.id.toString()); node.exprents = new ArrayList<>(); graph.nodes.addWithKey(node, node.id); mapDestinationNodes.put(dummyexit.id, new String[]{node.id, null}); setEdges(); graph.first = graph.nodes.getWithKey(mapDestinationNodes.get(root.id)[0]); graph.sortReversePostOrder(); return graph; }
root.getDummyExit(), st, st, firstnd, firstnd, true));
case Statement.TYPE_ROOT: mapEdges = setExplicitEdges(stat.getFirst()); processEdgesWithNext(stat.getFirst(), mapEdges, ((RootStatement)stat).getDummyExit()); break; case Statement.TYPE_SEQUENCE:
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); }
tracer.addMapping(root.getDummyExit().bytecode);
tracer.addMapping(root.getDummyExit().bytecode);
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; } } }
public DirectGraph buildDirectGraph(RootStatement root) { this.root = root; graph = new DirectGraph(); flattenStatement(); // dummy exit node Statement dummyexit = root.getDummyExit(); DirectNode node = new DirectNode(DirectNode.NODE_DIRECT, dummyexit, dummyexit.id.toString()); node.exprents = new ArrayList<>(); graph.nodes.addWithKey(node, node.id); mapDestinationNodes.put(dummyexit.id, new String[]{node.id, null}); setEdges(); graph.first = graph.nodes.getWithKey(mapDestinationNodes.get(root.id)[0]); graph.sortReversePostOrder(); return graph; }
public static boolean removeRedundantReturns(RootStatement root) { boolean res = false; DummyExitStatement dummyExit = root.getDummyExit(); for (StatEdge edge : dummyExit.getAllPredecessorEdges()) { if (!edge.explicit) { Statement source = edge.getSource(); List<Exprent> lstExpr = source.getExprents(); if (lstExpr != null && !lstExpr.isEmpty()) { Exprent expr = lstExpr.get(lstExpr.size() - 1); if (expr.type == Exprent.EXPRENT_EXIT) { ExitExprent ex = (ExitExprent)expr; if (ex.getExitType() == ExitExprent.EXIT_RETURN && ex.getValue() == null) { // remove redundant return dummyExit.addBytecodeOffsets(ex.bytecode); lstExpr.remove(lstExpr.size() - 1); res = true; } } } } } return res; } }
root.getDummyExit(), st, st, firstnd, firstnd, true));
case Statement.TYPE_ROOT: mapEdges = setExplicitEdges(stat.getFirst()); processEdgesWithNext(stat.getFirst(), mapEdges, ((RootStatement)stat).getDummyExit()); break; case Statement.TYPE_SEQUENCE:
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); }
tracer.addMapping(root.getDummyExit().bytecode);
tracer.addMapping(root.getDummyExit().bytecode);