# HG changeset patch # User Bram Moolenaar # Date 1610474407 -3600 # Node ID 8c5374ec8a3ddd373390a562838b575e5d4749c5 # Parent f912c5069505c154dc1c0cfb0fdb446e384795a1 patch 8.2.2335: Vim9: "silent return" does not restore command modifiers Commit: https://github.com/vim/vim/commit/7cd24227c02afdb4249db406e2174eda1e6b36b4 Author: Bram Moolenaar 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) diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim --- 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('\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 --- 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 --- 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;