comparison src/evalfunc.c @ 25356:1cde96e768e4 v8.2.3215

patch 8.2.3215: Vim9: argument types are not checked at compile time Commit: https://github.com/vim/vim/commit/5bca906b307728fa74a112914dc55b424d512d39 Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Sat Jul 24 21:33:26 2021 +0200 patch 8.2.3215: 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. Sort the argument lists. (Yegappan Lakshmanan, closes #8626)
author Bram Moolenaar <Bram@vim.org>
date Sat, 24 Jul 2021 21:45:04 +0200
parents 75031a22be39
children 1ffa8eb30353
comparison
equal deleted inserted replaced
25355:efef27c0f8a0 25356:1cde96e768e4
642 } 642 }
643 643
644 /* 644 /*
645 * Lists of functions that check the argument types of a builtin function. 645 * Lists of functions that check the argument types of a builtin function.
646 */ 646 */
647 static argcheck_T arg1_bool[] = {arg_bool};
648 static argcheck_T arg1_buffer[] = {arg_buffer};
649 static argcheck_T arg1_buffer_or_dict_any[] = {arg_buffer_or_dict_any};
650 static argcheck_T arg1_chan_or_job[] = {arg_chan_or_job};
651 static argcheck_T arg1_dict_any[] = {arg_dict_any};
652 static argcheck_T arg1_dict_or_string[] = {arg_dict_any_or_string};
653 static argcheck_T arg1_float_or_nr[] = {arg_float_or_nr};
654 static argcheck_T arg1_job[] = {arg_job};
655 static argcheck_T arg1_list_any[] = {arg_list_any};
656 static argcheck_T arg1_list_number[] = {arg_list_number};
657 static argcheck_T arg1_list_or_blob[] = {arg_list_or_blob};
658 static argcheck_T arg1_list_or_dict[] = {arg_list_or_dict};
659 static argcheck_T arg1_list_string[] = {arg_list_string};
660 static argcheck_T arg1_lnum[] = {arg_lnum};
661 static argcheck_T arg1_number[] = {arg_number};
647 static argcheck_T arg1_string[] = {arg_string}; 662 static argcheck_T arg1_string[] = {arg_string};
648 static argcheck_T arg1_number[] = {arg_number};
649 static argcheck_T arg1_bool[] = {arg_bool};
650 static argcheck_T arg1_list_any[] = {arg_list_any};
651 static argcheck_T arg1_dict_any[] = {arg_dict_any};
652 static argcheck_T arg1_job[] = {arg_job};
653 static argcheck_T arg1_buffer[] = {arg_buffer};
654 static argcheck_T arg1_lnum[] = {arg_lnum};
655 static argcheck_T arg1_list_number[] = {arg_list_number};
656 static argcheck_T arg1_list_string[] = {arg_list_string};
657 static argcheck_T arg1_float_or_nr[] = {arg_float_or_nr};
658 static argcheck_T arg1_string_or_nr[] = {arg_string_or_nr};
659 static argcheck_T arg1_string_or_list_any[] = {arg_string_or_list_any}; 663 static argcheck_T arg1_string_or_list_any[] = {arg_string_or_list_any};
660 static argcheck_T arg1_string_or_list_string[] = {arg_string_or_list_string}; 664 static argcheck_T arg1_string_or_list_string[] = {arg_string_or_list_string};
661 static argcheck_T arg1_list_or_blob[] = {arg_list_or_blob}; 665 static argcheck_T arg1_string_or_nr[] = {arg_string_or_nr};
662 static argcheck_T arg1_list_or_dict[] = {arg_list_or_dict}; 666 static argcheck_T arg2_any_buffer[] = {NULL, arg_buffer};
663 static argcheck_T arg1_chan_or_job[] = {arg_chan_or_job}; 667 static argcheck_T arg2_buffer_any[] = {arg_buffer, NULL};
664 static argcheck_T arg1_dict_or_string[] = {arg_dict_any_or_string}; 668 static argcheck_T arg2_buffer_bool[] = {arg_buffer, arg_bool};
665 static argcheck_T arg1_buffer_or_dict_any[] = {arg_buffer_or_dict_any}; 669 static argcheck_T arg2_buffer_list_any[] = {arg_buffer, arg_list_any};
670 static argcheck_T arg2_buffer_lnum[] = {arg_buffer, arg_lnum};
671 static argcheck_T arg2_buffer_number[] = {arg_buffer, arg_number};
672 static argcheck_T arg2_buffer_string[] = {arg_buffer, arg_string};
673 static argcheck_T arg2_chan_or_job_dict[] = {arg_chan_or_job, arg_dict_any};
674 static argcheck_T arg2_chan_or_job_string[] = {arg_chan_or_job, arg_string};
675 static argcheck_T arg2_dict_any_string_or_nr[] = {arg_dict_any, arg_string_or_nr};
676 static argcheck_T arg2_dict_string[] = {arg_dict_any, arg_string};
666 static argcheck_T arg2_float_or_nr[] = {arg_float_or_nr, arg_float_or_nr}; 677 static argcheck_T arg2_float_or_nr[] = {arg_float_or_nr, arg_float_or_nr};
678 static argcheck_T arg2_job_dict[] = {arg_job, arg_dict_any};
679 static argcheck_T arg2_job_string_or_number[] = {arg_job, arg_string_or_nr};
680 static argcheck_T arg2_list_any_number[] = {arg_list_any, arg_number};
681 static argcheck_T arg2_list_any_string[] = {arg_list_any, arg_string};
682 static argcheck_T arg2_list_number[] = {arg_list_number, arg_list_number};
683 static argcheck_T arg2_list_number_bool[] = {arg_list_number, arg_bool};
684 static argcheck_T arg2_listblob_item[] = {arg_list_or_blob, arg_item_of_prev};
685 static argcheck_T arg2_lnum[] = {arg_lnum, arg_lnum};
686 static argcheck_T arg2_lnum_number[] = {arg_lnum, arg_number};
667 static argcheck_T arg2_number[] = {arg_number, arg_number}; 687 static argcheck_T arg2_number[] = {arg_number, arg_number};
688 static argcheck_T arg2_number_bool[] = {arg_number, arg_bool};
689 static argcheck_T arg2_number_dict_any[] = {arg_number, arg_dict_any};
690 static argcheck_T arg2_number_list[] = {arg_number, arg_list_any};
691 static argcheck_T arg2_number_string[] = {arg_number, arg_string};
692 static argcheck_T arg2_number_string_or_list[] = {arg_number, arg_string_or_list_any};
693 static argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, arg_dict_any};
668 static argcheck_T arg2_string[] = {arg_string, arg_string}; 694 static argcheck_T arg2_string[] = {arg_string, arg_string};
695 static argcheck_T arg2_string_any[] = {arg_string, NULL};
696 static argcheck_T arg2_string_bool[] = {arg_string, arg_bool};
697 static argcheck_T arg2_string_chan_or_job[] = {arg_string, arg_chan_or_job};
698 static argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any};
699 static argcheck_T arg2_string_list_number[] = {arg_string, arg_list_number};
669 static argcheck_T arg2_string_number[] = {arg_string, arg_number}; 700 static argcheck_T arg2_string_number[] = {arg_string, arg_number};
670 static argcheck_T arg2_string_dict[] = {arg_string, arg_dict_any};
671 static argcheck_T arg2_string_list_nr[] = {arg_string, arg_list_number};
672 static argcheck_T arg2_string_bool[] = {arg_string, arg_bool};
673 static argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, arg_dict_any}; 701 static argcheck_T arg2_string_or_list_dict[] = {arg_string_or_list_any, arg_dict_any};
674 static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr}; 702 static argcheck_T arg2_string_string_or_number[] = {arg_string, arg_string_or_nr};
675 static argcheck_T arg2_string_chan_or_job[] = {arg_string, arg_chan_or_job}; 703 static argcheck_T arg3_any_list_dict[] = {NULL, arg_list_any, arg_dict_any};
676 static argcheck_T arg2_list_number[] = {arg_list_number, arg_list_number}; 704 static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum};
677 static argcheck_T arg2_list_number_bool[] = {arg_list_number, arg_bool}; 705 static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number};
678 static argcheck_T arg2_list_any_string[] = {arg_list_any, arg_string}; 706 static argcheck_T arg3_buffer_string_any[] = {arg_buffer, arg_string, NULL};
679 static argcheck_T arg2_list_any_number[] = {arg_list_any, arg_number}; 707 static argcheck_T arg3_buffer_string_dict[] = {arg_buffer, arg_string, arg_dict_any};
680 static argcheck_T arg2_number_string[] = {arg_number, arg_string}; 708 static argcheck_T arg3_dict_number_number[] = {arg_dict_any, arg_number, arg_number};
681 static argcheck_T arg2_number_bool[] = {arg_number, arg_bool}; 709 static argcheck_T arg3_list_string_dict[] = {arg_list_any, arg_string, arg_dict_any};
682 static argcheck_T arg2_number_list[] = {arg_number, arg_list_any}; 710 static argcheck_T arg3_lnum_number_bool[] = {arg_lnum, arg_number, arg_bool};
683 static argcheck_T arg2_number_dict_any[] = {arg_number, arg_dict_any};
684 static argcheck_T arg2_number_string_or_list[] = {arg_number, arg_string_or_list_any};
685 static argcheck_T arg2_dict_string[] = {arg_dict_any, arg_string};
686 static argcheck_T arg2_dict_any_string_or_nr[] = {arg_dict_any, arg_string_or_nr};
687 static argcheck_T arg2_job_dict[] = {arg_job, arg_dict_any};
688 static argcheck_T arg2_job_string_or_number[] = {arg_job, arg_string_or_nr};
689 static argcheck_T arg2_listblob_item[] = {arg_list_or_blob, arg_item_of_prev};
690 static argcheck_T arg2_str_or_nr_or_list_dict[] = {arg_str_or_nr_or_list, arg_dict_any};
691 static argcheck_T arg2_lnum[] = {arg_lnum, arg_lnum};
692 static argcheck_T arg2_lnum_number[] = {arg_lnum, arg_number};
693 static argcheck_T arg2_chan_or_job_dict[] = {arg_chan_or_job, arg_dict_any};
694 static argcheck_T arg2_chan_or_job_string[] = {arg_chan_or_job, arg_string};
695 static argcheck_T arg2_buffer_string[] = {arg_buffer, arg_string};
696 static argcheck_T arg2_buffer_number[] = {arg_buffer, arg_number};
697 static argcheck_T arg2_buffer_bool[] = {arg_buffer, arg_bool};
698 static argcheck_T arg2_buffer_lnum[] = {arg_buffer, arg_lnum};
699 static argcheck_T arg2_buffer_list_any[] = {arg_buffer, arg_list_any};
700 static argcheck_T arg2_buffer_any[] = {arg_buffer, NULL};
701 static argcheck_T arg3_string[] = {arg_string, arg_string, arg_string};
702 static argcheck_T arg3_number[] = {arg_number, arg_number, arg_number}; 711 static argcheck_T arg3_number[] = {arg_number, arg_number, arg_number};
712 static argcheck_T arg3_number_any_dict[] = {arg_number, NULL, arg_dict_any};
703 static argcheck_T arg3_number_number_dict[] = {arg_number, arg_number, arg_dict_any}; 713 static argcheck_T arg3_number_number_dict[] = {arg_number, arg_number, arg_dict_any};
704 static argcheck_T arg3_number_string_string[] = {arg_number, arg_string, arg_string};
705 static argcheck_T arg3_number_string_any[] = {arg_number, arg_string, NULL}; 714 static argcheck_T arg3_number_string_any[] = {arg_number, arg_string, NULL};
706 static argcheck_T arg3_number_string_buffer[] = {arg_number, arg_string, arg_buffer}; 715 static argcheck_T arg3_number_string_buffer[] = {arg_number, arg_string, arg_buffer};
707 static argcheck_T arg3_number_any_dict[] = {arg_number, NULL, arg_dict_any}; 716 static argcheck_T arg3_number_string_string[] = {arg_number, arg_string, arg_string};
708 static argcheck_T arg3_string_nr_bool[] = {arg_string, arg_number, arg_bool}; 717 static argcheck_T arg3_string[] = {arg_string, arg_string, arg_string};
709 static argcheck_T arg3_string_string_nr[] = {arg_string, arg_string, arg_number}; 718 static argcheck_T arg3_string_any_dict[] = {arg_string, NULL, arg_dict_any};
710 static argcheck_T arg3_string_string_dict[] = {arg_string, arg_string, arg_dict_any};
711 static argcheck_T arg3_string_string_bool[] = {arg_string, arg_string, arg_bool};
712 static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool}; 719 static argcheck_T arg3_string_bool_bool[] = {arg_string, arg_bool, arg_bool};
713 static argcheck_T arg3_string_bool_dict[] = {arg_string, arg_bool, arg_dict_any}; 720 static argcheck_T arg3_string_bool_dict[] = {arg_string, arg_bool, arg_dict_any};
714 static argcheck_T arg3_list_string_dict[] = {arg_list_any, arg_string, arg_dict_any}; 721 static argcheck_T arg3_string_number_bool[] = {arg_string, arg_number, arg_bool};
715 static argcheck_T arg3_dict_number_number[] = {arg_dict_any, arg_number, arg_number}; 722 static argcheck_T arg3_string_number_number[] = {arg_string, arg_number, arg_number};
716 static argcheck_T arg3_lnum_number_bool[] = {arg_lnum, arg_number, arg_bool}; 723 static argcheck_T arg3_string_string_bool[] = {arg_string, arg_string, arg_bool};
717 static argcheck_T arg3_buffer_lnum_lnum[] = {arg_buffer, arg_lnum, arg_lnum}; 724 static argcheck_T arg3_string_string_dict[] = {arg_string, arg_string, arg_dict_any};
718 static argcheck_T arg3_buffer_number_number[] = {arg_buffer, arg_number, arg_number}; 725 static argcheck_T arg3_string_string_nr[] = {arg_string, arg_string, arg_number};
719 static argcheck_T arg3_buffer_string_dict[] = {arg_buffer, arg_string, arg_dict_any}; 726 static argcheck_T arg4_list_number_number_number[] = {arg_list_string, arg_number, arg_number, arg_number};
720 static argcheck_T arg3_buffer_string_any[] = {arg_buffer, arg_string, NULL};
721 static argcheck_T arg4_number_number_string_any[] = {arg_number, arg_number, arg_string, NULL}; 727 static argcheck_T arg4_number_number_string_any[] = {arg_number, arg_number, arg_string, NULL};
728 static argcheck_T arg4_string_string_any_string[] = {arg_string, arg_string, NULL, arg_string};
722 static argcheck_T arg4_string_string_number_string[] = {arg_string, arg_string, arg_number, arg_string}; 729 static argcheck_T arg4_string_string_number_string[] = {arg_string, arg_string, arg_number, arg_string};
723 static argcheck_T arg5_number[] = {arg_number, arg_number, arg_number, arg_number, arg_number}; 730 static argcheck_T arg5_number[] = {arg_number, arg_number, arg_number, arg_number, arg_number};
731 /* Function specific argument types (not covered by the above) */
724 static argcheck_T arg4_browse[] = {arg_bool, arg_string, arg_string, arg_string}; 732 static argcheck_T arg4_browse[] = {arg_bool, arg_string, arg_string, arg_string};
725 static argcheck_T arg23_chanexpr[] = {arg_chan_or_job, NULL, arg_dict_any}; 733 static argcheck_T arg23_chanexpr[] = {arg_chan_or_job, NULL, arg_dict_any};
726 static argcheck_T arg23_chanraw[] = {arg_chan_or_job, arg_string_or_blob, arg_dict_any}; 734 static argcheck_T arg23_chanraw[] = {arg_chan_or_job, arg_string_or_blob, arg_dict_any};
727 static argcheck_T arg24_count[] = {arg_count1, NULL, arg_bool, arg_number}; 735 static argcheck_T arg24_count[] = {arg_count1, NULL, arg_bool, arg_number};
728 static argcheck_T arg13_cursor[] = {arg_cursor1, arg_number, arg_number}; 736 static argcheck_T arg13_cursor[] = {arg_cursor1, arg_number, arg_number};
732 static argcheck_T arg23_extendnew[] = {arg_list_or_dict, arg_same_struct_as_prev, arg_extend3}; 740 static argcheck_T arg23_extendnew[] = {arg_list_or_dict, arg_same_struct_as_prev, arg_extend3};
733 static argcheck_T arg14_glob[] = {arg_string, arg_bool, arg_bool, arg_bool}; 741 static argcheck_T arg14_glob[] = {arg_string, arg_bool, arg_bool, arg_bool};
734 static argcheck_T arg25_globpath[] = {arg_string, arg_string, arg_bool, arg_bool, arg_bool}; 742 static argcheck_T arg25_globpath[] = {arg_string, arg_string, arg_bool, arg_bool, arg_bool};
735 static argcheck_T arg24_index[] = {arg_list_or_blob, arg_item_of_prev, arg_number, arg_bool}; 743 static argcheck_T arg24_index[] = {arg_list_or_blob, arg_item_of_prev, arg_number, arg_bool};
736 static argcheck_T arg23_insert[] = {arg_list_or_blob, arg_item_of_prev, arg_number}; 744 static argcheck_T arg23_insert[] = {arg_list_or_blob, arg_item_of_prev, arg_number};
745 static argcheck_T arg3_libcall[] = {arg_string, arg_string, arg_string_or_nr};
746 static argcheck_T arg14_maparg[] = {arg_string, arg_string, arg_bool, arg_bool};
737 static argcheck_T arg2_mapfilter[] = {arg_list_or_dict_or_blob, NULL}; 747 static argcheck_T arg2_mapfilter[] = {arg_list_or_dict_or_blob, NULL};
738 static argcheck_T arg14_maparg[] = {arg_string, arg_string, arg_bool, arg_bool};
739 static argcheck_T arg25_matchadd[] = {arg_string, arg_string, arg_number, arg_number, arg_dict_any}; 748 static argcheck_T arg25_matchadd[] = {arg_string, arg_string, arg_number, arg_number, arg_dict_any};
740 static argcheck_T arg25_matchaddpos[] = {arg_string, arg_list_any, arg_number, arg_number, arg_dict_any}; 749 static argcheck_T arg25_matchaddpos[] = {arg_string, arg_list_any, arg_number, arg_number, arg_dict_any};
741 static argcheck_T arg23_reduce[] = {arg_list_or_blob, NULL, NULL}; 750 static argcheck_T arg23_reduce[] = {arg_list_or_blob, NULL, NULL};
742 static argcheck_T arg24_remote_expr[] = {arg_string, arg_string, arg_string, arg_number}; 751 static argcheck_T arg24_remote_expr[] = {arg_string, arg_string, arg_string, arg_number};
743 static argcheck_T arg23_remove[] = {arg_list_or_dict_or_blob, arg_remove2, arg_number}; 752 static argcheck_T arg23_remove[] = {arg_list_or_dict_or_blob, arg_remove2, arg_number};
1136 ret_number, f_byte2line}, 1145 ret_number, f_byte2line},
1137 {"byteidx", 2, 2, FEARG_1, arg2_string_number, 1146 {"byteidx", 2, 2, FEARG_1, arg2_string_number,
1138 ret_number, f_byteidx}, 1147 ret_number, f_byteidx},
1139 {"byteidxcomp", 2, 2, FEARG_1, arg2_string_number, 1148 {"byteidxcomp", 2, 2, FEARG_1, arg2_string_number,
1140 ret_number, f_byteidxcomp}, 1149 ret_number, f_byteidxcomp},
1141 {"call", 2, 3, FEARG_1, NULL, 1150 {"call", 2, 3, FEARG_1, arg3_any_list_dict,
1142 ret_any, f_call}, 1151 ret_any, f_call},
1143 {"ceil", 1, 1, FEARG_1, arg1_float_or_nr, 1152 {"ceil", 1, 1, FEARG_1, arg1_float_or_nr,
1144 ret_float, FLOAT_FUNC(f_ceil)}, 1153 ret_float, FLOAT_FUNC(f_ceil)},
1145 {"ch_canread", 1, 1, FEARG_1, arg1_chan_or_job, 1154 {"ch_canread", 1, 1, FEARG_1, arg1_chan_or_job,
1146 ret_number_bool, JOB_FUNC(f_ch_canread)}, 1155 ret_number_bool, JOB_FUNC(f_ch_canread)},
1184 ret_number, f_char2nr}, 1193 ret_number, f_char2nr},
1185 {"charclass", 1, 1, FEARG_1, arg1_string, 1194 {"charclass", 1, 1, FEARG_1, arg1_string,
1186 ret_number, f_charclass}, 1195 ret_number, f_charclass},
1187 {"charcol", 1, 1, FEARG_1, arg1_string_or_list_any, 1196 {"charcol", 1, 1, FEARG_1, arg1_string_or_list_any,
1188 ret_number, f_charcol}, 1197 ret_number, f_charcol},
1189 {"charidx", 2, 3, FEARG_1, arg3_string_nr_bool, 1198 {"charidx", 2, 3, FEARG_1, arg3_string_number_bool,
1190 ret_number, f_charidx}, 1199 ret_number, f_charidx},
1191 {"chdir", 1, 1, FEARG_1, arg1_string, 1200 {"chdir", 1, 1, FEARG_1, arg1_string,
1192 ret_string, f_chdir}, 1201 ret_string, f_chdir},
1193 {"cindent", 1, 1, FEARG_1, arg1_lnum, 1202 {"cindent", 1, 1, FEARG_1, arg1_lnum,
1194 ret_number, f_cindent}, 1203 ret_number, f_cindent},
1308 ret_string, f_foldtextresult}, 1317 ret_string, f_foldtextresult},
1309 {"foreground", 0, 0, 0, NULL, 1318 {"foreground", 0, 0, 0, NULL,
1310 ret_void, f_foreground}, 1319 ret_void, f_foreground},
1311 {"fullcommand", 1, 1, FEARG_1, arg1_string, 1320 {"fullcommand", 1, 1, FEARG_1, arg1_string,
1312 ret_string, f_fullcommand}, 1321 ret_string, f_fullcommand},
1313 {"funcref", 1, 3, FEARG_1, NULL, 1322 {"funcref", 1, 3, FEARG_1, arg3_any_list_dict,
1314 ret_func_any, f_funcref}, 1323 ret_func_any, f_funcref},
1315 {"function", 1, 3, FEARG_1, NULL, 1324 {"function", 1, 3, FEARG_1, arg3_any_list_dict,
1316 ret_f_function, f_function}, 1325 ret_f_function, f_function},
1317 {"garbagecollect", 0, 1, 0, arg1_bool, 1326 {"garbagecollect", 0, 1, 0, arg1_bool,
1318 ret_void, f_garbagecollect}, 1327 ret_void, f_garbagecollect},
1319 {"get", 2, 3, FEARG_1, NULL, 1328 {"get", 2, 3, FEARG_1, NULL,
1320 ret_any, f_get}, 1329 ret_any, f_get},
1506 ret_list_string, f_keys}, 1515 ret_list_string, f_keys},
1507 {"last_buffer_nr", 0, 0, 0, NULL, // obsolete 1516 {"last_buffer_nr", 0, 0, 0, NULL, // obsolete
1508 ret_number, f_last_buffer_nr}, 1517 ret_number, f_last_buffer_nr},
1509 {"len", 1, 1, FEARG_1, NULL, 1518 {"len", 1, 1, FEARG_1, NULL,
1510 ret_number, f_len}, 1519 ret_number, f_len},
1511 {"libcall", 3, 3, FEARG_3, NULL, 1520 {"libcall", 3, 3, FEARG_3, arg3_libcall,
1512 ret_string, f_libcall}, 1521 ret_string, f_libcall},
1513 {"libcallnr", 3, 3, FEARG_3, NULL, 1522 {"libcallnr", 3, 3, FEARG_3, arg3_libcall,
1514 ret_number, f_libcallnr}, 1523 ret_number, f_libcallnr},
1515 {"line", 1, 2, FEARG_1, arg2_string_number, 1524 {"line", 1, 2, FEARG_1, arg2_string_number,
1516 ret_number, f_line}, 1525 ret_number, f_line},
1517 {"line2byte", 1, 1, FEARG_1, arg1_lnum, 1526 {"line2byte", 1, 1, FEARG_1, arg1_lnum,
1518 ret_number, f_line2byte}, 1527 ret_number, f_line2byte},
1519 {"lispindent", 1, 1, FEARG_1, arg1_lnum, 1528 {"lispindent", 1, 1, FEARG_1, arg1_lnum,
1520 ret_number, f_lispindent}, 1529 ret_number, f_lispindent},
1521 {"list2str", 1, 2, FEARG_1, arg2_list_number_bool, 1530 {"list2str", 1, 2, FEARG_1, arg2_list_number_bool,
1522 ret_string, f_list2str}, 1531 ret_string, f_list2str},
1523 {"listener_add", 1, 2, FEARG_2, NULL, 1532 {"listener_add", 1, 2, FEARG_2, arg2_any_buffer,
1524 ret_number, f_listener_add}, 1533 ret_number, f_listener_add},
1525 {"listener_flush", 0, 1, FEARG_1, arg1_buffer, 1534 {"listener_flush", 0, 1, FEARG_1, arg1_buffer,
1526 ret_void, f_listener_flush}, 1535 ret_void, f_listener_flush},
1527 {"listener_remove", 1, 1, FEARG_1, arg1_number, 1536 {"listener_remove", 1, 1, FEARG_1, arg1_number,
1528 ret_number_bool, f_listener_remove}, 1537 ret_number_bool, f_listener_remove},
1720 ret_number, f_rand}, 1729 ret_number, f_rand},
1721 {"range", 1, 3, FEARG_1, arg3_number, 1730 {"range", 1, 3, FEARG_1, arg3_number,
1722 ret_list_number, f_range}, 1731 ret_list_number, f_range},
1723 {"readblob", 1, 1, FEARG_1, arg1_string, 1732 {"readblob", 1, 1, FEARG_1, arg1_string,
1724 ret_blob, f_readblob}, 1733 ret_blob, f_readblob},
1725 {"readdir", 1, 3, FEARG_1, NULL, 1734 {"readdir", 1, 3, FEARG_1, arg3_string_any_dict,
1726 ret_list_string, f_readdir}, 1735 ret_list_string, f_readdir},
1727 {"readdirex", 1, 3, FEARG_1, NULL, 1736 {"readdirex", 1, 3, FEARG_1, arg3_string_any_dict,
1728 ret_list_dict_any, f_readdirex}, 1737 ret_list_dict_any, f_readdirex},
1729 {"readfile", 1, 3, FEARG_1, arg3_string_string_nr, 1738 {"readfile", 1, 3, FEARG_1, arg3_string_string_nr,
1730 ret_list_string, f_readfile}, 1739 ret_list_string, f_readfile},
1731 {"reduce", 2, 3, FEARG_1, arg23_reduce, 1740 {"reduce", 2, 3, FEARG_1, arg23_reduce,
1732 ret_any, f_reduce}, 1741 ret_any, f_reduce},
1806 ret_number_bool, f_setbufline}, 1815 ret_number_bool, f_setbufline},
1807 {"setbufvar", 3, 3, FEARG_3, arg3_buffer_string_any, 1816 {"setbufvar", 3, 3, FEARG_3, arg3_buffer_string_any,
1808 ret_void, f_setbufvar}, 1817 ret_void, f_setbufvar},
1809 {"setcellwidths", 1, 1, FEARG_1, arg1_list_any, 1818 {"setcellwidths", 1, 1, FEARG_1, arg1_list_any,
1810 ret_void, f_setcellwidths}, 1819 ret_void, f_setcellwidths},
1811 {"setcharpos", 2, 2, FEARG_2, arg2_string_list_nr, 1820 {"setcharpos", 2, 2, FEARG_2, arg2_string_list_number,
1812 ret_number_bool, f_setcharpos}, 1821 ret_number_bool, f_setcharpos},
1813 {"setcharsearch", 1, 1, FEARG_1, arg1_dict_any, 1822 {"setcharsearch", 1, 1, FEARG_1, arg1_dict_any,
1814 ret_void, f_setcharsearch}, 1823 ret_void, f_setcharsearch},
1815 {"setcmdpos", 1, 1, FEARG_1, arg1_number, 1824 {"setcmdpos", 1, 1, FEARG_1, arg1_number,
1816 ret_number_bool, f_setcmdpos}, 1825 ret_number_bool, f_setcmdpos},
1828 ret_number_bool, f_setline}, 1837 ret_number_bool, f_setline},
1829 {"setloclist", 2, 4, FEARG_2, arg24_setloclist, 1838 {"setloclist", 2, 4, FEARG_2, arg24_setloclist,
1830 ret_number_bool, f_setloclist}, 1839 ret_number_bool, f_setloclist},
1831 {"setmatches", 1, 2, FEARG_1, arg2_list_any_number, 1840 {"setmatches", 1, 2, FEARG_1, arg2_list_any_number,
1832 ret_number_bool, f_setmatches}, 1841 ret_number_bool, f_setmatches},
1833 {"setpos", 2, 2, FEARG_2, arg2_string_list_nr, 1842 {"setpos", 2, 2, FEARG_2, arg2_string_list_number,
1834 ret_number_bool, f_setpos}, 1843 ret_number_bool, f_setpos},
1835 {"setqflist", 1, 3, FEARG_1, arg13_setqflist, 1844 {"setqflist", 1, 3, FEARG_1, arg13_setqflist,
1836 ret_number_bool, f_setqflist}, 1845 ret_number_bool, f_setqflist},
1837 {"setreg", 2, 3, FEARG_2, NULL, 1846 {"setreg", 2, 3, FEARG_2, NULL,
1838 ret_number_bool, f_setreg}, 1847 ret_number_bool, f_setreg},
1884 ret_first_arg, f_slice}, 1893 ret_first_arg, f_slice},
1885 {"sort", 1, 3, FEARG_1, arg13_sortuniq, 1894 {"sort", 1, 3, FEARG_1, arg13_sortuniq,
1886 ret_first_arg, f_sort}, 1895 ret_first_arg, f_sort},
1887 {"sound_clear", 0, 0, 0, NULL, 1896 {"sound_clear", 0, 0, 0, NULL,
1888 ret_void, SOUND_FUNC(f_sound_clear)}, 1897 ret_void, SOUND_FUNC(f_sound_clear)},
1889 {"sound_playevent", 1, 2, FEARG_1, NULL, 1898 {"sound_playevent", 1, 2, FEARG_1, arg2_string_any,
1890 ret_number, SOUND_FUNC(f_sound_playevent)}, 1899 ret_number, SOUND_FUNC(f_sound_playevent)},
1891 {"sound_playfile", 1, 2, FEARG_1, NULL, 1900 {"sound_playfile", 1, 2, FEARG_1, arg2_string_any,
1892 ret_number, SOUND_FUNC(f_sound_playfile)}, 1901 ret_number, SOUND_FUNC(f_sound_playfile)},
1893 {"sound_stop", 1, 1, FEARG_1, arg1_number, 1902 {"sound_stop", 1, 1, FEARG_1, arg1_number,
1894 ret_void, SOUND_FUNC(f_sound_stop)}, 1903 ret_void, SOUND_FUNC(f_sound_stop)},
1895 {"soundfold", 1, 1, FEARG_1, arg1_string, 1904 {"soundfold", 1, 1, FEARG_1, arg1_string,
1896 ret_string, f_soundfold}, 1905 ret_string, f_soundfold},
1897 {"spellbadword", 0, 1, FEARG_1, arg1_string, 1906 {"spellbadword", 0, 1, FEARG_1, arg1_string,
1898 ret_list_string, f_spellbadword}, 1907 ret_list_string, f_spellbadword},
1899 {"spellsuggest", 1, 3, FEARG_1, arg3_string_nr_bool, 1908 {"spellsuggest", 1, 3, FEARG_1, arg3_string_number_bool,
1900 ret_list_string, f_spellsuggest}, 1909 ret_list_string, f_spellsuggest},
1901 {"split", 1, 3, FEARG_1, arg3_string_string_bool, 1910 {"split", 1, 3, FEARG_1, arg3_string_string_bool,
1902 ret_list_string, f_split}, 1911 ret_list_string, f_split},
1903 {"sqrt", 1, 1, FEARG_1, arg1_float_or_nr, 1912 {"sqrt", 1, 1, FEARG_1, arg1_float_or_nr,
1904 ret_float, FLOAT_FUNC(f_sqrt)}, 1913 ret_float, FLOAT_FUNC(f_sqrt)},
1908 ret_string, f_state}, 1917 ret_string, f_state},
1909 {"str2float", 1, 1, FEARG_1, arg1_string, 1918 {"str2float", 1, 1, FEARG_1, arg1_string,
1910 ret_float, FLOAT_FUNC(f_str2float)}, 1919 ret_float, FLOAT_FUNC(f_str2float)},
1911 {"str2list", 1, 2, FEARG_1, arg2_string_bool, 1920 {"str2list", 1, 2, FEARG_1, arg2_string_bool,
1912 ret_list_number, f_str2list}, 1921 ret_list_number, f_str2list},
1913 {"str2nr", 1, 3, FEARG_1, arg3_string_nr_bool, 1922 {"str2nr", 1, 3, FEARG_1, arg3_string_number_bool,
1914 ret_number, f_str2nr}, 1923 ret_number, f_str2nr},
1915 {"strcharlen", 1, 1, FEARG_1, arg1_string_or_nr, 1924 {"strcharlen", 1, 1, FEARG_1, arg1_string_or_nr,
1916 ret_number, f_strcharlen}, 1925 ret_number, f_strcharlen},
1917 {"strcharpart", 2, 4, FEARG_1, arg24_strpart, 1926 {"strcharpart", 2, 4, FEARG_1, arg24_strpart,
1918 ret_string, f_strcharpart}, 1927 ret_string, f_strcharpart},
1952 ret_string, f_strtrans}, 1961 ret_string, f_strtrans},
1953 {"strwidth", 1, 1, FEARG_1, arg1_string, 1962 {"strwidth", 1, 1, FEARG_1, arg1_string,
1954 ret_number, f_strwidth}, 1963 ret_number, f_strwidth},
1955 {"submatch", 1, 2, FEARG_1, arg2_number_bool, 1964 {"submatch", 1, 2, FEARG_1, arg2_number_bool,
1956 ret_string, f_submatch}, 1965 ret_string, f_submatch},
1957 {"substitute", 4, 4, FEARG_1, NULL, 1966 {"substitute", 4, 4, FEARG_1, arg4_string_string_any_string,
1958 ret_string, f_substitute}, 1967 ret_string, f_substitute},
1959 {"swapinfo", 1, 1, FEARG_1, arg1_string, 1968 {"swapinfo", 1, 1, FEARG_1, arg1_string,
1960 ret_dict_any, f_swapinfo}, 1969 ret_dict_any, f_swapinfo},
1961 {"swapname", 1, 1, FEARG_1, arg1_buffer, 1970 {"swapname", 1, 1, FEARG_1, arg1_buffer,
1962 ret_string, f_swapname}, 1971 ret_string, f_swapname},
2062 ret_void, f_test_garbagecollect_now}, 2071 ret_void, f_test_garbagecollect_now},
2063 {"test_garbagecollect_soon", 0, 0, 0, NULL, 2072 {"test_garbagecollect_soon", 0, 0, 0, NULL,
2064 ret_void, f_test_garbagecollect_soon}, 2073 ret_void, f_test_garbagecollect_soon},
2065 {"test_getvalue", 1, 1, FEARG_1, arg1_string, 2074 {"test_getvalue", 1, 1, FEARG_1, arg1_string,
2066 ret_number, f_test_getvalue}, 2075 ret_number, f_test_getvalue},
2067 {"test_gui_drop_files", 4, 4, 0, NULL, 2076 {"test_gui_drop_files", 4, 4, 0, arg4_list_number_number_number,
2068 ret_void, f_test_gui_drop_files}, 2077 ret_void, f_test_gui_drop_files},
2069 {"test_gui_mouse_event", 5, 5, 0, arg5_number, 2078 {"test_gui_mouse_event", 5, 5, 0, arg5_number,
2070 ret_void, f_test_gui_mouse_event}, 2079 ret_void, f_test_gui_mouse_event},
2071 {"test_ignore_error", 1, 1, FEARG_1, arg1_string, 2080 {"test_ignore_error", 1, 1, FEARG_1, arg1_string,
2072 ret_void, f_test_ignore_error}, 2081 ret_void, f_test_ignore_error},
2090 ret_void, f_test_option_not_set}, 2099 ret_void, f_test_option_not_set},
2091 {"test_override", 2, 2, FEARG_2, arg2_string_number, 2100 {"test_override", 2, 2, FEARG_2, arg2_string_number,
2092 ret_void, f_test_override}, 2101 ret_void, f_test_override},
2093 {"test_refcount", 1, 1, FEARG_1, NULL, 2102 {"test_refcount", 1, 1, FEARG_1, NULL,
2094 ret_number, f_test_refcount}, 2103 ret_number, f_test_refcount},
2095 {"test_scrollbar", 3, 3, FEARG_2, NULL, 2104 {"test_scrollbar", 3, 3, FEARG_2, arg3_string_number_number,
2096 ret_void, 2105 ret_void,
2097 #ifdef FEAT_GUI 2106 #ifdef FEAT_GUI
2098 f_test_scrollbar 2107 f_test_scrollbar
2099 #else 2108 #else
2100 NULL 2109 NULL
2680 { 2689 {
2681 char_u *func; 2690 char_u *func;
2682 partial_T *partial = NULL; 2691 partial_T *partial = NULL;
2683 dict_T *selfdict = NULL; 2692 dict_T *selfdict = NULL;
2684 2693
2694 if (in_vim9script()
2695 && (check_for_list_arg(argvars, 1) == FAIL
2696 || check_for_opt_dict_arg(argvars, 2) == FAIL))
2697 return;
2698
2685 if (argvars[1].v_type != VAR_LIST) 2699 if (argvars[1].v_type != VAR_LIST)
2686 { 2700 {
2687 emsg(_(e_listreq)); 2701 emsg(_(e_listreq));
2688 return; 2702 return;
2689 } 2703 }
3731 char_u *name; 3745 char_u *name;
3732 int use_string = FALSE; 3746 int use_string = FALSE;
3733 partial_T *arg_pt = NULL; 3747 partial_T *arg_pt = NULL;
3734 char_u *trans_name = NULL; 3748 char_u *trans_name = NULL;
3735 int is_global = FALSE; 3749 int is_global = FALSE;
3750
3751 if (in_vim9script()
3752 && (check_for_opt_list_arg(argvars, 1) == FAIL
3753 || (argvars[1].v_type != VAR_UNKNOWN
3754 && check_for_opt_dict_arg(argvars, 2) == FAIL)))
3755 return;
3736 3756
3737 if (argvars[0].v_type == VAR_FUNC) 3757 if (argvars[0].v_type == VAR_FUNC)
3738 { 3758 {
3739 // function(MyFunc, [arg], dict) 3759 // function(MyFunc, [arg], dict)
3740 s = argvars[0].vval.v_string; 3760 s = argvars[0].vval.v_string;
6415 rettv->vval.v_string = NULL; 6435 rettv->vval.v_string = NULL;
6416 6436
6417 if (check_restricted() || check_secure()) 6437 if (check_restricted() || check_secure())
6418 return; 6438 return;
6419 6439
6440 if (in_vim9script()
6441 && (check_for_string_arg(argvars, 0) == FAIL
6442 || check_for_string_arg(argvars, 1) == FAIL
6443 || check_for_string_or_number_arg(argvars, 2) == FAIL))
6444 return;
6445
6420 #ifdef FEAT_LIBCALL 6446 #ifdef FEAT_LIBCALL
6421 // The first two args must be strings, otherwise it's meaningless 6447 // The first two args must be strings, otherwise it's meaningless
6422 if (argvars[0].v_type == VAR_STRING && argvars[1].v_type == VAR_STRING) 6448 if (argvars[0].v_type == VAR_STRING && argvars[1].v_type == VAR_STRING)
6423 { 6449 {
6424 string_in = NULL; 6450 string_in = NULL;
9175 f_substitute(typval_T *argvars, typval_T *rettv) 9201 f_substitute(typval_T *argvars, typval_T *rettv)
9176 { 9202 {
9177 char_u patbuf[NUMBUFLEN]; 9203 char_u patbuf[NUMBUFLEN];
9178 char_u subbuf[NUMBUFLEN]; 9204 char_u subbuf[NUMBUFLEN];
9179 char_u flagsbuf[NUMBUFLEN]; 9205 char_u flagsbuf[NUMBUFLEN];
9180 9206 char_u *str;
9181 char_u *str = tv_get_string_chk(&argvars[0]); 9207 char_u *pat;
9182 char_u *pat = tv_get_string_buf_chk(&argvars[1], patbuf);
9183 char_u *sub = NULL; 9208 char_u *sub = NULL;
9184 typval_T *expr = NULL; 9209 typval_T *expr = NULL;
9185 char_u *flg = tv_get_string_buf_chk(&argvars[3], flagsbuf); 9210 char_u *flg;
9211
9212 if (in_vim9script()
9213 && (check_for_string_arg(argvars, 0) == FAIL
9214 || check_for_string_arg(argvars, 1) == FAIL
9215 || check_for_string_arg(argvars, 3) == FAIL))
9216 return;
9217
9218 str = tv_get_string_chk(&argvars[0]);
9219 pat = tv_get_string_buf_chk(&argvars[1], patbuf);
9220 flg = tv_get_string_buf_chk(&argvars[3], flagsbuf);
9186 9221
9187 if (argvars[2].v_type == VAR_FUNC || argvars[2].v_type == VAR_PARTIAL) 9222 if (argvars[2].v_type == VAR_FUNC || argvars[2].v_type == VAR_PARTIAL)
9188 expr = &argvars[2]; 9223 expr = &argvars[2];
9189 else 9224 else
9190 sub = tv_get_string_buf_chk(&argvars[2], subbuf); 9225 sub = tv_get_string_buf_chk(&argvars[2], subbuf);