]> granicus.if.org Git - vim/commitdiff
patch 8.2.1333: Vim9: memory leak when using nested global function v8.2.1333
authorBram Moolenaar <Bram@vim.org>
Fri, 31 Jul 2020 22:03:09 +0000 (00:03 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 31 Jul 2020 22:03:09 +0000 (00:03 +0200)
Problem:    Vim9: memory leak when using nested global function.
Solution:   Swap from and to when copying the lines.

src/testdir/test_vim9_func.vim
src/userfunc.c
src/version.c

index 28937a1ddd8af92ad0bc9f7b2c2f3b368bd06fd8..7298d9a734916096edaab5de73c7e1e5bb9908e6 100644 (file)
@@ -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
index cdce0056058e2dafce0b4494f7f09455c04cba9b..4c1e2619522d0bb4aab29e279336bd859bd4ebb4 100644 (file)
@@ -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
index dd7539e44b12f841258c1f74035120c6bfc9989b..577a44bd6703fdffa14f277b1e3f213eb43fd702 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1333,
 /**/
     1332,
 /**/