package jqian.sootex.ptsto;
import java.util.Set;
import jqian.sootex.location.InstanceObject;
import jqian.sootex.location.Location;
import soot.*;
import soot.jimple.toolkits.callgraph.ReachableMethods;
/**
* Query points-to relations using both spark and type-based points-to analysis.
* For methods reachable from the main entry, use spark query; otherwise, use type-based query.
*/
public class CombinedPtsToQuery implements IPtsToQuery{
private SparkPtsToQuery spark;
private TypeBasedPtsToQuery typebased;
private ReachableMethods _reachFromMain;
public CombinedPtsToQuery(SparkPtsToQuery spark, TypeBasedPtsToQuery typebased, ReachableMethods reachFromMain){
this.spark = spark;
this.typebased = typebased;
this._reachFromMain = reachFromMain;
}
public Set<InstanceObject> getPointTos(SootMethod m, Unit stmt, Location ptr) {
if(_reachFromMain.contains(m)){
return spark.getPointTos(m, stmt, ptr);
}
else{
return typebased.getPointTos(m, stmt, ptr);
}
}
}