From: Bram Moolenaar Date: Fri, 31 Jul 2020 22:03:09 +0000 (+0200) Subject: patch 8.2.1333: Vim9: memory leak when using nested global function X-Git-Tag: v8.2.1333 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=af8edbb8dc551aaf2105a4d77b3d8495da239ef0;p=vim patch 8.2.1333: Vim9: memory leak when using nested global function Problem: Vim9: memory leak when using nested global function. Solution: Swap from and to when copying the lines. --- diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim index 28937a1dd..7298d9a73 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 cdce00560..4c1e26195 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 dd7539e44..577a44bd6 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1333, /**/ 1332, /**/