patch 8.2.3435: Vim9: dict is not passed to dict function
Problem: Vim9: dict is not passed to dict function.
Solution: Keep the dict used until a function call.
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index e7c5746..8400174 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -412,7 +412,8 @@
'\d PUSHNR 0\_s*' ..
'\d LOAD $0\_s*' ..
'\d MEMBER dd\_s*' ..
- '\d STOREINDEX any\_s*' ..
+ '\d\+ USEDICT\_s*' ..
+ '\d\+ STOREINDEX any\_s*' ..
'\d\+ RETURN void',
res)
enddef
@@ -1625,11 +1626,13 @@
'var res = d.item\_s*' ..
'\d\+ LOAD $0\_s*' ..
'\d\+ MEMBER item\_s*' ..
+ '\d\+ USEDICT\_s*' ..
'\d\+ STORE $1\_s*' ..
'res = d\["item"\]\_s*' ..
'\d\+ LOAD $0\_s*' ..
'\d\+ PUSHS "item"\_s*' ..
'\d\+ MEMBER\_s*' ..
+ '\d\+ USEDICT\_s*' ..
'\d\+ STORE $1\_s*',
instr)
assert_equal(1, DictMember())
@@ -2302,6 +2305,35 @@
res)
enddef
+func Legacy() dict
+ echo 'legacy'
+endfunc
+
+def s:UseMember()
+ var d = {func: Legacy}
+ var v = d.func()
+enddef
+
+def Test_disassemble_dict_stack()
+ var res = execute('disass s:UseMember')
+ assert_match('<SNR>\d*_UseMember\_s*' ..
+ 'var d = {func: Legacy}\_s*' ..
+ '\d PUSHS "func"\_s*' ..
+ '\d PUSHFUNC "Legacy"\_s*' ..
+ '\d NEWDICT size 1\_s*' ..
+ '\d STORE $0\_s*' ..
+
+ 'var v = d.func()\_s*' ..
+ '\d LOAD $0\_s*' ..
+ '\d MEMBER func\_s*' ..
+ '\d PCALL top (argc 0)\_s*' ..
+ '\d PCALL end\_s*' ..
+ '\d CLEARDICT\_s*' ..
+ '\d\+ STORE $1\_s*' ..
+ '\d\+ RETURN void*',
+ res)
+enddef
+
def s:EchoMessages()
echohl ErrorMsg | echom v:exception | echohl NONE
enddef
@@ -2363,4 +2395,5 @@
enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim
index 4e2f70e..dda812d 100644
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -2557,6 +2557,37 @@
endfor
enddef
+def Test_call_legacy_with_dict()
+ var lines =<< trim END
+ vim9script
+ func Legacy() dict
+ let g:result = self.value
+ endfunc
+ def TestDirect()
+ var d = {value: 'yes', func: Legacy}
+ d.func()
+ enddef
+ TestDirect()
+ assert_equal('yes', g:result)
+ unlet g:result
+
+ def TestIndirect()
+ var d = {value: 'foo', func: Legacy}
+ var Fi = d.func
+ Fi()
+ enddef
+ TestIndirect()
+ assert_equal('foo', g:result)
+ unlet g:result
+
+ var d = {value: 'bar', func: Legacy}
+ d.func()
+ assert_equal('bar', g:result)
+ unlet g:result
+ END
+ CheckScriptSuccess(lines)
+enddef
+
def DoFilterThis(a: string): list<string>
# closure nested inside another closure using argument
var Filter = (l) => filter(l, (_, v) => stridx(v, a) == 0)