changeset 21566:1e3e5058041c v8.2.1333

patch 8.2.1333: Vim9: memory leak when using nested global function Commit: https://github.com/vim/vim/commit/af8edbb8dc551aaf2105a4d77b3d8495da239ef0 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 1 00:03:09 2020 +0200 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.
author Bram Moolenaar <Bram@vim.org>
date Sat, 01 Aug 2020 00:15:04 +0200
parents a0fbaf68d30e
children 31ec74ed42f5
files src/testdir/test_vim9_func.vim src/userfunc.c src/version.c
diffstat 3 files changed, 21 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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,