Mercurial > vim
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); |