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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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()
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user