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