package lto.instrument;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lto.libinfo.LibInfo;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.classfile.Method;
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.InstructionHandle;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.InvokeInstruction;
import org.apache.bcel.generic.MethodGen;
import org.apache.bcel.util.InstructionFinder;
import org.apache.bcel.util.InstructionFinder.CodeConstraint;
import static lto.Utils.*;
public class MethodTransformer
{
public LibInfo li;
public JavaClass jc;
public Method jm;
public MethodGen mg;
public ConstantPoolGen cpg;
public MethodTransformer(JavaClass jc, Method jm, LibInfo li)
{
this.jc = jc;
this.jm = jm;
this.li = li;
}
public void doStuff() throws Exception
{
cpg = new ConstantPoolGen(jc.getConstantPool());
mg = new MethodGen(jm, jc.getClassName(), cpg);
Map<Integer, Method> BM = getBM();
Map<Integer, Set<Integer>> BMV;
}
// get calls to base method calls
public Map<Integer, Method> getBM()
{
Map<Integer, Method> BM = new HashMap<Integer, Method>();
InstructionList il = mg.getInstructionList();
InstructionFinder f = new InstructionFinder(il);
String pat = "invokestatic";
CodeConstraint constraint = new CodeConstraint() {
public boolean checkCode(InstructionHandle[] match)
{
InvokeInstruction iv0 = (InvokeInstruction) match[0].getInstruction();
return li.BLM.contains(iv0.getMethodName(cpg));
}
};
for (Iterator<?> e = f.search(pat, constraint); e.hasNext();)
{
InstructionHandle[] match = (InstructionHandle[]) e.next();
InvokeInstruction iv0 = (InvokeInstruction) match[0].getInstruction();
BM.put(match[0].getPosition(), rlm(iv0.getMethodName(cpg)));
}
return BM;
}
// il.append(_factory.createInvoke("java.lang.Object", "<init>", Type.VOID,
// Type.NO_ARGS, Constants.INVOKESPECIAL));
}