To: vim_dev@googlegroups.com Subject: Patch 8.2.0111 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///