summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-12-30 17:09:05 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-30 17:09:05 +0000
commitd293981d2b76b40013143fe2302b910585e50808 (patch)
tree87e99a889ddfb0344376b4553a14963de88a25cb
parent94f3192b03ed27474db80b4d3a409e107140738b (diff)
patch 8.2.3951: Vim9: memory leak when text after a nested functionv8.2.3951
Problem: Vim9: memory leak when text after a nested function. Solution: Free the function if text is found after "enddef".
-rw-r--r--src/testdir/test_vim9_func.vim17
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c1
3 files changed, 17 insertions, 3 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 7a5f0f1a40..7b2f5016c3 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1493,9 +1493,20 @@ def Test_call_varargs_only()
enddef
def Test_using_var_as_arg()
- writefile(['def Func(x: number)', 'var x = 234', 'enddef', 'defcompile'], 'Xdef')
- assert_fails('so Xdef', 'E1006:', '', 1, 'Func')
- delete('Xdef')
+ var lines =<< trim END
+ def Func(x: number)
+ var x = 234
+ enddef
+ END
+ CheckDefFailure(lines, 'E1006:')
+
+ lines =<< trim END
+ def Func(Ref: number)
+ def Ref()
+ enddef
+ enddef
+ END
+ CheckDefFailure(lines, 'E1073:')
enddef
def DictArg(arg: dict<string>)
diff --git a/src/version.c b/src/version.c
index 56d900dc2c..649d2fc601 100644
--- a/src/version.c
+++ b/src/version.c
@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3951,
+/**/
3950,
/**/
3949,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 8882bfe107..272368e765 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -889,6 +889,7 @@ compile_nested_function(exarg_T *eap, cctx_T *cctx, char_u **line_to_free)
semsg(_(e_text_found_after_str_str),
eap->cmdidx == CMD_def ? "enddef" : "endfunction", eap->nextcmd);
r = FAIL;
+ func_ptr_unref(ufunc);
goto theend;
}