0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.2.3194: Vim9: argument types are not checked at compile time

Problem:    Vim9: argument types are not checked at compile time.
Solution:   Add several more type checks, simplify some. (Yegappan
            Lakshmanan, closes #8598)
This commit is contained in:
Yegappan Lakshmanan 2021-07-21 19:09:09 +02:00 committed by Bram Moolenaar
parent 189663bdac
commit cd9172077b
10 changed files with 277 additions and 163 deletions

View File

@ -3294,7 +3294,7 @@ f_diff_hlID(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
int col;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars,0) == FAIL
&& (check_for_lnum_arg(argvars,0) == FAIL
|| check_for_number_arg(argvars, 1) == FAIL))
return;

View File

@ -388,7 +388,7 @@ f_bufnr(typval_T *argvars, typval_T *rettv)
char_u *name;
if (in_vim9script()
&& (check_for_opt_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_opt_buffer_arg(argvars, 0) == FAIL
|| (argvars[0].v_type != VAR_UNKNOWN
&& check_for_opt_bool_arg(argvars, 1) == FAIL)))
return;
@ -635,6 +635,11 @@ f_getbufinfo(typval_T *argvars, typval_T *rettv)
if (rettv_list_alloc(rettv) != OK)
return;
if (in_vim9script()
&& argvars[0].v_type != VAR_UNKNOWN
&& check_for_buffer_or_dict_arg(argvars, 0) == FAIL)
return;
// List of all the buffers or selected buffers
if (argvars[0].v_type == VAR_DICT)
{
@ -774,6 +779,11 @@ f_getline(typval_T *argvars, typval_T *rettv)
linenr_T end;
int retlist;
if (in_vim9script()
&& (check_for_lnum_arg(argvars, 0) == FAIL
|| check_for_opt_lnum_arg(argvars, 1) == FAIL))
return;
lnum = tv_get_lnum(argvars);
if (argvars[1].v_type == VAR_UNKNOWN)
{

View File

@ -326,7 +326,7 @@ arg_string_or_nr(type_T *type, argcontext_T *context)
}
/*
* Check "type" is a string or a number (buffer)
* Check "type" is a buffer (string or a number)
*/
static int
arg_buffer(type_T *type, argcontext_T *context)
@ -339,7 +339,22 @@ arg_buffer(type_T *type, argcontext_T *context)
}
/*
* Check "type" is a string or a number (line)
* Check "type" is a buffer or a dict of any
*/
static int
arg_buffer_or_dict_any(type_T *type, argcontext_T *context)
{
if (type->tt_type == VAR_ANY
|| type->tt_type == VAR_STRING
|| type->tt_type == VAR_NUMBER
|| type->tt_type == VAR_DICT)
return OK;
arg_type_mismatch(&t_string, type, context->arg_idx + 1);
return FAIL;
}
/*
* Check "type" is a line (string or a number)
*/
static int
arg_lnum(type_T *type, argcontext_T *context)
@ -607,9 +622,11 @@ arg_cursor1(type_T *type, argcontext_T *context)
static argcheck_T arg1_string[] = {arg_string};
static argcheck_T arg1_number[] = {arg_number};
static argcheck_T arg1_bool[] = {arg_bool};
static argcheck_T arg1_list_any[] = {arg_list_any};
static argcheck_T arg1_dict_any[] = {arg_dict_any};
static argcheck_T arg1_job[] = {arg_job};
static argcheck_T arg1_list_any[] = {arg_list_any};
static argcheck_T arg1_buffer[] = {arg_buffer};
static argcheck_T arg1_lnum[] = {arg_lnum};
static argcheck_T arg1_list_number[] = {arg_list_number};
static argcheck_T arg1_list_string[] = {arg_list_string};
static argcheck_T arg1_float_or_nr[] = {arg_float_or_nr};
@ -620,19 +637,21 @@ static argcheck_T arg1_list_or_blob[] = {arg_list_or_blob};
static argcheck_T arg1_list_or_dict[] = {arg_list_or_dict};
static argcheck_T arg1_chan_or_job[] = {arg_chan_or_job};
static argcheck_T arg1_dict_or_string[] = {arg_dict_any_or_string};
static argcheck_T arg1_buffer_or_dict_any[] = {arg_buffer_or_dict_any};
static argcheck_T arg2_float_or_nr[] = {arg_float_or_nr, arg_float_or_nr};
static argcheck_T arg2_number[] = {arg_number, arg_number};
static argcheck_T arg2_string[] = {arg_string, arg_string};
static argcheck_T arg2_string_number[] = {arg_string, arg_number};
static argcheck_T arg2_list_nr[] = {arg_list_number, arg_list_number};
static argcheck_T arg2_list_number[] = {arg_list_number, arg_list_number};
static argcheck_T arg2_lnum[] = {arg_lnum, arg_lnum};
static argcheck_T arg2_list_any_string[] = {arg_list_any, arg_string};
static argcheck_T arg2_list_any_number[] = {arg_list_any, arg_number};
static argcheck_T arg2_list_number_bool[] = {arg_list_number, arg_bool};
static argcheck_T arg2_nr_string[] = {arg_number, arg_string};
static argcheck_T arg2_nr_bool[] = {arg_number, arg_bool};
static argcheck_T arg2_nr_list[] = {arg_number, arg_list_any};
static argcheck_T arg2_number_string[] = {arg_number, arg_string};
static argcheck_T arg2_number_bool[] = {arg_number, arg_bool};
static argcheck_T arg2_number_list[] = {arg_number, arg_list_any};
static argcheck_T arg2_dict_string[] = {arg_dict_any, arg_string};
static argcheck_T arg2_dict_string_or_nr[] = {arg_dict_any, arg_string_or_nr};
static argcheck_T arg2_dict_any_string_or_nr[] = {arg_dict_any, arg_string_or_nr};
static argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any};
static argcheck_T arg2_string_list_nr[] = {arg_string, arg_list_number};
static argcheck_T arg2_string_bool[] = {arg_string, arg_bool};
@ -641,12 +660,15 @@ static argcheck_T arg2_job_string_or_number[] = {arg_job, arg_string_or_nr};
//static argcheck_T arg2_listblob_item[] = {arg_list_or_blob, arg_item_of_prev};
static argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, arg_dict_any};
static argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, arg_dict_any};
static argcheck_T arg2_string_or_nr_string[] = {arg_string_or_nr, arg_string};
static argcheck_T arg2_string_or_nr_nr[] = {arg_string_or_nr, arg_number};
static argcheck_T arg2_string_or_nr_bool[] = {arg_string_or_nr, arg_bool};
static argcheck_T arg2_lnum_number[] = {arg_lnum, arg_number};
static argcheck_T arg2_chan_or_job_dict[] = {arg_chan_or_job, arg_dict_any};
static argcheck_T arg2_chan_or_job_string[] = {arg_chan_or_job, arg_string};
static argcheck_T arg2_nr_dict_any[] = {arg_number, arg_dict_any};
static argcheck_T arg2_number_dict_any[] = {arg_number, arg_dict_any};
static argcheck_T arg2_buffer_string[] = {arg_buffer, arg_string};
static argcheck_T arg2_buffer_number[] = {arg_buffer, arg_number};
static argcheck_T arg2_buffer_bool[] = {arg_buffer, arg_bool};
static argcheck_T arg2_buffer_lnum[] = {arg_buffer, arg_lnum};
static argcheck_T arg2_buffer_list_any[] = {arg_buffer, arg_list_any};
static argcheck_T arg3_string[] = {arg_string, arg_string, arg_string};
static argcheck_T arg3_number[] = {arg_number, arg_number, arg_number};
static argcheck_T arg3_number_number_dict[] = {arg_number, arg_number, arg_dict_any};
@ -658,8 +680,9 @@ static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool};
static argcheck_T arg3_string_bool_dict[] = {arg_string, arg_bool, arg_dict_any};
static argcheck_T arg3_list_string_dict[] = {arg_list_any, arg_string, arg_dict_any};
static argcheck_T arg3_dict_number_number[] = {arg_dict_any, arg_number, arg_number};
static argcheck_T arg3_string_or_nr_nr_bool[] = {arg_string_or_nr, arg_number, arg_bool};
static argcheck_T arg3_bufnr_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum};
static argcheck_T arg3_lnum_number_bool[] = {arg_lnum, arg_number, arg_bool};
static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum};
static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number};
static argcheck_T arg4_number_number_string_any[] = {arg_number, arg_number, arg_string, NULL};
static argcheck_T arg5_number[] = {arg_number, arg_number, arg_number, arg_number, arg_number};
static argcheck_T arg4_browse[] = {arg_bool, arg_string, arg_string, arg_string};
@ -678,15 +701,14 @@ static argcheck_T arg3_insert[] = {arg_list_or_blob, arg_item_of_prev, arg_numbe
static argcheck_T arg4_maparg[] = {arg_string, arg_string, arg_bool, arg_bool};
static argcheck_T arg4_remote_expr[] = {arg_string, arg_string, arg_string, arg_number};
static argcheck_T arg3_remove[] = {arg_list_or_dict_or_blob, arg_remove2, arg_number};
static argcheck_T arg3_setbufline[] = {arg_string_or_nr, arg_string_or_nr, arg_str_or_nr_or_list};
static argcheck_T arg2_setline[] = {arg_string_or_nr, NULL};
static argcheck_T arg3_setbufline[] = {arg_buffer, arg_lnum, arg_str_or_nr_or_list};
static argcheck_T arg2_setline[] = {arg_lnum, NULL};
static argcheck_T arg4_setloclist[] = {arg_number, arg_list_any, arg_string, arg_dict_any};
static argcheck_T arg3_setqflist[] = {arg_list_any, arg_string, arg_dict_any};
static argcheck_T arg2_settagstack[] = {arg_number, arg_dict_any, arg_string};
static argcheck_T arg2_sign_getplaced[] = {arg_string_or_nr, arg_dict_any};
static argcheck_T arg2_sign_getplaced[] = {arg_buffer, arg_dict_any};
static argcheck_T arg3_slice[] = {arg_slice1, arg_number, arg_number};
static argcheck_T arg4_strpart[] = {arg_string, arg_number, arg_number, arg_bool};
static argcheck_T arg2_term_setansicolors[] = {arg_string_or_nr, arg_list_any};
static argcheck_T arg23_win_execute[] = {arg_number, arg_string_or_list_string, arg_string};
static argcheck_T arg4_match_func[] = {arg_string_or_list_any, arg_string, arg_number, arg_number};
@ -1040,27 +1062,27 @@ static funcentry_T global_functions[] =
ret_string, f_browsedir},
{"bufadd", 1, 1, FEARG_1, arg1_string,
ret_number, f_bufadd},
{"bufexists", 1, 1, FEARG_1, arg1_string_or_nr,
{"bufexists", 1, 1, FEARG_1, arg1_buffer,
ret_number_bool, f_bufexists},
{"buffer_exists", 1, 1, FEARG_1, arg1_string_or_nr, // obsolete
{"buffer_exists", 1, 1, FEARG_1, arg1_buffer, // obsolete
ret_number_bool, f_bufexists},
{"buffer_name", 0, 1, FEARG_1, arg1_string_or_nr, // obsolete
{"buffer_name", 0, 1, FEARG_1, arg1_buffer, // obsolete
ret_string, f_bufname},
{"buffer_number", 0, 1, FEARG_1, arg2_string_or_nr_bool, // obsolete
{"buffer_number", 0, 1, FEARG_1, arg1_buffer, // obsolete
ret_number, f_bufnr},
{"buflisted", 1, 1, FEARG_1, arg1_string_or_nr,
{"buflisted", 1, 1, FEARG_1, arg1_buffer,
ret_number_bool, f_buflisted},
{"bufload", 1, 1, FEARG_1, arg1_string_or_nr,
{"bufload", 1, 1, FEARG_1, arg1_buffer,
ret_void, f_bufload},
{"bufloaded", 1, 1, FEARG_1, arg1_string_or_nr,
{"bufloaded", 1, 1, FEARG_1, arg1_buffer,
ret_number_bool, f_bufloaded},
{"bufname", 0, 1, FEARG_1, arg1_string_or_nr,
{"bufname", 0, 1, FEARG_1, arg1_buffer,
ret_string, f_bufname},
{"bufnr", 0, 2, FEARG_1, arg2_string_or_nr_bool,
{"bufnr", 0, 2, FEARG_1, arg2_buffer_bool,
ret_number, f_bufnr},
{"bufwinid", 1, 1, FEARG_1, arg1_string_or_nr,
{"bufwinid", 1, 1, FEARG_1, arg1_buffer,
ret_number, f_bufwinid},
{"bufwinnr", 1, 1, FEARG_1, arg1_string_or_nr,
{"bufwinnr", 1, 1, FEARG_1, arg1_buffer,
ret_number, f_bufwinnr},
{"byte2line", 1, 1, FEARG_1, arg1_number,
ret_number, f_byte2line},
@ -1120,13 +1142,13 @@ static funcentry_T global_functions[] =
ret_number, f_charidx},
{"chdir", 1, 1, FEARG_1, arg1_string,
ret_string, f_chdir},
{"cindent", 1, 1, FEARG_1, arg1_string_or_nr,
{"cindent", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_cindent},
{"clearmatches", 0, 1, FEARG_1, arg1_number,
ret_void, f_clearmatches},
{"col", 1, 1, FEARG_1, arg1_string_or_list_any,
ret_number, f_col},
{"complete", 2, 2, FEARG_2, arg2_nr_list,
{"complete", 2, 2, FEARG_2, arg2_number_list,
ret_void, f_complete},
{"complete_add", 1, 1, FEARG_1, arg1_dict_or_string,
ret_number, f_complete_add},
@ -1160,13 +1182,13 @@ static funcentry_T global_functions[] =
ret_first_arg, f_deepcopy},
{"delete", 1, 2, FEARG_1, arg2_string,
ret_number_bool, f_delete},
{"deletebufline", 2, 3, FEARG_1, arg3_bufnr_lnum_lnum,
{"deletebufline", 2, 3, FEARG_1, arg3_buffer_lnum_lnum,
ret_number_bool, f_deletebufline},
{"did_filetype", 0, 0, 0, NULL,
ret_number_bool, f_did_filetype},
{"diff_filler", 1, 1, FEARG_1, arg1_string_or_nr,
{"diff_filler", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_diff_filler},
{"diff_hlID", 2, 2, FEARG_1, arg2_string_or_nr_nr,
{"diff_hlID", 2, 2, FEARG_1, arg2_lnum_number,
ret_number, f_diff_hlID},
{"echoraw", 1, 1, FEARG_1, arg1_string,
ret_void, f_echoraw},
@ -1226,15 +1248,15 @@ static funcentry_T global_functions[] =
ret_string, f_fnameescape},
{"fnamemodify", 2, 2, FEARG_1, arg2_string,
ret_string, f_fnamemodify},
{"foldclosed", 1, 1, FEARG_1, arg1_string_or_nr,
{"foldclosed", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_foldclosed},
{"foldclosedend", 1, 1, FEARG_1, arg1_string_or_nr,
{"foldclosedend", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_foldclosedend},
{"foldlevel", 1, 1, FEARG_1, arg1_string_or_nr,
{"foldlevel", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_foldlevel},
{"foldtext", 0, 0, 0, NULL,
ret_string, f_foldtext},
{"foldtextresult", 1, 1, FEARG_1, arg1_string_or_nr,
{"foldtextresult", 1, 1, FEARG_1, arg1_lnum,
ret_string, f_foldtextresult},
{"foreground", 0, 0, 0, NULL,
ret_void, f_foreground},
@ -1248,13 +1270,13 @@ static funcentry_T global_functions[] =
ret_void, f_garbagecollect},
{"get", 2, 3, FEARG_1, NULL,
ret_any, f_get},
{"getbufinfo", 0, 1, FEARG_1, NULL,
{"getbufinfo", 0, 1, FEARG_1, arg1_buffer_or_dict_any,
ret_list_dict_any, f_getbufinfo},
{"getbufline", 2, 3, FEARG_1, arg3_bufnr_lnum_lnum,
{"getbufline", 2, 3, FEARG_1, arg3_buffer_lnum_lnum,
ret_list_string, f_getbufline},
{"getbufvar", 2, 3, FEARG_1, NULL,
ret_any, f_getbufvar},
{"getchangelist", 0, 1, FEARG_1, arg1_string_or_nr,
{"getchangelist", 0, 1, FEARG_1, arg1_buffer,
ret_list_any, f_getchangelist},
{"getchar", 0, 1, 0, arg1_bool,
ret_any, f_getchar},
@ -1302,11 +1324,11 @@ static funcentry_T global_functions[] =
ret_number_bool, f_getimstatus},
{"getjumplist", 0, 2, FEARG_1, arg2_number,
ret_list_any, f_getjumplist},
{"getline", 1, 2, FEARG_1, NULL,
{"getline", 1, 2, FEARG_1, arg2_lnum,
ret_f_getline, f_getline},
{"getloclist", 1, 2, 0, arg2_nr_dict_any,
{"getloclist", 1, 2, 0, arg2_number_dict_any,
ret_list_or_dict_1, f_getloclist},
{"getmarklist", 0, 1, FEARG_1, arg1_string_or_nr,
{"getmarklist", 0, 1, FEARG_1, arg1_buffer,
ret_list_dict_any, f_getmarklist},
{"getmatches", 0, 1, 0, arg1_number,
ret_list_dict_any, f_getmatches},
@ -1352,7 +1374,7 @@ static funcentry_T global_functions[] =
ret_any, f_globpath},
{"has", 1, 2, 0, arg2_string_bool,
ret_number_bool, f_has},
{"has_key", 2, 2, FEARG_1, arg2_dict_string_or_nr,
{"has_key", 2, 2, FEARG_1, arg2_dict_any_string_or_nr,
ret_number_bool, f_has_key},
{"haslocaldir", 0, 2, FEARG_1, arg2_number,
ret_number, f_haslocaldir},
@ -1378,7 +1400,7 @@ static funcentry_T global_functions[] =
ret_string, f_hostname},
{"iconv", 3, 3, FEARG_1, arg3_string,
ret_string, f_iconv},
{"indent", 1, 1, FEARG_1, arg1_string_or_nr,
{"indent", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_indent},
{"index", 2, 4, FEARG_1, arg4_index,
ret_number, f_index},
@ -1444,15 +1466,15 @@ static funcentry_T global_functions[] =
ret_number, f_libcallnr},
{"line", 1, 2, FEARG_1, arg2_string_number,
ret_number, f_line},
{"line2byte", 1, 1, FEARG_1, arg1_string_or_nr,
{"line2byte", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_line2byte},
{"lispindent", 1, 1, FEARG_1, arg1_string_or_nr,
{"lispindent", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_lispindent},
{"list2str", 1, 2, FEARG_1, arg2_list_number_bool,
ret_string, f_list2str},
{"listener_add", 1, 2, FEARG_2, NULL,
ret_number, f_listener_add},
{"listener_flush", 0, 1, FEARG_1, arg1_string_or_nr,
{"listener_flush", 0, 1, FEARG_1, arg1_buffer,
ret_void, f_listener_flush},
{"listener_remove", 1, 1, FEARG_1, arg1_number,
ret_number_bool, f_listener_remove},
@ -1526,9 +1548,9 @@ static funcentry_T global_functions[] =
NULL
#endif
},
{"nextnonblank", 1, 1, FEARG_1, arg1_string_or_nr,
{"nextnonblank", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_nextnonblank},
{"nr2char", 1, 2, FEARG_1, arg2_nr_bool,
{"nr2char", 1, 2, FEARG_1, arg2_number_bool,
ret_string, f_nr2char},
{"or", 2, 2, FEARG_1, arg2_number,
ret_number, f_or},
@ -1554,9 +1576,9 @@ static funcentry_T global_functions[] =
ret_number, PROP_FUNC(f_popup_create)},
{"popup_dialog", 2, 2, FEARG_1, arg2_str_or_nr_or_list_dict,
ret_number, PROP_FUNC(f_popup_dialog)},
{"popup_filter_menu", 2, 2, 0, arg2_nr_string,
{"popup_filter_menu", 2, 2, 0, arg2_number_string,
ret_bool, PROP_FUNC(f_popup_filter_menu)},
{"popup_filter_yesno", 2, 2, 0, arg2_nr_string,
{"popup_filter_yesno", 2, 2, 0, arg2_number_string,
ret_bool, PROP_FUNC(f_popup_filter_yesno)},
{"popup_findinfo", 0, 0, 0, NULL,
ret_number, PROP_FUNC(f_popup_findinfo)},
@ -1574,11 +1596,11 @@ static funcentry_T global_functions[] =
ret_number, PROP_FUNC(f_popup_locate)},
{"popup_menu", 2, 2, FEARG_1, arg2_str_or_nr_or_list_dict,
ret_number, PROP_FUNC(f_popup_menu)},
{"popup_move", 2, 2, FEARG_1, arg2_nr_dict_any,
{"popup_move", 2, 2, FEARG_1, arg2_number_dict_any,
ret_void, PROP_FUNC(f_popup_move)},
{"popup_notification", 2, 2, FEARG_1, arg2_str_or_nr_or_list_dict,
ret_number, PROP_FUNC(f_popup_notification)},
{"popup_setoptions", 2, 2, FEARG_1, arg2_nr_dict_any,
{"popup_setoptions", 2, 2, FEARG_1, arg2_number_dict_any,
ret_void, PROP_FUNC(f_popup_setoptions)},
{"popup_settext", 2, 2, FEARG_1, NULL,
ret_void, PROP_FUNC(f_popup_settext)},
@ -1586,17 +1608,17 @@ static funcentry_T global_functions[] =
ret_void, PROP_FUNC(f_popup_show)},
{"pow", 2, 2, FEARG_1, arg2_float_or_nr,
ret_float, FLOAT_FUNC(f_pow)},
{"prevnonblank", 1, 1, FEARG_1, arg1_string_or_nr,
{"prevnonblank", 1, 1, FEARG_1, arg1_lnum,
ret_number, f_prevnonblank},
{"printf", 1, 19, FEARG_2, NULL,
ret_string, f_printf},
{"prompt_getprompt", 1, 1, FEARG_1, arg1_string_or_nr,
{"prompt_getprompt", 1, 1, FEARG_1, arg1_buffer,
ret_string, JOB_FUNC(f_prompt_getprompt)},
{"prompt_setcallback", 2, 2, FEARG_1, NULL,
ret_void, JOB_FUNC(f_prompt_setcallback)},
{"prompt_setinterrupt", 2, 2, FEARG_1, NULL,
ret_void, JOB_FUNC(f_prompt_setinterrupt)},
{"prompt_setprompt", 2, 2, FEARG_1, arg2_string_or_nr_string,
{"prompt_setprompt", 2, 2, FEARG_1, arg2_buffer_string,
ret_void, JOB_FUNC(f_prompt_setprompt)},
{"prop_add", 3, 3, FEARG_1, arg3_number_number_dict,
ret_void, PROP_FUNC(f_prop_add)},
@ -1604,7 +1626,7 @@ static funcentry_T global_functions[] =
ret_void, PROP_FUNC(f_prop_clear)},
{"prop_find", 1, 2, FEARG_1, arg2_dict_string,
ret_dict_any, PROP_FUNC(f_prop_find)},
{"prop_list", 1, 2, FEARG_1, arg2_nr_dict_any,
{"prop_list", 1, 2, FEARG_1, arg2_number_dict_any,
ret_list_dict_any, PROP_FUNC(f_prop_list)},
{"prop_remove", 1, 3, FEARG_1, arg3_dict_number_number,
ret_number, PROP_FUNC(f_prop_remove)},
@ -1664,7 +1686,7 @@ static funcentry_T global_functions[] =
ret_string, f_reg_executing},
{"reg_recording", 0, 0, 0, NULL,
ret_string, f_reg_recording},
{"reltime", 0, 2, FEARG_1, arg2_list_nr,
{"reltime", 0, 2, FEARG_1, arg2_list_number,
ret_list_any, f_reltime},
{"reltimefloat", 1, 1, FEARG_1, arg1_list_number,
ret_float, FLOAT_FUNC(f_reltimefloat)},
@ -1882,23 +1904,23 @@ static funcentry_T global_functions[] =
ret_string, f_strtrans},
{"strwidth", 1, 1, FEARG_1, arg1_string,
ret_number, f_strwidth},
{"submatch", 1, 2, FEARG_1, arg2_nr_bool,
{"submatch", 1, 2, FEARG_1, arg2_number_bool,
ret_string, f_submatch},
{"substitute", 4, 4, FEARG_1, NULL,
ret_string, f_substitute},
{"swapinfo", 1, 1, FEARG_1, arg1_string,
ret_dict_any, f_swapinfo},
{"swapname", 1, 1, FEARG_1, arg1_string_or_nr,
{"swapname", 1, 1, FEARG_1, arg1_buffer,
ret_string, f_swapname},
{"synID", 3, 3, 0, arg3_string_or_nr_nr_bool,
{"synID", 3, 3, 0, arg3_lnum_number_bool,
ret_number, f_synID},
{"synIDattr", 2, 3, FEARG_1, NULL,
ret_string, f_synIDattr},
{"synIDtrans", 1, 1, FEARG_1, arg1_number,
ret_number, f_synIDtrans},
{"synconcealed", 2, 2, 0, arg2_string_or_nr_nr,
{"synconcealed", 2, 2, 0, arg2_lnum_number,
ret_list_any, f_synconcealed},
{"synstack", 2, 2, 0, arg2_string_or_nr_nr,
{"synstack", 2, 2, 0, arg2_lnum_number,
ret_list_number, f_synstack},
{"system", 1, 2, FEARG_1, NULL,
ret_string, f_system},
@ -1908,7 +1930,7 @@ static funcentry_T global_functions[] =
ret_list_number, f_tabpagebuflist},
{"tabpagenr", 0, 1, 0, arg1_string,
ret_number, f_tabpagenr},
{"tabpagewinnr", 1, 2, FEARG_1, arg2_nr_string,
{"tabpagewinnr", 1, 2, FEARG_1, arg2_number_string,
ret_number, f_tabpagewinnr},
{"tagfiles", 0, 0, 0, NULL,
ret_list_string, f_tagfiles},
@ -1926,9 +1948,9 @@ static funcentry_T global_functions[] =
ret_number, TERM_FUNC(f_term_dumpload)},
{"term_dumpwrite", 2, 3, FEARG_2, NULL,
ret_void, TERM_FUNC(f_term_dumpwrite)},
{"term_getaltscreen", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getaltscreen", 1, 1, FEARG_1, arg1_buffer,
ret_number, TERM_FUNC(f_term_getaltscreen)},
{"term_getansicolors", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getansicolors", 1, 1, FEARG_1, arg1_buffer,
ret_list_string,
#if defined(FEAT_TERMINAL) && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS))
f_term_getansicolors
@ -1936,31 +1958,31 @@ static funcentry_T global_functions[] =
NULL
#endif
},
{"term_getattr", 2, 2, FEARG_1, arg2_nr_string,
{"term_getattr", 2, 2, FEARG_1, arg2_number_string,
ret_number, TERM_FUNC(f_term_getattr)},
{"term_getcursor", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getcursor", 1, 1, FEARG_1, arg1_buffer,
ret_list_any, TERM_FUNC(f_term_getcursor)},
{"term_getjob", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getjob", 1, 1, FEARG_1, arg1_buffer,
ret_job, TERM_FUNC(f_term_getjob)},
{"term_getline", 2, 2, FEARG_1, NULL,
{"term_getline", 2, 2, FEARG_1, arg2_buffer_lnum,
ret_string, TERM_FUNC(f_term_getline)},
{"term_getscrolled", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getscrolled", 1, 1, FEARG_1, arg1_buffer,
ret_number, TERM_FUNC(f_term_getscrolled)},
{"term_getsize", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getsize", 1, 1, FEARG_1, arg1_buffer,
ret_list_number, TERM_FUNC(f_term_getsize)},
{"term_getstatus", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_getstatus", 1, 1, FEARG_1, arg1_buffer,
ret_string, TERM_FUNC(f_term_getstatus)},
{"term_gettitle", 1, 1, FEARG_1, arg1_string_or_nr,
{"term_gettitle", 1, 1, FEARG_1, arg1_buffer,
ret_string, TERM_FUNC(f_term_gettitle)},
{"term_gettty", 1, 2, FEARG_1, arg2_string_or_nr_bool,
{"term_gettty", 1, 2, FEARG_1, arg2_buffer_bool,
ret_string, TERM_FUNC(f_term_gettty)},
{"term_list", 0, 0, 0, NULL,
ret_list_number, TERM_FUNC(f_term_list)},
{"term_scrape", 2, 2, FEARG_1, NULL,
{"term_scrape", 2, 2, FEARG_1, arg2_buffer_lnum,
ret_list_dict_any, TERM_FUNC(f_term_scrape)},
{"term_sendkeys", 2, 2, FEARG_1, arg2_string_or_nr_string,
{"term_sendkeys", 2, 2, FEARG_1, arg2_buffer_string,
ret_void, TERM_FUNC(f_term_sendkeys)},
{"term_setansicolors", 2, 2, FEARG_1, arg2_term_setansicolors,
{"term_setansicolors", 2, 2, FEARG_1, arg2_buffer_list_any,
ret_void,
#if defined(FEAT_TERMINAL) && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS))
f_term_setansicolors
@ -1968,17 +1990,17 @@ static funcentry_T global_functions[] =
NULL
#endif
},
{"term_setapi", 2, 2, FEARG_1, arg2_string_or_nr_string,
{"term_setapi", 2, 2, FEARG_1, arg2_buffer_string,
ret_void, TERM_FUNC(f_term_setapi)},
{"term_setkill", 2, 2, FEARG_1, arg2_string_or_nr_string,
{"term_setkill", 2, 2, FEARG_1, arg2_buffer_string,
ret_void, TERM_FUNC(f_term_setkill)},
{"term_setrestore", 2, 2, FEARG_1, arg2_string_or_nr_string,
{"term_setrestore", 2, 2, FEARG_1, arg2_buffer_string,
ret_void, TERM_FUNC(f_term_setrestore)},
{"term_setsize", 3, 3, FEARG_1, NULL,
{"term_setsize", 3, 3, FEARG_1, arg3_buffer_number_number,
ret_void, TERM_FUNC(f_term_setsize)},
{"term_start", 1, 2, FEARG_1, NULL,
{"term_start", 1, 2, FEARG_1, arg2_string_or_list_dict,
ret_number, TERM_FUNC(f_term_start)},
{"term_wait", 1, 2, FEARG_1, arg2_string_or_nr_nr,
{"term_wait", 1, 2, FEARG_1, arg2_buffer_number,
ret_void, TERM_FUNC(f_term_wait)},
{"terminalprops", 0, 0, 0, NULL,
ret_dict_string, f_terminalprops},
@ -2042,7 +2064,7 @@ static funcentry_T global_functions[] =
ret_void, f_test_void},
{"timer_info", 0, 1, FEARG_1, arg1_number,
ret_list_dict_any, TIMER_FUNC(f_timer_info)},
{"timer_pause", 2, 2, FEARG_1, arg2_nr_bool,
{"timer_pause", 2, 2, FEARG_1, arg2_number_bool,
ret_void, TIMER_FUNC(f_timer_pause)},
{"timer_start", 2, 3, FEARG_1, NULL,
ret_number, TIMER_FUNC(f_timer_start)},
@ -2851,8 +2873,9 @@ set_cursorpos(typval_T *argvars, typval_T *rettv, int charcol)
&& argvars[0].v_type != VAR_STRING
&& argvars[0].v_type != VAR_LIST
&& check_for_number_arg(argvars, 0) == FAIL)
|| check_for_number_arg(argvars, 1) == FAIL
|| check_for_opt_number_arg(argvars, 2) == FAIL))
|| check_for_opt_number_arg(argvars, 1) == FAIL
|| (argvars[1].v_type != VAR_UNKNOWN
&& check_for_opt_number_arg(argvars, 2) == FAIL)))
return;
rettv->vval.v_number = -1;
@ -9133,7 +9156,7 @@ f_synID(typval_T *argvars UNUSED, typval_T *rettv)
int transerr = FALSE;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_lnum_arg(argvars, 0) == FAIL
|| check_for_number_arg(argvars, 1) == FAIL
|| check_for_bool_arg(argvars, 2) == FAIL))
return;
@ -9282,7 +9305,7 @@ f_synconcealed(typval_T *argvars UNUSED, typval_T *rettv)
rettv_list_set(rettv, NULL);
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_lnum_arg(argvars, 0) == FAIL
|| check_for_number_arg(argvars, 1) == FAIL))
return;
@ -9343,7 +9366,7 @@ f_synstack(typval_T *argvars UNUSED, typval_T *rettv)
rettv_list_set(rettv, NULL);
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_lnum_arg(argvars, 0) == FAIL
|| check_for_number_arg(argvars, 1) == FAIL))
return;

View File

@ -1726,7 +1726,7 @@ f_prompt_setprompt(typval_T *argvars, typval_T *rettv UNUSED)
char_u *text;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_string_arg(argvars, 1) == FAIL))
return;

View File

@ -25,10 +25,13 @@ int check_for_chan_or_job_arg(typval_T *args, int idx);
int check_for_job_arg(typval_T *args, int idx);
int check_for_string_or_number_arg(typval_T *args, int idx);
int check_for_buffer_arg(typval_T *args, int idx);
int check_for_opt_buffer_arg(typval_T *args, int idx);
int check_for_lnum_arg(typval_T *args, int idx);
int check_for_opt_lnum_arg(typval_T *args, int idx);
int check_for_opt_string_or_number_arg(typval_T *args, int idx);
int check_for_string_or_blob_arg(typval_T *args, int idx);
int check_for_string_or_list_arg(typval_T *args, int idx);
int check_for_buffer_or_dict_arg(typval_T *args, int idx);
char_u *tv_get_string(typval_T *varp);
char_u *tv_get_string_strict(typval_T *varp);
char_u *tv_get_string_buf(typval_T *varp, char_u *buf);

View File

@ -2301,7 +2301,7 @@ f_sign_getplaced(typval_T *argvars, typval_T *rettv)
return;
if (in_vim9script()
&& (check_for_opt_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_opt_buffer_arg(argvars, 0) == FAIL
|| (argvars[0].v_type != VAR_UNKNOWN
&& check_for_opt_dict_arg(argvars, 1) == FAIL)))
return;

View File

@ -5779,11 +5779,18 @@ get_row_number(typval_T *tv, term_T *term)
void
f_term_getline(typval_T *argvars, typval_T *rettv)
{
buf_T *buf = term_get_buf(argvars, "term_getline()");
buf_T *buf;
term_T *term;
int row;
rettv->v_type = VAR_STRING;
if (in_vim9script()
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_lnum_arg(argvars, 1) == FAIL))
return;
buf = term_get_buf(argvars, "term_getline()");
if (buf == NULL)
return;
term = buf->b_term;
@ -5858,10 +5865,17 @@ f_term_getsize(typval_T *argvars, typval_T *rettv)
void
f_term_setsize(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
{
buf_T *buf = term_get_buf(argvars, "term_setsize()");
buf_T *buf;
term_T *term;
varnumber_T rows, cols;
if (in_vim9script()
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_number_arg(argvars, 1) == FAIL
|| check_for_number_arg(argvars, 2) == FAIL))
return;
buf = term_get_buf(argvars, "term_setsize()");
if (buf == NULL)
{
emsg(_("E955: Not a terminal buffer"));
@ -5933,7 +5947,7 @@ f_term_gettty(typval_T *argvars, typval_T *rettv)
int num = 0;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_opt_bool_arg(argvars, 1) == FAIL))
return;
@ -5988,7 +6002,7 @@ f_term_list(typval_T *argvars UNUSED, typval_T *rettv)
void
f_term_scrape(typval_T *argvars, typval_T *rettv)
{
buf_T *buf = term_get_buf(argvars, "term_scrape()");
buf_T *buf;
VTermScreen *screen = NULL;
VTermPos pos;
list_T *l;
@ -5998,6 +6012,13 @@ f_term_scrape(typval_T *argvars, typval_T *rettv)
if (rettv_list_alloc(rettv) == FAIL)
return;
if (in_vim9script()
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_lnum_arg(argvars, 1) == FAIL))
return;
buf = term_get_buf(argvars, "term_scrape()");
if (buf == NULL)
return;
term = buf->b_term;
@ -6104,7 +6125,7 @@ f_term_sendkeys(typval_T *argvars, typval_T *rettv UNUSED)
term_T *term;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_string_arg(argvars, 1) == FAIL))
return;
@ -6183,7 +6204,7 @@ f_term_setansicolors(typval_T *argvars, typval_T *rettv UNUSED)
term_T *term;
if (in_vim9script()
&& (check_for_opt_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_opt_buffer_arg(argvars, 0) == FAIL
|| (argvars[0].v_type != VAR_UNKNOWN
&& check_for_opt_list_arg(argvars, 1) == FAIL)))
return;
@ -6217,7 +6238,7 @@ f_term_setapi(typval_T *argvars, typval_T *rettv UNUSED)
char_u *api;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_string_arg(argvars, 1) == FAIL))
return;
@ -6245,7 +6266,7 @@ f_term_setrestore(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
char_u *cmd;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_string_arg(argvars, 1) == FAIL))
return;
@ -6273,7 +6294,7 @@ f_term_setkill(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
char_u *how;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_string_arg(argvars, 1) == FAIL))
return;
@ -6298,6 +6319,11 @@ f_term_start(typval_T *argvars, typval_T *rettv)
jobopt_T opt;
buf_T *buf;
if (in_vim9script()
&& (check_for_string_or_list_arg(argvars, 0) == FAIL
|| check_for_opt_dict_arg(argvars, 1) == FAIL))
return;
init_job_options(&opt);
if (argvars[1].v_type != VAR_UNKNOWN
&& get_job_options(&argvars[1], &opt,
@ -6326,7 +6352,7 @@ f_term_wait(typval_T *argvars, typval_T *rettv UNUSED)
buf_T *buf;
if (in_vim9script()
&& (check_for_string_or_number_arg(argvars, 0) == FAIL
&& (check_for_buffer_arg(argvars, 0) == FAIL
|| check_for_opt_number_arg(argvars, 1) == FAIL))
return;

View File

@ -652,6 +652,8 @@ def Test_cursor()
assert_equal(2, getcurpos()[1])
cursor('$', 1)
assert_equal(4, getcurpos()[1])
cursor([2, 1])
assert_equal(2, getcurpos()[1])
var lines =<< trim END
cursor('2', 1)
@ -1105,6 +1107,7 @@ def Test_getbufinfo()
getbufinfo({bufloaded: true, buflisted: true, bufmodified: false})
->len()->assert_equal(3)
bwipe Xtestfile1 Xtestfile2
CheckDefAndScriptFailure2(['getbufinfo(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1174: String required for argument 1')
enddef
def Test_getbufline()
@ -1246,6 +1249,8 @@ def Test_getline()
echo getline('1')
END
CheckDefExecAndScriptFailure(lines, 'E1209:')
CheckDefAndScriptFailure2(['getline(true)'], 'E1013: Argument 1: type mismatch, expected string but got bool', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['getline(1, true)'], 'E1013: Argument 2: type mismatch, expected string but got bool', 'E1174: String required for argument 2')
enddef
def Test_getloclist()
@ -3066,6 +3071,12 @@ def Test_term_getjob()
CheckDefAndScriptFailure2(['term_getjob(0z10)'], 'E1013: Argument 1: type mismatch, expected string but got blob', 'E974: Using a Blob as a Number')
enddef
def Test_term_getline()
CheckRunVimInTerminal
CheckDefAndScriptFailure2(['term_getline(1.1, 1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_getline(1, 1.1)'], 'E1013: Argument 2: type mismatch, expected string but got float', 'E1174: String required for argument 2')
enddef
def Test_term_getscrolled()
CheckRunVimInTerminal
CheckDefAndScriptFailure2(['term_getscrolled(1.1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E805: Using a Float as a Number')
@ -3098,6 +3109,12 @@ def Test_term_gettty()
CheckDefAndScriptFailure2(['term_gettty(1, 2)'], 'E1013: Argument 2: type mismatch, expected bool but got number', 'E1212: Bool required for argument 2')
enddef
def Test_term_scrape()
CheckRunVimInTerminal
CheckDefAndScriptFailure2(['term_scrape(1.1, 1)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_scrape(1, 1.1)'], 'E1013: Argument 2: type mismatch, expected string but got float', 'E1174: String required for argument 2')
enddef
def Test_term_sendkeys()
CheckRunVimInTerminal
CheckDefAndScriptFailure2(['term_sendkeys([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
@ -3127,6 +3144,14 @@ def Test_term_setrestore()
CheckDefAndScriptFailure2(['term_setrestore([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_setrestore(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list<unknown>', 'E1174: String required for argument 2')
enddef
def Test_term_setsize()
CheckRunVimInTerminal
CheckDefAndScriptFailure2(['term_setsize(1.1, 2, 3)'], 'E1013: Argument 1: type mismatch, expected string but got float', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_setsize(1, "2", 3)'], 'E1013: Argument 2: type mismatch, expected number but got string', 'E1210: Number required for argument 2')
CheckDefAndScriptFailure2(['term_setsize(1, 2, "3")'], 'E1013: Argument 3: type mismatch, expected number but got string', 'E1210: Number required for argument 3')
enddef
def Test_term_start()
if !has('terminal')
CheckFeature terminal
@ -3137,6 +3162,9 @@ def Test_term_start()
winnr()->assert_equal(winnr)
bwipe!
endif
CheckDefAndScriptFailure2(['term_start({})'], 'E1013: Argument 1: type mismatch, expected string but got dict<unknown>', 'E1174: String required for argument 1')
CheckDefAndScriptFailure2(['term_start([], [])'], 'E1013: Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary required for argument 2')
CheckDefAndScriptFailure2(['term_start("", "")'], 'E1013: Argument 2: type mismatch, expected dict<any> but got string', 'E1206: Dictionary required for argument 2')
enddef
def Test_term_wait()

View File

@ -575,63 +575,7 @@ check_for_string_or_number_arg(typval_T *args, int idx)
}
/*
* Give an error and return FAIL unless "args[idx]" is a string or
* a number (buffer)
*/
int
check_for_buffer_arg(typval_T *args, int idx)
{
if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_NUMBER)
{
if (idx >= 0)
semsg(_(e_string_required_for_argument_nr), idx + 1);
else
emsg(_(e_stringreq));
return FAIL;
}
return OK;
}
/*
* Give an error and return FAIL unless "args[idx]" is a string or
* a number (line)
*/
int
check_for_lnum_arg(typval_T *args, int idx)
{
if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_NUMBER)
{
if (idx >= 0)
semsg(_(e_string_required_for_argument_nr), idx + 1);
else
emsg(_(e_stringreq));
return FAIL;
}
return OK;
}
/*
* Give an error and return FAIL unless "args[idx]" is a string or
* a number (line)
*/
int
check_for_opt_lnum_arg(typval_T *args, int idx)
{
if (args[idx].v_type != VAR_UNKNOWN
&& args[idx].v_type != VAR_STRING
&& args[idx].v_type != VAR_NUMBER)
{
if (idx >= 0)
semsg(_(e_string_required_for_argument_nr), idx + 1);
else
emsg(_(e_stringreq));
return FAIL;
}
return OK;
}
/*
* Check for an optional string or number argument at 'idx'
* Check for an optional string or number argument at 'idx'.
*/
int
check_for_opt_string_or_number_arg(typval_T *args, int idx)
@ -640,6 +584,46 @@ check_for_opt_string_or_number_arg(typval_T *args, int idx)
|| check_for_string_or_number_arg(args, idx) != FAIL);
}
/*
* Give an error and return FAIL unless "args[idx]" is a buffer number.
* Buffer number can be a number or a string.
*/
int
check_for_buffer_arg(typval_T *args, int idx)
{
return check_for_string_or_number_arg(args, idx);
}
/*
* Check for an optional buffer argument at 'idx'
*/
int
check_for_opt_buffer_arg(typval_T *args, int idx)
{
return (args[idx].v_type == VAR_UNKNOWN
|| check_for_buffer_arg(args, idx));
}
/*
* Give an error and return FAIL unless "args[idx]" is a line number.
* Line number can be a number or a string.
*/
int
check_for_lnum_arg(typval_T *args, int idx)
{
return check_for_string_or_number_arg(args, idx);
}
/*
* Check for an optional line number argument at 'idx'
*/
int
check_for_opt_lnum_arg(typval_T *args, int idx)
{
return (args[idx].v_type == VAR_UNKNOWN
|| check_for_lnum_arg(args, idx));
}
/*
* Give an error and return FAIL unless "args[idx]" is a string or
* a blob.
@ -658,6 +642,44 @@ check_for_string_or_blob_arg(typval_T *args, int idx)
return OK;
}
/*
* Give an error and return FAIL unless "args[idx]" is a string or
* a list.
*/
int
check_for_string_or_list_arg(typval_T *args, int idx)
{
if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_LIST)
{
if (idx >= 0)
semsg(_(e_string_required_for_argument_nr), idx + 1);
else
emsg(_(e_stringreq));
return FAIL;
}
return OK;
}
/*
* Give an error and return FAIL unless "args[idx]" is a buffer
* number or a dict.
*/
int
check_for_buffer_or_dict_arg(typval_T *args, int idx)
{
if (args[idx].v_type != VAR_STRING
&& args[idx].v_type != VAR_NUMBER
&& args[idx].v_type != VAR_DICT)
{
if (idx >= 0)
semsg(_(e_string_required_for_argument_nr), idx + 1);
else
emsg(_(e_stringreq));
return FAIL;
}
return OK;
}
/*
* Get the string value of a variable.
* If it is a Number variable, the number is converted into a string.

View File

@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3194,
/**/
3193,
/**/