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 #9714)
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 3cc95c9..eb12e75 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -4454,6 +4454,9 @@
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;
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index e781a21..7ab15f7 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -3455,6 +3455,28 @@
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
diff --git a/src/version.c b/src/version.c
index 4fdeb2f..97bcfde 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4321,
+/**/
4320,
/**/
4319,