Patch 8.2.0111
Problem:    VAR_SPECIAL is also used for booleans.
Solution:   Add VAR_BOOL for better type checking.
Files:      src/structs.h, src/dict.c, src/eval.c, src/evalfunc.c,
            src/evalvars.c, src/if_lua.c, src/if_mzsch.c, src/if_py_both.h,
            src/if_ruby.c, src/json.c, src/popupmenu.c, src/proto/dict.pro,
            src/testing.c, src/vim.h, src/viminfo.c


*** ../vim-8.2.0110/src/structs.h       2019-12-31 22:36:14.557918868 +0100
--- src/structs.h       2020-01-11 15:07:43.232623502 +0100
***************
*** 1313,1319 ****
      VAR_LIST,  // "v_list" is used
      VAR_DICT,  // "v_dict" is used
      VAR_FLOAT,         // "v_float" is used
!     VAR_SPECIAL, // "v_number" is used
      VAR_JOB,   // "v_job" is used
      VAR_CHANNEL, // "v_channel" is used
      VAR_BLOB,  // "v_blob" is used
--- 1313,1320 ----
      VAR_LIST,  // "v_list" is used
      VAR_DICT,  // "v_dict" is used
      VAR_FLOAT,         // "v_float" is used
!     VAR_BOOL,  // "v_number" is VVAL_FALSE or VVAL_TRUE
!     VAR_SPECIAL, // "v_number" is VVAL_NONE or VVAL_NULL
      VAR_JOB,   // "v_job" is used
      VAR_CHANNEL, // "v_channel" is used
      VAR_BLOB,  // "v_blob" is used
*** ../vim-8.2.0110/src/dict.c  2020-01-04 19:00:07.573654631 +0100
--- src/dict.c  2020-01-11 15:39:13.168768161 +0100
***************
*** 345,358 ****
   * Returns FAIL when out of memory and when key already exists.
   */
      static int
! dict_add_number_special(dict_T *d, char *key, varnumber_T nr, int special)
  {
      dictitem_T        *item;
  
      item = dictitem_alloc((char_u *)key);
      if (item == NULL)
        return FAIL;
!     item->di_tv.v_type = special ? VAR_SPECIAL : VAR_NUMBER;
      item->di_tv.vval.v_number = nr;
      if (dict_add(d, item) == FAIL)
      {
--- 345,358 ----
   * Returns FAIL when out of memory and when key already exists.
   */
      static int
! dict_add_number_special(dict_T *d, char *key, varnumber_T nr, vartype_T 
vartype)
  {
      dictitem_T        *item;
  
      item = dictitem_alloc((char_u *)key);
      if (item == NULL)
        return FAIL;
!     item->di_tv.v_type = vartype;
      item->di_tv.vval.v_number = nr;
      if (dict_add(d, item) == FAIL)
      {
***************
*** 369,375 ****
      int
  dict_add_number(dict_T *d, char *key, varnumber_T nr)
  {
!     return dict_add_number_special(d, key, nr, FALSE);
  }
  
  /*
--- 369,375 ----
      int
  dict_add_number(dict_T *d, char *key, varnumber_T nr)
  {
!     return dict_add_number_special(d, key, nr, VAR_NUMBER);
  }
  
  /*
***************
*** 377,385 ****
   * Returns FAIL when out of memory and when key already exists.
   */
      int
! dict_add_special(dict_T *d, char *key, varnumber_T nr)
  {
!     return dict_add_number_special(d, key, nr, TRUE);
  }
  
  /*
--- 377,385 ----
   * Returns FAIL when out of memory and when key already exists.
   */
      int
! dict_add_bool(dict_T *d, char *key, varnumber_T nr)
  {
!     return dict_add_number_special(d, key, nr, VAR_BOOL);
  }
  
  /*
*** ../vim-8.2.0110/src/eval.c  2020-01-08 20:08:55.602187006 +0100
--- src/eval.c  2020-01-11 15:42:50.267896930 +0100
***************
*** 1246,1252 ****
  
      // Can't do anything with a Funcref, Dict, v:true on the right.
      if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT
!                                               && tv2->v_type != VAR_SPECIAL)
      {
        switch (tv1->v_type)
        {
--- 1246,1252 ----
  
      // Can't do anything with a Funcref, Dict, v:true on the right.
      if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT
!                     && tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL)
      {
        switch (tv1->v_type)
        {
***************
*** 1254,1259 ****
--- 1254,1260 ----
            case VAR_DICT:
            case VAR_FUNC:
            case VAR_PARTIAL:
+           case VAR_BOOL:
            case VAR_SPECIAL:
            case VAR_JOB:
            case VAR_CHANNEL:
***************
*** 3016,3021 ****
--- 3017,3023 ----
                emsg(_(e_float_as_string));
            return FAIL;
  #endif
+       case VAR_BOOL:
        case VAR_SPECIAL:
        case VAR_JOB:
        case VAR_CHANNEL:
***************
*** 3131,3136 ****
--- 3133,3139 ----
            case VAR_FUNC:
            case VAR_PARTIAL:
            case VAR_FLOAT:
+           case VAR_BOOL:
            case VAR_SPECIAL:
            case VAR_JOB:
            case VAR_CHANNEL:
***************
*** 3777,3782 ****
--- 3780,3786 ----
            s2 = tv_get_string_buf(tv2, buf2);
            return ((ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2)) == 0);
  
+       case VAR_BOOL:
        case VAR_SPECIAL:
            return tv1->vval.v_number == tv2->vval.v_number;
  
***************
*** 4531,4536 ****
--- 4535,4541 ----
            break;
  #endif
  
+       case VAR_BOOL:
        case VAR_SPECIAL:
            *tofree = NULL;
            r = (char_u *)get_var_special_name(tv->vval.v_number);
***************
*** 5359,5364 ****
--- 5364,5370 ----
            case VAR_NUMBER:
            case VAR_FLOAT:
            case VAR_UNKNOWN:
+           case VAR_BOOL:
            case VAR_SPECIAL:
                break;
        }
***************
*** 5399,5404 ****
--- 5405,5411 ----
                varp->vval.v_dict = NULL;
                break;
            case VAR_NUMBER:
+           case VAR_BOOL:
            case VAR_SPECIAL:
                varp->vval.v_number = 0;
                break;
***************
*** 5480,5485 ****
--- 5487,5493 ----
        case VAR_DICT:
            emsg(_("E728: Using a Dictionary as a Number"));
            break;
+       case VAR_BOOL:
        case VAR_SPECIAL:
            return varp->vval.v_number == VVAL_TRUE ? 1 : 0;
        case VAR_JOB:
***************
*** 5529,5534 ****
--- 5537,5545 ----
        case VAR_DICT:
            emsg(_("E894: Using a Dictionary as a Float"));
            break;
+       case VAR_BOOL:
+           emsg(_("E362: Using a boolean value as a Float"));
+           break;
        case VAR_SPECIAL:
            emsg(_("E907: Using a special value as a Float"));
            break;
***************
*** 5618,5623 ****
--- 5629,5635 ----
            if (varp->vval.v_string != NULL)
                return varp->vval.v_string;
            return (char_u *)"";
+       case VAR_BOOL:
        case VAR_SPECIAL:
            STRCPY(buf, get_var_special_name(varp->vval.v_number));
            return buf;
***************
*** 5744,5749 ****
--- 5756,5762 ----
      switch (from->v_type)
      {
        case VAR_NUMBER:
+       case VAR_BOOL:
        case VAR_SPECIAL:
            to->vval.v_number = from->vval.v_number;
            break;
***************
*** 5850,5855 ****
--- 5863,5869 ----
        case VAR_STRING:
        case VAR_FUNC:
        case VAR_PARTIAL:
+       case VAR_BOOL:
        case VAR_SPECIAL:
        case VAR_JOB:
        case VAR_CHANNEL:
*** ../vim-8.2.0110/src/evalfunc.c      2020-01-10 19:56:42.774995632 +0100
--- src/evalfunc.c      2020-01-11 15:43:46.411668545 +0100
***************
*** 1067,1073 ****
  {
      return ((argvars[0].v_type == VAR_NUMBER
                && argvars[0].vval.v_number != 0)
!           || (argvars[0].v_type == VAR_SPECIAL
                && argvars[0].vval.v_number == VVAL_TRUE)
            || (argvars[0].v_type == VAR_STRING
                && argvars[0].vval.v_string != NULL
--- 1067,1073 ----
  {
      return ((argvars[0].v_type == VAR_NUMBER
                && argvars[0].vval.v_number != 0)
!           || (argvars[0].v_type == VAR_BOOL
                && argvars[0].vval.v_number == VVAL_TRUE)
            || (argvars[0].v_type == VAR_STRING
                && argvars[0].vval.v_string != NULL
***************
*** 1811,1816 ****
--- 1811,1817 ----
            n = argvars[0].vval.v_dict == NULL
                        || argvars[0].vval.v_dict->dv_hashtab.ht_used == 0;
            break;
+       case VAR_BOOL:
        case VAR_SPECIAL:
            n = argvars[0].vval.v_number != VVAL_TRUE;
            break;
***************
*** 4318,4323 ****
--- 4319,4325 ----
            rettv->vval.v_number = dict_len(argvars[0].vval.v_dict);
            break;
        case VAR_UNKNOWN:
+       case VAR_BOOL:
        case VAR_SPECIAL:
        case VAR_FLOAT:
        case VAR_FUNC:
***************
*** 8341,8360 ****
  
      switch (argvars[0].v_type)
      {
!       case VAR_NUMBER: n = VAR_TYPE_NUMBER; break;
!       case VAR_STRING: n = VAR_TYPE_STRING; break;
        case VAR_PARTIAL:
!       case VAR_FUNC:   n = VAR_TYPE_FUNC; break;
!       case VAR_LIST:   n = VAR_TYPE_LIST; break;
!       case VAR_DICT:   n = VAR_TYPE_DICT; break;
!       case VAR_FLOAT:  n = VAR_TYPE_FLOAT; break;
!       case VAR_SPECIAL:
!            if (argvars[0].vval.v_number == VVAL_FALSE
!                    || argvars[0].vval.v_number == VVAL_TRUE)
!                n = VAR_TYPE_BOOL;
!            else
!                n = VAR_TYPE_NONE;
!            break;
        case VAR_JOB:     n = VAR_TYPE_JOB; break;
        case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break;
        case VAR_BLOB:    n = VAR_TYPE_BLOB; break;
--- 8343,8357 ----
  
      switch (argvars[0].v_type)
      {
!       case VAR_NUMBER:  n = VAR_TYPE_NUMBER; break;
!       case VAR_STRING:  n = VAR_TYPE_STRING; break;
        case VAR_PARTIAL:
!       case VAR_FUNC:    n = VAR_TYPE_FUNC; break;
!       case VAR_LIST:    n = VAR_TYPE_LIST; break;
!       case VAR_DICT:    n = VAR_TYPE_DICT; break;
!       case VAR_FLOAT:   n = VAR_TYPE_FLOAT; break;
!       case VAR_BOOL:    n = VAR_TYPE_BOOL; break;
!       case VAR_SPECIAL: n = VAR_TYPE_NONE; break;
        case VAR_JOB:     n = VAR_TYPE_JOB; break;
        case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break;
        case VAR_BLOB:    n = VAR_TYPE_BLOB; break;
*** ../vim-8.2.0110/src/evalvars.c      2020-01-04 16:13:44.408524644 +0100
--- src/evalvars.c      2020-01-11 15:44:44.415431522 +0100
***************
*** 118,125 ****
      {VV_NAME("option_command",         VAR_STRING), VV_RO},
      {VV_NAME("option_type",    VAR_STRING), VV_RO},
      {VV_NAME("errors",                 VAR_LIST), 0},
!     {VV_NAME("false",          VAR_SPECIAL), VV_RO},
!     {VV_NAME("true",           VAR_SPECIAL), VV_RO},
      {VV_NAME("null",           VAR_SPECIAL), VV_RO},
      {VV_NAME("none",           VAR_SPECIAL), VV_RO},
      {VV_NAME("vim_did_enter",  VAR_NUMBER), VV_RO},
--- 118,125 ----
      {VV_NAME("option_command",         VAR_STRING), VV_RO},
      {VV_NAME("option_type",    VAR_STRING), VV_RO},
      {VV_NAME("errors",                 VAR_LIST), 0},
!     {VV_NAME("false",          VAR_BOOL), VV_RO},
!     {VV_NAME("true",           VAR_BOOL), VV_RO},
      {VV_NAME("null",           VAR_SPECIAL), VV_RO},
      {VV_NAME("none",           VAR_SPECIAL), VV_RO},
      {VV_NAME("vim_did_enter",  VAR_NUMBER), VV_RO},
***************
*** 1675,1680 ****
--- 1675,1681 ----
        case VAR_FUNC:
        case VAR_PARTIAL:
        case VAR_FLOAT:
+       case VAR_BOOL:
        case VAR_SPECIAL:
        case VAR_JOB:
        case VAR_CHANNEL:
*** ../vim-8.2.0110/src/if_lua.c        2019-12-04 21:04:38.000000000 +0100
--- src/if_lua.c        2020-01-11 15:45:22.111276940 +0100
***************
*** 535,540 ****
--- 535,541 ----
        case VAR_DICT:
            luaV_pushdict(L, tv->vval.v_dict);
            break;
+       case VAR_BOOL:
        case VAR_SPECIAL:
            if (tv->vval.v_number <= VVAL_TRUE)
                lua_pushinteger(L, (int) tv->vval.v_number);
***************
*** 564,570 ****
      switch (lua_type(L, pos))
      {
        case LUA_TBOOLEAN:
!           tv->v_type = VAR_SPECIAL;
            tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos);
            break;
        case LUA_TNIL:
--- 565,571 ----
      switch (lua_type(L, pos))
      {
        case LUA_TBOOLEAN:
!           tv->v_type = VAR_BOOL;
            tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos);
            break;
        case LUA_TNIL:
*** ../vim-8.2.0110/src/if_mzsch.c      2019-12-04 21:15:14.000000000 +0100
--- src/if_mzsch.c      2020-01-11 15:46:10.559077753 +0100
***************
*** 3136,3142 ****
            MZ_GC_UNREG();
        }
      }
!     else if (vim_value->v_type == VAR_SPECIAL)
      {
        if (vim_value->vval.v_number <= VVAL_TRUE)
            result = scheme_make_integer((long)vim_value->vval.v_number);
--- 3136,3142 ----
            MZ_GC_UNREG();
        }
      }
!     else if (vim_value->v_type == VAR_BOOL || vim_value->v_type == 
VAR_SPECIAL)
      {
        if (vim_value->vval.v_number <= VVAL_TRUE)
            result = scheme_make_integer((long)vim_value->vval.v_number);
***************
*** 3218,3224 ****
      }
      else if (SCHEME_BOOLP(obj))
      {
!       tv->v_type = VAR_SPECIAL;
        tv->vval.v_number = SCHEME_TRUEP(obj);
      }
  # ifdef FEAT_FLOAT
--- 3218,3224 ----
      }
      else if (SCHEME_BOOLP(obj))
      {
!       tv->v_type = VAR_BOOL;
        tv->vval.v_number = SCHEME_TRUEP(obj);
      }
  # ifdef FEAT_FLOAT
*** ../vim-8.2.0110/src/if_py_both.h    2020-01-01 15:04:12.668301126 +0100
--- src/if_py_both.h    2020-01-11 15:56:16.392552672 +0100
***************
*** 844,866 ****
            }
        }
      }
!     else if (our_tv->v_type == VAR_SPECIAL)
      {
        if (our_tv->vval.v_number == VVAL_FALSE)
        {
            ret = Py_False;
            Py_INCREF(ret);
        }
!       else if (our_tv->vval.v_number == VVAL_TRUE)
        {
            ret = Py_True;
            Py_INCREF(ret);
        }
!       else
!       {
!           Py_INCREF(Py_None);
!           ret = Py_None;
!       }
        return ret;
      }
      else if (our_tv->v_type == VAR_BLOB)
--- 844,867 ----
            }
        }
      }
!     else if (our_tv->v_type == VAR_BOOL)
      {
        if (our_tv->vval.v_number == VVAL_FALSE)
        {
            ret = Py_False;
            Py_INCREF(ret);
        }
!       else
        {
            ret = Py_True;
            Py_INCREF(ret);
        }
!       return ret;
!     }
!     else if (our_tv->v_type == VAR_SPECIAL)
!     {
!       Py_INCREF(Py_None);
!       ret = Py_None;
        return ret;
      }
      else if (our_tv->v_type == VAR_BLOB)
***************
*** 6389,6394 ****
--- 6390,6396 ----
        case VAR_JOB:
            Py_INCREF(Py_None);
            return Py_None;
+       case VAR_BOOL:
        case VAR_SPECIAL:
            switch (tv->vval.v_number)
            {
*** ../vim-8.2.0110/src/if_ruby.c       2020-01-07 21:32:15.917239304 +0100
--- src/if_ruby.c       2020-01-11 15:47:12.398822684 +0100
***************
*** 1183,1189 ****
            }
        }
      }
!     else if (tv->v_type == VAR_SPECIAL)
      {
        if (tv->vval.v_number == VVAL_TRUE)
            result = Qtrue;
--- 1183,1189 ----
            }
        }
      }
!     else if (tv->v_type == VAR_BOOL || tv->v_type == VAR_SPECIAL)
      {
        if (tv->vval.v_number == VVAL_TRUE)
            result = Qtrue;
***************
*** 1827,1837 ****
            rettv->vval.v_number = VVAL_NULL;
            break;
        case T_TRUE:
!           rettv->v_type = VAR_SPECIAL;
            rettv->vval.v_number = VVAL_TRUE;
            break;
        case T_FALSE:
!           rettv->v_type = VAR_SPECIAL;
            rettv->vval.v_number = VVAL_FALSE;
            break;
        case T_BIGNUM:
--- 1827,1837 ----
            rettv->vval.v_number = VVAL_NULL;
            break;
        case T_TRUE:
!           rettv->v_type = VAR_BOOL;
            rettv->vval.v_number = VVAL_TRUE;
            break;
        case T_FALSE:
!           rettv->v_type = VAR_BOOL;
            rettv->vval.v_number = VVAL_FALSE;
            break;
        case T_BIGNUM:
*** ../vim-8.2.0110/src/json.c  2019-12-04 21:56:55.000000000 +0100
--- src/json.c  2020-01-11 15:48:40.614457450 +0100
***************
*** 193,203 ****
  
      switch (val->v_type)
      {
!       case VAR_SPECIAL:
            switch (val->vval.v_number)
            {
                case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break;
                case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break;
                case VVAL_NONE: if ((options & JSON_JS) != 0
                                             && (options & JSON_NO_NONE) == 0)
                                    // empty item
--- 193,209 ----
  
      switch (val->v_type)
      {
!       case VAR_BOOL:
            switch (val->vval.v_number)
            {
                case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break;
                case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break;
+           }
+           break;
+ 
+       case VAR_SPECIAL:
+           switch (val->vval.v_number)
+           {
                case VVAL_NONE: if ((options & JSON_JS) != 0
                                             && (options & JSON_NO_NONE) == 0)
                                    // empty item
***************
*** 818,824 ****
                        reader->js_used += 5;
                        if (cur_item != NULL)
                        {
!                           cur_item->v_type = VAR_SPECIAL;
                            cur_item->vval.v_number = VVAL_FALSE;
                        }
                        retval = OK;
--- 824,830 ----
                        reader->js_used += 5;
                        if (cur_item != NULL)
                        {
!                           cur_item->v_type = VAR_BOOL;
                            cur_item->vval.v_number = VVAL_FALSE;
                        }
                        retval = OK;
***************
*** 829,835 ****
                        reader->js_used += 4;
                        if (cur_item != NULL)
                        {
!                           cur_item->v_type = VAR_SPECIAL;
                            cur_item->vval.v_number = VVAL_TRUE;
                        }
                        retval = OK;
--- 835,841 ----
                        reader->js_used += 4;
                        if (cur_item != NULL)
                        {
!                           cur_item->v_type = VAR_BOOL;
                            cur_item->vval.v_number = VVAL_TRUE;
                        }
                        retval = OK;
*** ../vim-8.2.0110/src/popupmenu.c     2019-12-15 14:54:17.609139105 +0100
--- src/popupmenu.c     2020-01-11 15:38:45.780876441 +0100
***************
*** 1076,1082 ****
      dict_add_number(dict, "row", pum_row);
      dict_add_number(dict, "col", pum_col);
      dict_add_number(dict, "size", pum_size);
!     dict_add_special(dict, "scrollbar", pum_scrollbar ? VVAL_TRUE : 
VVAL_FALSE);
  }
  #endif
  
--- 1076,1082 ----
      dict_add_number(dict, "row", pum_row);
      dict_add_number(dict, "col", pum_col);
      dict_add_number(dict, "size", pum_size);
!     dict_add_bool(dict, "scrollbar", pum_scrollbar ? VVAL_TRUE : VVAL_FALSE);
  }
  #endif
  
*** ../vim-8.2.0110/src/proto/dict.pro  2020-01-04 14:32:35.522717984 +0100
--- src/proto/dict.pro  2020-01-11 15:39:17.212752138 +0100
***************
*** 14,20 ****
  dict_T *dict_copy(dict_T *orig, int deep, int copyID);
  int dict_add(dict_T *d, dictitem_T *item);
  int dict_add_number(dict_T *d, char *key, varnumber_T nr);
! int dict_add_special(dict_T *d, char *key, varnumber_T nr);
  int dict_add_string(dict_T *d, char *key, char_u *str);
  int dict_add_string_len(dict_T *d, char *key, char_u *str, int len);
  int dict_add_list(dict_T *d, char *key, list_T *list);
--- 14,20 ----
  dict_T *dict_copy(dict_T *orig, int deep, int copyID);
  int dict_add(dict_T *d, dictitem_T *item);
  int dict_add_number(dict_T *d, char *key, varnumber_T nr);
! int dict_add_bool(dict_T *d, char *key, varnumber_T nr);
  int dict_add_string(dict_T *d, char *key, char_u *str);
  int dict_add_string_len(dict_T *d, char *key, char_u *str, int len);
  int dict_add_list(dict_T *d, char *key, list_T *list);
*** ../vim-8.2.0110/src/testing.c       2019-12-29 23:04:20.294639884 +0100
--- src/testing.c       2020-01-11 15:49:36.294226207 +0100
***************
*** 222,228 ****
      int               error = FALSE;
      garray_T  ga;
  
!     if (argvars[0].v_type == VAR_SPECIAL
            && argvars[0].vval.v_number == (isTrue ? VVAL_TRUE : VVAL_FALSE))
        return 0;
      if (argvars[0].v_type != VAR_NUMBER
--- 222,228 ----
      int               error = FALSE;
      garray_T  ga;
  
!     if (argvars[0].v_type == VAR_BOOL
            && argvars[0].vval.v_number == (isTrue ? VVAL_TRUE : VVAL_FALSE))
        return 0;
      if (argvars[0].v_type != VAR_NUMBER
***************
*** 760,765 ****
--- 760,766 ----
        case VAR_UNKNOWN:
        case VAR_NUMBER:
        case VAR_FLOAT:
+       case VAR_BOOL:
        case VAR_SPECIAL:
        case VAR_STRING:
            break;
*** ../vim-8.2.0110/src/vim.h   2020-01-01 15:46:43.661568771 +0100
--- src/vim.h   2020-01-11 15:56:55.940386383 +0100
***************
*** 2019,2029 ****
  #define VV_ARGV               93
  #define VV_LEN                94      // number of v: vars
  
! // used for v_number in VAR_SPECIAL
! #define VVAL_FALSE    0L
! #define VVAL_TRUE     1L
! #define VVAL_NONE     2L
! #define VVAL_NULL     3L
  
  // Type values for type().
  #define VAR_TYPE_NUMBER           0
--- 2019,2029 ----
  #define VV_ARGV               93
  #define VV_LEN                94      // number of v: vars
  
! // used for v_number in VAR_BOOL and VAR_SPECIAL
! #define VVAL_FALSE    0L      // VAR_BOOL
! #define VVAL_TRUE     1L      // VAR_BOOL
! #define VVAL_NONE     2L      // VAR_SPECIAL
! #define VVAL_NULL     3L      // VAR_SPECIAL
  
  // Type values for type().
  #define VAR_TYPE_NUMBER           0
*** ../vim-8.2.0110/src/viminfo.c       2019-12-27 17:33:23.475080942 +0100
--- src/viminfo.c       2020-01-11 15:54:26.445014176 +0100
***************
*** 1233,1239 ****
--- 1233,1244 ----
                    (void)string2float(tab + 1, &tv.vval.v_float);
  #endif
                else
+               {
                    tv.vval.v_number = atol((char *)tab + 1);
+                   if (type == VAR_SPECIAL && (tv.vval.v_number == VVAL_FALSE
+                                            || tv.vval.v_number == VVAL_TRUE))
+                       tv.v_type = VAR_BOOL;
+               }
                if (type == VAR_DICT || type == VAR_LIST)
                {
                    typval_T *etv = eval_expr(tv.vval.v_string, NULL);
***************
*** 1312,1323 ****
            {
                switch (this_var->di_tv.v_type)
                {
!                   case VAR_STRING: s = "STR"; break;
!                   case VAR_NUMBER: s = "NUM"; break;
!                   case VAR_FLOAT:  s = "FLO"; break;
!                   case VAR_DICT:   s = "DIC"; break;
!                   case VAR_LIST:   s = "LIS"; break;
!                   case VAR_BLOB:   s = "BLO"; break;
                    case VAR_SPECIAL: s = "XPL"; break;
  
                    case VAR_UNKNOWN:
--- 1317,1329 ----
            {
                switch (this_var->di_tv.v_type)
                {
!                   case VAR_STRING:  s = "STR"; break;
!                   case VAR_NUMBER:  s = "NUM"; break;
!                   case VAR_FLOAT:   s = "FLO"; break;
!                   case VAR_DICT:    s = "DIC"; break;
!                   case VAR_LIST:    s = "LIS"; break;
!                   case VAR_BLOB:    s = "BLO"; break;
!                   case VAR_BOOL:    s = "XPL"; break;  // backwards compat.
                    case VAR_SPECIAL: s = "XPL"; break;
  
                    case VAR_UNKNOWN:
***************
*** 1328,1335 ****
                                     continue;
                }
                fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
!               if (this_var->di_tv.v_type == VAR_SPECIAL)
                {
                    sprintf((char *)numbuf, "%ld",
                                          (long)this_var->di_tv.vval.v_number);
                    p = numbuf;
--- 1334,1343 ----
                                     continue;
                }
                fprintf(fp, "!%s\t%s\t", this_var->di_key, s);
!               if (this_var->di_tv.v_type == VAR_BOOL
!                                     || this_var->di_tv.v_type == VAR_SPECIAL)
                {
+                   // do not use "v:true" but "1"
                    sprintf((char *)numbuf, "%ld",
                                          (long)this_var->di_tv.vval.v_number);
                    p = numbuf;
*** ../vim-8.2.0110/src/version.c       2020-01-10 19:56:42.778995613 +0100
--- src/version.c       2020-01-11 16:03:20.074771536 +0100
***************
*** 744,745 ****
--- 744,747 ----
  {   /* Add new patch number below this line */
+ /**/
+     111,
  /**/

-- 
Lawmakers made it obligatory for everybody to take at least one bath
each week -- on Saturday night.
                [real standing law in Vermont, United States of America]

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202001111506.00BF61uS014095%40masaka.moolenaar.net.

Raspunde prin e-mail lui