]> granicus.if.org Git - vim/commitdiff
patch 8.2.1394: Vim9: compiling a function interferes with command modifiers v8.2.1394
authorBram Moolenaar <Bram@vim.org>
Sat, 8 Aug 2020 13:10:27 +0000 (15:10 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 8 Aug 2020 13:10:27 +0000 (15:10 +0200)
Problem:    Vim9: compiling a function interferes with command modifiers.
Solution:   Save and restore command modifiers. (closes #6658)

src/testdir/test_vim9_func.vim
src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 3cc1e112b6ab9f36fc30db5f0c869b6c82c3c29e..d39584154bc5eabcf46e1a522073297b42edba53 100644 (file)
@@ -1351,5 +1351,30 @@ def Test_partial_call()
   assert_equal({'title': 'test'}, getqflist({'title': 1}))
 enddef
 
+def Test_cmd_modifier()
+  tab echo '0'
+  call CheckDefFailure(['5tab echo 3'], 'E16:')
+enddef
+
+def Test_restore_modifiers()
+  # check that when compiling a :def function command modifiers are not messed
+  # up.
+  let lines =<< trim END
+      vim9script
+      set eventignore=
+      autocmd QuickFixCmdPost * copen
+      def AutocmdsDisabled()
+          eval 0
+      enddef
+      func Func()
+        noautocmd call s:AutocmdsDisabled()
+        let g:ei_after = &eventignore
+      endfunc
+      Func()
+  END
+  CheckScriptSuccess(lines)
+  assert_equal('', g:ei_after)
+enddef
+
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 3f1997f6f4cb9e33b5529a8e25c0e251477dc985..10706b1d932b60fbb34739cd1402dddee5a6769f 100644 (file)
@@ -751,11 +751,6 @@ func Test_block_failure()
   call CheckDefFailure(['{', 'echo 1'], 'E1026:')
 endfunc
 
-def Test_cmd_modifier()
-  tab echo '0'
-  call CheckDefFailure(['5tab echo 3'], 'E16:')
-enddef
-
 func g:NoSuchFunc()
   echo 'none'
 endfunc
index 2febed6752006c098c72a50d9c54d9a39015bf1a..17ed09b0f713d275efec1ae1c62b0ebf06a94719 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1394,
 /**/
     1393,
 /**/
index 25da7f562c8ab72c2019ef2dbac034c541a8b1b4..04681fee7eaa20c123441c7bd82606354c1a83e5 100644 (file)
@@ -2668,7 +2668,7 @@ next_line_from_context(cctx_T *cctx, int skip_comment)
        cctx->ctx_line_start = line;
        SOURCING_LNUM = cctx->ctx_lnum + 1;
     } while (line == NULL || *skipwhite(line) == NUL
-                         || (skip_comment && vim9_comment_start(skipwhite(line))));
+                    || (skip_comment && vim9_comment_start(skipwhite(line))));
     return line;
 }
 
@@ -7194,10 +7194,11 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
      */
     for (;;)
     {
-       exarg_T ea;
-       int     starts_with_colon = FALSE;
-       char_u  *cmd;
-       int     save_msg_scroll = msg_scroll;
+       exarg_T     ea;
+       cmdmod_T    save_cmdmod;
+       int         starts_with_colon = FALSE;
+       char_u      *cmd;
+       int         save_msg_scroll = msg_scroll;
 
        // Bail out on the first error to avoid a flood of errors and report
        // the right line number when inside try/catch.
@@ -7278,6 +7279,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
        /*
         * COMMAND MODIFIERS
         */
+       save_cmdmod = cmdmod;
        if (parse_command_modifiers(&ea, &errormsg, FALSE) == FAIL)
        {
            if (errormsg != NULL)
@@ -7288,7 +7290,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
        }
        // TODO: use modifiers in the command
        undo_cmdmod(&ea, save_msg_scroll);
-       CLEAR_FIELD(cmdmod);
+       cmdmod = save_cmdmod;
 
        // Skip ":call" to get to the function name.
        if (checkforcmd(&ea.cmd, "call", 3))