changeset 21865:c16af87df654 v8.2.1482

patch 8.2.1482: Vim9: crash when using a nested lambda Commit: https://github.com/vim/vim/commit/aeb2bdd0de5ce5b566509dda5ba9ad6f976063b3 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Aug 18 22:32:03 2020 +0200 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 18 Aug 2020 22:45:03 +0200
parents 6c27a522a0cb
children 349859948450
files src/eval.c src/scriptfile.c src/testdir/test_vim9_expr.vim src/version.c
diffstat 4 files changed, 19 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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;
-
-    if (vim9script
+    int		evaluate = evalarg == NULL
+			       ? FALSE : (evalarg->eval_flags & EVAL_EVALUATE);
+
+    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;
 	}
 
--- 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)
--- 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()
--- 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,