diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-01-12 18:58:39 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-01-12 18:58:39 +0100 |
commit | 7cd24227c02afdb4249db406e2174eda1e6b36b4 (patch) | |
tree | dc562bcb5d5c84b6e208fa25392503319de62077 | |
parent | a0122dcd1cc9e9bb62c071a9b91426a8bce4f8d9 (diff) | |
download | vim-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.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 5 |
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; |