]> granicus.if.org Git - vim/commitdiff
patch 9.0.0390: cannot use a partial with :defer v9.0.0390
authorBram Moolenaar <Bram@vim.org>
Mon, 5 Sep 2022 20:21:25 +0000 (21:21 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 5 Sep 2022 20:21:25 +0000 (21:21 +0100)
Problem:    Cannot use a partial with :defer.
Solution:   Add the partial arguments before the other arguments.  Disallow
            using a dictionary.

src/errors.h
src/testdir/test_user_func.vim
src/userfunc.c
src/version.c

index 44eb9db9fcf5e1478dcdfd28fe82654cffdb68c8..2ed62a2afd42a20ceed6c72272abf5db54b5a7ef 100644 (file)
@@ -3326,3 +3326,7 @@ EXTERN char e_non_null_list_required_for_argument_nr[]
 #endif
 EXTERN char e_window_unexpectedly_close_while_searching_for_tags[]
        INIT(= N_("E1299: Window unexpectedly closed while searching for tags"));
+#ifdef FEAT_EVAL
+EXTERN char e_cannot_use_partial_with_dictionary_for_defer[]
+       INIT(= N_("E1300: Cannot use a partial with dictionary for :defer"));
+#endif
index af05812c6bee58a361df9150573eac85597e6807..4ea7711197e7efe38adaff8599b831f9b022ff7c 100644 (file)
@@ -529,8 +529,11 @@ func Test_funcdef_alloc_failure()
   bw!
 endfunc
 
-func AddDefer(arg)
-  call extend(g:deferred, [a:arg])
+func AddDefer(arg1, ...)
+  call extend(g:deferred, [a:arg1])
+  if a:0 == 1
+    call extend(g:deferred, [a:1])
+  endif
 endfunc
 
 func WithDeferTwo()
@@ -550,6 +553,13 @@ func WithDeferOne()
   call extend(g:deferred, ['end One'])
 endfunc
 
+func WithPartialDefer()
+  call extend(g:deferred, ['in Partial'])
+  let Part = funcref('AddDefer', ['arg1'])
+  defer Part("arg2")
+  call extend(g:deferred, ['end Partial'])
+endfunc
+
 func Test_defer()
   let g:deferred = []
   call WithDeferOne()
@@ -558,6 +568,17 @@ func Test_defer()
   unlet g:deferred
 
   call assert_equal('', glob('Xfuncdefer'))
+
+  call assert_fails('defer delete("Xfuncdefer")->Another()', 'E488:')
+  call assert_fails('defer delete("Xfuncdefer").member', 'E488:')
+
+  let g:deferred = []
+  call WithPartialDefer()
+  call assert_equal(['in Partial', 'end Partial', 'arg1', 'arg2'], g:deferred)
+  unlet g:deferred
+
+  let Part = funcref('AddDefer', ['arg1'], {})
+  call assert_fails('defer Part("arg2")', 'E1300:')
 endfunc
 
 
index 9ac681f202af83dc6ffc69333163e2a7b2297253..0ee276b3c3ad5c1df70a1eeaf1d1082ba03a102e 100644 (file)
@@ -5567,17 +5567,42 @@ ex_call_inner(
  * Returns FAIL or OK.
  */
     static int
-ex_defer_inner(char_u *name, char_u **arg, evalarg_T *evalarg)
+ex_defer_inner(
+       char_u      *name,
+       char_u      **arg,
+       partial_T   *partial,
+       evalarg_T   *evalarg)
 {
     typval_T   argvars[MAX_FUNC_ARGS + 1];     // vars for arguments
+    int                partial_argc = 0;               // number of partial arguments
     int                argcount = 0;                   // number of arguments found
+    int                r;
 
     if (current_funccal == NULL)
     {
        semsg(_(e_str_not_inside_function), "defer");
        return FAIL;
     }
-    if (get_func_arguments(arg, evalarg, FALSE, argvars, &argcount) == FAIL)
+    if (partial != NULL)
+    {
+       if (partial->pt_dict != NULL)
+       {
+           emsg(_(e_cannot_use_partial_with_dictionary_for_defer));
+           return FAIL;
+       }
+       if (partial->pt_argc > 0)
+       {
+           int i;
+
+           partial_argc = partial->pt_argc;
+           for (i = 0; i < partial_argc; ++i)
+               copy_tv(&partial->pt_argv[i], &argvars[i]);
+       }
+    }
+    r = get_func_arguments(arg, evalarg, FALSE,
+                                           argvars + partial_argc, &argcount);
+    argcount += partial_argc;
+    if (r == FAIL)
     {
        while (--argcount >= 0)
            clear_tv(&argvars[argcount]);
@@ -5738,7 +5763,7 @@ ex_call(exarg_T *eap)
     if (eap->cmdidx == CMD_defer)
     {
        arg = startarg;
-       failed = ex_defer_inner(name, &arg, &evalarg) == FAIL;
+       failed = ex_defer_inner(name, &arg, partial, &evalarg) == FAIL;
     }
     else
     {
index b114c2760d84a53f0a37ae89df6ba3b5b392cd42..76ce3a16ddd2d96f128f1ed30525f47530d63b2a 100644 (file)
@@ -703,6 +703,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    390,
 /**/
     389,
 /**/