package cute.instrument;
import soot.*;
import soot.jimple.Stmt;
import soot.jimple.Jimple;
import soot.jimple.AssignStmt;
import soot.jimple.IntConstant;
import soot.util.Chain;
/**
* .
* User: Koushik Sen (ksen@cs.uiuc.edu)
* Date: Nov 7, 2005
* Time: 5:52:15 PM
*/
public class AddCallWithValue {
public static void instrument(Body b, Value v, Chain units, Stmt s, Type t, String type, int lineNo, String call, boolean before){
SootMethodRef mr = Scene.v().getMethod("<cute.concolic.Call: void "+call+"("+type+",int)>").makeRef();
Local tmpLocal = Jimple.v().newLocal("__ct_"+b.getLocalCount(),t);
b.getLocals().add(tmpLocal);
AssignStmt as = null;
as = Jimple.v().newAssignStmt(tmpLocal,v);
if(before){
units.insertBefore(as,s);
units.insertBefore(Jimple.v().newInvokeStmt(
Jimple.v().newStaticInvokeExpr(mr,tmpLocal,IntConstant.v(lineNo))),s);
} else {
units.insertAfter(Jimple.v().newInvokeStmt(
Jimple.v().newStaticInvokeExpr(mr,tmpLocal,IntConstant.v(lineNo))),s);
units.insertAfter(as,s);
}
}
}