package soot.jimple.toolkits.thread.mhp;
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 TopologicalSorter
{
Chain chain;
PegGraph pg;
LinkedList<Object> sorter = new LinkedList<Object>();
List<Object> visited = new ArrayList<Object>();
public TopologicalSorter(Chain chain, PegGraph pg){
this.chain = chain;
this.pg = pg;
go();
// printSeq(sorter);
}
private void go(){
Iterator it = chain.iterator();
while (it.hasNext()){
Object node = it.next();
dfsVisit(node);
}
}
private void dfsVisit(Object m){
if( visited.contains( m ) ) return;
visited.add( m );
Iterator targetsIt = pg.getSuccsOf(m).iterator();
while (targetsIt.hasNext()){
Object target = targetsIt.next();
dfsVisit(target);
}
sorter.addFirst(m);
}
public List<Object> sorter(){return sorter;}
}