summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-03-18 21:41:47 +0000
committerBram Moolenaar <Bram@vim.org>2022-03-18 21:41:47 +0000
commit2995e5cf4eb9651827788e14f9f42ab34ce4c7e1 (patch)
tree38e73fc832ca1ea6a5df97a3a53f66add12223cd
parent2e17fef225a58f478dc24ab1aaa20390c9abce57 (diff)
patch 8.2.4590: Vim9: range type check has wrong offsetv8.2.4590
Problem: Vim9: range type check has wrong offset. Solution: Adjust offset for CHECKTYPE. Remove other type check.
-rw-r--r--src/testdir/test_vim9_assign.vim2
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c2
-rw-r--r--src/vim9execute.c95
4 files changed, 39 insertions, 62 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index d2d7217b53..44a8fcbefb 100644
--- 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]
diff --git a/src/version.c b/src/version.c
index 6f86d2bb9d..682fdc6051 100644
--- 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,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index e6c2233a75..06b6c79b9a 100644
--- 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);
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 3136dced79..5bc7708b6c 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -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
{