package x10.wala.util; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import com.ibm.wala.cfg.ControlFlowGraph; import com.ibm.wala.ssa.ISSABasicBlock; import com.ibm.wala.ssa.SSAInstruction; import com.ibm.wala.util.graph.dominators.NumberedDominators; /** * This class wraps a natural loop in a control flow graph * * @author blshao * */ public class NatLoop { /** * the entry point of the loop: a natural loop has only one entry point */ private ISSABasicBlock start; /** * the exit point of the loop: the node has a back edge */ private ISSABasicBlock end; /** * all nodes of a loop, including the start and the end */ private HashSet<ISSABasicBlock> body; public NatLoop(){ body = new HashSet<ISSABasicBlock>(); } public NatLoop(ISSABasicBlock s, ISSABasicBlock e){ start = s; end = e; body = new HashSet<ISSABasicBlock>(); body.add(s); body.add(e); } public ISSABasicBlock getStart(){ return start; } public ISSABasicBlock getEnd(){ return end; } public void setStart(ISSABasicBlock s){ start = s; if(!body.contains(s)){ body.add(s); } } public void setEnd(ISSABasicBlock e){ end = e; if(!body.contains(e)){ body.add(e); } } public void addNode(ISSABasicBlock n){ if(!isInLoop(n)){ body.add(n); } } public boolean isInLoop(ISSABasicBlock n){ return body.contains(n); } public int hashCode() { return toString().hashCode(); } public String toString(){ StringBuffer str= new StringBuffer(); Iterator<ISSABasicBlock> it = body.iterator(); while(it.hasNext()){ ISSABasicBlock tmp = it.next(); str.append(tmp.getNumber()); str.append(" "); } return str.toString(); } }