std::string show_opcode()

in libredex/Show.cpp [212:896]


std::string show_opcode(const DexInstruction* insn, bool deobfuscated = false) {
  if (!insn) return "";
  std::ostringstream ss;
  auto opcode = insn->opcode();
  switch (opcode) {
  case DOPCODE_NOP:
    return "nop";
  case DOPCODE_MOVE:
    return "move";
  case DOPCODE_MOVE_WIDE:
    return "move-wide";
  case DOPCODE_MOVE_OBJECT:
    return "move-object";
  case DOPCODE_MOVE_RESULT:
    return "move-result";
  case DOPCODE_MOVE_RESULT_WIDE:
    return "move-result-wide";
  case DOPCODE_MOVE_RESULT_OBJECT:
    return "move-result-object";
  case DOPCODE_MOVE_EXCEPTION:
    return "move-exception";
  case DOPCODE_RETURN_VOID:
    return "return-void";
  case DOPCODE_RETURN:
    return "return";
  case DOPCODE_RETURN_WIDE:
    return "return-wide";
  case DOPCODE_RETURN_OBJECT:
    return "return-object";
  case DOPCODE_CONST_4:
    return "const/4";
  case DOPCODE_MONITOR_ENTER:
    return "monitor-enter";
  case DOPCODE_MONITOR_EXIT:
    return "monitor-exit";
  case DOPCODE_THROW:
    return "throw";
  case DOPCODE_GOTO:
    return "goto";
  case DOPCODE_NEG_INT:
    return "neg-int";
  case DOPCODE_NOT_INT:
    return "not-int";
  case DOPCODE_NEG_LONG:
    return "neg-long";
  case DOPCODE_NOT_LONG:
    return "not-long";
  case DOPCODE_NEG_FLOAT:
    return "neg-float";
  case DOPCODE_NEG_DOUBLE:
    return "neg-double";
  case DOPCODE_INT_TO_LONG:
    return "int-to-long";
  case DOPCODE_INT_TO_FLOAT:
    return "int-to-float";
  case DOPCODE_INT_TO_DOUBLE:
    return "int-to-double";
  case DOPCODE_LONG_TO_INT:
    return "long-to-int";
  case DOPCODE_LONG_TO_FLOAT:
    return "long-to-float";
  case DOPCODE_LONG_TO_DOUBLE:
    return "long-to-double";
  case DOPCODE_FLOAT_TO_INT:
    return "float-to-int";
  case DOPCODE_FLOAT_TO_LONG:
    return "float-to-long";
  case DOPCODE_FLOAT_TO_DOUBLE:
    return "float-to-double";
  case DOPCODE_DOUBLE_TO_INT:
    return "double-to-int";
  case DOPCODE_DOUBLE_TO_LONG:
    return "double-to-long";
  case DOPCODE_DOUBLE_TO_FLOAT:
    return "double-to-float";
  case DOPCODE_INT_TO_BYTE:
    return "int-to-byte";
  case DOPCODE_INT_TO_CHAR:
    return "int-to-char";
  case DOPCODE_INT_TO_SHORT:
    return "int-to-short";
  case DOPCODE_ARRAY_LENGTH:
    return "array-length";
  case DOPCODE_MOVE_FROM16:
    return "move/from16";
  case DOPCODE_MOVE_WIDE_FROM16:
    return "move-wide/from16";
  case DOPCODE_MOVE_OBJECT_FROM16:
    return "move-object/from16";
  case DOPCODE_CONST_16:
    return "const/16";
  case DOPCODE_CONST_HIGH16:
    return "const/high16";
  case DOPCODE_CONST_WIDE_16:
    return "const-wide/16";
  case DOPCODE_CONST_WIDE_HIGH16:
    return "const-wide/high16";
  case DOPCODE_GOTO_16:
    return "goto/16";
  case DOPCODE_CMPL_FLOAT:
    return "cmpl-float";
  case DOPCODE_CMPG_FLOAT:
    return "cmpg-float";
  case DOPCODE_CMPL_DOUBLE:
    return "cmpl-double";
  case DOPCODE_CMPG_DOUBLE:
    return "cmpg-double";
  case DOPCODE_CMP_LONG:
    return "cmp-long";
  case DOPCODE_IF_EQ:
    return "if-eq";
  case DOPCODE_IF_NE:
    return "if-ne";
  case DOPCODE_IF_LT:
    return "if-lt";
  case DOPCODE_IF_GE:
    return "if-ge";
  case DOPCODE_IF_GT:
    return "if-gt";
  case DOPCODE_IF_LE:
    return "if-le";
  case DOPCODE_IF_EQZ:
    return "if-eqz";
  case DOPCODE_IF_NEZ:
    return "if-nez";
  case DOPCODE_IF_LTZ:
    return "if-ltz";
  case DOPCODE_IF_GEZ:
    return "if-gez";
  case DOPCODE_IF_GTZ:
    return "if-gtz";
  case DOPCODE_IF_LEZ:
    return "if-lez";
  case DOPCODE_AGET:
    return "aget";
  case DOPCODE_AGET_WIDE:
    return "aget-wide";
  case DOPCODE_AGET_OBJECT:
    return "aget-object";
  case DOPCODE_AGET_BOOLEAN:
    return "aget-boolean";
  case DOPCODE_AGET_BYTE:
    return "aget-byte";
  case DOPCODE_AGET_CHAR:
    return "aget-char";
  case DOPCODE_AGET_SHORT:
    return "aget-short";
  case DOPCODE_APUT:
    return "aput";
  case DOPCODE_APUT_WIDE:
    return "aput-wide";
  case DOPCODE_APUT_OBJECT:
    return "aput-object";
  case DOPCODE_APUT_BOOLEAN:
    return "aput-boolean";
  case DOPCODE_APUT_BYTE:
    return "aput-byte";
  case DOPCODE_APUT_CHAR:
    return "aput-char";
  case DOPCODE_APUT_SHORT:
    return "aput-short";
  case DOPCODE_ADD_INT:
    return "add-int";
  case DOPCODE_SUB_INT:
    return "sub-int";
  case DOPCODE_MUL_INT:
    return "mul-int";
  case DOPCODE_DIV_INT:
    return "div-int";
  case DOPCODE_REM_INT:
    return "rem-int";
  case DOPCODE_AND_INT:
    return "and-int";
  case DOPCODE_OR_INT:
    return "or-int";
  case DOPCODE_XOR_INT:
    return "xor-int";
  case DOPCODE_SHL_INT:
    return "shl-int";
  case DOPCODE_SHR_INT:
    return "shr-int";
  case DOPCODE_USHR_INT:
    return "ushr-int";
  case DOPCODE_ADD_LONG:
    return "add-long";
  case DOPCODE_SUB_LONG:
    return "sub-long";
  case DOPCODE_MUL_LONG:
    return "mul-long";
  case DOPCODE_DIV_LONG:
    return "div-long";
  case DOPCODE_REM_LONG:
    return "rem-long";
  case DOPCODE_AND_LONG:
    return "and-long";
  case DOPCODE_OR_LONG:
    return "or-long";
  case DOPCODE_XOR_LONG:
    return "xor-long";
  case DOPCODE_SHL_LONG:
    return "shl-long";
  case DOPCODE_SHR_LONG:
    return "shr-long";
  case DOPCODE_USHR_LONG:
    return "ushr-long";
  case DOPCODE_ADD_FLOAT:
    return "add-float";
  case DOPCODE_SUB_FLOAT:
    return "sub-float";
  case DOPCODE_MUL_FLOAT:
    return "mul-float";
  case DOPCODE_DIV_FLOAT:
    return "div-float";
  case DOPCODE_REM_FLOAT:
    return "rem-float";
  case DOPCODE_ADD_DOUBLE:
    return "add-double";
  case DOPCODE_SUB_DOUBLE:
    return "sub-double";
  case DOPCODE_MUL_DOUBLE:
    return "mul-double";
  case DOPCODE_DIV_DOUBLE:
    return "div-double";
  case DOPCODE_REM_DOUBLE:
    return "rem-double";
  case DOPCODE_ADD_INT_LIT16:
    return "add-int/lit16";
  case DOPCODE_RSUB_INT:
    return "rsub-int";
  case DOPCODE_MUL_INT_LIT16:
    return "mul-int/lit16";
  case DOPCODE_DIV_INT_LIT16:
    return "div-int/lit16";
  case DOPCODE_REM_INT_LIT16:
    return "rem-int/lit16";
  case DOPCODE_AND_INT_LIT16:
    return "and-int/lit16";
  case DOPCODE_OR_INT_LIT16:
    return "or-int/lit16";
  case DOPCODE_XOR_INT_LIT16:
    return "xor-int/lit16";
  case DOPCODE_ADD_INT_LIT8:
    return "add-int/lit8";
  case DOPCODE_RSUB_INT_LIT8:
    return "rsub-int/lit8";
  case DOPCODE_MUL_INT_LIT8:
    return "mul-int/lit8";
  case DOPCODE_DIV_INT_LIT8:
    return "div-int/lit8";
  case DOPCODE_REM_INT_LIT8:
    return "rem-int/lit8";
  case DOPCODE_AND_INT_LIT8:
    return "and-int/lit8";
  case DOPCODE_OR_INT_LIT8:
    return "or-int/lit8";
  case DOPCODE_XOR_INT_LIT8:
    return "xor-int/lit8";
  case DOPCODE_SHL_INT_LIT8:
    return "shl-int/lit8";
  case DOPCODE_SHR_INT_LIT8:
    return "shr-int/lit8";
  case DOPCODE_USHR_INT_LIT8:
    return "ushr-int/lit8";
  case DOPCODE_MOVE_16:
    return "move/16";
  case DOPCODE_MOVE_WIDE_16:
    return "move-wide/16";
  case DOPCODE_MOVE_OBJECT_16:
    return "move-object/16";
  case DOPCODE_CONST:
    return "const";
  case DOPCODE_CONST_WIDE_32:
    return "const-wide/32";
  case DOPCODE_FILL_ARRAY_DATA:
    return "fill-array-data";
  case DOPCODE_GOTO_32:
    return "goto/32";
  case DOPCODE_PACKED_SWITCH:
    return "packed-switch";
  case DOPCODE_SPARSE_SWITCH:
    return "sparse-switch";
  case DOPCODE_CONST_WIDE:
    return "const-wide";
  // field opcode
  case DOPCODE_IGET:
    ss << "iget ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_WIDE:
    ss << "iget-wide ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_OBJECT:
    ss << "iget-object ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_BOOLEAN:
    ss << "iget-boolean ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_BYTE:
    ss << "iget-byte ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_CHAR:
    ss << "iget-char ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_SHORT:
    ss << "iget-short ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT:
    ss << "iput ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_WIDE:
    ss << "iput-wide ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_OBJECT:
    ss << "iput-object ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_BOOLEAN:
    ss << "iput-boolean ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_BYTE:
    ss << "iput-byte ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_CHAR:
    ss << "iput-char ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_SHORT:
    ss << "iput-short ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET:
    ss << "sget ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET_WIDE:
    ss << "sget-wide ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET_OBJECT:
    ss << "sget-object ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET_BOOLEAN:
    ss << "sget-boolean ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET_BYTE:
    ss << "sget-byte ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET_CHAR:
    ss << "sget-char ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SGET_SHORT:
    ss << "sget-short ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT:
    ss << "sput ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT_WIDE:
    ss << "sput-wide ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT_OBJECT:
    ss << "sput-object ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT_BOOLEAN:
    ss << "sput-boolean ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT_BYTE:
    ss << "sput-byte ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT_CHAR:
    ss << "sput-char ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_SPUT_SHORT:
    ss << "sput-short ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_VIRTUAL:
    ss << "invoke-virtual ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_SUPER:
    ss << "invoke-super ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_DIRECT:
    ss << "invoke-direct ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_STATIC:
    ss << "invoke-static ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_INTERFACE:
    ss << "invoke-interface ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_VIRTUAL_RANGE:
    ss << "invoke-virtual/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_SUPER_RANGE:
    ss << "invoke-super/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_DIRECT_RANGE:
    ss << "invoke-direct/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_STATIC_RANGE:
    ss << "invoke-static/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_INTERFACE_RANGE:
    ss << "invoke-interface/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_CONST_STRING:
    ss << "const-string "
       << show(static_cast<const DexOpcodeString*>(insn)->get_string());
    return ss.str();
  case DOPCODE_CONST_STRING_JUMBO:
    ss << "const-string/jumbo "
       << show(static_cast<const DexOpcodeString*>(insn)->get_string());
    return ss.str();
  case DOPCODE_CONST_CLASS:
    ss << "const-class ";
    ss << show_type(static_cast<const DexOpcodeType*>(insn)->get_type(),
                    deobfuscated);
    return ss.str();
  case DOPCODE_CHECK_CAST:
    ss << "check-cast ";
    ss << show_type(static_cast<const DexOpcodeType*>(insn)->get_type(),
                    deobfuscated);
    return ss.str();
  case DOPCODE_INSTANCE_OF:
    ss << "instance-of ";
    ss << show_type(static_cast<const DexOpcodeType*>(insn)->get_type(),
                    deobfuscated);
    return ss.str();
  case DOPCODE_NEW_INSTANCE:
    ss << "new-instance ";
    ss << show_type(static_cast<const DexOpcodeType*>(insn)->get_type(),
                    deobfuscated);
    return ss.str();
  case DOPCODE_NEW_ARRAY:
    ss << "new-array ";
    ss << show_type(static_cast<const DexOpcodeType*>(insn)->get_type(),
                    deobfuscated);
    return ss.str();
  case DOPCODE_FILLED_NEW_ARRAY:
    ss << "filled-new-array ";
    ss << show_type(static_cast<const DexOpcodeType*>(insn)->get_type(),
                    deobfuscated);
    return ss.str();
  case FOPCODE_PACKED_SWITCH:
    return "packed-switch-payload";
  case FOPCODE_SPARSE_SWITCH:
    return "sparse-switch-payload";
  case FOPCODE_FILLED_ARRAY:
    return "fill-array-data-payload";
  case DOPCODE_FILLED_NEW_ARRAY_RANGE:
    return "filled-new-array/range";
  case DOPCODE_RETURN_VOID_NO_BARRIER:
    return "return-void-no-barrier";
  case DOPCODE_ADD_INT_2ADDR:
    return "add-int/2addr";
  case DOPCODE_SUB_INT_2ADDR:
    return "sub-int/2addr";
  case DOPCODE_MUL_INT_2ADDR:
    return "mult-int/2addr";
  case DOPCODE_DIV_INT_2ADDR:
    return "div-int/2addr";
  case DOPCODE_REM_INT_2ADDR:
    return "rem-int/2addr";
  case DOPCODE_AND_INT_2ADDR:
    return "and-int/2addr";
  case DOPCODE_OR_INT_2ADDR:
    return "or-int/2addr";
  case DOPCODE_XOR_INT_2ADDR:
    return "xor-int/2addr";
  case DOPCODE_SHL_INT_2ADDR:
    return "shl-int/2addr";
  case DOPCODE_SHR_INT_2ADDR:
    return "shr-int/2addr";
  case DOPCODE_USHR_INT_2ADDR:
    return "ushr-int/2addr";
  case DOPCODE_ADD_LONG_2ADDR:
    return "add-long/2addr";
  case DOPCODE_SUB_LONG_2ADDR:
    return "sub-long/2addr";
  case DOPCODE_MUL_LONG_2ADDR:
    return "mul-long/2addr";
  case DOPCODE_DIV_LONG_2ADDR:
    return "div-long/2addr";
  case DOPCODE_REM_LONG_2ADDR:
    return "rem-long/2addr";
  case DOPCODE_AND_LONG_2ADDR:
    return "and-long/2addr";
  case DOPCODE_OR_LONG_2ADDR:
    return "or-long/2addr";
  case DOPCODE_XOR_LONG_2ADDR:
    return "xor-long/2addr";
  case DOPCODE_SHL_LONG_2ADDR:
    return "shl-long/2addr";
  case DOPCODE_SHR_LONG_2ADDR:
    return "shr-long/2addr";
  case DOPCODE_USHR_LONG_2ADDR:
    return "ushr-long/2addr";
  case DOPCODE_ADD_FLOAT_2ADDR:
    return "add-float/2addr";
  case DOPCODE_SUB_FLOAT_2ADDR:
    return "sub-float/2addr";
  case DOPCODE_MUL_FLOAT_2ADDR:
    return "mul-float/2addr";
  case DOPCODE_DIV_FLOAT_2ADDR:
    return "div-float/2addr";
  case DOPCODE_REM_FLOAT_2ADDR:
    return "rem-float/2addr";
  case DOPCODE_ADD_DOUBLE_2ADDR:
    return "add-double/2addr";
  case DOPCODE_SUB_DOUBLE_2ADDR:
    return "sub-double/2addr";
  case DOPCODE_MUL_DOUBLE_2ADDR:
    return "mul-double/2addr";
  case DOPCODE_DIV_DOUBLE_2ADDR:
    return "div-double/2addr";
  case DOPCODE_REM_DOUBLE_2ADDR:
    return "rem-double/2addr";
  case DOPCODE_IGET_QUICK:
    return "add-double/2addr";
  case DOPCODE_IGET_WIDE_QUICK:
    ss << "iget-wide-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_OBJECT_QUICK:
    ss << "iget-object-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_QUICK:
    ss << "iput-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_WIDE_QUICK:
    ss << "iput-wide-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_OBJECT_QUICK:
    ss << "iput-object-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_VIRTUAL_QUICK:
    ss << "invoke-virtual-quick ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_VIRTUAL_RANGE_QUICK:
    ss << "invoke-virtual/range-quick ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_BOOLEAN_QUICK:
    ss << "iput-boolean-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_BYTE_QUICK:
    ss << "iput-byte-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_CHAR_QUICK:
    ss << "iput-char-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IPUT_SHORT_QUICK:
    ss << "iput-short-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_BOOLEAN_QUICK:
    ss << "iget-boolean-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_BYTE_QUICK:
    ss << "iget-byte-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_CHAR_QUICK:
    ss << "iget-char-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_IGET_SHORT_QUICK:
    ss << "iget-short-quick ";
    ss << show_field(static_cast<const DexOpcodeField*>(insn)->get_field(),
                     deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_POLYMORPHIC:
    ss << "invoke-polymorphic ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_POLYMORPHIC_RANGE:
    ss << "invoke-polymorphic/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_CUSTOM:
    ss << "invoke-custom ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  case DOPCODE_INVOKE_CUSTOM_RANGE:
    ss << "invoke-custom/range ";
    ss << show_method(static_cast<const DexOpcodeMethod*>(insn)->get_method(),
                      deobfuscated);
    return ss.str();
  }
}