changeset 27589:ecea41486e8a v8.2.4321

patch 8.2.4321: Vim9: crash when using a funcref to a closure Commit: https://github.com/vim/vim/commit/92368aad613bca700877ccb1725e1cb5a80dd34a Author: Bram Moolenaar <Bram@vim.org> Date: Mon Feb 7 17:50:39 2022 +0000 patch 8.2.4321: Vim9: crash when using a funcref to a closure Problem: Vim9: crash when using a funcref to a closure. Solution: Copy pt_outer to the new partial. (closes https://github.com/vim/vim/issues/9714)
author Bram Moolenaar <Bram@vim.org>
date Mon, 07 Feb 2022 19:00:03 +0100
parents 40bf8abda755
children cc44ec730954
files src/evalfunc.c src/testdir/test_vim9_func.vim src/version.c
diffstat 3 files changed, 27 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4454,6 +4454,9 @@ common_function(typval_T *argvars, typva
 		    pt->pt_name = name;
 		    func_ref(name);
 		}
+
+		if (arg_pt != NULL)
+		    pt->pt_outer = arg_pt->pt_outer;
 	    }
 	    rettv->v_type = VAR_PARTIAL;
 	    rettv->vval.v_partial = pt;
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -3455,6 +3455,28 @@ def Test_nested_lambda_in_closure()
   delete('XnestedDone')
 enddef
 
+def Test_nested_closure_funcref()
+  var lines =<< trim END
+      vim9script
+      def Func()
+          var n: number
+          def Nested()
+              ++n
+          enddef
+          Nested()
+          g:result_one = n
+          var Ref = function(Nested)
+          Ref()
+          g:result_two = n
+      enddef
+      Func()
+  END
+  v9.CheckScriptSuccess(lines)
+  assert_equal(1, g:result_one)
+  assert_equal(2, g:result_two)
+  unlet g:result_one g:result_two
+enddef
+
 def Test_check_func_arg_types()
   var lines =<< trim END
       vim9script
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4321,
+/**/
     4320,
 /**/
     4319,