]> granicus.if.org Git - vim/commitdiff
patch 8.2.3266: Vim9: assignment with two indexes may check next line v8.2.3266
authorBram Moolenaar <Bram@vim.org>
Sun, 1 Aug 2021 11:17:17 +0000 (13:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 1 Aug 2021 11:17:17 +0000 (13:17 +0200)
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)

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

index 97983ef3c31eefe67695e958f4c69ec8b17a7d35..c104059edac521fe7a648b2558ee82c51248b36c 100644 (file)
@@ -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 = {}
index 70959825095ce657c78c14f3fdd400075d682b67..45cb4b60f8f02b0f7bc1d717637c0349aece671f 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3266,
 /**/
     3265,
 /**/
index cafbd6b2fc1fdc9b920635cf5f4df0184a6702a5..9a534f46c261cdbb8ac8ac8eb025e7b35b6e93b5 100644 (file)
@@ -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];