Mercurial > vim
diff src/userfunc.c @ 23252:35583da6397e v8.2.2172
patch 8.2.2172: Vim9: number of arguments is not always checked
Commit: https://github.com/vim/vim/commit/5082471f91dd42ed8c35e0f649d0a6572e6fe3fc
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Dec 20 21:10:17 2020 +0100
patch 8.2.2172: Vim9: number of arguments is not always checked
Problem: Vim9: number of arguments is not always checked. (Yegappan
Lakshmanan)
Solution: Check number of arguments when calling function by name.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 20 Dec 2020 21:15:03 +0100 |
parents | 43532077b5ff |
children | 112fa621b127 |
line wrap: on
line diff
--- a/src/userfunc.c +++ b/src/userfunc.c @@ -1834,6 +1834,22 @@ call_user_func( } /* + * Check the argument count for user function "fp". + * Return FCERR_UNKNOWN if OK, FCERR_TOOFEW or FCERR_TOOMANY otherwise. + */ + int +check_user_func_argcount(ufunc_T *fp, int argcount) +{ + int regular_args = fp->uf_args.ga_len; + + if (argcount < regular_args - fp->uf_def_args.ga_len) + return FCERR_TOOFEW; + else if (!has_varargs(fp) && argcount > regular_args) + return FCERR_TOOMANY; + return FCERR_UNKNOWN; +} + +/* * Call a user function after checking the arguments. */ int @@ -1846,15 +1862,13 @@ call_user_func_check( dict_T *selfdict) { int error; - int regular_args = fp->uf_args.ga_len; if (fp->uf_flags & FC_RANGE && funcexe->doesrange != NULL) *funcexe->doesrange = TRUE; - if (argcount < regular_args - fp->uf_def_args.ga_len) - error = FCERR_TOOFEW; - else if (!has_varargs(fp) && argcount > regular_args) - error = FCERR_TOOMANY; - else if ((fp->uf_flags & FC_DICT) && selfdict == NULL) + error = check_user_func_argcount(fp, argcount); + if (error != FCERR_UNKNOWN) + return error; + if ((fp->uf_flags & FC_DICT) && selfdict == NULL) error = FCERR_DICT; else {