package cute.instrument;
import soot.Body;
import soot.Value;
import soot.jimple.*;
import soot.util.Chain;
/**
* .
* User: Koushik Sen (ksen@cs.uiuc.edu)
* Date: Nov 7, 2005
* Time: 5:34:31 PM
*/
public class InstrumentAssignmentStatement {
public static void instrument(Stmt s, Body body, Chain units,boolean isConcurrent,SymbolTable st,int lineNo){
AssignStmt as = (AssignStmt)s;
Value left = as.getLeftOp();
if(left instanceof InstanceFieldRef){
if(((InstanceFieldRef)left).getField().getName().equals("this$0"))
return;
}
Value right = as.getRightOp();
if(isConcurrent){
if(left instanceof ArrayRef || left instanceof InstanceFieldRef || left instanceof StaticFieldRef){
AddCallWithAddress.instrument(left,units,s,"writeAccess",true,st,lineNo,false);
}
if(right instanceof ArrayRef || right instanceof InstanceFieldRef || right instanceof StaticFieldRef){
AddCallWithAddress.instrument(right,units,s,"readAccess",true,st,lineNo,false);
}
}
if(right instanceof InvokeExpr || right instanceof LengthExpr){
ParseExpr.instrument(body,right,left,units,s,st,isConcurrent,lineNo,false);
} else {
ParseExpr.instrument(body,right,left,units,s,st,isConcurrent,lineNo,false);
AddCallWithAddress.instrument(left,units,s,"store",true,st,lineNo,false);
}
}
}