Skip to content

Commit 9b4a15d

Browse files
committed
patch 8.2.0111: VAR_SPECIAL is also used for booleans
Problem: VAR_SPECIAL is also used for booleans. Solution: Add VAR_BOOL for better type checking.
1 parent e05a89a commit 9b4a15d

16 files changed

Lines changed: 87 additions & 54 deletions

src/dict.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -345,14 +345,14 @@ dict_add(dict_T *d, dictitem_T *item)
345345
* Returns FAIL when out of memory and when key already exists.
346346
*/
347347
static int
348-
dict_add_number_special(dict_T *d, char *key, varnumber_T nr, int special)
348+
dict_add_number_special(dict_T *d, char *key, varnumber_T nr, vartype_T vartype)
349349
{
350350
dictitem_T *item;
351351

352352
item = dictitem_alloc((char_u *)key);
353353
if (item == NULL)
354354
return FAIL;
355-
item->di_tv.v_type = special ? VAR_SPECIAL : VAR_NUMBER;
355+
item->di_tv.v_type = vartype;
356356
item->di_tv.vval.v_number = nr;
357357
if (dict_add(d, item) == FAIL)
358358
{
@@ -369,17 +369,17 @@ dict_add_number_special(dict_T *d, char *key, varnumber_T nr, int special)
369369
int
370370
dict_add_number(dict_T *d, char *key, varnumber_T nr)
371371
{
372-
return dict_add_number_special(d, key, nr, FALSE);
372+
return dict_add_number_special(d, key, nr, VAR_NUMBER);
373373
}
374374

375375
/*
376376
* Add a special entry to dictionary "d".
377377
* Returns FAIL when out of memory and when key already exists.
378378
*/
379379
int
380-
dict_add_special(dict_T *d, char *key, varnumber_T nr)
380+
dict_add_bool(dict_T *d, char *key, varnumber_T nr)
381381
{
382-
return dict_add_number_special(d, key, nr, TRUE);
382+
return dict_add_number_special(d, key, nr, VAR_BOOL);
383383
}
384384

385385
/*

src/eval.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1246,14 +1246,15 @@ tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
12461246

12471247
// Can't do anything with a Funcref, Dict, v:true on the right.
12481248
if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT
1249-
&& tv2->v_type != VAR_SPECIAL)
1249+
&& tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL)
12501250
{
12511251
switch (tv1->v_type)
12521252
{
12531253
case VAR_UNKNOWN:
12541254
case VAR_DICT:
12551255
case VAR_FUNC:
12561256
case VAR_PARTIAL:
1257+
case VAR_BOOL:
12571258
case VAR_SPECIAL:
12581259
case VAR_JOB:
12591260
case VAR_CHANNEL:
@@ -3016,6 +3017,7 @@ eval_index(
30163017
emsg(_(e_float_as_string));
30173018
return FAIL;
30183019
#endif
3020+
case VAR_BOOL:
30193021
case VAR_SPECIAL:
30203022
case VAR_JOB:
30213023
case VAR_CHANNEL:
@@ -3131,6 +3133,7 @@ eval_index(
31313133
case VAR_FUNC:
31323134
case VAR_PARTIAL:
31333135
case VAR_FLOAT:
3136+
case VAR_BOOL:
31343137
case VAR_SPECIAL:
31353138
case VAR_JOB:
31363139
case VAR_CHANNEL:
@@ -3777,6 +3780,7 @@ tv_equal(
37773780
s2 = tv_get_string_buf(tv2, buf2);
37783781
return ((ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2)) == 0);
37793782

3783+
case VAR_BOOL:
37803784
case VAR_SPECIAL:
37813785
return tv1->vval.v_number == tv2->vval.v_number;
37823786

@@ -4531,6 +4535,7 @@ echo_string_core(
45314535
break;
45324536
#endif
45334537

4538+
case VAR_BOOL:
45344539
case VAR_SPECIAL:
45354540
*tofree = NULL;
45364541
r = (char_u *)get_var_special_name(tv->vval.v_number);
@@ -5359,6 +5364,7 @@ free_tv(typval_T *varp)
53595364
case VAR_NUMBER:
53605365
case VAR_FLOAT:
53615366
case VAR_UNKNOWN:
5367+
case VAR_BOOL:
53625368
case VAR_SPECIAL:
53635369
break;
53645370
}
@@ -5399,6 +5405,7 @@ clear_tv(typval_T *varp)
53995405
varp->vval.v_dict = NULL;
54005406
break;
54015407
case VAR_NUMBER:
5408+
case VAR_BOOL:
54025409
case VAR_SPECIAL:
54035410
varp->vval.v_number = 0;
54045411
break;
@@ -5480,6 +5487,7 @@ tv_get_number_chk(typval_T *varp, int *denote)
54805487
case VAR_DICT:
54815488
emsg(_("E728: Using a Dictionary as a Number"));
54825489
break;
5490+
case VAR_BOOL:
54835491
case VAR_SPECIAL:
54845492
return varp->vval.v_number == VVAL_TRUE ? 1 : 0;
54855493
case VAR_JOB:
@@ -5529,6 +5537,9 @@ tv_get_float(typval_T *varp)
55295537
case VAR_DICT:
55305538
emsg(_("E894: Using a Dictionary as a Float"));
55315539
break;
5540+
case VAR_BOOL:
5541+
emsg(_("E362: Using a boolean value as a Float"));
5542+
break;
55325543
case VAR_SPECIAL:
55335544
emsg(_("E907: Using a special value as a Float"));
55345545
break;
@@ -5618,6 +5629,7 @@ tv_get_string_buf_chk(typval_T *varp, char_u *buf)
56185629
if (varp->vval.v_string != NULL)
56195630
return varp->vval.v_string;
56205631
return (char_u *)"";
5632+
case VAR_BOOL:
56215633
case VAR_SPECIAL:
56225634
STRCPY(buf, get_var_special_name(varp->vval.v_number));
56235635
return buf;
@@ -5744,6 +5756,7 @@ copy_tv(typval_T *from, typval_T *to)
57445756
switch (from->v_type)
57455757
{
57465758
case VAR_NUMBER:
5759+
case VAR_BOOL:
57475760
case VAR_SPECIAL:
57485761
to->vval.v_number = from->vval.v_number;
57495762
break;
@@ -5850,6 +5863,7 @@ item_copy(
58505863
case VAR_STRING:
58515864
case VAR_FUNC:
58525865
case VAR_PARTIAL:
5866+
case VAR_BOOL:
58535867
case VAR_SPECIAL:
58545868
case VAR_JOB:
58555869
case VAR_CHANNEL:

src/evalfunc.c

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,7 @@ non_zero_arg(typval_T *argvars)
10671067
{
10681068
return ((argvars[0].v_type == VAR_NUMBER
10691069
&& argvars[0].vval.v_number != 0)
1070-
|| (argvars[0].v_type == VAR_SPECIAL
1070+
|| (argvars[0].v_type == VAR_BOOL
10711071
&& argvars[0].vval.v_number == VVAL_TRUE)
10721072
|| (argvars[0].v_type == VAR_STRING
10731073
&& argvars[0].vval.v_string != NULL
@@ -1811,6 +1811,7 @@ f_empty(typval_T *argvars, typval_T *rettv)
18111811
n = argvars[0].vval.v_dict == NULL
18121812
|| argvars[0].vval.v_dict->dv_hashtab.ht_used == 0;
18131813
break;
1814+
case VAR_BOOL:
18141815
case VAR_SPECIAL:
18151816
n = argvars[0].vval.v_number != VVAL_TRUE;
18161817
break;
@@ -4318,6 +4319,7 @@ f_len(typval_T *argvars, typval_T *rettv)
43184319
rettv->vval.v_number = dict_len(argvars[0].vval.v_dict);
43194320
break;
43204321
case VAR_UNKNOWN:
4322+
case VAR_BOOL:
43214323
case VAR_SPECIAL:
43224324
case VAR_FLOAT:
43234325
case VAR_FUNC:
@@ -8341,20 +8343,15 @@ f_type(typval_T *argvars, typval_T *rettv)
83418343

83428344
switch (argvars[0].v_type)
83438345
{
8344-
case VAR_NUMBER: n = VAR_TYPE_NUMBER; break;
8345-
case VAR_STRING: n = VAR_TYPE_STRING; break;
8346+
case VAR_NUMBER: n = VAR_TYPE_NUMBER; break;
8347+
case VAR_STRING: n = VAR_TYPE_STRING; break;
83468348
case VAR_PARTIAL:
8347-
case VAR_FUNC: n = VAR_TYPE_FUNC; break;
8348-
case VAR_LIST: n = VAR_TYPE_LIST; break;
8349-
case VAR_DICT: n = VAR_TYPE_DICT; break;
8350-
case VAR_FLOAT: n = VAR_TYPE_FLOAT; break;
8351-
case VAR_SPECIAL:
8352-
if (argvars[0].vval.v_number == VVAL_FALSE
8353-
|| argvars[0].vval.v_number == VVAL_TRUE)
8354-
n = VAR_TYPE_BOOL;
8355-
else
8356-
n = VAR_TYPE_NONE;
8357-
break;
8349+
case VAR_FUNC: n = VAR_TYPE_FUNC; break;
8350+
case VAR_LIST: n = VAR_TYPE_LIST; break;
8351+
case VAR_DICT: n = VAR_TYPE_DICT; break;
8352+
case VAR_FLOAT: n = VAR_TYPE_FLOAT; break;
8353+
case VAR_BOOL: n = VAR_TYPE_BOOL; break;
8354+
case VAR_SPECIAL: n = VAR_TYPE_NONE; break;
83588355
case VAR_JOB: n = VAR_TYPE_JOB; break;
83598356
case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break;
83608357
case VAR_BLOB: n = VAR_TYPE_BLOB; break;

src/evalvars.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ static struct vimvar
118118
{VV_NAME("option_command", VAR_STRING), VV_RO},
119119
{VV_NAME("option_type", VAR_STRING), VV_RO},
120120
{VV_NAME("errors", VAR_LIST), 0},
121-
{VV_NAME("false", VAR_SPECIAL), VV_RO},
122-
{VV_NAME("true", VAR_SPECIAL), VV_RO},
121+
{VV_NAME("false", VAR_BOOL), VV_RO},
122+
{VV_NAME("true", VAR_BOOL), VV_RO},
123123
{VV_NAME("null", VAR_SPECIAL), VV_RO},
124124
{VV_NAME("none", VAR_SPECIAL), VV_RO},
125125
{VV_NAME("vim_did_enter", VAR_NUMBER), VV_RO},
@@ -1675,6 +1675,7 @@ item_lock(typval_T *tv, int deep, int lock)
16751675
case VAR_FUNC:
16761676
case VAR_PARTIAL:
16771677
case VAR_FLOAT:
1678+
case VAR_BOOL:
16781679
case VAR_SPECIAL:
16791680
case VAR_JOB:
16801681
case VAR_CHANNEL:

src/if_lua.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ luaV_pushtypval(lua_State *L, typval_T *tv)
535535
case VAR_DICT:
536536
luaV_pushdict(L, tv->vval.v_dict);
537537
break;
538+
case VAR_BOOL:
538539
case VAR_SPECIAL:
539540
if (tv->vval.v_number <= VVAL_TRUE)
540541
lua_pushinteger(L, (int) tv->vval.v_number);
@@ -564,7 +565,7 @@ luaV_totypval(lua_State *L, int pos, typval_T *tv)
564565
switch (lua_type(L, pos))
565566
{
566567
case LUA_TBOOLEAN:
567-
tv->v_type = VAR_SPECIAL;
568+
tv->v_type = VAR_BOOL;
568569
tv->vval.v_number = (varnumber_T) lua_toboolean(L, pos);
569570
break;
570571
case LUA_TNIL:

src/if_mzsch.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3136,7 +3136,7 @@ vim_to_mzscheme_impl(typval_T *vim_value, int depth, Scheme_Hash_Table *visited)
31363136
MZ_GC_UNREG();
31373137
}
31383138
}
3139-
else if (vim_value->v_type == VAR_SPECIAL)
3139+
else if (vim_value->v_type == VAR_BOOL || vim_value->v_type == VAR_SPECIAL)
31403140
{
31413141
if (vim_value->vval.v_number <= VVAL_TRUE)
31423142
result = scheme_make_integer((long)vim_value->vval.v_number);
@@ -3218,7 +3218,7 @@ mzscheme_to_vim_impl(Scheme_Object *obj, typval_T *tv, int depth,
32183218
}
32193219
else if (SCHEME_BOOLP(obj))
32203220
{
3221-
tv->v_type = VAR_SPECIAL;
3221+
tv->v_type = VAR_BOOL;
32223222
tv->vval.v_number = SCHEME_TRUEP(obj);
32233223
}
32243224
# ifdef FEAT_FLOAT

src/if_py_both.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -844,23 +844,24 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookup_dict)
844844
}
845845
}
846846
}
847-
else if (our_tv->v_type == VAR_SPECIAL)
847+
else if (our_tv->v_type == VAR_BOOL)
848848
{
849849
if (our_tv->vval.v_number == VVAL_FALSE)
850850
{
851851
ret = Py_False;
852852
Py_INCREF(ret);
853853
}
854-
else if (our_tv->vval.v_number == VVAL_TRUE)
854+
else
855855
{
856856
ret = Py_True;
857857
Py_INCREF(ret);
858858
}
859-
else
860-
{
861-
Py_INCREF(Py_None);
862-
ret = Py_None;
863-
}
859+
return ret;
860+
}
861+
else if (our_tv->v_type == VAR_SPECIAL)
862+
{
863+
Py_INCREF(Py_None);
864+
ret = Py_None;
864865
return ret;
865866
}
866867
else if (our_tv->v_type == VAR_BLOB)
@@ -6389,6 +6390,7 @@ ConvertToPyObject(typval_T *tv)
63896390
case VAR_JOB:
63906391
Py_INCREF(Py_None);
63916392
return Py_None;
6393+
case VAR_BOOL:
63926394
case VAR_SPECIAL:
63936395
switch (tv->vval.v_number)
63946396
{

src/if_ruby.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ vim_to_ruby(typval_T *tv)
11831183
}
11841184
}
11851185
}
1186-
else if (tv->v_type == VAR_SPECIAL)
1186+
else if (tv->v_type == VAR_BOOL || tv->v_type == VAR_SPECIAL)
11871187
{
11881188
if (tv->vval.v_number == VVAL_TRUE)
11891189
result = Qtrue;
@@ -1827,11 +1827,11 @@ ruby_convert_to_vim_value(VALUE val, typval_T *rettv)
18271827
rettv->vval.v_number = VVAL_NULL;
18281828
break;
18291829
case T_TRUE:
1830-
rettv->v_type = VAR_SPECIAL;
1830+
rettv->v_type = VAR_BOOL;
18311831
rettv->vval.v_number = VVAL_TRUE;
18321832
break;
18331833
case T_FALSE:
1834-
rettv->v_type = VAR_SPECIAL;
1834+
rettv->v_type = VAR_BOOL;
18351835
rettv->vval.v_number = VVAL_FALSE;
18361836
break;
18371837
case T_BIGNUM:

src/json.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,17 @@ json_encode_item(garray_T *gap, typval_T *val, int copyID, int options)
193193

194194
switch (val->v_type)
195195
{
196-
case VAR_SPECIAL:
196+
case VAR_BOOL:
197197
switch (val->vval.v_number)
198198
{
199199
case VVAL_FALSE: ga_concat(gap, (char_u *)"false"); break;
200200
case VVAL_TRUE: ga_concat(gap, (char_u *)"true"); break;
201+
}
202+
break;
203+
204+
case VAR_SPECIAL:
205+
switch (val->vval.v_number)
206+
{
201207
case VVAL_NONE: if ((options & JSON_JS) != 0
202208
&& (options & JSON_NO_NONE) == 0)
203209
// empty item
@@ -818,7 +824,7 @@ json_decode_item(js_read_T *reader, typval_T *res, int options)
818824
reader->js_used += 5;
819825
if (cur_item != NULL)
820826
{
821-
cur_item->v_type = VAR_SPECIAL;
827+
cur_item->v_type = VAR_BOOL;
822828
cur_item->vval.v_number = VVAL_FALSE;
823829
}
824830
retval = OK;
@@ -829,7 +835,7 @@ json_decode_item(js_read_T *reader, typval_T *res, int options)
829835
reader->js_used += 4;
830836
if (cur_item != NULL)
831837
{
832-
cur_item->v_type = VAR_SPECIAL;
838+
cur_item->v_type = VAR_BOOL;
833839
cur_item->vval.v_number = VVAL_TRUE;
834840
}
835841
retval = OK;

src/popupmenu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ pum_set_event_info(dict_T *dict)
10761076
dict_add_number(dict, "row", pum_row);
10771077
dict_add_number(dict, "col", pum_col);
10781078
dict_add_number(dict, "size", pum_size);
1079-
dict_add_special(dict, "scrollbar", pum_scrollbar ? VVAL_TRUE : VVAL_FALSE);
1079+
dict_add_bool(dict, "scrollbar", pum_scrollbar ? VVAL_TRUE : VVAL_FALSE);
10801080
}
10811081
#endif
10821082

0 commit comments

Comments
 (0)