To: vim_dev@googlegroups.com Subject: Patch 8.2.3266 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.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) Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim *** ../vim-8.2.3265/src/vim9compile.c 2021-07-31 22:51:06.930754925 +0200 --- src/vim9compile.c 2021-08-01 13:15:18.546323206 +0200 *************** *** 6536,6554 **** { size_t varlen = lhs->lhs_varlen; int c = var_start[varlen]; char_u *p = var_start; garray_T *stack = &cctx->ctx_type_stack; ! // Evaluate "ll[expr]" of "ll[expr][idx]" var_start[varlen] = NUL; ! if (compile_expr0(&p, cctx) == OK && p != var_start + varlen) { // this should not happen ! emsg(_(e_missbrac)); ! var_start[varlen] = c; return FAIL; } - var_start[varlen] = c; lhs->lhs_type = stack->ga_len == 0 ? &t_void : ((type_T **)stack->ga_data)[stack->ga_len - 1]; --- 6536,6560 ---- { 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]". End the line with a NUL and ! // limit the lines array length to avoid skipping to a following line. var_start[varlen] = NUL; ! 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 ! if (res != FAIL) ! emsg(_(e_missbrac)); return FAIL; } lhs->lhs_type = stack->ga_len == 0 ? &t_void : ((type_T **)stack->ga_data)[stack->ga_len - 1]; *** ../vim-8.2.3265/src/testdir/test_vim9_assign.vim 2021-07-31 22:51:06.930754925 +0200 --- src/testdir/test_vim9_assign.vim 2021-08-01 13:14:37.674270249 +0200 *************** *** 466,471 **** --- 466,477 ---- 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> d3.one = {} *** ../vim-8.2.3265/src/version.c 2021-08-01 12:44:31.856542627 +0200 --- src/version.c 2021-08-01 13:10:22.061666933 +0200 *************** *** 757,758 **** --- 757,760 ---- { /* Add new patch number below this line */ + /**/ + 3266, /**/ -- Eight Megabytes And Continually Swapping. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///