To: vim_dev@googlegroups.com Subject: Patch 8.2.3194 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.3194 Problem: Vim9: argument types are not checked at compile time. Solution: Add several more type checks, simplify some. (Yegappan Lakshmanan, closes #8598) Files: src/diff.c, src/evalbuffer.c, src/evalfunc.c, src/job.c, src/proto/typval.pro, src/sign.c, src/terminal.c, src/testdir/test_vim9_builtin.vim, src/typval.c *** ../vim-8.2.3193/src/diff.c 2021-07-20 17:51:48.239744107 +0200 --- src/diff.c 2021-07-21 19:06:07.877106611 +0200 *************** *** 3294,3300 **** int col; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars,0) == FAIL || check_for_number_arg(argvars, 1) == FAIL)) return; --- 3294,3300 ---- int col; if (in_vim9script() ! && (check_for_lnum_arg(argvars,0) == FAIL || check_for_number_arg(argvars, 1) == FAIL)) return; *** ../vim-8.2.3193/src/evalbuffer.c 2021-07-20 17:51:48.243744105 +0200 --- src/evalbuffer.c 2021-07-21 19:06:07.877106611 +0200 *************** *** 388,394 **** char_u *name; if (in_vim9script() ! && (check_for_opt_string_or_number_arg(argvars, 0) == FAIL || (argvars[0].v_type != VAR_UNKNOWN && check_for_opt_bool_arg(argvars, 1) == FAIL))) return; --- 388,394 ---- char_u *name; if (in_vim9script() ! && (check_for_opt_buffer_arg(argvars, 0) == FAIL || (argvars[0].v_type != VAR_UNKNOWN && check_for_opt_bool_arg(argvars, 1) == FAIL))) return; *************** *** 635,640 **** --- 635,645 ---- 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,779 **** --- 779,789 ---- 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) { *** ../vim-8.2.3193/src/evalfunc.c 2021-07-20 17:51:48.243744105 +0200 --- src/evalfunc.c 2021-07-21 19:06:07.877106611 +0200 *************** *** 326,332 **** } /* ! * Check "type" is a string or a number (buffer) */ static int arg_buffer(type_T *type, argcontext_T *context) --- 326,332 ---- } /* ! * Check "type" is a buffer (string or a number) */ static int arg_buffer(type_T *type, argcontext_T *context) *************** *** 339,345 **** } /* ! * Check "type" is a string or a number (line) */ static int arg_lnum(type_T *type, argcontext_T *context) --- 339,360 ---- } /* ! * 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,615 **** 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_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_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}; --- 622,632 ---- 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_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,638 **** 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 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_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_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_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}; --- 637,657 ---- 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_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_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_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,652 **** //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_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 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}; --- 660,674 ---- //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_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_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,665 **** 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 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}; --- 680,688 ---- 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_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,692 **** 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 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 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}; --- 701,714 ---- 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_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_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 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,1066 **** ret_string, f_browsedir}, {"bufadd", 1, 1, FEARG_1, arg1_string, ret_number, f_bufadd}, ! {"bufexists", 1, 1, FEARG_1, arg1_string_or_nr, ret_number_bool, f_bufexists}, ! {"buffer_exists", 1, 1, FEARG_1, arg1_string_or_nr, // obsolete ret_number_bool, f_bufexists}, ! {"buffer_name", 0, 1, FEARG_1, arg1_string_or_nr, // obsolete ret_string, f_bufname}, ! {"buffer_number", 0, 1, FEARG_1, arg2_string_or_nr_bool, // obsolete ret_number, f_bufnr}, ! {"buflisted", 1, 1, FEARG_1, arg1_string_or_nr, ret_number_bool, f_buflisted}, ! {"bufload", 1, 1, FEARG_1, arg1_string_or_nr, ret_void, f_bufload}, ! {"bufloaded", 1, 1, FEARG_1, arg1_string_or_nr, ret_number_bool, f_bufloaded}, ! {"bufname", 0, 1, FEARG_1, arg1_string_or_nr, ret_string, f_bufname}, ! {"bufnr", 0, 2, FEARG_1, arg2_string_or_nr_bool, ret_number, f_bufnr}, ! {"bufwinid", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_bufwinid}, ! {"bufwinnr", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_bufwinnr}, {"byte2line", 1, 1, FEARG_1, arg1_number, ret_number, f_byte2line}, --- 1062,1088 ---- ret_string, f_browsedir}, {"bufadd", 1, 1, FEARG_1, arg1_string, ret_number, f_bufadd}, ! {"bufexists", 1, 1, FEARG_1, arg1_buffer, ret_number_bool, f_bufexists}, ! {"buffer_exists", 1, 1, FEARG_1, arg1_buffer, // obsolete ret_number_bool, f_bufexists}, ! {"buffer_name", 0, 1, FEARG_1, arg1_buffer, // obsolete ret_string, f_bufname}, ! {"buffer_number", 0, 1, FEARG_1, arg1_buffer, // obsolete ret_number, f_bufnr}, ! {"buflisted", 1, 1, FEARG_1, arg1_buffer, ret_number_bool, f_buflisted}, ! {"bufload", 1, 1, FEARG_1, arg1_buffer, ret_void, f_bufload}, ! {"bufloaded", 1, 1, FEARG_1, arg1_buffer, ret_number_bool, f_bufloaded}, ! {"bufname", 0, 1, FEARG_1, arg1_buffer, ret_string, f_bufname}, ! {"bufnr", 0, 2, FEARG_1, arg2_buffer_bool, ret_number, f_bufnr}, ! {"bufwinid", 1, 1, FEARG_1, arg1_buffer, ret_number, f_bufwinid}, ! {"bufwinnr", 1, 1, FEARG_1, arg1_buffer, ret_number, f_bufwinnr}, {"byte2line", 1, 1, FEARG_1, arg1_number, ret_number, f_byte2line}, *************** *** 1120,1132 **** ret_number, f_charidx}, {"chdir", 1, 1, FEARG_1, arg1_string, ret_string, f_chdir}, ! {"cindent", 1, 1, FEARG_1, arg1_string_or_nr, 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, ret_void, f_complete}, {"complete_add", 1, 1, FEARG_1, arg1_dict_or_string, ret_number, f_complete_add}, --- 1142,1154 ---- ret_number, f_charidx}, {"chdir", 1, 1, FEARG_1, arg1_string, ret_string, f_chdir}, ! {"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_number_list, ret_void, f_complete}, {"complete_add", 1, 1, FEARG_1, arg1_dict_or_string, ret_number, f_complete_add}, *************** *** 1160,1172 **** 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, 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, ret_number, f_diff_filler}, ! {"diff_hlID", 2, 2, FEARG_1, arg2_string_or_nr_nr, ret_number, f_diff_hlID}, {"echoraw", 1, 1, FEARG_1, arg1_string, ret_void, f_echoraw}, --- 1182,1194 ---- ret_first_arg, f_deepcopy}, {"delete", 1, 2, FEARG_1, arg2_string, ret_number_bool, f_delete}, ! {"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_lnum, ret_number, f_diff_filler}, ! {"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,1240 **** ret_string, f_fnameescape}, {"fnamemodify", 2, 2, FEARG_1, arg2_string, ret_string, f_fnamemodify}, ! {"foldclosed", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_foldclosed}, ! {"foldclosedend", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_foldclosedend}, ! {"foldlevel", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_foldlevel}, {"foldtext", 0, 0, 0, NULL, ret_string, f_foldtext}, ! {"foldtextresult", 1, 1, FEARG_1, arg1_string_or_nr, ret_string, f_foldtextresult}, {"foreground", 0, 0, 0, NULL, ret_void, f_foreground}, --- 1248,1262 ---- ret_string, f_fnameescape}, {"fnamemodify", 2, 2, FEARG_1, arg2_string, ret_string, f_fnamemodify}, ! {"foldclosed", 1, 1, FEARG_1, arg1_lnum, ret_number, f_foldclosed}, ! {"foldclosedend", 1, 1, FEARG_1, arg1_lnum, ret_number, f_foldclosedend}, ! {"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_lnum, ret_string, f_foldtextresult}, {"foreground", 0, 0, 0, NULL, ret_void, f_foreground}, *************** *** 1248,1260 **** ret_void, f_garbagecollect}, {"get", 2, 3, FEARG_1, NULL, ret_any, f_get}, ! {"getbufinfo", 0, 1, FEARG_1, NULL, ret_list_dict_any, f_getbufinfo}, ! {"getbufline", 2, 3, FEARG_1, arg3_bufnr_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, ret_list_any, f_getchangelist}, {"getchar", 0, 1, 0, arg1_bool, ret_any, f_getchar}, --- 1270,1282 ---- ret_void, f_garbagecollect}, {"get", 2, 3, FEARG_1, NULL, ret_any, f_get}, ! {"getbufinfo", 0, 1, FEARG_1, arg1_buffer_or_dict_any, ret_list_dict_any, f_getbufinfo}, ! {"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_buffer, ret_list_any, f_getchangelist}, {"getchar", 0, 1, 0, arg1_bool, ret_any, f_getchar}, *************** *** 1302,1312 **** ret_number_bool, f_getimstatus}, {"getjumplist", 0, 2, FEARG_1, arg2_number, ret_list_any, f_getjumplist}, ! {"getline", 1, 2, FEARG_1, NULL, ret_f_getline, f_getline}, ! {"getloclist", 1, 2, 0, arg2_nr_dict_any, ret_list_or_dict_1, f_getloclist}, ! {"getmarklist", 0, 1, FEARG_1, arg1_string_or_nr, ret_list_dict_any, f_getmarklist}, {"getmatches", 0, 1, 0, arg1_number, ret_list_dict_any, f_getmatches}, --- 1324,1334 ---- ret_number_bool, f_getimstatus}, {"getjumplist", 0, 2, FEARG_1, arg2_number, ret_list_any, f_getjumplist}, ! {"getline", 1, 2, FEARG_1, arg2_lnum, ret_f_getline, f_getline}, ! {"getloclist", 1, 2, 0, arg2_number_dict_any, ret_list_or_dict_1, f_getloclist}, ! {"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,1358 **** 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, ret_number_bool, f_has_key}, {"haslocaldir", 0, 2, FEARG_1, arg2_number, ret_number, f_haslocaldir}, --- 1374,1380 ---- ret_any, f_globpath}, {"has", 1, 2, 0, arg2_string_bool, ret_number_bool, f_has}, ! {"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,1384 **** ret_string, f_hostname}, {"iconv", 3, 3, FEARG_1, arg3_string, ret_string, f_iconv}, ! {"indent", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_indent}, {"index", 2, 4, FEARG_1, arg4_index, ret_number, f_index}, --- 1400,1406 ---- ret_string, f_hostname}, {"iconv", 3, 3, FEARG_1, arg3_string, ret_string, f_iconv}, ! {"indent", 1, 1, FEARG_1, arg1_lnum, ret_number, f_indent}, {"index", 2, 4, FEARG_1, arg4_index, ret_number, f_index}, *************** *** 1444,1458 **** 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, ret_number, f_line2byte}, ! {"lispindent", 1, 1, FEARG_1, arg1_string_or_nr, 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, ret_void, f_listener_flush}, {"listener_remove", 1, 1, FEARG_1, arg1_number, ret_number_bool, f_listener_remove}, --- 1466,1480 ---- ret_number, f_libcallnr}, {"line", 1, 2, FEARG_1, arg2_string_number, ret_number, f_line}, ! {"line2byte", 1, 1, FEARG_1, arg1_lnum, ret_number, f_line2byte}, ! {"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_buffer, ret_void, f_listener_flush}, {"listener_remove", 1, 1, FEARG_1, arg1_number, ret_number_bool, f_listener_remove}, *************** *** 1526,1534 **** NULL #endif }, ! {"nextnonblank", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, f_nextnonblank}, ! {"nr2char", 1, 2, FEARG_1, arg2_nr_bool, ret_string, f_nr2char}, {"or", 2, 2, FEARG_1, arg2_number, ret_number, f_or}, --- 1548,1556 ---- NULL #endif }, ! {"nextnonblank", 1, 1, FEARG_1, arg1_lnum, ret_number, f_nextnonblank}, ! {"nr2char", 1, 2, FEARG_1, arg2_number_bool, ret_string, f_nr2char}, {"or", 2, 2, FEARG_1, arg2_number, ret_number, f_or}, *************** *** 1554,1562 **** 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, ret_bool, PROP_FUNC(f_popup_filter_menu)}, ! {"popup_filter_yesno", 2, 2, 0, arg2_nr_string, ret_bool, PROP_FUNC(f_popup_filter_yesno)}, {"popup_findinfo", 0, 0, 0, NULL, ret_number, PROP_FUNC(f_popup_findinfo)}, --- 1576,1584 ---- 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_number_string, ret_bool, PROP_FUNC(f_popup_filter_menu)}, ! {"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,1584 **** 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, 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, ret_void, PROP_FUNC(f_popup_setoptions)}, {"popup_settext", 2, 2, FEARG_1, NULL, ret_void, PROP_FUNC(f_popup_settext)}, --- 1596,1606 ---- 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_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_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,1602 **** 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, ret_number, f_prevnonblank}, {"printf", 1, 19, FEARG_2, NULL, ret_string, f_printf}, ! {"prompt_getprompt", 1, 1, FEARG_1, arg1_string_or_nr, 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, ret_void, JOB_FUNC(f_prompt_setprompt)}, {"prop_add", 3, 3, FEARG_1, arg3_number_number_dict, ret_void, PROP_FUNC(f_prop_add)}, --- 1608,1624 ---- 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_lnum, ret_number, f_prevnonblank}, {"printf", 1, 19, FEARG_2, NULL, ret_string, f_printf}, ! {"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_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,1610 **** 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, 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)}, --- 1626,1632 ---- 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_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,1670 **** ret_string, f_reg_executing}, {"reg_recording", 0, 0, 0, NULL, ret_string, f_reg_recording}, ! {"reltime", 0, 2, FEARG_1, arg2_list_nr, ret_list_any, f_reltime}, {"reltimefloat", 1, 1, FEARG_1, arg1_list_number, ret_float, FLOAT_FUNC(f_reltimefloat)}, --- 1686,1692 ---- ret_string, f_reg_executing}, {"reg_recording", 0, 0, 0, NULL, ret_string, f_reg_recording}, ! {"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,1904 **** ret_string, f_strtrans}, {"strwidth", 1, 1, FEARG_1, arg1_string, ret_number, f_strwidth}, ! {"submatch", 1, 2, FEARG_1, arg2_nr_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, ret_string, f_swapname}, ! {"synID", 3, 3, 0, arg3_string_or_nr_nr_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, ret_list_any, f_synconcealed}, ! {"synstack", 2, 2, 0, arg2_string_or_nr_nr, ret_list_number, f_synstack}, {"system", 1, 2, FEARG_1, NULL, ret_string, f_system}, --- 1904,1926 ---- ret_string, f_strtrans}, {"strwidth", 1, 1, FEARG_1, arg1_string, ret_number, f_strwidth}, ! {"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_buffer, ret_string, f_swapname}, ! {"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_lnum_number, ret_list_any, f_synconcealed}, ! {"synstack", 2, 2, 0, arg2_lnum_number, ret_list_number, f_synstack}, {"system", 1, 2, FEARG_1, NULL, ret_string, f_system}, *************** *** 1908,1914 **** ret_list_number, f_tabpagebuflist}, {"tabpagenr", 0, 1, 0, arg1_string, ret_number, f_tabpagenr}, ! {"tabpagewinnr", 1, 2, FEARG_1, arg2_nr_string, ret_number, f_tabpagewinnr}, {"tagfiles", 0, 0, 0, NULL, ret_list_string, f_tagfiles}, --- 1930,1936 ---- ret_list_number, f_tabpagebuflist}, {"tabpagenr", 0, 1, 0, arg1_string, ret_number, f_tabpagenr}, ! {"tabpagewinnr", 1, 2, FEARG_1, arg2_number_string, ret_number, f_tabpagewinnr}, {"tagfiles", 0, 0, 0, NULL, ret_list_string, f_tagfiles}, *************** *** 1926,1934 **** 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, ret_number, TERM_FUNC(f_term_getaltscreen)}, ! {"term_getansicolors", 1, 1, FEARG_1, arg1_string_or_nr, ret_list_string, #if defined(FEAT_TERMINAL) && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)) f_term_getansicolors --- 1948,1956 ---- 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_buffer, ret_number, TERM_FUNC(f_term_getaltscreen)}, ! {"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,1966 **** NULL #endif }, ! {"term_getattr", 2, 2, FEARG_1, arg2_nr_string, ret_number, TERM_FUNC(f_term_getattr)}, ! {"term_getcursor", 1, 1, FEARG_1, arg1_string_or_nr, ret_list_any, TERM_FUNC(f_term_getcursor)}, ! {"term_getjob", 1, 1, FEARG_1, arg1_string_or_nr, ret_job, TERM_FUNC(f_term_getjob)}, ! {"term_getline", 2, 2, FEARG_1, NULL, ret_string, TERM_FUNC(f_term_getline)}, ! {"term_getscrolled", 1, 1, FEARG_1, arg1_string_or_nr, ret_number, TERM_FUNC(f_term_getscrolled)}, ! {"term_getsize", 1, 1, FEARG_1, arg1_string_or_nr, ret_list_number, TERM_FUNC(f_term_getsize)}, ! {"term_getstatus", 1, 1, FEARG_1, arg1_string_or_nr, ret_string, TERM_FUNC(f_term_getstatus)}, ! {"term_gettitle", 1, 1, FEARG_1, arg1_string_or_nr, ret_string, TERM_FUNC(f_term_gettitle)}, ! {"term_gettty", 1, 2, FEARG_1, arg2_string_or_nr_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, ret_list_dict_any, TERM_FUNC(f_term_scrape)}, ! {"term_sendkeys", 2, 2, FEARG_1, arg2_string_or_nr_string, ret_void, TERM_FUNC(f_term_sendkeys)}, ! {"term_setansicolors", 2, 2, FEARG_1, arg2_term_setansicolors, ret_void, #if defined(FEAT_TERMINAL) && (defined(FEAT_GUI) || defined(FEAT_TERMGUICOLORS)) f_term_setansicolors --- 1958,1988 ---- NULL #endif }, ! {"term_getattr", 2, 2, FEARG_1, arg2_number_string, ret_number, TERM_FUNC(f_term_getattr)}, ! {"term_getcursor", 1, 1, FEARG_1, arg1_buffer, ret_list_any, TERM_FUNC(f_term_getcursor)}, ! {"term_getjob", 1, 1, FEARG_1, arg1_buffer, ret_job, TERM_FUNC(f_term_getjob)}, ! {"term_getline", 2, 2, FEARG_1, arg2_buffer_lnum, ret_string, TERM_FUNC(f_term_getline)}, ! {"term_getscrolled", 1, 1, FEARG_1, arg1_buffer, ret_number, TERM_FUNC(f_term_getscrolled)}, ! {"term_getsize", 1, 1, FEARG_1, arg1_buffer, ret_list_number, TERM_FUNC(f_term_getsize)}, ! {"term_getstatus", 1, 1, FEARG_1, arg1_buffer, ret_string, TERM_FUNC(f_term_getstatus)}, ! {"term_gettitle", 1, 1, FEARG_1, arg1_buffer, ret_string, TERM_FUNC(f_term_gettitle)}, ! {"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, arg2_buffer_lnum, ret_list_dict_any, TERM_FUNC(f_term_scrape)}, ! {"term_sendkeys", 2, 2, FEARG_1, arg2_buffer_string, ret_void, TERM_FUNC(f_term_sendkeys)}, ! {"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,1984 **** NULL #endif }, ! {"term_setapi", 2, 2, FEARG_1, arg2_string_or_nr_string, ret_void, TERM_FUNC(f_term_setapi)}, ! {"term_setkill", 2, 2, FEARG_1, arg2_string_or_nr_string, ret_void, TERM_FUNC(f_term_setkill)}, ! {"term_setrestore", 2, 2, FEARG_1, arg2_string_or_nr_string, ret_void, TERM_FUNC(f_term_setrestore)}, ! {"term_setsize", 3, 3, FEARG_1, NULL, ret_void, TERM_FUNC(f_term_setsize)}, ! {"term_start", 1, 2, FEARG_1, NULL, ret_number, TERM_FUNC(f_term_start)}, ! {"term_wait", 1, 2, FEARG_1, arg2_string_or_nr_nr, ret_void, TERM_FUNC(f_term_wait)}, {"terminalprops", 0, 0, 0, NULL, ret_dict_string, f_terminalprops}, --- 1990,2006 ---- NULL #endif }, ! {"term_setapi", 2, 2, FEARG_1, arg2_buffer_string, ret_void, TERM_FUNC(f_term_setapi)}, ! {"term_setkill", 2, 2, FEARG_1, arg2_buffer_string, ret_void, TERM_FUNC(f_term_setkill)}, ! {"term_setrestore", 2, 2, FEARG_1, arg2_buffer_string, ret_void, TERM_FUNC(f_term_setrestore)}, ! {"term_setsize", 3, 3, FEARG_1, arg3_buffer_number_number, ret_void, TERM_FUNC(f_term_setsize)}, ! {"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_buffer_number, ret_void, TERM_FUNC(f_term_wait)}, {"terminalprops", 0, 0, 0, NULL, ret_dict_string, f_terminalprops}, *************** *** 2042,2048 **** 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, ret_void, TIMER_FUNC(f_timer_pause)}, {"timer_start", 2, 3, FEARG_1, NULL, ret_number, TIMER_FUNC(f_timer_start)}, --- 2064,2070 ---- 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_number_bool, ret_void, TIMER_FUNC(f_timer_pause)}, {"timer_start", 2, 3, FEARG_1, NULL, ret_number, TIMER_FUNC(f_timer_start)}, *************** *** 2851,2858 **** && 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)) return; rettv->vval.v_number = -1; --- 2873,2881 ---- && argvars[0].v_type != VAR_STRING && argvars[0].v_type != VAR_LIST && check_for_number_arg(argvars, 0) == 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,9139 **** int transerr = FALSE; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_number_arg(argvars, 1) == FAIL || check_for_bool_arg(argvars, 2) == FAIL)) return; --- 9156,9162 ---- int transerr = FALSE; if (in_vim9script() ! && (check_for_lnum_arg(argvars, 0) == FAIL || check_for_number_arg(argvars, 1) == FAIL || check_for_bool_arg(argvars, 2) == FAIL)) return; *************** *** 9282,9288 **** rettv_list_set(rettv, NULL); if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_number_arg(argvars, 1) == FAIL)) return; --- 9305,9311 ---- rettv_list_set(rettv, NULL); if (in_vim9script() ! && (check_for_lnum_arg(argvars, 0) == FAIL || check_for_number_arg(argvars, 1) == FAIL)) return; *************** *** 9343,9349 **** rettv_list_set(rettv, NULL); if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_number_arg(argvars, 1) == FAIL)) return; --- 9366,9372 ---- rettv_list_set(rettv, NULL); if (in_vim9script() ! && (check_for_lnum_arg(argvars, 0) == FAIL || check_for_number_arg(argvars, 1) == FAIL)) return; *** ../vim-8.2.3193/src/job.c 2021-07-20 17:51:48.247744104 +0200 --- src/job.c 2021-07-21 19:06:07.877106611 +0200 *************** *** 1726,1732 **** char_u *text; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; --- 1726,1732 ---- char_u *text; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; *** ../vim-8.2.3193/src/proto/typval.pro 2021-07-20 17:51:48.247744104 +0200 --- src/proto/typval.pro 2021-07-21 19:06:07.881106600 +0200 *************** *** 25,34 **** --- 25,37 ---- 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); *** ../vim-8.2.3193/src/sign.c 2021-07-20 17:51:48.247744104 +0200 --- src/sign.c 2021-07-21 19:06:07.881106600 +0200 *************** *** 2301,2307 **** return; if (in_vim9script() ! && (check_for_opt_string_or_number_arg(argvars, 0) == FAIL || (argvars[0].v_type != VAR_UNKNOWN && check_for_opt_dict_arg(argvars, 1) == FAIL))) return; --- 2301,2307 ---- return; if (in_vim9script() ! && (check_for_opt_buffer_arg(argvars, 0) == FAIL || (argvars[0].v_type != VAR_UNKNOWN && check_for_opt_dict_arg(argvars, 1) == FAIL))) return; *** ../vim-8.2.3193/src/terminal.c 2021-07-20 17:51:48.247744104 +0200 --- src/terminal.c 2021-07-21 19:06:07.881106600 +0200 *************** *** 5779,5789 **** void f_term_getline(typval_T *argvars, typval_T *rettv) { ! buf_T *buf = term_get_buf(argvars, "term_getline()"); term_T *term; int row; rettv->v_type = VAR_STRING; if (buf == NULL) return; term = buf->b_term; --- 5779,5796 ---- void f_term_getline(typval_T *argvars, typval_T *rettv) { ! 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,5867 **** void f_term_setsize(typval_T *argvars UNUSED, typval_T *rettv UNUSED) { ! buf_T *buf = term_get_buf(argvars, "term_setsize()"); term_T *term; varnumber_T rows, cols; if (buf == NULL) { emsg(_("E955: Not a terminal buffer")); --- 5865,5881 ---- void f_term_setsize(typval_T *argvars UNUSED, typval_T *rettv UNUSED) { ! 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,5939 **** int num = 0; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_opt_bool_arg(argvars, 1) == FAIL)) return; --- 5947,5953 ---- int num = 0; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_opt_bool_arg(argvars, 1) == FAIL)) return; *************** *** 5988,5994 **** void f_term_scrape(typval_T *argvars, typval_T *rettv) { ! buf_T *buf = term_get_buf(argvars, "term_scrape()"); VTermScreen *screen = NULL; VTermPos pos; list_T *l; --- 6002,6008 ---- void f_term_scrape(typval_T *argvars, typval_T *rettv) { ! buf_T *buf; VTermScreen *screen = NULL; VTermPos pos; list_T *l; *************** *** 5998,6003 **** --- 6012,6024 ---- 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,6110 **** term_T *term; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; --- 6125,6131 ---- term_T *term; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; *************** *** 6183,6189 **** term_T *term; if (in_vim9script() ! && (check_for_opt_string_or_number_arg(argvars, 0) == FAIL || (argvars[0].v_type != VAR_UNKNOWN && check_for_opt_list_arg(argvars, 1) == FAIL))) return; --- 6204,6210 ---- term_T *term; if (in_vim9script() ! && (check_for_opt_buffer_arg(argvars, 0) == FAIL || (argvars[0].v_type != VAR_UNKNOWN && check_for_opt_list_arg(argvars, 1) == FAIL))) return; *************** *** 6217,6223 **** char_u *api; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; --- 6238,6244 ---- char_u *api; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; *************** *** 6245,6251 **** char_u *cmd; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; --- 6266,6272 ---- char_u *cmd; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; *************** *** 6273,6279 **** char_u *how; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; --- 6294,6300 ---- char_u *how; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_string_arg(argvars, 1) == FAIL)) return; *************** *** 6298,6303 **** --- 6319,6329 ---- 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,6332 **** buf_T *buf; if (in_vim9script() ! && (check_for_string_or_number_arg(argvars, 0) == FAIL || check_for_opt_number_arg(argvars, 1) == FAIL)) return; --- 6352,6358 ---- buf_T *buf; if (in_vim9script() ! && (check_for_buffer_arg(argvars, 0) == FAIL || check_for_opt_number_arg(argvars, 1) == FAIL)) return; *** ../vim-8.2.3193/src/testdir/test_vim9_builtin.vim 2021-07-20 17:51:48.251744105 +0200 --- src/testdir/test_vim9_builtin.vim 2021-07-21 19:06:07.881106600 +0200 *************** *** 652,657 **** --- 652,659 ---- 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,1110 **** --- 1107,1113 ---- 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,1251 **** --- 1249,1256 ---- 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,3071 **** --- 3071,3082 ---- 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,3103 **** --- 3109,3120 ---- 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', 'E1174: String required for argument 1') *************** *** 3127,3132 **** --- 3144,3157 ---- CheckDefAndScriptFailure2(['term_setrestore([], "p")'], 'E1013: Argument 1: type mismatch, expected string but got list', 'E1174: String required for argument 1') CheckDefAndScriptFailure2(['term_setrestore(1, [])'], 'E1013: Argument 2: type mismatch, expected string but got list', '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,3142 **** --- 3162,3170 ---- winnr()->assert_equal(winnr) bwipe! endif + CheckDefAndScriptFailure2(['term_start({})'], 'E1013: Argument 1: type mismatch, expected string but got dict', 'E1174: String required for argument 1') + CheckDefAndScriptFailure2(['term_start([], [])'], 'E1013: Argument 2: type mismatch, expected dict but got list', 'E1206: Dictionary required for argument 2') + CheckDefAndScriptFailure2(['term_start("", "")'], 'E1013: Argument 2: type mismatch, expected dict but got string', 'E1206: Dictionary required for argument 2') enddef def Test_term_wait() *** ../vim-8.2.3193/src/typval.c 2021-07-20 17:51:48.251744105 +0200 --- src/typval.c 2021-07-21 19:06:07.881106600 +0200 *************** *** 575,605 **** } /* ! * 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); --- 575,637 ---- } /* ! * Check for an optional string or number argument at 'idx'. ! */ ! int ! check_for_opt_string_or_number_arg(typval_T *args, int idx) ! { ! return (args[idx].v_type == VAR_UNKNOWN ! || 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. ! */ ! int ! check_for_string_or_blob_arg(typval_T *args, int idx) ! { ! if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_BLOB) { if (idx >= 0) semsg(_(e_string_required_for_argument_nr), idx + 1); *************** *** 612,625 **** /* * 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); --- 644,655 ---- /* * 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); *************** *** 631,653 **** } /* ! * Check for an optional string or number argument at 'idx' ! */ ! int ! check_for_opt_string_or_number_arg(typval_T *args, int idx) ! { ! return (args[idx].v_type == VAR_UNKNOWN ! || check_for_string_or_number_arg(args, idx) != FAIL); ! } ! ! /* ! * Give an error and return FAIL unless "args[idx]" is a string or ! * a blob. */ int ! check_for_string_or_blob_arg(typval_T *args, int idx) { ! if (args[idx].v_type != VAR_STRING && args[idx].v_type != VAR_BLOB) { if (idx >= 0) semsg(_(e_string_required_for_argument_nr), idx + 1); --- 661,675 ---- } /* ! * 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); *** ../vim-8.2.3193/src/version.c 2021-07-21 18:04:53.343910544 +0200 --- src/version.c 2021-07-21 19:07:49.584858848 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3194, /**/ -- Some of the well known MS-Windows errors: EMEMORY Memory error caused by..., eh... ELICENSE Your license has expired, give us more money! EMOUSE Mouse moved, reinstall Windows EILLEGAL Illegal error, you are not allowed to see this EVIRUS Undetectable virus found /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///