diff src/ex_docmd.c @ 21172:96ae8622cfb6 v8.2.1137

patch 8.2.1137: Vim9: modifiers not cleared after compiling function Commit: https://github.com/vim/vim/commit/47e7d70b58e8bfc1daaf6d35569ef2dbd0339ddc Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 5 18:18:42 2020 +0200 patch 8.2.1137: Vim9: modifiers not cleared after compiling function Problem: Vim9: modifiers not cleared after compiling function. Solution: Clear command modifiers. (closes https://github.com/vim/vim/issues/6396)
author Bram Moolenaar <Bram@vim.org>
date Sun, 05 Jul 2020 18:30:07 +0200
parents 4a1e8086759b
children 874a28fac941
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -25,7 +25,6 @@ static char_u	*do_one_cmd(char_u **, int
 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, ch
 }
 
 /*
- * Free contents of "cmdmod".
- */
-    static void
-free_cmdmod(void)
-{
+ * Unod and free contents of "cmdmod".
+ */
+    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;
+    }
 }
 
 /*