changeset 28131:d8bf200cd761 v8.2.4590

patch 8.2.4590: Vim9: range type check has wrong offset Commit: https://github.com/vim/vim/commit/2995e5cf4eb9651827788e14f9f42ab34ce4c7e1 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Mar 18 21:41:47 2022 +0000 patch 8.2.4590: Vim9: range type check has wrong offset Problem: Vim9: range type check has wrong offset. Solution: Adjust offset for CHECKTYPE. Remove other type check.
author Bram Moolenaar <Bram@vim.org>
date Fri, 18 Mar 2022 22:45:02 +0100
parents f7483c7afd6c
children a4c48c2beb9f
files src/testdir/test_vim9_assign.vim src/version.c src/vim9compile.c src/vim9execute.c
diffstat 4 files changed, 41 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -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]
--- 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 */
 /**/
+    4590,
+/**/
     4589,
 /**/
     4588,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -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);
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1896,79 +1896,54 @@ execute_storerange(isn_T *iptr, ectx_T *
     SOURCING_LNUM = iptr->isn_lnum;
     if (tv_dest->v_type == VAR_LIST)
     {
-	long	n1;
-	long	n2;
-	int	error = FALSE;
-
-	n1 = (long)tv_get_number_chk(tv_idx1, &error);
-	if (error)
+	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);
+
+	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;
-
-	n1 = tv_get_number_chk(tv_idx1, &error);
-	if (error)
+	long	    bloblen;
+
+	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
+	    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
-	{
-	    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);
-
-		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);
-	    }
-	}
+	    status = blob_set_range(tv_dest->vval.v_blob, n1, n2, tv);
     }
     else
     {