]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.1224: Vim9: arguments from partial are not used v8.2.1224
authorBram Moolenaar <Bram@vim.org>
Wed, 15 Jul 2020 20:38:56 +0000 (22:38 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 Jul 2020 20:38:56 +0000 (22:38 +0200)
Problem:    Vim9: arguments from partial are not used.
Solution:   Put the partial arguments on the stack. (closes #6460)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9execute.c

index 3e90a02b809e5b3636b75af6dbaa82acd05840d4..d201181fae40ee059c823923d46a3bfcba16828d 100644 (file)
@@ -1055,5 +1055,23 @@ def Test_closure_in_map()
   delete('XclosureDir', 'rf')
 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
index 92cbe501d30d4fbdcdc752ea859f4f20dfd2b72f..2a915fb61d9ae75d0d73c4fab1f40c0ef228e774 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1224,
 /**/
     1223,
 /**/
index eb900c876ff6c054f616f9aa23ba205f18179b1c..a0d7f630bc90885a028113a060539d305660928b 100644 (file)
@@ -575,14 +575,32 @@ call_by_name(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
 }
 
     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;
     int                called_emsg_before = called_emsg;
 
     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)
        {