]> granicus.if.org Git - vim/commitdiff
patch 8.2.4365: sticky command modifiers are too sticky v8.2.4365
authorBram Moolenaar <Bram@vim.org>
Sat, 12 Feb 2022 22:13:06 +0000 (22:13 +0000)
committerBram Moolenaar <Bram@vim.org>
Sat, 12 Feb 2022 22:13:06 +0000 (22:13 +0000)
Problem:    sticky command modifiers are too sticky.
Solution:   Do not apply command modifiers to a called function. (closes #9751)

src/testdir/test_vim9_cmd.vim
src/userfunc.c
src/version.c

index e7cdcc3f09c5079ba56797117258873ce47b2538..8325d7a808595e8e369f02ec388ddaf52cf02e8f 100644 (file)
@@ -118,6 +118,20 @@ def Test_cmdmod_execute()
   END
   v9.CheckScriptSuccess(lines)
   delete('Xvim9import.vim')
+
+  # "legacy" does not aply to a called function
+  lines =<< trim END
+      vim9script
+
+      def g:TheFunc()
+        if exists('something')
+          echo 'yes'
+        endif
+      enddef
+      legacy exe 'call g:TheFunc()'
+  END
+  v9.CheckScriptSuccess(lines)
+  delfunc g:TheFunc
 enddef
 
 def Test_edit_wildcards()
index 4eead2a630b2aef679ab47b90412ca50c3385aa4..841a537d7d4b87b957a8aa70c42823a5d8d191da 100644 (file)
@@ -2513,6 +2513,7 @@ call_user_func(
 {
     sctx_T     save_current_sctx;
     int                using_sandbox = FALSE;
+    int                save_sticky_cmdmod_flags = sticky_cmdmod_flags;
     funccall_T *fc;
     int                save_did_emsg;
     int                default_arg_err = FALSE;
@@ -2569,6 +2570,7 @@ call_user_func(
        if (do_profiling == PROF_YES)
            profile_may_start_func(&profile_info, fp, caller);
 #endif
+       sticky_cmdmod_flags = 0;
        call_def_function(fp, argcount, argvars, funcexe->fe_partial, rettv);
        funcdepth_decrement();
 #ifdef FEAT_PROFILE
@@ -2578,6 +2580,7 @@ call_user_func(
 #endif
        current_funccal = fc->caller;
        free_funccal(fc);
+       sticky_cmdmod_flags = save_sticky_cmdmod_flags;
        return;
     }
 
@@ -2797,6 +2800,9 @@ call_user_func(
                                 fc->caller == NULL ? NULL : fc->caller->func);
 #endif
 
+    // "legacy" does not apply to commands in the function
+    sticky_cmdmod_flags = 0;
+
     save_current_sctx = current_sctx;
     current_sctx = fp->uf_script_ctx;
     save_did_emsg = did_emsg;
@@ -2889,6 +2895,7 @@ call_user_func(
 #endif
     if (using_sandbox)
        --sandbox;
+    sticky_cmdmod_flags = save_sticky_cmdmod_flags;
 
     if (p_verbose >= 12 && SOURCING_NAME != NULL)
     {
index ea5119c32dc6f508ba4b34a21cdd1febfedb5503..840a0d36f81930fcdbc29aadfe35d85dd2bc641a 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4365,
 /**/
     4364,
 /**/