2013-01-31 20 views
0

ASM中是否有任何utils類允許我從操作碼中推斷指令是某種存儲,加載還是其他類型?ASM字節碼庫中用於操作碼性質確定的實用方法?

例如,考慮下面的代碼(從ASM)

/** 
* Visits a zero operand instruction. 
* 
* @param opcode the opcode of the instruction to be visited. This opcode is 
*  either NOP, ACONST_NULL, ICONST_M1, ICONST_0, ICONST_1, ICONST_2, 
*  ICONST_3, ICONST_4, ICONST_5, LCONST_0, LCONST_1, FCONST_0, 
*  FCONST_1, FCONST_2, DCONST_0, DCONST_1, IALOAD, LALOAD, FALOAD, 
*  DALOAD, AALOAD, BALOAD, CALOAD, SALOAD, IASTORE, LASTORE, FASTORE, 
*  DASTORE, AASTORE, BASTORE, CASTORE, SASTORE, POP, POP2, DUP, 
*  DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, SWAP, IADD, LADD, FADD, 
*  DADD, ISUB, LSUB, FSUB, DSUB, IMUL, LMUL, FMUL, DMUL, IDIV, LDIV, 
*  FDIV, DDIV, IREM, LREM, FREM, DREM, INEG, LNEG, FNEG, DNEG, ISHL, 
*  LSHL, ISHR, LSHR, IUSHR, LUSHR, IAND, LAND, IOR, LOR, IXOR, LXOR, 
*  I2L, I2F, I2D, L2I, L2F, L2D, F2I, F2L, F2D, D2I, D2L, D2F, I2B, 
*  I2C, I2S, LCMP, FCMPL, FCMPG, DCMPL, DCMPG, IRETURN, LRETURN, 
*  FRETURN, DRETURN, ARETURN, RETURN, ARRAYLENGTH, ATHROW, 
*  MONITORENTER, or MONITOREXIT. 
*/ 
public void visitInsn(int opcode) { 
    if (mv != null) { 
     mv.visitInsn(opcode); 
    } 
} 

這將是方便有方法如Utils.isConst(操作碼)或Utils.isLoad(操作碼)或Utils.isStore(操作碼)。

在ASM中有沒有類似的東西?

回答

1

看一看InstructionAdapter。它將操作碼轉換爲更粗粒度的方法調用。

+0

嗯。它似乎適合生成代碼。我實際上需要它做某種分析(例如,當給出操作碼X時,例如知道它是商店還是負載)。 –