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:
@@ -576,6 +576,13 @@ def Test_multiline()
|
|||||||
assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
|
assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
func Test_multiline_not_vim9()
|
||||||
|
call assert_equal('text1234', MultiLine('text'))
|
||||||
|
call assert_equal('text777', MultiLine('text', 777))
|
||||||
|
call assert_equal('text777one', MultiLine('text', 777, 'one'))
|
||||||
|
call assert_equal('text777one-two', MultiLine('text', 777, 'one', 'two'))
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
" When using CheckScriptFailure() for the below test, E1010 is generated instead
|
" When using CheckScriptFailure() for the below test, E1010 is generated instead
|
||||||
" of E1056.
|
" of E1056.
|
||||||
|
@@ -738,6 +738,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
564,
|
||||||
/**/
|
/**/
|
||||||
563,
|
563,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -477,11 +477,12 @@ call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
|
|||||||
int
|
int
|
||||||
call_def_function(
|
call_def_function(
|
||||||
ufunc_T *ufunc,
|
ufunc_T *ufunc,
|
||||||
int argc, // nr of arguments
|
int argc_arg, // nr of arguments
|
||||||
typval_T *argv, // arguments
|
typval_T *argv, // arguments
|
||||||
typval_T *rettv) // return value
|
typval_T *rettv) // return value
|
||||||
{
|
{
|
||||||
ectx_T ectx; // execution context
|
ectx_T ectx; // execution context
|
||||||
|
int argc = argc_arg;
|
||||||
int initial_frame_ptr;
|
int initial_frame_ptr;
|
||||||
typval_T *tv;
|
typval_T *tv;
|
||||||
int idx;
|
int idx;
|
||||||
@@ -512,13 +513,34 @@ call_def_function(
|
|||||||
copy_tv(&argv[idx], STACK_TV_BOT(0));
|
copy_tv(&argv[idx], STACK_TV_BOT(0));
|
||||||
++ectx.ec_stack.ga_len;
|
++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.
|
// Make space for omitted arguments, will store default value below.
|
||||||
|
// Any varargs list goes after them.
|
||||||
if (defcount > 0)
|
if (defcount > 0)
|
||||||
for (idx = 0; idx < defcount; ++idx)
|
for (idx = 0; idx < defcount; ++idx)
|
||||||
{
|
{
|
||||||
STACK_TV_BOT(0)->v_type = VAR_UNKNOWN;
|
STACK_TV_BOT(0)->v_type = VAR_UNKNOWN;
|
||||||
++ectx.ec_stack.ga_len;
|
++ectx.ec_stack.ga_len;
|
||||||
}
|
}
|
||||||
|
if (ufunc->uf_va_name != NULL)
|
||||||
|
++ectx.ec_stack.ga_len;
|
||||||
|
|
||||||
// Frame pointer points to just after arguments.
|
// Frame pointer points to just after arguments.
|
||||||
ectx.ec_frame = ectx.ec_stack.ga_len;
|
ectx.ec_frame = ectx.ec_stack.ga_len;
|
||||||
|
Reference in New Issue
Block a user