import soot.Body;
import soot.Main;
import soot.Pack;
import soot.PackManager;
import soot.Transform;
import soot.Unit;
import soot.tagkit.StringTag;
import soot.toolkits.scalar.ArraySparseSet;
import soot.toolkits.graph.BriefUnitGraph;
public class NullnessDriver
{
public static void main(String[] argv)
{
Pack jtp = soot.G.v().PackManager().getPack("jtp");
jtp.add(new Transform("jtp.nt", new NullTransformer()));
jtp.add(new Transform("jtp.nac", new NullnessAnalysisColorer()));
soot.Main.main(argv);
}
}
class NullTransformer extends soot.BodyTransformer
{
protected void internalTransform(Body b, String phaseName,
java.util.Map options)
{
NullnessAnalysis na = new NullnessAnalysis(new BriefUnitGraph(b));
java.util.Iterator uIt = b.getUnits().iterator();
while (uIt.hasNext())
{
Unit u = (Unit)uIt.next();
StringBuffer n = new StringBuffer();
u.addTag(new StringTag("IN: "+na.getFlowBefore(u).toString()));
if (u.fallsThrough())
{
ArraySparseSet s = (ArraySparseSet)na.getFallFlowAfter(u);
u.addTag(new StringTag("FALL: "+s.toString()));
}
if (u.branches())
{
ArraySparseSet t = (ArraySparseSet)na.
getBranchFlowAfter(u).get(0);
u.addTag(new StringTag("BRANCH: "+t.toString()));
}
}
}
}