comparison src/evalfunc.c @ 19102:ba9f50bfda83 v8.2.0111

patch 8.2.0111: VAR_SPECIAL is also used for booleans Commit: https://github.com/vim/vim/commit/9b4a15d5dba354d2e1e02871470bad103f34769a Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 11 16:05:23 2020 +0100 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.
author Bram Moolenaar <Bram@vim.org>
date Sat, 11 Jan 2020 16:15:04 +0100
parents 91bb12995034
children a51fee786930
comparison
equal deleted inserted replaced
19101:7c682fab000b 19102:ba9f50bfda83
1065 int 1065 int
1066 non_zero_arg(typval_T *argvars) 1066 non_zero_arg(typval_T *argvars)
1067 { 1067 {
1068 return ((argvars[0].v_type == VAR_NUMBER 1068 return ((argvars[0].v_type == VAR_NUMBER
1069 && argvars[0].vval.v_number != 0) 1069 && argvars[0].vval.v_number != 0)
1070 || (argvars[0].v_type == VAR_SPECIAL 1070 || (argvars[0].v_type == VAR_BOOL
1071 && argvars[0].vval.v_number == VVAL_TRUE) 1071 && argvars[0].vval.v_number == VVAL_TRUE)
1072 || (argvars[0].v_type == VAR_STRING 1072 || (argvars[0].v_type == VAR_STRING
1073 && argvars[0].vval.v_string != NULL 1073 && argvars[0].vval.v_string != NULL
1074 && *argvars[0].vval.v_string != NUL)); 1074 && *argvars[0].vval.v_string != NUL));
1075 } 1075 }
1809 break; 1809 break;
1810 case VAR_DICT: 1810 case VAR_DICT:
1811 n = argvars[0].vval.v_dict == NULL 1811 n = argvars[0].vval.v_dict == NULL
1812 || argvars[0].vval.v_dict->dv_hashtab.ht_used == 0; 1812 || argvars[0].vval.v_dict->dv_hashtab.ht_used == 0;
1813 break; 1813 break;
1814 case VAR_BOOL:
1814 case VAR_SPECIAL: 1815 case VAR_SPECIAL:
1815 n = argvars[0].vval.v_number != VVAL_TRUE; 1816 n = argvars[0].vval.v_number != VVAL_TRUE;
1816 break; 1817 break;
1817 1818
1818 case VAR_BLOB: 1819 case VAR_BLOB:
4316 break; 4317 break;
4317 case VAR_DICT: 4318 case VAR_DICT:
4318 rettv->vval.v_number = dict_len(argvars[0].vval.v_dict); 4319 rettv->vval.v_number = dict_len(argvars[0].vval.v_dict);
4319 break; 4320 break;
4320 case VAR_UNKNOWN: 4321 case VAR_UNKNOWN:
4322 case VAR_BOOL:
4321 case VAR_SPECIAL: 4323 case VAR_SPECIAL:
4322 case VAR_FLOAT: 4324 case VAR_FLOAT:
4323 case VAR_FUNC: 4325 case VAR_FUNC:
4324 case VAR_PARTIAL: 4326 case VAR_PARTIAL:
4325 case VAR_JOB: 4327 case VAR_JOB:
8339 { 8341 {
8340 int n = -1; 8342 int n = -1;
8341 8343
8342 switch (argvars[0].v_type) 8344 switch (argvars[0].v_type)
8343 { 8345 {
8344 case VAR_NUMBER: n = VAR_TYPE_NUMBER; break; 8346 case VAR_NUMBER: n = VAR_TYPE_NUMBER; break;
8345 case VAR_STRING: n = VAR_TYPE_STRING; break; 8347 case VAR_STRING: n = VAR_TYPE_STRING; break;
8346 case VAR_PARTIAL: 8348 case VAR_PARTIAL:
8347 case VAR_FUNC: n = VAR_TYPE_FUNC; break; 8349 case VAR_FUNC: n = VAR_TYPE_FUNC; break;
8348 case VAR_LIST: n = VAR_TYPE_LIST; break; 8350 case VAR_LIST: n = VAR_TYPE_LIST; break;
8349 case VAR_DICT: n = VAR_TYPE_DICT; break; 8351 case VAR_DICT: n = VAR_TYPE_DICT; break;
8350 case VAR_FLOAT: n = VAR_TYPE_FLOAT; break; 8352 case VAR_FLOAT: n = VAR_TYPE_FLOAT; break;
8351 case VAR_SPECIAL: 8353 case VAR_BOOL: n = VAR_TYPE_BOOL; break;
8352 if (argvars[0].vval.v_number == VVAL_FALSE 8354 case VAR_SPECIAL: n = VAR_TYPE_NONE; break;
8353 || argvars[0].vval.v_number == VVAL_TRUE)
8354 n = VAR_TYPE_BOOL;
8355 else
8356 n = VAR_TYPE_NONE;
8357 break;
8358 case VAR_JOB: n = VAR_TYPE_JOB; break; 8355 case VAR_JOB: n = VAR_TYPE_JOB; break;
8359 case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break; 8356 case VAR_CHANNEL: n = VAR_TYPE_CHANNEL; break;
8360 case VAR_BLOB: n = VAR_TYPE_BLOB; break; 8357 case VAR_BLOB: n = VAR_TYPE_BLOB; break;
8361 case VAR_UNKNOWN: 8358 case VAR_UNKNOWN:
8362 internal_error("f_type(UNKNOWN)"); 8359 internal_error("f_type(UNKNOWN)");