forked from aniani/vim
patch 8.2.1224: Vim9: arguments from partial are not used
Problem: Vim9: arguments from partial are not used. Solution: Put the partial arguments on the stack. (closes #6460)
This commit is contained in:
parent
e30f64b4b5
commit
a90afb9a59
@ -1055,5 +1055,23 @@ def Test_closure_in_map()
|
|||||||
delete('XclosureDir', 'rf')
|
delete('XclosureDir', 'rf')
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_partial_call()
|
||||||
|
let Xsetlist = function('setloclist', [0])
|
||||||
|
Xsetlist([], ' ', {'title': 'test'})
|
||||||
|
assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
|
||||||
|
|
||||||
|
Xsetlist = function('setloclist', [0, [], ' '])
|
||||||
|
Xsetlist({'title': 'test'})
|
||||||
|
assert_equal({'title': 'test'}, getloclist(0, {'title': 1}))
|
||||||
|
|
||||||
|
Xsetlist = function('setqflist')
|
||||||
|
Xsetlist([], ' ', {'title': 'test'})
|
||||||
|
assert_equal({'title': 'test'}, getqflist({'title': 1}))
|
||||||
|
|
||||||
|
Xsetlist = function('setqflist', [[], ' '])
|
||||||
|
Xsetlist({'title': 'test'})
|
||||||
|
assert_equal({'title': 'test'}, getqflist({'title': 1}))
|
||||||
|
enddef
|
||||||
|
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1224,
|
||||||
/**/
|
/**/
|
||||||
1223,
|
1223,
|
||||||
/**/
|
/**/
|
||||||
|
@ -575,14 +575,32 @@ call_by_name(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
call_partial(typval_T *tv, int argcount, ectx_T *ectx)
|
call_partial(typval_T *tv, int argcount_arg, ectx_T *ectx)
|
||||||
{
|
{
|
||||||
|
int argcount = argcount_arg;
|
||||||
char_u *name = NULL;
|
char_u *name = NULL;
|
||||||
int called_emsg_before = called_emsg;
|
int called_emsg_before = called_emsg;
|
||||||
|
|
||||||
if (tv->v_type == VAR_PARTIAL)
|
if (tv->v_type == VAR_PARTIAL)
|
||||||
{
|
{
|
||||||
partial_T *pt = tv->vval.v_partial;
|
partial_T *pt = tv->vval.v_partial;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (pt->pt_argc > 0)
|
||||||
|
{
|
||||||
|
// Make space for arguments from the partial, shift the "argcount"
|
||||||
|
// arguments up.
|
||||||
|
if (ga_grow(&ectx->ec_stack, pt->pt_argc) == FAIL)
|
||||||
|
return FAIL;
|
||||||
|
for (i = 1; i <= argcount; ++i)
|
||||||
|
*STACK_TV_BOT(-i + pt->pt_argc) = *STACK_TV_BOT(-i);
|
||||||
|
ectx->ec_stack.ga_len += pt->pt_argc;
|
||||||
|
argcount += pt->pt_argc;
|
||||||
|
|
||||||
|
// copy the arguments from the partial onto the stack
|
||||||
|
for (i = 0; i < pt->pt_argc; ++i)
|
||||||
|
copy_tv(&pt->pt_argv[i], STACK_TV_BOT(-argcount + i));
|
||||||
|
}
|
||||||
|
|
||||||
if (pt->pt_func != NULL)
|
if (pt->pt_func != NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user