summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-05 19:17:16 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-05 19:17:16 +0100
commitf665e97ffa06817975810cb511b13dbaa83ec630 (patch)
treed405215beadca418ce002f6507102f46f6f4aef5
parent4029cabbe7c68a304ab8becb495bd6d91c6e97b1 (diff)
downloadvim-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.vim43
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c16
-rw-r--r--src/vim9execute.c1
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;