下面列出了怎么用org.objectweb.asm.tree.analysis.Value的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Determines if two frames are compatible.
*
* @param oldFrame
* @param afterRET
* @param interpreter2
* @return
*/
public boolean isMergeCompatible(StackFrame oldFrame, StackFrame afterRET) {
if (oldFrame == null || oldFrame.getStackSize() != afterRET.getStackSize()) {
return false;
}
boolean changes = false;
for (int i = 0; i < oldFrame.getLocals() + oldFrame.getStackSize(); ++i) {
Value v = afterRET.getStack(i);
if (v != null && !v.equals(oldFrame.getStack(i))) {
changes = true;
}
}
return changes;
}
@Override
public void execute(AbstractInsnNode insn, Interpreter interpreter) throws AnalyzerException {
boolean never = false;
if (never) {
super.execute(insn, interpreter);
return;
}
int insnOpcode = insn.getOpcode();
if (insnOpcode == Opcodes.MONITORENTER || insnOpcode == Opcodes.MONITOREXIT) {
Value pop = pop();
interpreter.unaryOperation(insn, pop);
int local = -1;
for (int i = 0; i < getLocals(); i++) {
if (getLocal(i) == pop) local = i;
}
if (local > -1) {
if (insnOpcode == Opcodes.MONITORENTER) {
monitorEnter(local);
} else {
monitorExit(local);
}
}
} else {
super.execute(insn, interpreter);
}
}
@Override
public void execute(AbstractInsnNode insn, Interpreter interpreter) throws AnalyzerException {
boolean never = false;
if (never) {
super.execute(insn, interpreter);
return;
}
int insnOpcode = insn.getOpcode();
if (insnOpcode == Opcodes.MONITORENTER || insnOpcode == Opcodes.MONITOREXIT) {
Value pop = pop();
interpreter.unaryOperation(insn, pop);
int local = -1;
for (int i = 0; i < getLocals(); i++) {
if (getLocal(i) == pop) local = i;
}
if (local > -1) {
if (insnOpcode == Opcodes.MONITORENTER) {
monitorEnter(local);
} else {
monitorExit(local);
}
}
} else {
super.execute(insn, interpreter);
}
}
@Override
public Value merge(Value v, Value w) {
if (!v.equals(w)) {
Type t = ((BasicValue)v).getType();
Type u = ((BasicValue)w).getType();
int tsort = t == null ? -1 : t.getSort();
if (tsort == Type.OBJECT || tsort == Type.ARRAY) {
int usort = u == null ? -1 : u.getSort();
if (usort == Type.OBJECT || usort == Type.ARRAY) {
if ("Lnull;".equals(t.getDescriptor())) {
return w;
}
if ("Lnull;".equals(u.getDescriptor())) {
return v;
}
if (isAssignableFrom(t, u)) {
return v;
}
if (isAssignableFrom(u, t)) {
return w;
}
return new BasicValue(classHierarchy.getCommonSuperType(t, u));
}
}
return BasicValue.UNINITIALIZED_VALUE;
}
return v;
}
@Override
public void execute(AbstractInsnNode insn, Interpreter interpreter) throws AnalyzerException {
boolean never = false;
if (never) {
super.execute(insn, interpreter);
return;
}
int insnOpcode = insn.getOpcode();
if (insnOpcode == Opcodes.MONITORENTER || insnOpcode == Opcodes.MONITOREXIT) {
Value pop = pop();
interpreter.unaryOperation(insn, pop);
int local = -1;
for (int i = 0; i < getLocals(); i++) {
if (getLocal(i) == pop) local = i;
}
if (local > -1) {
if (insnOpcode == Opcodes.MONITORENTER) {
monitorEnter(local);
} else {
monitorExit(local);
}
}
} else {
super.execute(insn, interpreter);
}
}