package com.googlecode.dex2jar.reader;
import static com.googlecode.dex2jar.OdexOpcodes.*;
import static com.googlecode.dex2jar.reader.DexInternalOpcode.*;
/* default */enum OpcodeFormat {
F10t(1), F10x(1), F11n(1), F11x(1), F12x(1), // 1
F20bc(2), F20t(2), F21c(2), F21h(2), F21s(2), F21t(2), F22b(2), F22c(2), F22cs(2), F22s(2), F22t(2), F22x(2), F23x(
2), // 2
F30t(3), F31c(3), F31i(3), F31t(3), F32s(3), F32x(3), F33x(3), F35c(3), F35mi(3), F35ms(3), F3rc(3), F3rmi(3), F3rms(
3), // 3
F40sc(4), F41c(4), // 4
F51l(5), F52c(5), F5rc(5);// 5
OpcodeFormat(int size) {
this.size = size;
}
private int size;
public int getSize() {
return size;
}
public static OpcodeFormat get(int opcode, int apiLevel) {
switch (opcode) {
case 0x00F0:// OP_INVOKE_DIRECT_EMPTY,OP_INVOKE_OBJECT_INIT_RANGE
if (apiLevel < 14) {
return F35c;
} else {
return F3rc;
}
case OP_GOTO:
return F10t;
case OP_NOP:
case OP_RETURN_VOID:
case OP_RETURN_VOID_BARRIER:
return F10x;
case OP_CONST_4:
return F11n;
case OP_MOVE_RESULT:
case OP_MOVE_RESULT_WIDE:
case OP_MOVE_RESULT_OBJECT:
case OP_MOVE_EXCEPTION:
case OP_RETURN:
case OP_RETURN_WIDE:
case OP_RETURN_OBJECT:
case OP_MONITOR_ENTER:
case OP_MONITOR_EXIT:
case OP_THROW:
return F11x;
case OP_MOVE:
case OP_MOVE_WIDE:
case OP_MOVE_OBJECT:
case OP_ARRAY_LENGTH:
case OP_NEG_INT:
case OP_NOT_INT:
case OP_NEG_LONG:
case OP_NOT_LONG:
case OP_NEG_FLOAT:
case OP_NEG_DOUBLE:
case OP_INT_TO_LONG:
case OP_INT_TO_FLOAT:
case OP_INT_TO_DOUBLE:
case OP_LONG_TO_INT:
case OP_LONG_TO_FLOAT:
case OP_LONG_TO_DOUBLE:
case OP_FLOAT_TO_INT:
case OP_FLOAT_TO_LONG:
case OP_FLOAT_TO_DOUBLE:
case OP_DOUBLE_TO_INT:
case OP_DOUBLE_TO_LONG:
case OP_DOUBLE_TO_FLOAT:
case OP_INT_TO_BYTE:
case OP_INT_TO_CHAR:
case OP_INT_TO_SHORT:
case OP_ADD_INT_2ADDR:
case OP_SUB_INT_2ADDR:
case OP_MUL_INT_2ADDR:
case OP_DIV_INT_2ADDR:
case OP_REM_INT_2ADDR:
case OP_AND_INT_2ADDR:
case OP_OR_INT_2ADDR:
case OP_XOR_INT_2ADDR:
case OP_SHL_INT_2ADDR:
case OP_SHR_INT_2ADDR:
case OP_USHR_INT_2ADDR:
case OP_ADD_LONG_2ADDR:
case OP_SUB_LONG_2ADDR:
case OP_MUL_LONG_2ADDR:
case OP_DIV_LONG_2ADDR:
case OP_REM_LONG_2ADDR:
case OP_AND_LONG_2ADDR:
case OP_OR_LONG_2ADDR:
case OP_XOR_LONG_2ADDR:
case OP_SHL_LONG_2ADDR:
case OP_SHR_LONG_2ADDR:
case OP_USHR_LONG_2ADDR:
case OP_ADD_FLOAT_2ADDR:
case OP_SUB_FLOAT_2ADDR:
case OP_MUL_FLOAT_2ADDR:
case OP_DIV_FLOAT_2ADDR:
case OP_REM_FLOAT_2ADDR:
case OP_ADD_DOUBLE_2ADDR:
case OP_SUB_DOUBLE_2ADDR:
case OP_MUL_DOUBLE_2ADDR:
case OP_DIV_DOUBLE_2ADDR:
case OP_REM_DOUBLE_2ADDR:
return F12x;
case OP_THROW_VERIFICATION_ERROR:
return F20bc;
case OP_GOTO_16:
return F20t;
case OP_CONST_STRING:
case OP_CONST_CLASS:
case OP_CHECK_CAST:
case OP_NEW_INSTANCE:
case OP_SGET:
case OP_SGET_WIDE:
case OP_SGET_OBJECT:
case OP_SGET_BOOLEAN:
case OP_SGET_BYTE:
case OP_SGET_CHAR:
case OP_SGET_SHORT:
case OP_SPUT:
case OP_SPUT_WIDE:
case OP_SPUT_OBJECT:
case OP_SPUT_BOOLEAN:
case OP_SPUT_BYTE:
case OP_SPUT_CHAR:
case OP_SPUT_SHORT:
case OP_SGET_VOLATILE:
case OP_SPUT_VOLATILE:
case OP_SGET_WIDE_VOLATILE:
case OP_SPUT_WIDE_VOLATILE:
case OP_SGET_OBJECT_VOLATILE:
case OP_SPUT_OBJECT_VOLATILE:
return F21c;
case OP_CONST_HIGH16:
case OP_CONST_WIDE_HIGH16:
return F21h;
case OP_CONST_16:
case OP_CONST_WIDE_16:
return F21s;
case OP_IF_EQZ:
case OP_IF_NEZ:
case OP_IF_LTZ:
case OP_IF_GEZ:
case OP_IF_GTZ:
case OP_IF_LEZ:
return F21t;
case OP_ADD_INT_LIT8:
case OP_RSUB_INT_LIT8:
case OP_MUL_INT_LIT8:
case OP_DIV_INT_LIT8:
case OP_REM_INT_LIT8:
case OP_AND_INT_LIT8:
case OP_OR_INT_LIT8:
case OP_XOR_INT_LIT8:
case OP_SHL_INT_LIT8:
case OP_SHR_INT_LIT8:
case OP_USHR_INT_LIT8:
return F22b;
case OP_INSTANCE_OF:
case OP_NEW_ARRAY:
case OP_IGET:
case OP_IGET_WIDE:
case OP_IGET_OBJECT:
case OP_IGET_BOOLEAN:
case OP_IGET_BYTE:
case OP_IGET_CHAR:
case OP_IGET_SHORT:
case OP_IPUT:
case OP_IPUT_WIDE:
case OP_IPUT_OBJECT:
case OP_IPUT_BOOLEAN:
case OP_IPUT_BYTE:
case OP_IPUT_CHAR:
case OP_IPUT_SHORT:
case OP_IGET_VOLATILE:
case OP_IPUT_VOLATILE:
case OP_IGET_OBJECT_VOLATILE:
case OP_IGET_WIDE_VOLATILE:
case OP_IPUT_WIDE_VOLATILE:
case OP_IPUT_OBJECT_VOLATILE:
return F22c;
case OP_IGET_QUICK:
case OP_IGET_WIDE_QUICK:
case OP_IGET_OBJECT_QUICK:
case OP_IPUT_QUICK:
case OP_IPUT_WIDE_QUICK:
case OP_IPUT_OBJECT_QUICK:
return F22cs;
case OP_ADD_INT_LIT16:
case OP_RSUB_INT:
case OP_MUL_INT_LIT16:
case OP_DIV_INT_LIT16:
case OP_REM_INT_LIT16:
case OP_AND_INT_LIT16:
case OP_OR_INT_LIT16:
case OP_XOR_INT_LIT16:
return F22s;
case OP_IF_EQ:
case OP_IF_NE:
case OP_IF_LT:
case OP_IF_GE:
case OP_IF_GT:
case OP_IF_LE:
return F22t;
case OP_MOVE_FROM16:
case OP_MOVE_WIDE_FROM16:
case OP_MOVE_OBJECT_FROM16:
return F22x;
case OP_CMPL_FLOAT:
case OP_CMPG_FLOAT:
case OP_CMPL_DOUBLE:
case OP_CMPG_DOUBLE:
case OP_CMP_LONG:
case OP_AGET:
case OP_AGET_WIDE:
case OP_AGET_OBJECT:
case OP_AGET_BOOLEAN:
case OP_AGET_BYTE:
case OP_AGET_CHAR:
case OP_AGET_SHORT:
case OP_APUT:
case OP_APUT_WIDE:
case OP_APUT_OBJECT:
case OP_APUT_BOOLEAN:
case OP_APUT_BYTE:
case OP_APUT_CHAR:
case OP_APUT_SHORT:
case OP_ADD_INT:
case OP_SUB_INT:
case OP_MUL_INT:
case OP_DIV_INT:
case OP_REM_INT:
case OP_AND_INT:
case OP_OR_INT:
case OP_XOR_INT:
case OP_SHL_INT:
case OP_SHR_INT:
case OP_USHR_INT:
case OP_ADD_LONG:
case OP_SUB_LONG:
case OP_MUL_LONG:
case OP_DIV_LONG:
case OP_REM_LONG:
case OP_AND_LONG:
case OP_OR_LONG:
case OP_XOR_LONG:
case OP_SHL_LONG:
case OP_SHR_LONG:
case OP_USHR_LONG:
case OP_ADD_FLOAT:
case OP_SUB_FLOAT:
case OP_MUL_FLOAT:
case OP_DIV_FLOAT:
case OP_REM_FLOAT:
case OP_ADD_DOUBLE:
case OP_SUB_DOUBLE:
case OP_MUL_DOUBLE:
case OP_DIV_DOUBLE:
case OP_REM_DOUBLE:
return F23x;
case OP_GOTO_32:
return F30t;
case OP_CONST_STRING_JUMBO:
return F31c;
case OP_CONST:
case OP_CONST_WIDE_32:
return F31i;
case OP_FILL_ARRAY_DATA:
case OP_PACKED_SWITCH:
case OP_SPARSE_SWITCH:
return F31t;
case OP_MOVE_16:
case OP_MOVE_WIDE_16:
case OP_MOVE_OBJECT_16:
return F32x;
case OP_FILLED_NEW_ARRAY:
case OP_INVOKE_VIRTUAL:
case OP_INVOKE_SUPER:
case OP_INVOKE_DIRECT:
case OP_INVOKE_STATIC:
case OP_INVOKE_INTERFACE:
return F35c;
case OP_EXECUTE_INLINE:
return F35mi;
case OP_INVOKE_VIRTUAL_QUICK:
case OP_INVOKE_SUPER_QUICK:
return F35ms;
case OP_FILLED_NEW_ARRAY_RANGE:
case OP_INVOKE_VIRTUAL_RANGE:
case OP_INVOKE_SUPER_RANGE:
case OP_INVOKE_DIRECT_RANGE:
case OP_INVOKE_STATIC_RANGE:
case OP_INVOKE_INTERFACE_RANGE:
return F3rc;
case OP_EXECUTE_INLINE_RANGE:
return F3rmi;
case OP_INVOKE_VIRTUAL_QUICK_RANGE:
case OP_INVOKE_SUPER_QUICK_RANGE:
return F3rms;
case OP_CONST_CLASS_JUMBO:
case OP_CHECK_CAST_JUMBO:
case OP_NEW_INSTANCE_JUMBO:
case OP_SGET_JUMBO:
case OP_SGET_WIDE_JUMBO:
case OP_SGET_OBJECT_JUMBO:
case OP_SGET_BOOLEAN_JUMBO:
case OP_SGET_BYTE_JUMBO:
case OP_SGET_CHAR_JUMBO:
case OP_SGET_SHORT_JUMBO:
case OP_SPUT_JUMBO:
case OP_SPUT_WIDE_JUMBO:
case OP_SPUT_OBJECT_JUMBO:
case OP_SPUT_BOOLEAN_JUMBO:
case OP_SPUT_BYTE_JUMBO:
case OP_SPUT_CHAR_JUMBO:
case OP_SPUT_SHORT_JUMBO:
case OP_SGET_VOLATILE_JUMBO:
case OP_SGET_WIDE_VOLATILE_JUMBO:
case OP_SGET_OBJECT_VOLATILE_JUMBO:
case OP_SPUT_VOLATILE_JUMBO:
case OP_SPUT_WIDE_VOLATILE_JUMBO:
case OP_SPUT_OBJECT_VOLATILE_JUMBO:
return F41c;
case OP_CONST_WIDE:
return F51l;
case OP_INSTANCE_OF_JUMBO:
case OP_NEW_ARRAY_JUMBO:
case OP_IGET_JUMBO:
case OP_IGET_WIDE_JUMBO:
case OP_IGET_OBJECT_JUMBO:
case OP_IGET_BOOLEAN_JUMBO:
case OP_IGET_BYTE_JUMBO:
case OP_IGET_CHAR_JUMBO:
case OP_IGET_SHORT_JUMBO:
case OP_IPUT_JUMBO:
case OP_IPUT_WIDE_JUMBO:
case OP_IPUT_OBJECT_JUMBO:
case OP_IPUT_BOOLEAN_JUMBO:
case OP_IPUT_BYTE_JUMBO:
case OP_IPUT_CHAR_JUMBO:
case OP_IPUT_SHORT_JUMBO:
case OP_IGET_VOLATILE_JUMBO:
case OP_IGET_WIDE_VOLATILE_JUMBO:
case OP_IGET_OBJECT_VOLATILE_JUMBO:
case OP_IPUT_VOLATILE_JUMBO:
case OP_IPUT_WIDE_VOLATILE_JUMBO:
case OP_IPUT_OBJECT_VOLATILE_JUMBO:
return F52c;
case OP_FILLED_NEW_ARRAY_JUMBO:
case OP_INVOKE_VIRTUAL_JUMBO:
case OP_INVOKE_SUPER_JUMBO:
case OP_INVOKE_DIRECT_JUMBO:
case OP_INVOKE_STATIC_JUMBO:
case OP_INVOKE_INTERFACE_JUMBO:
case OP_INVOKE_OBJECT_INIT_JUMBO:
return F5rc;
default:
System.out.println("opcode format for " + opcode + " not found!");
return null;
}
// throw new RuntimeException("opcode format for " + opcode + " not found!");
}
}