mirror of
https://github.com/vim/vim.git
synced 2025-08-22 19:27:53 -04:00
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.
This commit is contained in:
parent
ce6583568f
commit
af8edbb8dc
@ -133,6 +133,12 @@ def Test_nested_function()
|
|||||||
CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
|
CheckDefFailure(['func Nested()', 'endfunc'], 'E1086:')
|
||||||
enddef
|
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()
|
def Test_nested_global_function()
|
||||||
let lines =<< trim END
|
let lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
@ -141,25 +147,20 @@ def Test_nested_global_function()
|
|||||||
return 'inner'
|
return 'inner'
|
||||||
enddef
|
enddef
|
||||||
enddef
|
enddef
|
||||||
# Outer()
|
defcompile
|
||||||
# assert_equal('inner', g:Inner())
|
Outer()
|
||||||
# delfunc g:Inner
|
assert_equal('inner', g:Inner())
|
||||||
# Outer()
|
delfunc g:Inner
|
||||||
# assert_equal('inner', g:Inner())
|
Outer()
|
||||||
# delfunc g:Inner
|
assert_equal('inner', g:Inner())
|
||||||
# Outer()
|
delfunc g:Inner
|
||||||
# assert_equal('inner', g:Inner())
|
Outer()
|
||||||
# delfunc g:Inner
|
assert_equal('inner', g:Inner())
|
||||||
|
delfunc g:Inner
|
||||||
END
|
END
|
||||||
CheckScriptSuccess(lines)
|
CheckScriptSuccess(lines)
|
||||||
enddef
|
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)
|
func TakesOneArg(arg)
|
||||||
echo a:arg
|
echo a:arg
|
||||||
endfunc
|
endfunc
|
||||||
|
@ -1188,10 +1188,10 @@ copy_func(char_u *lambda, char_u *global)
|
|||||||
fp->uf_flags = (ufunc->uf_flags & ~FC_VIM9) | FC_COPY;
|
fp->uf_flags = (ufunc->uf_flags & ~FC_VIM9) | FC_COPY;
|
||||||
fp->uf_def_status = ufunc->uf_def_status;
|
fp->uf_def_status = ufunc->uf_def_status;
|
||||||
fp->uf_dfunc_idx = ufunc->uf_dfunc_idx;
|
fp->uf_dfunc_idx = ufunc->uf_dfunc_idx;
|
||||||
if (ga_copy_strings(&fp->uf_args, &ufunc->uf_args) == FAIL
|
if (ga_copy_strings(&ufunc->uf_args, &fp->uf_args) == FAIL
|
||||||
|| ga_copy_strings(&fp->uf_def_args, &ufunc->uf_def_args)
|
|| ga_copy_strings(&ufunc->uf_def_args, &fp->uf_def_args)
|
||||||
== FAIL
|
== FAIL
|
||||||
|| ga_copy_strings(&fp->uf_lines, &ufunc->uf_lines) == FAIL)
|
|| ga_copy_strings(&ufunc->uf_lines, &fp->uf_lines) == FAIL)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
fp->uf_name_exp = ufunc->uf_name_exp == NULL ? NULL
|
fp->uf_name_exp = ufunc->uf_name_exp == NULL ? NULL
|
||||||
|
@ -754,6 +754,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1333,
|
||||||
/**/
|
/**/
|
||||||
1332,
|
1332,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user