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();
}
}