diff options
author | zeertzjq <zeertzjq@outlook.com> | 2025-01-16 12:20:33 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-16 12:20:33 +0800 |
commit | 92d3bf101d07d52cfbd4c22e6e06251897adda34 (patch) | |
tree | 0e08a4e5fc1e9cbe051f52297b8441cee32da6e1 /src/nvim/eval/funcs.c | |
parent | 718e16536052c0e75de61a32ef237a9e87fc03f2 (diff) | |
parent | 47a4e4239203fe96d404874bdc1ea6910f72b695 (diff) | |
download | rneovim-92d3bf101d07d52cfbd4c22e6e06251897adda34.tar.gz rneovim-92d3bf101d07d52cfbd4c22e6e06251897adda34.tar.bz2 rneovim-92d3bf101d07d52cfbd4c22e6e06251897adda34.zip |
Merge pull request #32051 from zeertzjq/vim-9.1.1013
vim-patch:9.1.{1013,1017}
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r-- | src/nvim/eval/funcs.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index ed3efca0d7..c125bd8893 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -548,8 +548,7 @@ static void f_byte2line(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) /// "call(func, arglist [, dict])" function static void f_call(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) { - if (argvars[1].v_type != VAR_LIST) { - emsg(_(e_listreq)); + if (tv_check_for_list_arg(argvars, 1) == FAIL) { return; } if (argvars[1].vval.v_list == NULL) { @@ -575,22 +574,32 @@ static void f_call(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) if (func == NULL || *func == NUL) { return; // type error, empty name or null function } + char *tofree = NULL; + if (argvars[0].v_type == VAR_STRING) { + char *p = func; + tofree = trans_function_name(&p, false, TFN_INT|TFN_QUIET, NULL, NULL); + if (tofree == NULL) { + emsg_funcname(e_unknown_function_str, func); + return; + } + func = tofree; + } dict_T *selfdict = NULL; if (argvars[2].v_type != VAR_UNKNOWN) { if (tv_check_for_dict_arg(argvars, 2) == FAIL) { - if (owned) { - func_unref(func); - } - return; + goto done; } selfdict = argvars[2].vval.v_dict; } func_call(func, &argvars[1], partial, selfdict, rettv); + +done: if (owned) { func_unref(func); } + xfree(tofree); } /// "changenr()" function |