summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-08-01 13:17:17 +0200
committerBram Moolenaar <Bram@vim.org>2021-08-01 13:17:17 +0200
commite97976baa7a74fbbe0cfecd1943fe1c5f9dfba4f (patch)
treeab5dd99bb09aa67e9dc559d201c114e5059bdbab
parent78ba933d18439ff1a02f6be4c571e73ddceb3cd4 (diff)
patch 8.2.3266: Vim9: assignment with two indexes may check next linev8.2.3266
Problem: Vim9: assignment with two indexes may check next line. Solution: Limit the number of lines to avoid checking the next line when assiging to a LHS subscript. (closes #8660)
-rw-r--r--src/testdir/test_vim9_assign.vim6
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c16
3 files changed, 19 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 97983ef3c3..c104059eda 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -466,6 +466,12 @@ def Test_assign_index()
d3.one.two.three = 123
assert_equal({one: {two: {three: 123}}}, d3)
+ # should not read the next line when generating "a.b"
+ var a = {}
+ a.b = {}
+ a.b.c = {}
+ ->copy()
+
lines =<< trim END
var d3: dict<dict<number>>
d3.one = {}
diff --git a/src/version.c b/src/version.c
index 7095982509..45cb4b60f8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3266,
+/**/
3265,
/**/
3264,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index cafbd6b2fc..9a534f46c2 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -6536,19 +6536,25 @@ compile_load_lhs(
{
size_t varlen = lhs->lhs_varlen;
int c = var_start[varlen];
+ int lines_len = cctx->ctx_ufunc->uf_lines.ga_len;
char_u *p = var_start;
garray_T *stack = &cctx->ctx_type_stack;
+ int res;
- // Evaluate "ll[expr]" of "ll[expr][idx]"
+ // Evaluate "ll[expr]" of "ll[expr][idx]". End the line with a NUL and
+ // limit the lines array length to avoid skipping to a following line.
var_start[varlen] = NUL;
- if (compile_expr0(&p, cctx) == OK && p != var_start + varlen)
+ cctx->ctx_ufunc->uf_lines.ga_len = cctx->ctx_lnum + 1;
+ res = compile_expr0(&p, cctx);
+ var_start[varlen] = c;
+ cctx->ctx_ufunc->uf_lines.ga_len = lines_len;
+ if (res == FAIL || p != var_start + varlen)
{
// this should not happen
- emsg(_(e_missbrac));
- var_start[varlen] = c;
+ if (res != FAIL)
+ emsg(_(e_missbrac));
return FAIL;
}
- var_start[varlen] = c;
lhs->lhs_type = stack->ga_len == 0 ? &t_void
: ((type_T **)stack->ga_data)[stack->ga_len - 1];