void (Statement stat) { for (Statement st : stat.getStats()) { buildSynchronized(st); } if (stat.type == StatementType.SEQUENCE) { while (true) { boolean found = false; List<Statement> lst = stat.getStats(); for (int i = 0; i < lst.size() - 1; i++) { Statement current = lst.get(i); // basic block if (current.isMonitorEnter()) { Statement next = lst.get(i + 1); Statement nextDirect = next; while (next.type == StatementType.SEQUENCE) { next = next.getFirst(); } if (next.type == StatementType.CATCH_ALL) { CatchAllStatement ca = (CatchAllStatement)next; if (ca.getFirst().isContainsMonitorExit() && ca.getHandler().isContainsMonitorExit()) { // remove the head block from sequence current.removeSuccessor(current.getSuccessorEdges(EdgeType.DIRECT_ALL).get(0)); for (StatEdge edge : current.getPredecessorEdges(EdgeType.DIRECT_ALL)) { current.removePredecessor(edge); edge.getSource().changeEdgeNode(EdgeDirection.FORWARD, edge, nextDirect); nextDirect.addPredecessor(edge); } stat.getStats().removeWithKey(current.id); stat.setFirst(stat.getStats().get(0)); // new statement SynchronizedStatement sync = new SynchronizedStatement(current, ca.getFirst(), ca.getHandler()); sync.setAllParent(); for (StatEdge edge : new HashSet<>(ca.getLabelEdges())) { sync.addLabeledEdge(edge); } current.addSuccessor(new StatEdge(EdgeType.REGULAR, current, ca.getFirst())); ca.getParent().replaceStatement(ca, sync); found = true; break; } } } } if (!found) { break; } } } }