]> granicus.if.org Git - vim/commitdiff
patch 8.2.1137: Vim9: modifiers not cleared after compiling function v8.2.1137
authorBram Moolenaar <Bram@vim.org>
Sun, 5 Jul 2020 16:18:42 +0000 (18:18 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 5 Jul 2020 16:18:42 +0000 (18:18 +0200)
Problem:    Vim9: modifiers not cleared after compiling function.
Solution:   Clear command modifiers. (closes #6396)

src/ex_docmd.c
src/proto/ex_docmd.pro
src/testdir/dumps/Test_vim9_silent_echo.dump [new file with mode: 0644]
src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index a5562cc28a8dde1689253ad4b06a8f9bba60c201..59778eb981ab92d9b199fcd74087b98af305a933 100644 (file)
@@ -25,7 +25,6 @@ static char_u *do_one_cmd(char_u **, int, cstack_T *, char_u *(*fgetline)(int, v
 static char_u  *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int, int), void *cookie);
 static int     if_level = 0;           // depth in :if
 #endif
-static void    free_cmdmod(void);
 static void    append_command(char_u *cmd);
 
 #ifndef FEAT_MENU
@@ -2611,32 +2610,10 @@ doend:
                        ? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
 #endif
 
-    if (ea.verbose_save >= 0)
-       p_verbose = ea.verbose_save;
-
-    free_cmdmod();
+    undo_cmdmod(&ea, save_msg_scroll);
     cmdmod = save_cmdmod;
     reg_executing = save_reg_executing;
 
-    if (ea.save_msg_silent != -1)
-    {
-       // messages could be enabled for a serious error, need to check if the
-       // counters don't become negative
-       if (!did_emsg || msg_silent > ea.save_msg_silent)
-           msg_silent = ea.save_msg_silent;
-       emsg_silent -= ea.did_esilent;
-       if (emsg_silent < 0)
-           emsg_silent = 0;
-       // Restore msg_scroll, it's set by file I/O commands, even when no
-       // message is actually displayed.
-       msg_scroll = save_msg_scroll;
-
-       // "silent reg" or "silent echo x" inside "redir" leaves msg_col
-       // somewhere in the line.  Put it back in the first column.
-       if (redirecting())
-           msg_col = 0;
-    }
-
 #ifdef HAVE_SANDBOX
     if (ea.did_sandbox)
        --sandbox;
@@ -2927,11 +2904,14 @@ parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only)
 }
 
 /*
- * Free contents of "cmdmod".
+ * Unod and free contents of "cmdmod".
  */
-    static void
-free_cmdmod(void)
+    void
+undo_cmdmod(exarg_T *eap, int save_msg_scroll)
 {
+    if (eap->verbose_save >= 0)
+       p_verbose = eap->verbose_save;
+
     if (cmdmod.save_ei != NULL)
     {
        // Restore 'eventignore' to the value before ":noautocmd".
@@ -2942,6 +2922,25 @@ free_cmdmod(void)
 
     if (cmdmod.filter_regmatch.regprog != NULL)
        vim_regfree(cmdmod.filter_regmatch.regprog);
+
+    if (eap->save_msg_silent != -1)
+    {
+       // messages could be enabled for a serious error, need to check if the
+       // counters don't become negative
+       if (!did_emsg || msg_silent > eap->save_msg_silent)
+           msg_silent = eap->save_msg_silent;
+       emsg_silent -= eap->did_esilent;
+       if (emsg_silent < 0)
+           emsg_silent = 0;
+       // Restore msg_scroll, it's set by file I/O commands, even when no
+       // message is actually displayed.
+       msg_scroll = save_msg_scroll;
+
+       // "silent reg" or "silent echo x" inside "redir" leaves msg_col
+       // somewhere in the line.  Put it back in the first column.
+       if (redirecting())
+           msg_col = 0;
+    }
 }
 
 /*
index 8f5ac10d4e3d96158b18a113947001ae585af0b1..85050313b63243370cee32e178afc320df6b1ec6 100644 (file)
@@ -6,6 +6,7 @@ int getline_equal(char_u *(*fgetline)(int, void *, int, int), void *cookie, char
 void *getline_cookie(char_u *(*fgetline)(int, void *, int, int), void *cookie);
 char_u *getline_peek(char_u *(*fgetline)(int, void *, int, int), void *cookie);
 int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
+void undo_cmdmod(exarg_T *eap, int save_msg_scroll);
 int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
 int checkforcmd(char_u **pp, char *cmd, int len);
 char_u *find_ex_command(exarg_T *eap, int *full, void *(*lookup)(char_u *, size_t, cctx_T *), cctx_T *cctx);
diff --git a/src/testdir/dumps/Test_vim9_silent_echo.dump b/src/testdir/dumps/Test_vim9_silent_echo.dump
new file mode 100644 (file)
index 0000000..f5f7927
--- /dev/null
@@ -0,0 +1,6 @@
+| +0&#ffffff0@74
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|:+0#0000000&|a|b|c> @70
index c3236fff15f0c5921ebddecc2c9a25b2427a6430..761dd57252ee6b1f41db1a4ef7d6cdb6790aa6f7 100644 (file)
@@ -3,6 +3,7 @@
 source check.vim
 source view_util.vim
 source vim9.vim
+source screendump.vim
 
 func Test_def_basic()
   def SomeFunc(): string
@@ -903,5 +904,27 @@ def Test_line_continuation_in_def()
   assert_equal('full', Line_continuation_in_def('.'))
 enddef
 
+def Test_silent_echo()
+  CheckScreendump
+
+  let lines =<< trim END
+    vim9script
+    def EchoNothing()
+      silent echo ''
+    enddef
+    defcompile
+  END
+  writefile(lines, 'XTest_silent_echo')
+
+  " Check that the balloon shows up after a mouse move
+  let buf = RunVimInTerminal('-S XTest_silent_echo', {'rows': 6})
+  term_sendkeys(buf, ":abc")
+  call VerifyScreenDump(buf, 'Test_vim9_silent_echo', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+  call delete('XTest_silent_echo')
+enddef
+
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 23a94348f8f0e390fbd110c682af98152c802baf..b6ed058e1389155f38c4a51ad79b82f621d666ed 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1137,
 /**/
     1136,
 /**/
index e5a801a28ea871fb930f92437658124c62cb8594..ed069b740a729438a0d20c3bd5082af3fa4bbc39 100644 (file)
@@ -6809,6 +6809,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
        exarg_T ea;
        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.
@@ -6897,6 +6898,8 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
            line = (char_u *)"";
            continue;
        }
+       // TODO: use modifiers in the command
+       undo_cmdmod(&ea, save_msg_scroll);
 
        // Skip ":call" to get to the function name.
        if (checkforcmd(&ea.cmd, "call", 3))