void operator()

in libredex/InstructionAnalyzer.h [180:405]


  void operator()(const IRInstruction* insn, Env* env) const {
    auto op = insn->opcode();
    switch (op) {
    case IOPCODE_LOAD_PARAM:
    case IOPCODE_LOAD_PARAM_OBJECT:
    case IOPCODE_LOAD_PARAM_WIDE:
      return analyze_load_param(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_NOP:
      return analyze_nop(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_MOVE:
    case OPCODE_MOVE_WIDE:
    case OPCODE_MOVE_OBJECT:
      return analyze_move(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_MOVE_RESULT:
    case OPCODE_MOVE_RESULT_WIDE:
    case OPCODE_MOVE_RESULT_OBJECT:
    case IOPCODE_MOVE_RESULT_PSEUDO:
    case IOPCODE_MOVE_RESULT_PSEUDO_OBJECT:
    case IOPCODE_MOVE_RESULT_PSEUDO_WIDE:
      return analyze_move_result(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_MOVE_EXCEPTION:
      return analyze_move_exception(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_RETURN_VOID:
    case OPCODE_RETURN:
    case OPCODE_RETURN_WIDE:
    case OPCODE_RETURN_OBJECT:
      return analyze_return(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_MONITOR_ENTER:
    case OPCODE_MONITOR_EXIT:
      return analyze_monitor(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_THROW:
      return analyze_throw(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_GOTO:
      return analyze_goto(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_NEG_INT:
    case OPCODE_NOT_INT:
    case OPCODE_NEG_LONG:
    case OPCODE_NOT_LONG:
    case OPCODE_NEG_FLOAT:
    case OPCODE_NEG_DOUBLE:
    case OPCODE_INT_TO_LONG:
    case OPCODE_INT_TO_FLOAT:
    case OPCODE_INT_TO_DOUBLE:
    case OPCODE_LONG_TO_INT:
    case OPCODE_LONG_TO_FLOAT:
    case OPCODE_LONG_TO_DOUBLE:
    case OPCODE_FLOAT_TO_INT:
    case OPCODE_FLOAT_TO_LONG:
    case OPCODE_FLOAT_TO_DOUBLE:
    case OPCODE_DOUBLE_TO_INT:
    case OPCODE_DOUBLE_TO_LONG:
    case OPCODE_DOUBLE_TO_FLOAT:
    case OPCODE_INT_TO_BYTE:
    case OPCODE_INT_TO_CHAR:
    case OPCODE_INT_TO_SHORT:
      return analyze_unop(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_ARRAY_LENGTH:
      return analyze_array_length(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_CMPL_FLOAT:
    case OPCODE_CMPG_FLOAT:
    case OPCODE_CMPL_DOUBLE:
    case OPCODE_CMPG_DOUBLE:
    case OPCODE_CMP_LONG:
      return analyze_cmp(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_IF_EQ:
    case OPCODE_IF_NE:
    case OPCODE_IF_LT:
    case OPCODE_IF_GE:
    case OPCODE_IF_GT:
    case OPCODE_IF_LE:
    case OPCODE_IF_EQZ:
    case OPCODE_IF_NEZ:
    case OPCODE_IF_LTZ:
    case OPCODE_IF_GEZ:
    case OPCODE_IF_GTZ:
    case OPCODE_IF_LEZ:
      return analyze_if(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_AGET:
    case OPCODE_AGET_WIDE:
    case OPCODE_AGET_OBJECT:
    case OPCODE_AGET_BOOLEAN:
    case OPCODE_AGET_BYTE:
    case OPCODE_AGET_CHAR:
    case OPCODE_AGET_SHORT:
      return analyze_aget(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_APUT:
    case OPCODE_APUT_WIDE:
    case OPCODE_APUT_OBJECT:
    case OPCODE_APUT_BOOLEAN:
    case OPCODE_APUT_BYTE:
    case OPCODE_APUT_CHAR:
    case OPCODE_APUT_SHORT:
      return analyze_aput(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_ADD_INT:
    case OPCODE_SUB_INT:
    case OPCODE_MUL_INT:
    case OPCODE_DIV_INT:
    case OPCODE_REM_INT:
    case OPCODE_AND_INT:
    case OPCODE_OR_INT:
    case OPCODE_XOR_INT:
    case OPCODE_SHL_INT:
    case OPCODE_SHR_INT:
    case OPCODE_USHR_INT:
    case OPCODE_ADD_LONG:
    case OPCODE_SUB_LONG:
    case OPCODE_MUL_LONG:
    case OPCODE_DIV_LONG:
    case OPCODE_REM_LONG:
    case OPCODE_AND_LONG:
    case OPCODE_OR_LONG:
    case OPCODE_XOR_LONG:
    case OPCODE_SHL_LONG:
    case OPCODE_SHR_LONG:
    case OPCODE_USHR_LONG:
    case OPCODE_ADD_FLOAT:
    case OPCODE_SUB_FLOAT:
    case OPCODE_MUL_FLOAT:
    case OPCODE_DIV_FLOAT:
    case OPCODE_REM_FLOAT:
    case OPCODE_ADD_DOUBLE:
    case OPCODE_SUB_DOUBLE:
    case OPCODE_MUL_DOUBLE:
    case OPCODE_DIV_DOUBLE:
    case OPCODE_REM_DOUBLE:
      return analyze_binop(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_ADD_INT_LIT16:
    case OPCODE_RSUB_INT:
    case OPCODE_MUL_INT_LIT16:
    case OPCODE_DIV_INT_LIT16:
    case OPCODE_REM_INT_LIT16:
    case OPCODE_AND_INT_LIT16:
    case OPCODE_OR_INT_LIT16:
    case OPCODE_XOR_INT_LIT16:
    case OPCODE_ADD_INT_LIT8:
    case OPCODE_RSUB_INT_LIT8:
    case OPCODE_MUL_INT_LIT8:
    case OPCODE_DIV_INT_LIT8:
    case OPCODE_REM_INT_LIT8:
    case OPCODE_AND_INT_LIT8:
    case OPCODE_OR_INT_LIT8:
    case OPCODE_XOR_INT_LIT8:
    case OPCODE_SHL_INT_LIT8:
    case OPCODE_SHR_INT_LIT8:
    case OPCODE_USHR_INT_LIT8:
      return analyze_binop_lit(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_CONST:
    case OPCODE_CONST_WIDE:
      return analyze_const(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_CONST_STRING:
      return analyze_const_string(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_CONST_CLASS:
      return analyze_const_class(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_FILL_ARRAY_DATA:
      return analyze_fill_array_data(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_SWITCH:
      return analyze_switch(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_IGET:
    case OPCODE_IGET_WIDE:
    case OPCODE_IGET_OBJECT:
    case OPCODE_IGET_BOOLEAN:
    case OPCODE_IGET_BYTE:
    case OPCODE_IGET_CHAR:
    case OPCODE_IGET_SHORT:
      return analyze_iget(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_IPUT:
    case OPCODE_IPUT_WIDE:
    case OPCODE_IPUT_OBJECT:
    case OPCODE_IPUT_BOOLEAN:
    case OPCODE_IPUT_BYTE:
    case OPCODE_IPUT_CHAR:
    case OPCODE_IPUT_SHORT:
      return analyze_iput(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_SGET:
    case OPCODE_SGET_WIDE:
    case OPCODE_SGET_OBJECT:
    case OPCODE_SGET_BOOLEAN:
    case OPCODE_SGET_BYTE:
    case OPCODE_SGET_CHAR:
    case OPCODE_SGET_SHORT:
      return analyze_sget(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_SPUT:
    case OPCODE_SPUT_WIDE:
    case OPCODE_SPUT_OBJECT:
    case OPCODE_SPUT_BOOLEAN:
    case OPCODE_SPUT_BYTE:
    case OPCODE_SPUT_CHAR:
    case OPCODE_SPUT_SHORT:
      return analyze_sput(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_INVOKE_VIRTUAL:
    case OPCODE_INVOKE_SUPER:
    case OPCODE_INVOKE_DIRECT:
    case OPCODE_INVOKE_STATIC:
    case OPCODE_INVOKE_POLYMORPHIC:
    case OPCODE_INVOKE_CUSTOM:
    case OPCODE_INVOKE_INTERFACE:
      return analyze_invoke(std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_CHECK_CAST:
      return analyze_check_cast(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_INSTANCE_OF:
      return analyze_instance_of(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_NEW_INSTANCE:
      return analyze_new_instance(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_NEW_ARRAY:
      return analyze_new_array(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case OPCODE_FILLED_NEW_ARRAY:
      return analyze_filled_new_array(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    case IOPCODE_INIT_CLASS:
      return analyze_init_class(
          std::index_sequence_for<Analyzers...>{}, insn, env);
    }
  }