private OutputType getInstructionOutputType()

in tools/dexfuzz/src/dexfuzz/program/mutators/ValuePrinter.java [215:265]


  private OutputType getInstructionOutputType(MInsn mInsn) {
    Opcode opcode = mInsn.insn.info.opcode;
    if (opcode == Opcode.CONST_STRING || opcode == Opcode.CONST_STRING_JUMBO) {
      return OutputType.STRING;
    }
    if (opcode == Opcode.IGET_BOOLEAN || opcode == Opcode.SGET_BOOLEAN) {
      return OutputType.BOOLEAN;
    }
    if (opcode == Opcode.IGET_BYTE || opcode == Opcode.SGET_BYTE
        || opcode == Opcode.INT_TO_BYTE) {
      return OutputType.BYTE;
    }
    if (opcode == Opcode.IGET_CHAR || opcode == Opcode.SGET_CHAR
        || opcode == Opcode.INT_TO_CHAR) {
      return OutputType.CHAR;
    }
    if (opcode == Opcode.IGET_SHORT || opcode == Opcode.SGET_SHORT
        || opcode == Opcode.INT_TO_SHORT) {
      return OutputType.SHORT;
    }
    if (opcode == Opcode.NEG_INT || opcode == Opcode.NOT_INT
        || opcode == Opcode.LONG_TO_INT || opcode == Opcode.FLOAT_TO_INT
        || opcode == Opcode.DOUBLE_TO_INT
        || Opcode.isBetween(opcode, Opcode.ADD_INT, Opcode.USHR_INT)
        || Opcode.isBetween(opcode, Opcode.ADD_INT_2ADDR, Opcode.USHR_INT_2ADDR)
        || Opcode.isBetween(opcode, Opcode.ADD_INT_LIT16, Opcode.USHR_INT_LIT8)) {
      return OutputType.INT;
    }
    if (opcode == Opcode.NEG_LONG || opcode == Opcode.NOT_LONG
        || opcode == Opcode.INT_TO_LONG || opcode == Opcode.FLOAT_TO_LONG
        || opcode == Opcode.DOUBLE_TO_LONG
        || Opcode.isBetween(opcode, Opcode.ADD_LONG, Opcode.USHR_LONG)
        || Opcode.isBetween(opcode, Opcode.ADD_LONG_2ADDR, Opcode.USHR_LONG_2ADDR)) {
      return OutputType.LONG;
    }
    if (opcode == Opcode.NEG_FLOAT
        || opcode == Opcode.INT_TO_FLOAT || opcode == Opcode.LONG_TO_FLOAT
        || opcode == Opcode.DOUBLE_TO_FLOAT
        || Opcode.isBetween(opcode, Opcode.ADD_FLOAT, Opcode.REM_FLOAT)
        || Opcode.isBetween(opcode, Opcode.ADD_FLOAT_2ADDR, Opcode.REM_FLOAT_2ADDR)) {
      return OutputType.FLOAT;
    }
    if (opcode == Opcode.NEG_DOUBLE
        || opcode == Opcode.INT_TO_DOUBLE || opcode == Opcode.LONG_TO_DOUBLE
        || opcode == Opcode.FLOAT_TO_DOUBLE
        || Opcode.isBetween(opcode, Opcode.ADD_DOUBLE, Opcode.REM_DOUBLE)
        || Opcode.isBetween(opcode, Opcode.ADD_DOUBLE_2ADDR, Opcode.REM_DOUBLE_2ADDR)) {
      return OutputType.DOUBLE;
    }
    return OutputType.UNKNOWN;
  }