patch 8.2.1819: Vim9: Memory leak when using a closure
Problem: Vim9: Memory leak when using a closure.
Solution: Compute the mininal refcount in the funcstack. Reenable disabled
tests.
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index f233f5b..53bc4ba 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -436,42 +436,42 @@
res)
enddef
-" TODO: fix memory leak and enable again
-"def s:CreateRefs()
-" var local = 'a'
-" def Append(arg: string)
-" local ..= arg
-" enddef
-" g:Append = Append
-" def Get(): string
-" return local
-" enddef
-" g:Get = Get
-"enddef
-"
-"def Test_disassemble_closure()
-" CreateRefs()
-" var res = execute('disass g:Append')
-" assert_match('<lambda>\d\_s*' ..
-" 'local ..= arg\_s*' ..
-" '\d LOADOUTER $0\_s*' ..
-" '\d LOAD arg\[-1\]\_s*' ..
-" '\d CONCAT\_s*' ..
-" '\d STOREOUTER $0\_s*' ..
-" '\d PUSHNR 0\_s*' ..
-" '\d RETURN',
-" res)
-"
-" res = execute('disass g:Get')
-" assert_match('<lambda>\d\_s*' ..
-" 'return local\_s*' ..
-" '\d LOADOUTER $0\_s*' ..
-" '\d RETURN',
-" res)
-"
-" unlet g:Append
-" unlet g:Get
-"enddef
+
+def s:CreateRefs()
+ var local = 'a'
+ def Append(arg: string)
+ local ..= arg
+ enddef
+ g:Append = Append
+ def Get(): string
+ return local
+ enddef
+ g:Get = Get
+enddef
+
+def Test_disassemble_closure()
+ CreateRefs()
+ var res = execute('disass g:Append')
+ assert_match('<lambda>\d\_s*' ..
+ 'local ..= arg\_s*' ..
+ '\d LOADOUTER $0\_s*' ..
+ '\d LOAD arg\[-1\]\_s*' ..
+ '\d CONCAT\_s*' ..
+ '\d STOREOUTER $0\_s*' ..
+ '\d PUSHNR 0\_s*' ..
+ '\d RETURN',
+ res)
+
+ res = execute('disass g:Get')
+ assert_match('<lambda>\d\_s*' ..
+ 'return local\_s*' ..
+ '\d LOADOUTER $0\_s*' ..
+ '\d RETURN',
+ res)
+
+ unlet g:Append
+ unlet g:Get
+enddef
def EchoArg(arg: string): string
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 6089402..371b9ef 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1330,32 +1330,31 @@
unlet g:UseVararg
enddef
-" TODO: reenable after fixing memory leak
-"def MakeGetAndAppendRefs()
-" var local = 'a'
-"
-" def Append(arg: string)
-" local ..= arg
-" enddef
-" g:Append = Append
-"
-" def Get(): string
-" return local
-" enddef
-" g:Get = Get
-"enddef
-"
-"def Test_closure_append_get()
-" MakeGetAndAppendRefs()
-" g:Get()->assert_equal('a')
-" g:Append('-b')
-" g:Get()->assert_equal('a-b')
-" g:Append('-c')
-" g:Get()->assert_equal('a-b-c')
-"
-" unlet g:Append
-" unlet g:Get
-"enddef
+def MakeGetAndAppendRefs()
+ var local = 'a'
+
+ def Append(arg: string)
+ local ..= arg
+ enddef
+ g:Append = Append
+
+ def Get(): string
+ return local
+ enddef
+ g:Get = Get
+enddef
+
+def Test_closure_append_get()
+ MakeGetAndAppendRefs()
+ g:Get()->assert_equal('a')
+ g:Append('-b')
+ g:Get()->assert_equal('a-b')
+ g:Append('-c')
+ g:Get()->assert_equal('a-b-c')
+
+ unlet g:Append
+ unlet g:Get
+enddef
def Test_nested_closure()
var local = 'text'
@@ -1389,20 +1388,19 @@
CheckScriptSuccess(lines)
enddef
-" TODO: reenable after fixing memory leak
-"def Test_nested_closure_used()
-" var lines =<< trim END
-" vim9script
-" def Func()
-" var x = 'hello'
-" var Closure = {-> x}
-" g:Myclosure = {-> Closure()}
-" enddef
-" Func()
-" assert_equal('hello', g:Myclosure())
-" END
-" CheckScriptSuccess(lines)
-"enddef
+def Test_nested_closure_used()
+ var lines =<< trim END
+ vim9script
+ def Func()
+ var x = 'hello'
+ var Closure = {-> x}
+ g:Myclosure = {-> Closure()}
+ enddef
+ Func()
+ assert_equal('hello', g:Myclosure())
+ END
+ CheckScriptSuccess(lines)
+enddef
def Test_nested_closure_fails()
var lines =<< trim END