diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-12-05 19:17:16 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-12-05 19:17:16 +0100 |
commit | f665e97ffa06817975810cb511b13dbaa83ec630 (patch) | |
tree | d405215beadca418ce002f6507102f46f6f4aef5 | |
parent | 4029cabbe7c68a304ab8becb495bd6d91c6e97b1 (diff) | |
download | vim-git-f665e97ffa06817975810cb511b13dbaa83ec630.tar.gz |
patch 8.2.2096: Vim9: command modifiers not restored after assignmentv8.2.2096
Problem: Vim9: command modifiers not restored after assignment.
Solution: Jump to nextline instead of using continue.
-rw-r--r-- | src/testdir/test_vim9_func.vim | 43 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 16 | ||||
-rw-r--r-- | src/vim9execute.c | 1 |
4 files changed, 50 insertions, 12 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 18864cfd1..4e8ee888d 100644 --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -1784,6 +1784,22 @@ def Test_reset_did_emsg() delfunc! g:Func enddef +def Test_continues_with_silent_error() + var lines =<< trim END + vim9script + g:result = 'none' + def Func() + silent! g:result += 3 + g:result = 'yes' + enddef + # error is silenced, function does not abort + Func() + assert_equal('yes', g:result) + unlet g:result + END + CheckScriptSuccess(lines) +enddef + def Test_abort_even_with_silent() var lines =<< trim END vim9script @@ -1792,13 +1808,38 @@ def Test_abort_even_with_silent() eval {-> ''}() .. '' .. {}['X'] g:result = 'yes' enddef - sil! Func() + silent! Func() assert_equal('none', g:result) unlet g:result END CheckScriptSuccess(lines) enddef +def Test_cmdmod_silent_restored() + var lines =<< trim END + vim9script + def Func() + g:result = 'none' + silent! g:result += 3 + g:result = 'none' + g:result += 3 + enddef + Func() + END + # can't use CheckScriptFailure, it ignores the :silent! + var fname = 'Xdefsilent' + writefile(lines, fname) + var caught = 'no' + try + exe 'source ' .. fname + catch /E1030:/ + caught = 'yes' + assert_match('Func, line 4', v:throwpoint) + endtry + assert_equal('yes', caught) + delete(fname) +enddef + def Test_dict_member_with_silent() var lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index cfc1639d4..66ec86a20 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 */ /**/ + 2096, +/**/ 2095, /**/ 2094, diff --git a/src/vim9compile.c b/src/vim9compile.c index 2cd4b52c0..ee3d89e51 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -1933,14 +1933,8 @@ generate_cmdmods(cctx_T *cctx, cmdmod_T *cmod) static int generate_undo_cmdmods(cctx_T *cctx) { - isn_T *isn; - - if (cctx->ctx_has_cmdmod) - { - if ((isn = generate_instr(cctx, ISN_CMDMOD_REV)) == NULL) - return FAIL; - } - + if (cctx->ctx_has_cmdmod && generate_instr(cctx, ISN_CMDMOD_REV) == NULL) + return FAIL; return OK; } @@ -7578,7 +7572,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) line = compile_assignment(ea.cmd, &ea, CMD_SIZE, &cctx); if (line == NULL || line == ea.cmd) goto erret; - continue; + goto nextline; } } } @@ -7590,7 +7584,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) if (line == NULL) goto erret; if (line != ea.cmd) - continue; + goto nextline; } } @@ -7629,7 +7623,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx) if (cctx.ctx_skip == SKIP_YES) { line += STRLEN(line); - continue; + goto nextline; } // Expression or function call. diff --git a/src/vim9execute.c b/src/vim9execute.c index dd36cfa6b..980ebb51a 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2432,6 +2432,7 @@ call_def_function( else #endif { + SOURCING_LNUM = iptr->isn_lnum; n1 = tv_get_number_chk(tv1, &error); if (error) goto on_error; |