1
0
forked from aniani/vim

patch 8.2.1137: Vim9: modifiers not cleared after compiling function

Problem:    Vim9: modifiers not cleared after compiling function.
Solution:   Clear command modifiers. (closes #6396)
This commit is contained in:
Bram Moolenaar 2020-07-05 18:18:42 +02:00
parent 846178a72c
commit 47e7d70b58
6 changed files with 61 additions and 27 deletions

View 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 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 static int if_level = 0; // depth in :if
#endif #endif
static void free_cmdmod(void);
static void append_command(char_u *cmd); static void append_command(char_u *cmd);
#ifndef FEAT_MENU #ifndef FEAT_MENU
@ -2611,32 +2610,10 @@ doend:
? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL); ? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
#endif #endif
if (ea.verbose_save >= 0) undo_cmdmod(&ea, save_msg_scroll);
p_verbose = ea.verbose_save;
free_cmdmod();
cmdmod = save_cmdmod; cmdmod = save_cmdmod;
reg_executing = save_reg_executing; 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 #ifdef HAVE_SANDBOX
if (ea.did_sandbox) if (ea.did_sandbox)
--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 void
free_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) if (cmdmod.save_ei != NULL)
{ {
// Restore 'eventignore' to the value before ":noautocmd". // Restore 'eventignore' to the value before ":noautocmd".
@ -2942,6 +2922,25 @@ free_cmdmod(void)
if (cmdmod.filter_regmatch.regprog != NULL) if (cmdmod.filter_regmatch.regprog != NULL)
vim_regfree(cmdmod.filter_regmatch.regprog); 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;
}
} }
/* /*

View 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); 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); 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); 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 parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
int checkforcmd(char_u **pp, char *cmd, int len); 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); char_u *find_ex_command(exarg_T *eap, int *full, void *(*lookup)(char_u *, size_t, cctx_T *), cctx_T *cctx);

View File

@ -0,0 +1,6 @@
| +0&#ffffff0@74
|~+0#4040ff13&| @73
|~| @73
|~| @73
|~| @73
|:+0#0000000&|a|b|c> @70

View File

@ -3,6 +3,7 @@
source check.vim source check.vim
source view_util.vim source view_util.vim
source vim9.vim source vim9.vim
source screendump.vim
func Test_def_basic() func Test_def_basic()
def SomeFunc(): string def SomeFunc(): string
@ -903,5 +904,27 @@ def Test_line_continuation_in_def()
assert_equal('full', Line_continuation_in_def('.')) assert_equal('full', Line_continuation_in_def('.'))
enddef 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 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker

View File

@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1137,
/**/ /**/
1136, 1136,
/**/ /**/

View File

@ -6809,6 +6809,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
exarg_T ea; exarg_T ea;
int starts_with_colon = FALSE; int starts_with_colon = FALSE;
char_u *cmd; char_u *cmd;
int save_msg_scroll = msg_scroll;
// Bail out on the first error to avoid a flood of errors and report // Bail out on the first error to avoid a flood of errors and report
// the right line number when inside try/catch. // 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 *)""; line = (char_u *)"";
continue; continue;
} }
// TODO: use modifiers in the command
undo_cmdmod(&ea, save_msg_scroll);
// Skip ":call" to get to the function name. // Skip ":call" to get to the function name.
if (checkforcmd(&ea.cmd, "call", 3)) if (checkforcmd(&ea.cmd, "call", 3))