summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-04-27 17:54:25 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-27 17:54:25 +0100
commit06651630ee35111839e627e1bcbac94b86347883 (patch)
tree51c24c575c9d85cd173a1019901868904fe7c53e
parentce001a337e28fa368f40ac6422835d730fb8ebb1 (diff)
downloadvim-git-06651630ee35111839e627e1bcbac94b86347883.tar.gz
patch 8.2.4834: Vim9: some lines not covered by testsv8.2.4834
Problem: Vim9: some lines not covered by tests. Solution: Add a few more tests. Remove dead code.
-rw-r--r--src/testdir/test_vim9_expr.vim17
-rw-r--r--src/version.c2
-rw-r--r--src/vim9.h1
-rw-r--r--src/vim9execute.c91
-rw-r--r--src/vim9instr.c1
5 files changed, 50 insertions, 62 deletions
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index cd5f15207..729e77a0f 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1848,8 +1848,12 @@ def Test_expr6()
v9.CheckDefFailure(["var d = 6 * "], 'E1097:', 3)
v9.CheckScriptFailure(['vim9script', "var d = 6 * "], 'E15:', 2)
- v9.CheckDefExecAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
- v9.CheckDefExecAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
+ v9.CheckDefAndScriptFailure(['echo 1 / 0'], 'E1154', 1)
+ v9.CheckDefAndScriptFailure(['echo 1 % 0'], 'E1154', 1)
+
+ g:zero = 0
+ v9.CheckDefExecFailure(['echo 123 / g:zero'], 'E1154: Divide by zero')
+ v9.CheckDefExecFailure(['echo 123 % g:zero'], 'E1154: Divide by zero')
if has('float')
v9.CheckDefExecAndScriptFailure([
@@ -3399,6 +3403,15 @@ def Test_expr8_legacy_script()
lines =<< trim END
vim9script
def GetNumber(): number
+ legacy return notexists
+ enddef
+ echo GetNumber()
+ END
+ v9.CheckScriptFailure(lines, 'E121: Undefined variable: notexists')
+
+ lines =<< trim END
+ vim9script
+ def GetNumber(): number
legacy return range(3)->map('v:val + 1')
enddef
echo GetNumber()
diff --git a/src/version.c b/src/version.c
index a8f6671d9..c8dbb4794 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4834,
+/**/
4833,
/**/
4832,
diff --git a/src/vim9.h b/src/vim9.h
index d759be209..c92b05fcf 100644
--- a/src/vim9.h
+++ b/src/vim9.h
@@ -173,7 +173,6 @@ typedef enum {
ISN_2STRING_ANY, // like ISN_2STRING but check type
ISN_NEGATENR, // apply "-" to number
- ISN_CHECKNR, // check value can be used as a number
ISN_CHECKTYPE, // check value type is isn_arg.type.ct_type
ISN_CHECKLEN, // check list length is isn_arg.checklen.cl_min_len
ISN_SETTYPE, // set dict type to isn_arg.type.ct_type
diff --git a/src/vim9execute.c b/src/vim9execute.c
index bf55d18cd..22813e159 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -3172,6 +3172,7 @@ exec_instructions(ectx_T *ectx)
int idx = get_script_item_idx(sid, name, 0,
NULL, NULL);
+ // can this ever fail?
if (idx >= 0)
{
svar_T *sv = ((svar_T *)SCRIPT_ITEM(sid)
@@ -3862,15 +3863,14 @@ exec_instructions(ectx_T *ectx)
case ISN_CATCH:
{
garray_T *trystack = &ectx->ec_trystack;
+ trycmd_T *trycmd;
may_restore_cmdmod(&ectx->ec_funclocal);
- if (trystack->ga_len > 0)
- {
- trycmd_T *trycmd = ((trycmd_T *)trystack->ga_data)
+ trycmd = ((trycmd_T *)trystack->ga_data)
+ trystack->ga_len - 1;
- trycmd->tcd_caught = TRUE;
- trycmd->tcd_did_throw = FALSE;
- }
+ trycmd->tcd_caught = TRUE;
+ trycmd->tcd_did_throw = FALSE;
+
did_emsg = got_int = did_throw = FALSE;
force_abort = need_rethrow = FALSE;
catch_exception(current_exception);
@@ -3924,38 +3924,33 @@ exec_instructions(ectx_T *ectx)
case ISN_ENDTRY:
{
garray_T *trystack = &ectx->ec_trystack;
+ trycmd_T *trycmd;
- if (trystack->ga_len > 0)
+ --trystack->ga_len;
+ --trylevel;
+ trycmd = ((trycmd_T *)trystack->ga_data) + trystack->ga_len;
+ if (trycmd->tcd_did_throw)
+ did_throw = TRUE;
+ if (trycmd->tcd_caught && current_exception != NULL)
{
- trycmd_T *trycmd;
-
- --trystack->ga_len;
- --trylevel;
- trycmd = ((trycmd_T *)trystack->ga_data)
- + trystack->ga_len;
- if (trycmd->tcd_did_throw)
- did_throw = TRUE;
- if (trycmd->tcd_caught && current_exception != NULL)
- {
- // discard the exception
- if (caught_stack == current_exception)
- caught_stack = caught_stack->caught;
- discard_current_exception();
- }
+ // discard the exception
+ if (caught_stack == current_exception)
+ caught_stack = caught_stack->caught;
+ discard_current_exception();
+ }
- if (trycmd->tcd_return)
- goto func_return;
+ if (trycmd->tcd_return)
+ goto func_return;
- while (ectx->ec_stack.ga_len > trycmd->tcd_stack_len)
- {
- --ectx->ec_stack.ga_len;
- clear_tv(STACK_TV_BOT(0));
- }
- if (trycmd->tcd_cont != 0)
- // handling :continue: jump to outer try block or
- // start of the loop
- ectx->ec_iidx = trycmd->tcd_cont - 1;
+ while (ectx->ec_stack.ga_len > trycmd->tcd_stack_len)
+ {
+ --ectx->ec_stack.ga_len;
+ clear_tv(STACK_TV_BOT(0));
}
+ if (trycmd->tcd_cont != 0)
+ // handling :continue: jump to outer try block or
+ // start of the loop
+ ectx->ec_iidx = trycmd->tcd_cont - 1;
}
break;
@@ -4021,12 +4016,10 @@ exec_instructions(ectx_T *ectx)
varnumber_T arg2 = tv2->vval.v_number;
int res;
- switch (iptr->isn_arg.op.op_type)
- {
- case EXPR_EQUAL: res = arg1 == arg2; break;
- case EXPR_NEQUAL: res = arg1 != arg2; break;
- default: res = 0; break;
- }
+ if (iptr->isn_arg.op.op_type == EXPR_EQUAL)
+ res = arg1 == arg2;
+ else
+ res = arg1 != arg2;
--ectx->ec_stack.ga_len;
tv1->v_type = VAR_BOOL;
@@ -4658,20 +4651,6 @@ exec_instructions(ectx_T *ectx)
tv->vval.v_number = -tv->vval.v_number;
break;
- case ISN_CHECKNR:
- {
- int error = FALSE;
-
- tv = STACK_TV_BOT(-1);
- SOURCING_LNUM = iptr->isn_lnum;
- if (check_not_string(tv) == FAIL)
- goto on_error;
- (void)tv_get_number_chk(tv, &error);
- if (error)
- goto on_error;
- }
- break;
-
case ISN_CHECKTYPE:
{
checktype_T *ct = &iptr->isn_arg.type;
@@ -4778,10 +4757,7 @@ exec_instructions(ectx_T *ectx)
tv = STACK_TV_BOT(-1);
tv->v_type = VAR_NUMBER;
tv->v_lock = 0;
- if (ea.addr_count == 0)
- tv->vval.v_number = curwin->w_cursor.lnum;
- else
- tv->vval.v_number = ea.line2;
+ tv->vval.v_number = ea.line2;
}
break;
@@ -6144,7 +6120,6 @@ list_instructions(char *pfx, isn_T *instr, int instr_count, ufunc_T *ufunc)
case ISN_NEGATENR: smsg("%s%4d NEGATENR", pfx, current); break;
- case ISN_CHECKNR: smsg("%s%4d CHECKNR", pfx, current); break;
case ISN_CHECKTYPE:
{
checktype_T *ct = &iptr->isn_arg.type;
diff --git a/src/vim9instr.c b/src/vim9instr.c
index 0cc1c7189..5a5e3c5ab 100644
--- a/src/vim9instr.c
+++ b/src/vim9instr.c
@@ -2231,7 +2231,6 @@ delete_instr(isn_T *isn)
case ISN_CATCH:
case ISN_CEXPR_AUCMD:
case ISN_CHECKLEN:
- case ISN_CHECKNR:
case ISN_CLEARDICT:
case ISN_CMDMOD_REV:
case ISN_COMPAREANY: