下面列出了org.objectweb.asm.Opcodes# I2L ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public InsnValue convertValue(AbstractInsnNode insn, InsnValue value) {
Object obj = value.getValue();
switch (insn.getOpcode()) {
case Opcodes.I2L:
case Opcodes.D2L:
case Opcodes.F2L:
if (obj == null) {
return InsnValue.LONG_VALUE;
}
return InsnValue.longValue(((Number) obj).longValue());
case Opcodes.I2F:
case Opcodes.L2F:
case Opcodes.D2F:
if (obj == null) {
return InsnValue.FLOAT_VALUE;
}
return InsnValue.floatValue(((Number) obj).floatValue());
case Opcodes.L2I:
case Opcodes.F2I:
case Opcodes.D2I:
if (obj == null) {
return InsnValue.INT_VALUE;
}
return InsnValue.intValue(((Number) obj).intValue());
case Opcodes.I2D:
case Opcodes.L2D:
case Opcodes.F2D:
if (obj == null) {
return InsnValue.DOUBLE_VALUE;
}
return InsnValue.doubleValue(((Number) obj).doubleValue());
case Opcodes.I2B:
if (obj == null) {
return InsnValue.BYTE_VALUE;
}
return InsnValue.byteValue(((Number) obj).byteValue());
case Opcodes.I2C:
if (obj == null) {
return InsnValue.CHAR_VALUE;
}
return InsnValue.charValue(((Number) obj).intValue());
case Opcodes.I2S:
if (obj == null) {
return InsnValue.SHORT_VALUE;
}
return InsnValue.shortValue(((Number) obj).shortValue());
}
return null;
}
private List<AbstractInsnNode> getPossibleInsns(AbstractInsnNode ain)
{
List<AbstractInsnNode> instrs = new ArrayList<>();
while(ain != null)
{
if(ain instanceof LineNumberNode || ain instanceof FrameNode)
{
ain = ain.getNext();
continue;
}
instrs.add(ain);
if(instrs.size() >= 23)
break;
ain = ain.getNext();
}
if(instrs.size() == 23 && instrs.get(0).getOpcode() == Opcodes.ILOAD
&& instrs.get(1).getOpcode() == Opcodes.ICONST_1
&& instrs.get(2).getOpcode() == Opcodes.ISUB
&& instrs.get(3).getOpcode() == Opcodes.ISTORE)
{
int var1 = ((VarInsnNode)instrs.get(0)).var;
int var2 = ((VarInsnNode)instrs.get(3)).var;
if(instrs.get(4).getOpcode() == Opcodes.ILOAD
&& ((VarInsnNode)instrs.get(4)).var == var1
&& instrs.get(5).getOpcode() == Opcodes.ILOAD
&& ((VarInsnNode)instrs.get(5)).var == var2
&& instrs.get(6).getOpcode() == Opcodes.IMUL
&& instrs.get(7).getOpcode() == Opcodes.ISTORE
&& ((VarInsnNode)instrs.get(7)).var == var2
&& instrs.get(8).getOpcode() == Opcodes.ILOAD
&& ((VarInsnNode)instrs.get(8)).var == var2
&& instrs.get(9).getOpcode() == Opcodes.ICONST_2
&& instrs.get(10).getOpcode() == Opcodes.IREM
&& instrs.get(11).getOpcode() == Opcodes.ISTORE
&& ((VarInsnNode)instrs.get(11)).var == var2
&& instrs.get(12).getOpcode() == Opcodes.ILOAD
&& ((VarInsnNode)instrs.get(12)).var == var2
&& instrs.get(13).getOpcode() == Opcodes.I2L
&& instrs.get(14).getOpcode() == Opcodes.ICONST_0
&& instrs.get(15).getOpcode() == Opcodes.I2L
&& instrs.get(16).getOpcode() == Opcodes.LCMP
&& instrs.get(17).getOpcode() == Opcodes.ICONST_1
&& instrs.get(18).getOpcode() == Opcodes.IXOR
&& instrs.get(19).getOpcode() == Opcodes.ICONST_1
&& instrs.get(20).getOpcode() == Opcodes.IAND
&& instrs.get(21).getOpcode() == Opcodes.IFEQ
&& instrs.get(22).getOpcode() == Opcodes.IINC)
return instrs;
}
return null;
}
public static boolean isArithmeticOp(Instruction instr) {
switch (instr.getOpcode()) {
case Opcodes.ISHL:
case Opcodes.ISHR:
case Opcodes.LSHL:
case Opcodes.LSHR:
case Opcodes.IUSHR:
case Opcodes.LUSHR:
case Opcodes.DCMPG:
case Opcodes.DCMPL:
case Opcodes.FCMPG:
case Opcodes.FCMPL:
case Opcodes.LCMP:
case Opcodes.FNEG:
case Opcodes.DNEG:
case Opcodes.INEG:
case Opcodes.D2F:
case Opcodes.D2I:
case Opcodes.D2L:
case Opcodes.F2D:
case Opcodes.F2I:
case Opcodes.F2L:
case Opcodes.L2D:
case Opcodes.L2F:
case Opcodes.L2I:
case Opcodes.I2L:
case Opcodes.I2B:
case Opcodes.I2C:
case Opcodes.I2D:
case Opcodes.I2F:
case Opcodes.I2S:
case Opcodes.IOR:
case Opcodes.LOR:
case Opcodes.IXOR:
case Opcodes.LXOR:
case Opcodes.IAND:
case Opcodes.LAND:
case Opcodes.FADD:
case Opcodes.DADD:
case Opcodes.IADD:
case Opcodes.LADD:
case Opcodes.FSUB:
case Opcodes.DSUB:
case Opcodes.ISUB:
case Opcodes.LSUB:
case Opcodes.FDIV:
case Opcodes.DDIV:
case Opcodes.LDIV:
case Opcodes.IDIV:
case Opcodes.IREM:
case Opcodes.FREM:
case Opcodes.DREM:
case Opcodes.LREM:
case Opcodes.FMUL:
case Opcodes.DMUL:
case Opcodes.IMUL:
case Opcodes.LMUL:
return true;
}
return false;
}