changeset 21769:f37c1330b15c v8.2.1434

patch 8.2.1434: Vim9: crash when lambda uses outer function argument Commit: https://github.com/vim/vim/commit/fd77748df2ba7d5f38aab649cb630374620462d7 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Aug 12 19:42:01 2020 +0200 patch 8.2.1434: Vim9: crash when lambda uses outer function argument Problem: Vim9: crash when lambda uses outer function argument. Solution: Set the flag that the outer context is used.
author Bram Moolenaar <Bram@vim.org>
date Wed, 12 Aug 2020 19:45:04 +0200
parents c680589182eb
children 48e91c319616
files src/testdir/test_vim9_expr.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 18 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -1443,6 +1443,16 @@ def LambdaWithComments(): func
         }
 enddef
 
+def LambdaUsingArg(x: number): func
+  return {->
+            # some comment
+            x == 1
+            # some comment
+            ||
+            x == 2
+        }
+enddef
+
 def Test_expr7_lambda()
   let La = { -> 'result'}
   assert_equal('result', La())
@@ -1481,6 +1491,9 @@ def Test_expr7_lambda()
   assert_equal(true, LambdaWithComments()(2))
   assert_equal(false, LambdaWithComments()(3))
 
+  assert_equal(false, LambdaUsingArg(0)())
+  assert_equal(true, LambdaUsingArg(1)())
+
   call CheckDefFailure(["filter([1, 2], {k,v -> 1})"], 'E1069:')
 enddef
 
--- 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 */
 /**/
+    1434,
+/**/
     1433,
 /**/
     1432,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -2135,7 +2135,10 @@ compile_load(char_u **arg, char_u *end_a
 	if (gen_load)
 	    res = generate_LOAD(cctx, ISN_LOAD, idx, NULL, type);
 	if (gen_load_outer)
+	{
 	    res = generate_LOAD(cctx, ISN_LOADOUTER, idx, NULL, type);
+	    cctx->ctx_outer_used = TRUE;
+	}
     }
 
     *arg = end;