patch 8.2.3266: Vim9: assignment with two indexes may check next line
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)
This commit is contained in:
@ -466,6 +466,12 @@ def Test_assign_index()
|
|||||||
d3.one.two.three = 123
|
d3.one.two.three = 123
|
||||||
assert_equal({one: {two: {three: 123}}}, d3)
|
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
|
lines =<< trim END
|
||||||
var d3: dict<dict<number>>
|
var d3: dict<dict<number>>
|
||||||
d3.one = {}
|
d3.one = {}
|
||||||
|
|||||||
@ -755,6 +755,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
3266,
|
||||||
/**/
|
/**/
|
||||||
3265,
|
3265,
|
||||||
/**/
|
/**/
|
||||||
|
|||||||
@ -6536,19 +6536,25 @@ compile_load_lhs(
|
|||||||
{
|
{
|
||||||
size_t varlen = lhs->lhs_varlen;
|
size_t varlen = lhs->lhs_varlen;
|
||||||
int c = var_start[varlen];
|
int c = var_start[varlen];
|
||||||
|
int lines_len = cctx->ctx_ufunc->uf_lines.ga_len;
|
||||||
char_u *p = var_start;
|
char_u *p = var_start;
|
||||||
garray_T *stack = &cctx->ctx_type_stack;
|
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;
|
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
|
// this should not happen
|
||||||
|
if (res != FAIL)
|
||||||
emsg(_(e_missbrac));
|
emsg(_(e_missbrac));
|
||||||
var_start[varlen] = c;
|
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
var_start[varlen] = c;
|
|
||||||
|
|
||||||
lhs->lhs_type = stack->ga_len == 0 ? &t_void
|
lhs->lhs_type = stack->ga_len == 0 ? &t_void
|
||||||
: ((type_T **)stack->ga_data)[stack->ga_len - 1];
|
: ((type_T **)stack->ga_data)[stack->ga_len - 1];
|
||||||
|
|||||||
Reference in New Issue
Block a user