package cute.instrument; import soot.jimple.*; import soot.util.Chain; import soot.*; /** * . * User: Koushik Sen (ksen@cs.uiuc.edu) * Date: Nov 7, 2005 * Time: 5:47:31 PM */ public class AddSyncMethodInstr { public static void instrument(InvokeExpr right,Chain units,Body body,Stmt s,boolean before,String mc,int lineNo){ if(right.getMethod().isSynchronized()){ if(right instanceof InstanceInvokeExpr){ AddCallWithObject.instrument(((InstanceInvokeExpr)right).getBase(),units,s,mc,before,lineNo); } else if(right instanceof StaticInvokeExpr){ Local tmpLocal = Jimple.v().newLocal("__ct_"+body.getLocalCount(),RefType.v("java.lang.Object")); body.getLocals().add(tmpLocal); SootMethodRef mr = Scene.v().getMethod("<cute.concolic.Call: java.lang.Class myClass(java.lang.String)>").makeRef(); String cname = ((StaticInvokeExpr) right).getMethod().getDeclaringClass().getName(); InvokeExpr ie = Jimple.v().newStaticInvokeExpr(mr,StringConstant.v(cname)); if(before){ units.insertBefore(Jimple.v().newAssignStmt(tmpLocal,ie),s); AddCallWithObject.instrument(tmpLocal,units,s,mc,before,lineNo); } else { AddCallWithObject.instrument(tmpLocal,units,s,mc,before,lineNo); units.insertAfter(Jimple.v().newAssignStmt(tmpLocal,ie),s); } } } else if(right instanceof InstanceInvokeExpr && right.getMethod().getSubSignature().indexOf("<init>")==-1){ AddCallWithObjectAndString.instrument(((InstanceInvokeExpr)right).getBase(),units,s,mc,before, right.getMethod().getSubSignature(),lineNo); } } }