package jqian.sootex.util.callgraph;
import java.util.*;
import soot.Scene;
import soot.SootMethod;
import soot.jimple.toolkits.callgraph.*;
import soot.util.NumberedSet;
public class PartialTopologicalOrderer extends TopologicalOrderer{
private Collection<SootMethod> _entries;
CallGraph _cg;
List<SootMethod> _order = new ArrayList<SootMethod>();
NumberedSet _visited = new NumberedSet( Scene.v().getMethodNumberer() );
public PartialTopologicalOrderer(CallGraph cg, Collection<SootMethod> entries) {
super(cg);
this._entries = new ArrayList<SootMethod>(entries);
this._cg = cg;
}
public void go() {
Iterator<SootMethod> methods = _entries.iterator();
while (methods.hasNext()) {
SootMethod m = (SootMethod) methods.next();
dfsVisit(m);
}
}
@SuppressWarnings("rawtypes")
private void dfsVisit( SootMethod m ) {
if( _visited.contains( m ) ) return;
_visited.add( m );
Iterator targets = new Targets(_cg.edgesOutOf(m) );
while( targets.hasNext() ) {
SootMethod target = (SootMethod) targets.next();
dfsVisit( target );
}
_order.add( m );
}
public List<SootMethod> order() { return _order; }
}