public int readInt()
          throws IOException {
    mark(DEFAULT_READ_LIMIT);

    int cfaslOpcode = read();

    if (cfaslOpcode >= CFASL_IMMEDIATE_FIXNUM_OFFSET) {
      return cfaslOpcode - CFASL_IMMEDIATE_FIXNUM_OFFSET;
    } else {
      switch (cfaslOpcode) {
        case CFASL_P_8BIT_INT:
          return readFixnumBody(1, false);
        case CFASL_N_8BIT_INT:
          return readFixnumBody(1, true);
        case CFASL_P_16BIT_INT:
          return readFixnumBody(2, false);
        case CFASL_N_16BIT_INT:
          return readFixnumBody(2, true);
        case CFASL_P_24BIT_INT:
          return readFixnumBody(3, false);
        case CFASL_N_24BIT_INT:
          return readFixnumBody(3, true);
        case CFASL_P_32BIT_INT:
          return readFixnumBody(4, false);
        case CFASL_N_32BIT_INT:
          return readFixnumBody(4, true);
        default:
          reset();
          throw new RuntimeException("Expected an int but received OpCode=" + cfaslOpcode);
      }
    }
  }