To: vim_dev@googlegroups.com Subject: Patch 8.2.1333 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1333 Problem: Vim9: memory leak when using nested global function. Solution: Swap from and to when copying the lines. Files: src/userfunc.c, src/testdir/test_vim9_func.vim *** ../vim-8.2.1332/src/userfunc.c 2020-07-31 23:47:08.017231395 +0200 --- src/userfunc.c 2020-07-31 23:59:07.109960662 +0200 *************** *** 1188,1197 **** 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) == FAIL ! || ga_copy_strings(&fp->uf_lines, &ufunc->uf_lines) == FAIL) goto failed; fp->uf_name_exp = ufunc->uf_name_exp == NULL ? NULL --- 1188,1197 ---- 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(&ufunc->uf_args, &fp->uf_args) == FAIL ! || ga_copy_strings(&ufunc->uf_def_args, &fp->uf_def_args) == FAIL ! || ga_copy_strings(&ufunc->uf_lines, &fp->uf_lines) == FAIL) goto failed; fp->uf_name_exp = ufunc->uf_name_exp == NULL ? NULL *** ../vim-8.2.1332/src/testdir/test_vim9_func.vim 2020-07-31 23:47:08.017231395 +0200 --- src/testdir/test_vim9_func.vim 2020-08-01 00:00:29.789584609 +0200 *************** *** 133,138 **** --- 133,144 ---- 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,165 **** 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 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 --- 147,166 ---- return 'inner' enddef enddef ! 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 TakesOneArg(arg) echo a:arg endfunc *** ../vim-8.2.1332/src/version.c 2020-07-31 23:47:08.017231395 +0200 --- src/version.c 2020-08-01 00:02:05.353149942 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1333, /**/ -- From "know your smileys": :.-( Crying /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///