public static RootStatement parseGraph(ControlFlowGraph graph) { RootStatement root = graphToStatement(graph); if (!processStatement(root, new HashMap<>())) { // try { // DotExporter.toDotFile(root.getFirst().getStats().get(13), new File("c:\\Temp\\stat1.dot")); // } catch (Exception ex) { // ex.printStackTrace(); // } throw new RuntimeException("parsing failure!"); } LabelHelper.lowContinueLabels(root, new HashSet<>()); SequenceHelper.condenseSequences(root); root.buildMonitorFlags(); // build synchronized statements buildSynchronized(root); return root; }
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; } } }
if (root != null) { // check for existence try { buffer.append(root.toJava(indent, tracer)); tracer.addMapping(root.getDummyExit().bytecode);
RootStatement root = new RootStatement(firstst, dummyexit); firstst.addSuccessor(new StatEdge(StatEdge.TYPE_BREAK, firstst, dummyexit, root)); return new RootStatement(general, dummyexit);
TextBuffer code = root.toJava(indent + 1, codeTracer); tracer.addMapping(root.getDummyExit().bytecode);
RootStatement root = new RootStatement(firstst, dummyexit); firstst.addSuccessor(new StatEdge(StatEdge.TYPE_BREAK, firstst, dummyexit, root)); return new RootStatement(general, dummyexit);
if (root != null) { // check for existence try { buffer.append(root.toJava(indent, tracer)); tracer.addMapping(root.getDummyExit().bytecode);
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); } } } } } } }
if (statement == null) { statement = root.getFirst();
public static RootStatement parseGraph(ControlFlowGraph graph) { RootStatement root = graphToStatement(graph); if (!processStatement(root, new HashMap<>())) { // try { // DotExporter.toDotFile(root.getFirst().getStats().get(13), new File("c:\\Temp\\stat1.dot")); // } catch (Exception ex) { // ex.printStackTrace(); // } throw new RuntimeException("parsing failure!"); } LabelHelper.lowContinueLabels(root, new HashSet<>()); SequenceHelper.condenseSequences(root); root.buildMonitorFlags(); // build synchronized statements buildSynchronized(root); return root; }
TextBuffer code = root.toJava(indent + 1, tracer); tracer.addMapping(root.getDummyExit().bytecode);
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));
if (statement == null) { statement = root.getFirst();
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); }
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; }