summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-18 22:32:03 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-18 22:32:03 +0200
commitaeb2bdd0de5ce5b566509dda5ba9ad6f976063b3 (patch)
tree0f1b73d630fff86f5c939ec79498d83f46960e56
parent3affe7a6c6fc813f5d29857933ee6aca0b9c7bd6 (diff)
downloadvim-git-aeb2bdd0de5ce5b566509dda5ba9ad6f976063b3.tar.gz
patch 8.2.1482: Vim9: crash when using a nested lambdav8.2.1482
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)
-rw-r--r--src/eval.c7
-rw-r--r--src/scriptfile.c3
-rw-r--r--src/testdir/test_vim9_expr.vim9
-rw-r--r--src/version.c2
4 files changed, 18 insertions, 3 deletions
diff --git a/src/eval.c b/src/eval.c
index 585975a80..69f9f21e8 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -397,8 +397,10 @@ skip_expr_concatenate(
int vim9script = in_vim9script();
garray_T *gap = &evalarg->eval_ga;
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))
{
ga_init2(gap, sizeof(char_u *), 10);
@@ -417,7 +419,7 @@ skip_expr_concatenate(
if (evalarg != NULL)
evalarg->eval_flags = save_flags;
- if (vim9script
+ if (vim9script && evaluate
&& (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL))
{
if (evalarg->eval_ga.ga_len == 1)
@@ -5425,6 +5427,7 @@ handle_subscript(
&& (p[2] == '{' || ASCII_ISALPHA(p[2])))))
{
*arg = eval_next_line(evalarg);
+ p = *arg;
check_white = FALSE;
}
diff --git a/src/scriptfile.c b/src/scriptfile.c
index fee29712c..4df2c31fe 100644
--- a/src/scriptfile.c
+++ b/src/scriptfile.c
@@ -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 *
source_nextline(void *cookie)
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index db899ee4d..2c88efbac 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1624,6 +1624,15 @@ def Test_expr7_lambda_vim9script()
assert_equal(12, v)
END
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
def Test_expr7_dict()
diff --git a/src/version.c b/src/version.c
index 130d4bc6f..a7fe8d46a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1482,
+/**/
1481,
/**/
1480,