]> granicus.if.org Git - vim/commitdiff
patch 9.0.0140: execute() does not use the "legacy" command modifier v9.0.0140
authorKota Kato <peony.btn@gmail.com>
Thu, 4 Aug 2022 17:50:14 +0000 (18:50 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 4 Aug 2022 17:50:14 +0000 (18:50 +0100)
Problem:    execute() does not use the "legacy" command modifier.
Solution:   pass the command modifier in sticky_cmdmod_flags. (Kota Kato,
            closes #10845)

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

index ef66aedf9a73f136593df2016e3efbac65b59dd5..da2f35e5cf8306af474be70198817cd74ce79d6e 100644 (file)
@@ -3929,6 +3929,7 @@ execute_common(typval_T *argvars, typval_T *rettv, int arg_off)
     int                save_redir_off = redir_off;
     garray_T   save_ga;
     int                save_msg_col = msg_col;
+    int                save_sticky_cmdmod_flags = sticky_cmdmod_flags;
     int                echo_output = FALSE;
 
     rettv->vval.v_string = NULL;
@@ -3985,6 +3986,9 @@ execute_common(typval_T *argvars, typval_T *rettv, int arg_off)
     if (!echo_output)
        msg_col = 0;  // prevent leading spaces
 
+    // For "legacy call execute('cmd')" and "vim9cmd execute('cmd')" apply the
+    // command modifiers to "cmd".
+    sticky_cmdmod_flags = cmdmod.cmod_flags & (CMOD_LEGACY | CMOD_VIM9CMD);
     if (cmd != NULL)
        do_cmdline_cmd(cmd);
     else
@@ -3997,6 +4001,7 @@ execute_common(typval_T *argvars, typval_T *rettv, int arg_off)
                      DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT|DOCMD_KEYTYPED);
        --list->lv_refcount;
     }
+    sticky_cmdmod_flags = save_sticky_cmdmod_flags;
 
     // Need to append a NUL to the result.
     if (ga_grow(&redir_execute_ga, 1) == OK)
index 7db8e50c8e6b22a36d1e1ecafb32ef27099ea3ad..fc1354e83da3669e424b50db51d190e48db38a0b 100644 (file)
@@ -142,6 +142,42 @@ def Test_cmdmod_execute()
   END
   v9.CheckScriptSuccess(lines)
   delfunc g:TheFunc
+
+  # vim9cmd execute(cmd) executes code in vim9 script context
+  lines =<< trim END
+    vim9cmd execute("g:vim9executetest = 'bar'")
+    call assert_equal('bar', g:vim9executetest)
+  END
+  v9.CheckScriptSuccess(lines)
+  unlet g:vim9executetest
+
+  lines =<< trim END
+    vim9cmd execute(["g:vim9executetest1 = 'baz'", "g:vim9executetest2 = 'foo'"])
+    call assert_equal('baz', g:vim9executetest1)
+    call assert_equal('foo', g:vim9executetest2)
+  END
+  v9.CheckScriptSuccess(lines)
+  unlet g:vim9executetest1
+  unlet g:vim9executetest2
+
+  # legacy call execute(cmd) executes code in vim script context
+  lines =<< trim END
+    vim9script
+    legacy call execute("let g:vim9executetest = 'bar'")
+    assert_equal('bar', g:vim9executetest)
+  END
+  v9.CheckScriptSuccess(lines)
+  unlet g:vim9executetest
+
+  lines =<< trim END
+    vim9script
+    legacy call execute(["let g:vim9executetest1 = 'baz'", "let g:vim9executetest2 = 'foo'"])
+    assert_equal('baz', g:vim9executetest1)
+    assert_equal('foo', g:vim9executetest2)
+  END
+  v9.CheckScriptSuccess(lines)
+  unlet g:vim9executetest1
+  unlet g:vim9executetest2
 enddef
 
 def Test_edit_wildcards()
index d6bd4cbedcc3b2bef5d1135f81abd49fda12e454..7b53bee9dfaa4f763db69a071d03c9f906ca950b 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    140,
 /**/
     139,
 /**/