summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-01-12 18:58:39 +0100
committerBram Moolenaar <Bram@vim.org>2021-01-12 18:58:39 +0100
commit7cd24227c02afdb4249db406e2174eda1e6b36b4 (patch)
treedc562bcb5d5c84b6e208fa25392503319de62077
parenta0122dcd1cc9e9bb62c071a9b91426a8bce4f8d9 (diff)
downloadvim-git-7cd24227c02afdb4249db406e2174eda1e6b36b4.tar.gz
patch 8.2.2335: Vim9: "silent return" does not restore command modifiersv8.2.2335
Problem: Vim9: "silent return" does not restore command modifiers. Solution: Resture command modifiers before returning. (closes #7649)
-rw-r--r--src/testdir/test_vim9_disassemble.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c5
3 files changed, 22 insertions, 0 deletions
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index ca9b90e88..83dcda085 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -1842,4 +1842,19 @@ def Test_silent()
res)
enddef
+def s:SilentReturn(): string
+ silent return "done"
+enddef
+
+def Test_silent_return()
+ var res = execute('disass s:SilentReturn')
+ assert_match('<SNR>\d*_SilentReturn\_s*' ..
+ 'silent return "done"\_s*' ..
+ '\d CMDMOD silent\_s*' ..
+ '\d PUSHS "done"\_s*' ..
+ '\d CMDMOD_REV\_s*' ..
+ '\d RETURN',
+ res)
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 7566a3989..1832108d3 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2335,
+/**/
2334,
/**/
2333,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 4b2ee0779..e25a36b75 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -2055,6 +2055,7 @@ generate_undo_cmdmods(cctx_T *cctx)
{
if (cctx->ctx_has_cmdmod && generate_instr(cctx, ISN_CMDMOD_REV) == NULL)
return FAIL;
+ cctx->ctx_has_cmdmod = FALSE;
return OK;
}
@@ -4933,6 +4934,10 @@ compile_return(char_u *arg, int check_return_type, cctx_T *cctx)
// No argument, return zero.
generate_PUSHNR(cctx, 0);
}
+
+ // Undo any command modifiers.
+ generate_undo_cmdmods(cctx);
+
if (cctx->ctx_skip != SKIP_YES && generate_instr(cctx, ISN_RETURN) == NULL)
return NULL;