summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-01 00:03:09 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-01 00:03:09 +0200
commitaf8edbb8dc551aaf2105a4d77b3d8495da239ef0 (patch)
treec968eb7edde8e1229516ad33f7f2b927b52d2314
parentce6583568ff5b3e0e6438b37ede2c80bedffba10 (diff)
patch 8.2.1333: Vim9: memory leak when using nested global functionv8.2.1333
Problem: Vim9: memory leak when using nested global function. Solution: Swap from and to when copying the lines.
-rw-r--r--src/testdir/test_vim9_func.vim31
-rw-r--r--src/userfunc.c6
-rw-r--r--src/version.c2
3 files changed, 21 insertions, 18 deletions
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 28937a1ddd..7298d9a734 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -133,6 +133,12 @@ def Test_nested_function()
CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
enddef
+func Test_call_default_args_from_func()
+ call assert_equal('string', MyDefaultArgs())
+ call assert_equal('one', MyDefaultArgs('one'))
+ call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
+endfunc
+
def Test_nested_global_function()
let lines =<< trim END
vim9script
@@ -141,25 +147,20 @@ def Test_nested_global_function()
return 'inner'
enddef
enddef
-# Outer()
-# assert_equal('inner', g:Inner())
-# delfunc g:Inner
-# Outer()
-# assert_equal('inner', g:Inner())
-# delfunc g:Inner
-# Outer()
-# assert_equal('inner', g:Inner())
-# delfunc g:Inner
+ defcompile
+ Outer()
+ assert_equal('inner', g:Inner())
+ delfunc g:Inner
+ Outer()
+ assert_equal('inner', g:Inner())
+ delfunc g:Inner
+ Outer()
+ assert_equal('inner', g:Inner())
+ delfunc g:Inner
END
CheckScriptSuccess(lines)
enddef
-func Test_call_default_args_from_func()
- call assert_equal('string', MyDefaultArgs())
- call assert_equal('one', MyDefaultArgs('one'))
- call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
-endfunc
-
func TakesOneArg(arg)
echo a:arg
endfunc
diff --git a/src/userfunc.c b/src/userfunc.c
index cdce005605..4c1e261952 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1188,10 +1188,10 @@ copy_func(char_u *lambda, char_u *global)
fp->uf_flags = (ufunc->uf_flags & ~FC_VIM9) | FC_COPY;
fp->uf_def_status = ufunc->uf_def_status;
fp->uf_dfunc_idx = ufunc->uf_dfunc_idx;
- if (ga_copy_strings(&fp->uf_args, &ufunc->uf_args) == FAIL
- || ga_copy_strings(&fp->uf_def_args, &ufunc->uf_def_args)
+ if (ga_copy_strings(&ufunc->uf_args, &fp->uf_args) == FAIL
+ || ga_copy_strings(&ufunc->uf_def_args, &fp->uf_def_args)
== FAIL
- || ga_copy_strings(&fp->uf_lines, &ufunc->uf_lines) == FAIL)
+ || ga_copy_strings(&ufunc->uf_lines, &fp->uf_lines) == FAIL)
goto failed;
fp->uf_name_exp = ufunc->uf_name_exp == NULL ? NULL
diff --git a/src/version.c b/src/version.c
index dd7539e44b..577a44bd67 100644
--- 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 */
/**/
+ 1333,
+/**/
1332,
/**/
1331,