From aeb2bdd0de5ce5b566509dda5ba9ad6f976063b3 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 18 Aug 2020 22:32:03 +0200 Subject: [PATCH] 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) --- src/eval.c | 7 +++++-- src/scriptfile.c | 3 ++- src/testdir/test_vim9_expr.vim | 9 +++++++++ src/version.c | 2 ++ 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 @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1482, /**/ 1481, /**/ -- 2.40.0