Java 类org.objectweb.asm.tree.analysis.SourceValue 实例源码
项目:evosuite
文件:BytecodeInstruction.java
/**
* This method returns the BytecodeInstruction that loaded the reference
* which is located on top of the stack minus positionFromTop when this
* instruction is executed.
*
* This is done using the CFGFrame created by the SourceInterpreter() of the
* BytecodeAnalyzer via the CFGGenerator
*
* Note that this method may return null. This can happen when aliasing is
* involved. For example for method invocations on objects this can happen
* when you first store the object in a local variable and then call a
* method on that variable
*
* see PairTestClass.sourceCallerTest() for an even worse example.
*
* TODO: this could be done better by following the SourceValues even
* further.
*/
public BytecodeInstruction getSourceOfStackInstruction(int positionFromTop) {
if (frame == null)
throw new IllegalStateException(
"expect each BytecodeInstruction to have its CFGFrame set");
int stackPos = frame.getStackSize() - (1 + positionFromTop);
if (stackPos < 0){
StackTraceElement[] se = new Throwable().getStackTrace();
int t=0;
System.out.println("Stack trace: ");
while(t<se.length){
System.out.println(se[t]);
t++;
}
return null;
}
SourceValue source = (SourceValue) frame.getStack(stackPos);
if (source.insns.size() != 1) {
// we don't know for sure, let's be conservative
return null;
}
Object sourceIns = source.insns.iterator().next();
AbstractInsnNode sourceInstruction = (AbstractInsnNode) sourceIns;
BytecodeInstruction src = BytecodeInstructionPool.getInstance(classLoader).getInstruction(className,
methodName,
sourceInstruction);
return src;
}
项目:svm-fasttagging
文件:WeavingCode.java
private InsnList procAtCallSite(final ProcInstance processor) throws InvalidContextUsageException {
final Frame <SourceValue> frame = info.getSourceFrame (weavingLoc);
final InsnList result = new InsnList();
for (final ProcMethodInstance pmi : processor.getMethods ()) {
final Code code = pmi.getCode ().clone ();
final int index = pmi.getArgPos ();
final int total = pmi.getArgsCount ();
final Type type = pmi.getArgType ().getASMType ();
final InsnList insns = code.getInstructions ();
rewriteArgumentContextCalls (index, total, type, insns);
// Duplicate call site arguments and store them into local vars.
final SourceValue source = FrameHelper.getStackByIndex (frame, total - 1 - index);
for (final AbstractInsnNode argLoadInsn : source.insns) {
// TRICK: the value has to be set properly because
// method code will be not adjusted by fixLocalIndex
method.instructions.insert (argLoadInsn, AsmHelper.storeVar (type, method.maxLocals + maxLocals));
method.instructions.insert (argLoadInsn, new InsnNode (type.getSize () == 2 ? Opcodes.DUP2 : Opcodes.DUP));
}
__shiftLocalSlots (maxLocals, insns);
maxLocals = __calcMaxLocals (maxLocals + type.getSize(), insns);
result.add (insns);
method.tryCatchBlocks.addAll (code.getTryCatchBlocks ());
}
return result;
}
项目:svm-fasttagging
文件:PartialEvaluator.java
private void tryRemoveAllocation(InsnList ilist, AbstractInsnNode next,
Map<AbstractInsnNode, Frame<SourceValue>> frames) {
if (next.getOpcode() != Opcodes.DUP) {
return;
}
// TODO LB: iterate over a copy unless we are sure an iterator is OK
for (AbstractInsnNode instr : ilist.toArray()) {
if (instr.getOpcode() == Opcodes.INVOKESPECIAL) {
Type[] args = Type
.getArgumentTypes(((MethodInsnNode) instr).desc);
Frame<SourceValue> frame = frames.get(instr);
Set<AbstractInsnNode> sources = FrameHelper.getStackByIndex(
frame, args.length).insns;
if (sources.contains(next)) {
for (Type arg : args) {
ilist.insert(instr,
new InsnNode(arg.getSize() == 2 ? Opcodes.POP2
: Opcodes.POP));
}
ilist.remove(instr);
}
}
}
ilist.remove(next);
}
项目:svm-fasttagging
文件:WeavingInfo.java
public Frame<SourceValue> getSourceFrame(AbstractInsnNode instr) {
return sourceFrameMap.get(instr);
}
项目:svm-fasttagging
文件:PartialEvaluator.java
private boolean removePop() {
Map<AbstractInsnNode, Frame<SourceValue>> frames =
FrameHelper.createSourceMapping(PartialEvaluator.class.getName(), method);
boolean isOptimized = false;
// TODO LB: iterate over a copy unless we are sure an iterator is OK
for (AbstractInsnNode instr : ilist.toArray()) {
int opcode = instr.getOpcode();
if (opcode != Opcodes.POP && opcode != Opcodes.POP2) {
continue;
}
Frame<SourceValue> frame = frames.get(instr);
if (frame == null) {
continue;
}
Set<AbstractInsnNode> sources = FrameHelper.getStackByIndex(frame, 0).insns;
if (unremovablePop(sources)) {
continue;
}
for (AbstractInsnNode source : sources) {
switch (source.getOpcode()) {
case Opcodes.INVOKESPECIAL:
case Opcodes.INVOKEVIRTUAL:
case Opcodes.INVOKESTATIC:
tryRemoveInvocation(ilist, (MethodInsnNode) source);
break;
case Opcodes.NEW:
tryRemoveAllocation(ilist, source.getNext(), frames);
break;
default:
break;
}
ilist.remove(source);
}
ilist.remove(instr);
isOptimized = true;
}
return isOptimized;
}
项目:svm-fasttagging
文件:FrameHelper.java
public static Analyzer<SourceValue> getSourceAnalyzer() {
return new Analyzer<SourceValue>(new SourceInterpreter());
}
项目:svm-fasttagging
文件:FrameHelper.java
public static int dupStack (
Frame <SourceValue> frame, MethodNode method,
int operand, Type type, int slot
) {
SourceValue source = getStackByIndex (frame, operand);
for (final AbstractInsnNode insn : source.insns) {
// if the instruction duplicates two-size operand(s), weaver should
// be careful that the operand might be either 2 one-size operands,
// or 1 two-size operand.
switch (insn.getOpcode()) {
case Opcodes.DUP2:
if (source.size != 1) {
break;
}
dupStack (frame, method, operand + 2, type, slot);
continue;
case Opcodes.DUP2_X1:
if (source.size != 1) {
break;
}
dupStack (frame, method, operand + 3, type, slot);
continue;
case Opcodes.DUP2_X2:
if (source.size != 1) {
break;
}
SourceValue x2 = getStackByIndex (frame, operand + 2);
dupStack (frame, method, operand + (4 - x2.size), type, slot);
continue;
case Opcodes.SWAP:
if (operand > 0 &&
getStackByIndex (frame, operand - 1).insns.contains (insn)
) {
// insert 'dup' instruction and then store to a local slot
method.instructions.insertBefore (
insn, new InsnNode (Opcodes.DUP)
);
method.instructions.insertBefore (
insn, AsmHelper.storeVar (type, slot)
);
continue;
}
default:
break;
}
// insert 'dup' instruction and then store to a local slot
method.instructions.insert (insn, AsmHelper.storeVar (type, slot));
method.instructions.insert (
insn, new InsnNode (source.size == 2 ? Opcodes.DUP2 : Opcodes.DUP)
);
}
return source.size;
}
项目:svm-fasttagging
文件:FrameHelper.java
public static Frame<SourceValue>[] getSourceFrames(String clazz,
MethodNode method) {
return getFrames(getSourceAnalyzer(), clazz, method);
}
项目:svm-fasttagging
文件:FrameHelper.java
public static Map<AbstractInsnNode, Frame<SourceValue>> createSourceMapping(
String clazz, MethodNode method) {
return createMapping(getSourceAnalyzer(), clazz, method);
}