]> granicus.if.org Git - vim/commitdiff
patch 8.2.4834: Vim9: some lines not covered by tests v8.2.4834
authorBram Moolenaar <Bram@vim.org>
Wed, 27 Apr 2022 16:54:25 +0000 (17:54 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 27 Apr 2022 16:54:25 +0000 (17:54 +0100)
Problem:    Vim9: some lines not covered by tests.
Solution:   Add a few more tests.  Remove dead code.

src/testdir/test_vim9_expr.vim
src/version.c
src/vim9.h
src/vim9execute.c
src/vim9instr.c

index cd5f15207bbd9483996b6470ae8ba9b6d926236b..729e77a0faf5f32b1e8484f91a939d8148a7aa38 100644 (file)
@@ -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([
@@ -3396,6 +3400,15 @@ def Test_expr8_legacy_script()
 
   assert_equal('ok', g:LegacyReturn())
 
+  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   
index a8f6671d9a87b8eb8de20f78103b4c44e3371963..c8dbb479415b39e66a37f20101031b373a1c2ba2 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4834,
 /**/
     4833,
 /**/
index d759be2090593be2155df4e488cf4a2332e745f3..c92b05fcf201268f1bf65f1228117a799cc36a80 100644 (file)
@@ -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
index bf55d18cd97aeaf8cf2a0952bbdba77ed299f6bb..22813e1597741844059bb286c68f18d43fb922a3 100644 (file)
@@ -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;
index 0cc1c718954715fb47c8323230997c84e56ece01..5a5e3c5ab835068b1ace3b4b75cb45b3874e65c2 100644 (file)
@@ -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: