/** * @param number of a basic block * @return the exceptional successors of the basic block, in order of increasing catch scope. */ private Iterator<T> iterateExceptionalSuccessors(int number) { if (exceptionalEdgeManager.hasAnySuccessor(number)) { List<T> result = new ArrayList<>(); SimpleIntVector v = exceptionalSuccessors.get(number); for (int i = 0; i <= v.getMaxIndex(); i++) { result.add(getNode(v.get(i))); } if (exceptionalToExit.get(number)) { result.add(exit); } return result.iterator(); } else { if (exceptionalToExit.get(number)) { return new NonNullSingletonIterator<>(exit()); } else { return EmptyIterator.instance(); } } }
/** * @param number of a basic block * @return the exceptional successors of the basic block, in order of increasing catch scope. */ private Iterator<T> iterateExceptionalSuccessors(int number) { if (exceptionalEdgeManager.hasAnySuccessor(number)) { List<T> result = new ArrayList<>(); SimpleIntVector v = exceptionalSuccessors.get(number); for (int i = 0; i <= v.getMaxIndex(); i++) { result.add(getNode(v.get(i))); } if (exceptionalToExit.get(number)) { result.add(exit); } return result.iterator(); } else { if (exceptionalToExit.get(number)) { return new NonNullSingletonIterator<>(exit()); } else { return EmptyIterator.instance(); } } }
/** * @throws IllegalArgumentException if dst is null */ public void addExceptionalEdge(T src, T dst) { if (dst == null) { throw new IllegalArgumentException("dst is null"); } if (dst.equals(exit())) { exceptionalToExit.set(getNumber(src)); } else { exceptionalEdgeManager.addEdge(src, dst); SimpleIntVector v = exceptionalSuccessors.get(getNumber(src)); if (v == null) { v = new SimpleIntVector(-1); exceptionalSuccessors.set(getNumber(src), v); v.set(0, getNumber(dst)); return; } if (v.get(v.getMaxIndex()) != getNumber(dst)) { v.set(v.getMaxIndex() + 1, getNumber(dst)); } } }
/** * @throws IllegalArgumentException if dst is null */ public void addExceptionalEdge(T src, T dst) { if (dst == null) { throw new IllegalArgumentException("dst is null"); } if (dst.equals(exit())) { exceptionalToExit.set(getNumber(src)); } else { exceptionalEdgeManager.addEdge(src, dst); SimpleIntVector v = exceptionalSuccessors.get(getNumber(src)); if (v == null) { v = new SimpleIntVector(-1); exceptionalSuccessors.set(getNumber(src), v); v.set(0, getNumber(dst)); return; } if (v.get(v.getMaxIndex()) != getNumber(dst)) { v.set(v.getMaxIndex() + 1, getNumber(dst)); } } }