package xsched.analysis.wala.schedule_extraction; import com.ibm.wala.cfg.ControlFlowGraph; import com.ibm.wala.cfg.IBasicBlock; import com.ibm.wala.ipa.cfg.EdgeFilter; import com.ibm.wala.ipa.cfg.PrunedCFG; public class AutomaticExceptionPrunedCFG { private static class ExceptionEdgePruner<I, T extends IBasicBlock<I>> implements EdgeFilter<T>{ private final ControlFlowGraph<I, T> cfg; ExceptionEdgePruner(ControlFlowGraph<I, T> cfg) { this.cfg = cfg; } public boolean hasNormalEdge(T src, T dst) { return cfg.getNormalSuccessors(src).contains(dst); } public boolean hasExceptionalEdge(T src, T dst) { //remove all exceptional edges to the exit block //those have been inserted automatically by wala but our semantics is that //when an unhandled exception occurs all scheduled child tasks are aborted return !cfg.exit().equals(dst) && cfg.getExceptionalSuccessors(src).contains(dst); } }; public static <I, T extends IBasicBlock<I>> PrunedCFG<I, T> make(ControlFlowGraph<I, T> cfg) { return PrunedCFG.make(cfg, new ExceptionEdgePruner<I, T>(cfg)); } }