0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.1482: Vim9: crash when using a nested lambda

Problem:    Vim9: crash when using a nested lambda.
Solution:   Do not clear the growarray when not evaluating.  Correct pointer
when getting the next line. (closes #6731)
This commit is contained in:
Bram Moolenaar
2020-08-18 22:32:03 +02:00
parent 3affe7a6c6
commit aeb2bdd0de
4 changed files with 18 additions and 3 deletions

View File

@@ -397,8 +397,10 @@ skip_expr_concatenate(
int vim9script = in_vim9script(); int vim9script = in_vim9script();
garray_T *gap = &evalarg->eval_ga; garray_T *gap = &evalarg->eval_ga;
int save_flags = evalarg == NULL ? 0 : evalarg->eval_flags; int save_flags = evalarg == NULL ? 0 : evalarg->eval_flags;
int evaluate = evalarg == NULL
? FALSE : (evalarg->eval_flags & EVAL_EVALUATE);
if (vim9script if (vim9script && evaluate
&& (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL)) && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL))
{ {
ga_init2(gap, sizeof(char_u *), 10); ga_init2(gap, sizeof(char_u *), 10);
@@ -417,7 +419,7 @@ skip_expr_concatenate(
if (evalarg != NULL) if (evalarg != NULL)
evalarg->eval_flags = save_flags; evalarg->eval_flags = save_flags;
if (vim9script if (vim9script && evaluate
&& (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL)) && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL))
{ {
if (evalarg->eval_ga.ga_len == 1) if (evalarg->eval_ga.ga_len == 1)
@@ -5425,6 +5427,7 @@ handle_subscript(
&& (p[2] == '{' || ASCII_ISALPHA(p[2]))))) && (p[2] == '{' || ASCII_ISALPHA(p[2])))))
{ {
*arg = eval_next_line(evalarg); *arg = eval_next_line(evalarg);
p = *arg;
check_white = FALSE; check_white = FALSE;
} }

View File

@@ -1065,7 +1065,8 @@ source_level(void *cookie)
} }
/* /*
* Return the readahead line. * Return the readahead line. Note that the pointer may become invalid when
* getting the next line, if it's concatenated with the next one.
*/ */
char_u * char_u *
source_nextline(void *cookie) source_nextline(void *cookie)

View File

@@ -1624,6 +1624,15 @@ def Test_expr7_lambda_vim9script()
assert_equal(12, v) assert_equal(12, v)
END END
CheckScriptSuccess(lines) CheckScriptSuccess(lines)
# nested lambda with line breaks
lines =<< trim END
vim9script
search('"', 'cW', 0, 0, {->
synstack('.', col('.'))
->map({_, v -> synIDattr(v, 'name')})->len()})
END
CheckScriptSuccess(lines)
enddef enddef
def Test_expr7_dict() def Test_expr7_dict()

View File

@@ -754,6 +754,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 */
/**/
1482,
/**/ /**/
1481, 1481,
/**/ /**/