# HG changeset patch # User Bram Moolenaar # Date 1651078803 -7200 # Node ID 333be301dfe8c1cb64d3777dab93f3dbfc0f8f68 # Parent 4d76b3e07c070fa83e03420a5bf96f8b8aa758ee patch 8.2.4834: Vim9: some lines not covered by tests Commit: https://github.com/vim/vim/commit/06651630ee35111839e627e1bcbac94b86347883 Author: Bram Moolenaar Date: Wed Apr 27 17:54:25 2022 +0100 patch 8.2.4834: Vim9: some lines not covered by tests Problem: Vim9: some lines not covered by tests. Solution: Add a few more tests. Remove dead code. diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim --- 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 --- 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 --- 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 --- 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; - - if (trystack->ga_len > 0) + 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) { - 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(); - } - - 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; + // discard the exception + if (caught_stack == current_exception) + caught_stack = caught_stack->caught; + discard_current_exception(); } + + 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; } 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 *inst 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 --- 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: