package de.ecspride.instrumentation; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import soot.Scene; import soot.SootClass; import soot.SootMethod; import soot.Type; import soot.Value; import soot.jimple.Jimple; import soot.jimple.StaticInvokeExpr; public class Instrumentation { private static Logger log = LoggerFactory.getLogger(Instrumentation.class); public static StaticInvokeExpr createJimpleStaticInvokeExpr(String javaClass, String call, List<Object> args) { SootClass sootClass = Scene.v().getSootClass(javaClass); ArrayList<Type> argTypes = new ArrayList<Type>(); ArrayList<Value> argList = new ArrayList<Value>(); if (args != null) { if (args.size() % 2 != 0) { throw new RuntimeException( "Mismatched argument types:values in static call to " + call); } else { for (int i = 0; i < args.size(); i++) if (i % 2 == 0) // First type, then argument argTypes.add((Type) args.get(i)); else argList.add((Value) args.get(i)); } } SootMethod createAndAdd = sootClass.getMethod(call, argTypes); StaticInvokeExpr sie = Jimple.v().newStaticInvokeExpr( createAndAdd.makeRef(), argList); log.debug("new invoke expression: "+ sie); return sie; } }