comparison src/userfunc.c @ 30166:d1c04b4dc60d v9.0.0419

patch 9.0.0419: the :defer command does not check the function arguments Commit: https://github.com/vim/vim/commit/169003289fb4b2ad18fd7f5807e0d05efff0be85 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 8 19:51:45 2022 +0100 patch 9.0.0419: the :defer command does not check the function arguments Problem: The :defer command does not check the function argument count and types. Solution: Check the function arguments when adding a deferred function.
author Bram Moolenaar <Bram@vim.org>
date Thu, 08 Sep 2022 21:00:04 +0200
parents 0fe61fa4e5d1
children d3cfd12839ef
comparison
equal deleted inserted replaced
30165:27820ff1eaf4 30166:d1c04b4dc60d
5606 */ 5606 */
5607 static int 5607 static int
5608 ex_defer_inner( 5608 ex_defer_inner(
5609 char_u *name, 5609 char_u *name,
5610 char_u **arg, 5610 char_u **arg,
5611 type_T *type,
5611 partial_T *partial, 5612 partial_T *partial,
5612 evalarg_T *evalarg) 5613 evalarg_T *evalarg)
5613 { 5614 {
5614 typval_T argvars[MAX_FUNC_ARGS + 1]; // vars for arguments 5615 typval_T argvars[MAX_FUNC_ARGS + 1]; // vars for arguments
5615 int partial_argc = 0; // number of partial arguments 5616 int partial_argc = 0; // number of partial arguments
5638 } 5639 }
5639 } 5640 }
5640 r = get_func_arguments(arg, evalarg, FALSE, 5641 r = get_func_arguments(arg, evalarg, FALSE,
5641 argvars + partial_argc, &argcount); 5642 argvars + partial_argc, &argcount);
5642 argcount += partial_argc; 5643 argcount += partial_argc;
5644
5645 if (r == OK)
5646 {
5647 if (type != NULL)
5648 {
5649 // Check that the arguments are OK for the types of the funcref.
5650 r = check_argument_types(type, argvars, argcount, NULL, name);
5651 }
5652 else if (builtin_function(name, -1))
5653 {
5654 int idx = find_internal_func(name);
5655
5656 if (idx < 0)
5657 {
5658 emsg_funcname(e_unknown_function_str, name);
5659 r = FAIL;
5660 }
5661 else if (check_internal_func(idx, argcount) == -1)
5662 r = FAIL;
5663 }
5664 else
5665 {
5666 ufunc_T *ufunc = find_func(name, FALSE);
5667
5668 // we tolerate an unknown function here, it might be defined later
5669 if (ufunc != NULL)
5670 {
5671 int error = check_user_func_argcount(ufunc, argcount);
5672
5673 if (error != FCERR_UNKNOWN)
5674 {
5675 user_func_error(error, name, NULL);
5676 r = FAIL;
5677 }
5678 }
5679 }
5680 }
5681
5643 if (r == FAIL) 5682 if (r == FAIL)
5644 { 5683 {
5645 while (--argcount >= 0) 5684 while (--argcount >= 0)
5646 clear_tv(&argvars[argcount]); 5685 clear_tv(&argvars[argcount]);
5647 return FAIL; 5686 return FAIL;
5837 } 5876 }
5838 5877
5839 if (eap->cmdidx == CMD_defer) 5878 if (eap->cmdidx == CMD_defer)
5840 { 5879 {
5841 arg = startarg; 5880 arg = startarg;
5842 failed = ex_defer_inner(name, &arg, partial, &evalarg) == FAIL; 5881 failed = ex_defer_inner(name, &arg, type, partial, &evalarg) == FAIL;
5843 } 5882 }
5844 else 5883 else
5845 { 5884 {
5846 funcexe_T funcexe; 5885 funcexe_T funcexe;
5847 5886