]> granicus.if.org Git - vim/commitdiff
patch 8.2.4590: Vim9: range type check has wrong offset v8.2.4590
authorBram Moolenaar <Bram@vim.org>
Fri, 18 Mar 2022 21:41:47 +0000 (21:41 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 18 Mar 2022 21:41:47 +0000 (21:41 +0000)
Problem:    Vim9: range type check has wrong offset.
Solution:   Adjust offset for CHECKTYPE.  Remove other type check.

src/testdir/test_vim9_assign.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index d2d7217b537bec5eadf5acf62e302021ac9fea8d..44a8fcbefba66dd627b2741c4dcc3c6c37a7cbe2 100644 (file)
@@ -1602,7 +1602,7 @@ def Test_assign_list()
       l[g:idx : 1] = [0]
       echo l
   END
-  v9.CheckDefExecAndScriptFailure(lines, 'E1030: Using a String as a Number: "x"')
+  v9.CheckDefExecAndScriptFailure(lines, ['E1012: Type mismatch; expected number but got string', 'E1030: Using a String as a Number: "x"'])
 
   lines =<< trim END
       var l = [1, 2]
index 6f86d2bb9ddcebb9dc37998522db9d42381e55b4..682fdc60518284912ee5d7327064581de10d924c 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4590,
 /**/
     4589,
 /**/
index e6c2233a75f4d7746713479af27b38debce157ec..06b6c79b9a8ebf54835df1f011b1de69235f7d64 100644 (file)
@@ -1802,7 +1802,7 @@ compile_assign_unlet(
            {
                type = get_type_on_stack(cctx, 1);
                if (need_type(type, &t_number,
-                                           -1, 0, cctx, FALSE, FALSE) == FAIL)
+                                           -2, 0, cctx, FALSE, FALSE) == FAIL)
                return FAIL;
            }
            type = get_type_on_stack(cctx, 0);
index 3136dced79e0bb26ebcb0e6d3fc208974fca6aad..5bc7708b6c2bf01ef98b1ab898bf48b8487602ee 100644 (file)
@@ -1896,79 +1896,54 @@ execute_storerange(isn_T *iptr, ectx_T *ectx)
     SOURCING_LNUM = iptr->isn_lnum;
     if (tv_dest->v_type == VAR_LIST)
     {
-       long    n1;
-       long    n2;
-       int     error = FALSE;
+       long        n1;
+       long        n2;
+       listitem_T  *li1;
+
+       n1 = (long)tv_get_number_chk(tv_idx1, NULL);
+       if (tv_idx2->v_type == VAR_SPECIAL
+                   && tv_idx2->vval.v_number == VVAL_NONE)
+           n2 = list_len(tv_dest->vval.v_list) - 1;
+       else
+           n2 = (long)tv_get_number_chk(tv_idx2, NULL);
 
-       n1 = (long)tv_get_number_chk(tv_idx1, &error);
-       if (error)
+       li1 = check_range_index_one(tv_dest->vval.v_list, &n1, FALSE);
+       if (li1 == NULL)
            status = FAIL;
        else
        {
-           if (tv_idx2->v_type == VAR_SPECIAL
-                       && tv_idx2->vval.v_number == VVAL_NONE)
-               n2 = list_len(tv_dest->vval.v_list) - 1;
-           else
-               n2 = (long)tv_get_number_chk(tv_idx2, &error);
-           if (error)
-               status = FAIL; // cannot happen?
-           else
-           {
-               listitem_T *li1 = check_range_index_one(
-                                            tv_dest->vval.v_list, &n1, FALSE);
-
-               if (li1 == NULL)
-                   status = FAIL;
-               else
-               {
-                   status = check_range_index_two(
-                           tv_dest->vval.v_list,
-                           &n1, li1, &n2, FALSE);
-                   if (status != FAIL)
-                       status = list_assign_range(
-                               tv_dest->vval.v_list,
-                               tv->vval.v_list,
-                               n1,
-                               n2,
-                               tv_idx2->v_type == VAR_SPECIAL,
-                               (char_u *)"=",
-                               (char_u *)"[unknown]");
-               }
-           }
+           status = check_range_index_two(tv_dest->vval.v_list,
+                                                        &n1, li1, &n2, FALSE);
+           if (status != FAIL)
+               status = list_assign_range(
+                       tv_dest->vval.v_list,
+                       tv->vval.v_list,
+                       n1,
+                       n2,
+                       tv_idx2->v_type == VAR_SPECIAL,
+                       (char_u *)"=",
+                       (char_u *)"[unknown]");
        }
     }
     else if (tv_dest->v_type == VAR_BLOB)
     {
        varnumber_T n1;
        varnumber_T n2;
-       int         error = FALSE;
+       long        bloblen;
 
-       n1 = tv_get_number_chk(tv_idx1, &error);
-       if (error)
-           status = FAIL;
+       n1 = tv_get_number_chk(tv_idx1, NULL);
+       if (tv_idx2->v_type == VAR_SPECIAL
+                                       && tv_idx2->vval.v_number == VVAL_NONE)
+           n2 = blob_len(tv_dest->vval.v_blob) - 1;
        else
-       {
-           if (tv_idx2->v_type == VAR_SPECIAL
-                       && tv_idx2->vval.v_number == VVAL_NONE)
-               n2 = blob_len(tv_dest->vval.v_blob) - 1;
-           else
-               n2 = tv_get_number_chk(tv_idx2, &error);
-           if (error)
-               status = FAIL;
-           else
-           {
-               long  bloblen = blob_len(tv_dest->vval.v_blob);
+           n2 = tv_get_number_chk(tv_idx2, NULL);
+       bloblen = blob_len(tv_dest->vval.v_blob);
 
-               if (check_blob_index(bloblen,
-                                            n1, FALSE) == FAIL
-                       || check_blob_range(bloblen,
-                                       n1, n2, FALSE) == FAIL)
-                   status = FAIL;
-               else
-                   status = blob_set_range(
-                            tv_dest->vval.v_blob, n1, n2, tv);
-           }
-       }
+       if (check_blob_index(bloblen, n1, FALSE) == FAIL
+               || check_blob_range(bloblen, n1, n2, FALSE) == FAIL)
+           status = FAIL;
+       else
+           status = blob_set_range(tv_dest->vval.v_blob, n1, n2, tv);
     }
     else
     {