0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.0564: Vim9: calling a def function from non-vim9 may fail

Problem:    Vim9: calling a def function from non-vim9 may fail.
Solution:   Convert varargs to a list.
This commit is contained in:
Bram Moolenaar
2020-04-12 22:22:31 +02:00
parent 5e774c7579
commit 23e032523e
3 changed files with 32 additions and 1 deletions

View File

@@ -477,11 +477,12 @@ call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
int
call_def_function(
ufunc_T *ufunc,
int argc, // nr of arguments
int argc_arg, // nr of arguments
typval_T *argv, // arguments
typval_T *rettv) // return value
{
ectx_T ectx; // execution context
int argc = argc_arg;
int initial_frame_ptr;
typval_T *tv;
int idx;
@@ -512,13 +513,34 @@ call_def_function(
copy_tv(&argv[idx], STACK_TV_BOT(0));
++ectx.ec_stack.ga_len;
}
// Turn varargs into a list. Empty list if no args.
if (ufunc->uf_va_name != NULL)
{
int vararg_count = argc - ufunc->uf_args.ga_len;
if (vararg_count < 0)
vararg_count = 0;
else
argc -= vararg_count;
if (exe_newlist(vararg_count, &ectx) == FAIL)
goto failed;
if (defcount > 0)
// Move varargs list to below missing default arguments.
*STACK_TV_BOT(defcount- 1) = *STACK_TV_BOT(-1);
--ectx.ec_stack.ga_len;
}
// Make space for omitted arguments, will store default value below.
// Any varargs list goes after them.
if (defcount > 0)
for (idx = 0; idx < defcount; ++idx)
{
STACK_TV_BOT(0)->v_type = VAR_UNKNOWN;
++ectx.ec_stack.ga_len;
}
if (ufunc->uf_va_name != NULL)
++ectx.ec_stack.ga_len;
// Frame pointer points to just after arguments.
ectx.ec_frame = ectx.ec_stack.ga_len;