package soot.jimple.toolkits.thread.mhp.pegcallgraph;
import soot.jimple.toolkits.thread.mhp.SCC;
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 CheckRecursiveCalls{
List<List> newSccList = null;
public CheckRecursiveCalls(PegCallGraph pcg, Set<Object> methodNeedExtent){
Iterator it = pcg.iterator();
//PegCallGraphToDot pcgtd = new PegCallGraphToDot(pcg, false, "pegcallgraph");
SCC scc = new SCC(it, pcg);
List<List<Object>> sccList = scc.getSccList();
//printSCC(sccList);
newSccList = updateScc(sccList, pcg);
//System.out.println("after update scc");
//printSCC(newSccList);
check(newSccList, methodNeedExtent);
}
private List<List> updateScc(List<List<Object>> sccList, PegCallGraph pcg){
List<List> newList = new ArrayList<List>();
Iterator<List<Object>> listIt = sccList.iterator();
while (listIt.hasNext()){
List s = listIt.next();
if (s.size() == 1){
Object o = s.get(0);
if ((pcg.getSuccsOf(o)).contains(o) || (pcg.getPredsOf(o)).contains(o)){
//sccList.remove(s);
newList.add(s);
}
}
else
newList.add(s);
}
return newList;
}
private void check(List<List> sccList, Set<Object> methodNeedExtent){
Iterator<List> listIt = sccList.iterator();
while (listIt.hasNext()){
List s = listIt.next();
//printSCC(s);
if (s.size()>0){
Iterator it = s.iterator();
while (it.hasNext()){
Object o = it.next();
if (methodNeedExtent.contains(o)){
//if (((Boolean)methodsNeedingInlining.get(o)).booleanValue() == true){
System.err.println("Fail to compute MHP because interested method call relate to recursive calls!");
System.err.println("interested method: " + o);
System.exit(1);
// }
}
}
}
}
}
}