package soot.jimple.toolkits.thread.mhp;
import soot.jimple.toolkits.thread.mhp.stmt.JPegStmt;
import soot.tagkit.*;
import soot.util.*;
import java.util.*;
// *** USE AT YOUR OWN RISK ***
// May Happen in Parallel (MHP) analysis by Lin Li.
// This code should be treated as beta-quality code.
// It was written in 2003, but not incorporated into Soot until 2006.
// As such, it may contain incorrect assumptions about the usage
// of certain Soot classes.
// Some portions of this MHP analysis have been quality-checked, and are
// now used by the Transactions toolkit.
//
// -Richard L. Halpert, 2006-11-30
public class LoopFinder{
private final Map<Chain, Set<Set<Object>>> chainToLoop = new HashMap<Chain, Set<Set<Object>>>();
LoopFinder(PegGraph peg){
Chain chain = peg.getMainPegChain();
DfsForBackEdge dfsForBackEdge = new DfsForBackEdge(chain, peg);
Map<Object, Object> backEdges = dfsForBackEdge.getBackEdges();
LoopBodyFinder lbf = new LoopBodyFinder(backEdges, peg);
Set<Set<Object>> loopBody = lbf.getLoopBody();
testLoops(loopBody);
chainToLoop.put(chain, loopBody);
}
private void testLoops(Set<Set<Object>> loopBody){
System.out.println("====loops===");
Iterator<Set<Object>> it = loopBody.iterator();
while (it.hasNext()){
Set loop = it.next();
Iterator loopIt = loop.iterator();
System.out.println("---loop---");
while (loopIt.hasNext()){
JPegStmt o = (JPegStmt)loopIt.next();
Tag tag = (Tag)o.getTags().get(0);
System.out.println(tag+" "+o);
}
}
System.out.println("===end===loops===");
}
}