patch 8.2.0703: Vim9: closure cannot store value in outer context
Problem: Vim9: closure cannot store value in outer context.
Solution: Make storing value in outer context work. Make :disassemble
accept a function reference.
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 4e2caf0..1170341 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -291,6 +291,42 @@
res)
enddef
+def s:CreateRefs()
+ let 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()
+ let res = execute('disass g:Append')
+ assert_match('<lambda>\d.*' ..
+ 'local ..= arg.*' ..
+ '\d LOADOUTER $0.*' ..
+ '\d LOAD arg\[-1\].*' ..
+ '\d CONCAT.*' ..
+ '\d STOREOUTER $0.*' ..
+ '\d PUSHNR 0.*' ..
+ '\d RETURN.*',
+ res)
+
+ res = execute('disass g:Get')
+ assert_match('<lambda>\d.*' ..
+ 'return local.*' ..
+ '\d LOADOUTER $0.*' ..
+ '\d RETURN.*',
+ res)
+
+ unlet g:Append
+ unlet g:Get
+enddef
+
def EchoArg(arg: string): string
return arg
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 49dc2f2..83cef67 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -738,6 +738,32 @@
unlet g:UseVararg
enddef
+def MakeGetAndAppendRefs()
+ let 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()
+ assert_equal('a', g:Get())
+ g:Append('-b')
+ assert_equal('a-b', g:Get())
+ g:Append('-c')
+ assert_equal('a-b-c', g:Get())
+
+ unlet g:Append
+ unlet g:Get
+enddef
+
def Test_nested_closure()
let local = 'text'
def Closure(arg: string): string