Mercurial > vim
changeset 23586:8c5374ec8a3d v8.2.2335
patch 8.2.2335: Vim9: "silent return" does not restore command modifiers
Commit: https://github.com/vim/vim/commit/7cd24227c02afdb4249db406e2174eda1e6b36b4
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jan 12 18:58:39 2021 +0100
patch 8.2.2335: Vim9: "silent return" does not restore command modifiers
Problem: Vim9: "silent return" does not restore command modifiers.
Solution: Resture command modifiers before returning. (closes https://github.com/vim/vim/issues/7649)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 12 Jan 2021 19:00:07 +0100 |
parents | f912c5069505 |
children | 901fb2bf09d1 |
files | src/testdir/test_vim9_disassemble.vim src/version.c src/vim9compile.c |
diffstat | 3 files changed, 22 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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,
--- 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_re // 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;