15cab73f8SBram Moolenaar" Test the :disassemble command, and compilation as a side effect 25cab73f8SBram Moolenaar 3f51cb4e0SBram Moolenaarsource check.vim 4f51cb4e0SBram Moolenaar 55cab73f8SBram Moolenaarfunc NotCompiled() 65cab73f8SBram Moolenaar echo "not" 75cab73f8SBram Moolenaarendfunc 85cab73f8SBram Moolenaar 95cab73f8SBram Moolenaarlet s:scriptvar = 4 105cab73f8SBram Moolenaarlet g:globalvar = 'g' 11d3aac291SBram Moolenaarlet b:buffervar = 'b' 12d3aac291SBram Moolenaarlet w:windowvar = 'w' 13d3aac291SBram Moolenaarlet t:tabpagevar = 't' 145cab73f8SBram Moolenaar 155cab73f8SBram Moolenaardef s:ScriptFuncLoad(arg: string) 16ac564082SBram Moolenaar var local = 1 175cab73f8SBram Moolenaar buffers 18e4984290SBram Moolenaar echo 195cab73f8SBram Moolenaar echo arg 205cab73f8SBram Moolenaar echo local 218a1c1013SBram Moolenaar echo &lines 225cab73f8SBram Moolenaar echo v:version 235cab73f8SBram Moolenaar echo s:scriptvar 245cab73f8SBram Moolenaar echo g:globalvar 252f8ce0aeSBram Moolenaar echo get(g:, "global") 2603290b84SBram Moolenaar echo g:auto#var 27d3aac291SBram Moolenaar echo b:buffervar 282f8ce0aeSBram Moolenaar echo get(b:, "buffer") 29d3aac291SBram Moolenaar echo w:windowvar 302f8ce0aeSBram Moolenaar echo get(w:, "window") 31d3aac291SBram Moolenaar echo t:tabpagevar 322f8ce0aeSBram Moolenaar echo get(t:, "tab") 335cab73f8SBram Moolenaar echo &tabstop 345cab73f8SBram Moolenaar echo $ENVVAR 355cab73f8SBram Moolenaar echo @z 365cab73f8SBram Moolenaarenddef 375cab73f8SBram Moolenaar 38f2460a3aSBram Moolenaardef Test_disassemble_load() 395cab73f8SBram Moolenaar assert_fails('disass NoFunc', 'E1061:') 40451c2e35SBram Moolenaar assert_fails('disass NotCompiled', 'E1091:') 4121456cdcSBram Moolenaar assert_fails('disass', 'E471:') 4221456cdcSBram Moolenaar assert_fails('disass [', 'E475:') 439b7bf9e9SBram Moolenaar assert_fails('disass 234', 'E129:') 449b7bf9e9SBram Moolenaar assert_fails('disass <XX>foo', 'E129:') 455cab73f8SBram Moolenaar 46ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncLoad') 47675f716eSBram Moolenaar assert_match('<SNR>\d*_ScriptFuncLoad.*' .. 48e4984290SBram Moolenaar 'buffers\_s*' .. 49e4984290SBram Moolenaar '\d\+ EXEC \+buffers\_s*' .. 50e4984290SBram Moolenaar 'echo\_s*' .. 51e4984290SBram Moolenaar 'echo arg\_s*' .. 52e4984290SBram Moolenaar '\d\+ LOAD arg\[-1\]\_s*' .. 53e4984290SBram Moolenaar '\d\+ ECHO 1\_s*' .. 54e4984290SBram Moolenaar 'echo local\_s*' .. 55e4984290SBram Moolenaar '\d\+ LOAD $0\_s*' .. 56e4984290SBram Moolenaar '\d\+ ECHO 1\_s*' .. 57e4984290SBram Moolenaar 'echo &lines\_s*' .. 58e4984290SBram Moolenaar '\d\+ LOADOPT &lines\_s*' .. 59e4984290SBram Moolenaar '\d\+ ECHO 1\_s*' .. 60e4984290SBram Moolenaar 'echo v:version\_s*' .. 61e4984290SBram Moolenaar '\d\+ LOADV v:version\_s*' .. 62e4984290SBram Moolenaar '\d\+ ECHO 1\_s*' .. 63e4984290SBram Moolenaar 'echo s:scriptvar\_s*' .. 64e4984290SBram Moolenaar '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' .. 65e4984290SBram Moolenaar '\d\+ ECHO 1\_s*' .. 66e4984290SBram Moolenaar 'echo g:globalvar\_s*' .. 67e4984290SBram Moolenaar '\d\+ LOADG g:globalvar\_s*' .. 68e4984290SBram Moolenaar '\d\+ ECHO 1\_s*' .. 692f8ce0aeSBram Moolenaar 'echo get(g:, "global")\_s*' .. 702f8ce0aeSBram Moolenaar '\d\+ LOAD g:\_s*' .. 712f8ce0aeSBram Moolenaar '\d\+ PUSHS "global"\_s*' .. 7203290b84SBram Moolenaar '\d\+ BCALL get(argc 2)\_s*' .. 7303290b84SBram Moolenaar '\d\+ ECHO 1\_s*' .. 7403290b84SBram Moolenaar 'echo g:auto#var\_s*' .. 7503290b84SBram Moolenaar '\d\+ LOADAUTO g:auto#var\_s*' .. 7603290b84SBram Moolenaar '\d\+ ECHO 1\_s*' .. 7703290b84SBram Moolenaar 'echo b:buffervar\_s*' .. 7803290b84SBram Moolenaar '\d\+ LOADB b:buffervar\_s*' .. 7903290b84SBram Moolenaar '\d\+ ECHO 1\_s*' .. 802f8ce0aeSBram Moolenaar 'echo get(b:, "buffer")\_s*' .. 812f8ce0aeSBram Moolenaar '\d\+ LOAD b:\_s*' .. 822f8ce0aeSBram Moolenaar '\d\+ PUSHS "buffer"\_s*' .. 832f8ce0aeSBram Moolenaar '\d\+ BCALL get(argc 2).*' .. 84d3aac291SBram Moolenaar ' LOADW w:windowvar.*' .. 852f8ce0aeSBram Moolenaar 'echo get(w:, "window")\_s*' .. 862f8ce0aeSBram Moolenaar '\d\+ LOAD w:\_s*' .. 872f8ce0aeSBram Moolenaar '\d\+ PUSHS "window"\_s*' .. 882f8ce0aeSBram Moolenaar '\d\+ BCALL get(argc 2).*' .. 89d3aac291SBram Moolenaar ' LOADT t:tabpagevar.*' .. 902f8ce0aeSBram Moolenaar 'echo get(t:, "tab")\_s*' .. 912f8ce0aeSBram Moolenaar '\d\+ LOAD t:\_s*' .. 922f8ce0aeSBram Moolenaar '\d\+ PUSHS "tab"\_s*' .. 932f8ce0aeSBram Moolenaar '\d\+ BCALL get(argc 2).*' .. 94675f716eSBram Moolenaar ' LOADENV $ENVVAR.*' .. 95675f716eSBram Moolenaar ' LOADREG @z.*', 96675f716eSBram Moolenaar res) 975cab73f8SBram Moolenaarenddef 985cab73f8SBram Moolenaar 99cfe435d7SBram Moolenaardef s:EditExpand() 100ac564082SBram Moolenaar var filename = "file" 101ac564082SBram Moolenaar var filenr = 123 102cfe435d7SBram Moolenaar edit the`=filename``=filenr`.txt 103cfe435d7SBram Moolenaarenddef 104cfe435d7SBram Moolenaar 105cfe435d7SBram Moolenaardef Test_disassemble_exec_expr() 106ac564082SBram Moolenaar var res = execute('disass s:EditExpand') 1077c5ad348SBram Moolenaar assert_match('<SNR>\d*_EditExpand\_s*' .. 108ac564082SBram Moolenaar ' var filename = "file"\_s*' .. 1097c5ad348SBram Moolenaar '\d PUSHS "file"\_s*' .. 1107c5ad348SBram Moolenaar '\d STORE $0\_s*' .. 111ac564082SBram Moolenaar ' var filenr = 123\_s*' .. 1127c5ad348SBram Moolenaar '\d STORE 123 in $1\_s*' .. 1137c5ad348SBram Moolenaar ' edit the`=filename``=filenr`.txt\_s*' .. 1147c5ad348SBram Moolenaar '\d PUSHS "edit the"\_s*' .. 1157c5ad348SBram Moolenaar '\d LOAD $0\_s*' .. 1167c5ad348SBram Moolenaar '\d LOAD $1\_s*' .. 1177c5ad348SBram Moolenaar '\d 2STRING stack\[-1\]\_s*' .. 1187c5ad348SBram Moolenaar '\d\+ PUSHS ".txt"\_s*' .. 1197c5ad348SBram Moolenaar '\d\+ EXECCONCAT 4\_s*' .. 120f57b43c2SBram Moolenaar '\d\+ RETURN void', 1217c5ad348SBram Moolenaar res) 1227c5ad348SBram Moolenaarenddef 1237c5ad348SBram Moolenaar 1242067733bSBram Moolenaarif has('python3') 1252067733bSBram Moolenaar def s:PyHeredoc() 1262067733bSBram Moolenaar python3 << EOF 1272067733bSBram Moolenaar print('hello') 1282067733bSBram MoolenaarEOF 1292067733bSBram Moolenaar enddef 1302067733bSBram Moolenaar 1312067733bSBram Moolenaar def Test_disassemble_python_heredoc() 1322067733bSBram Moolenaar var res = execute('disass s:PyHeredoc') 1332067733bSBram Moolenaar assert_match('<SNR>\d*_PyHeredoc.*' .. 1342067733bSBram Moolenaar " python3 << EOF^@ print('hello')^@EOF\\_s*" .. 1352067733bSBram Moolenaar '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' .. 136f57b43c2SBram Moolenaar '\d RETURN void', 1372067733bSBram Moolenaar res) 1382067733bSBram Moolenaar enddef 1392067733bSBram Moolenaarendif 1402067733bSBram Moolenaar 1414c137214SBram Moolenaardef s:Substitute() 1424c137214SBram Moolenaar var expr = "abc" 1434c137214SBram Moolenaar :%s/a/\=expr/&g#c 1444c137214SBram Moolenaarenddef 1454c137214SBram Moolenaar 1464c137214SBram Moolenaardef Test_disassemble_substitute() 1474c137214SBram Moolenaar var res = execute('disass s:Substitute') 1484c137214SBram Moolenaar assert_match('<SNR>\d*_Substitute.*' .. 1494c137214SBram Moolenaar ' var expr = "abc"\_s*' .. 1504c137214SBram Moolenaar '\d PUSHS "abc"\_s*' .. 1514c137214SBram Moolenaar '\d STORE $0\_s*' .. 1524c137214SBram Moolenaar ' :%s/a/\\=expr/&g#c\_s*' .. 1534c137214SBram Moolenaar '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' .. 1544c137214SBram Moolenaar ' 0 LOAD $0\_s*' .. 1554c137214SBram Moolenaar ' -------------\_s*' .. 156f57b43c2SBram Moolenaar '\d RETURN void', 1574c137214SBram Moolenaar res) 1584c137214SBram Moolenaarenddef 1594c137214SBram Moolenaar 160f18332fbSBram Moolenaar 161f18332fbSBram Moolenaardef s:SearchPair() 162f18332fbSBram Moolenaar var col = 8 163f18332fbSBram Moolenaar searchpair("{", "", "}", "", "col('.') > col") 164f18332fbSBram Moolenaarenddef 165f18332fbSBram Moolenaar 166f18332fbSBram Moolenaardef Test_disassemble_seachpair() 167f18332fbSBram Moolenaar var res = execute('disass s:SearchPair') 168f18332fbSBram Moolenaar assert_match('<SNR>\d*_SearchPair.*' .. 169f18332fbSBram Moolenaar ' var col = 8\_s*' .. 170f18332fbSBram Moolenaar '\d STORE 8 in $0\_s*' .. 171f18332fbSBram Moolenaar ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' .. 172f18332fbSBram Moolenaar '\d PUSHS "{"\_s*' .. 173f18332fbSBram Moolenaar '\d PUSHS ""\_s*' .. 174f18332fbSBram Moolenaar '\d PUSHS "}"\_s*' .. 175f18332fbSBram Moolenaar '\d PUSHS ""\_s*' .. 176f18332fbSBram Moolenaar '\d INSTR\_s*' .. 177f18332fbSBram Moolenaar ' 0 PUSHS "."\_s*' .. 178f18332fbSBram Moolenaar ' 1 BCALL col(argc 1)\_s*' .. 179f18332fbSBram Moolenaar ' 2 LOAD $0\_s*' .. 180f18332fbSBram Moolenaar ' 3 COMPARENR >\_s*' .. 181f18332fbSBram Moolenaar ' -------------\_s*' .. 182f18332fbSBram Moolenaar '\d BCALL searchpair(argc 5)\_s*' .. 183f18332fbSBram Moolenaar '\d DROP\_s*' .. 184f57b43c2SBram Moolenaar '\d RETURN void', 185f18332fbSBram Moolenaar res) 186f18332fbSBram Moolenaarenddef 187f18332fbSBram Moolenaar 188f18332fbSBram Moolenaar 1892d1c57edSBram Moolenaardef s:RedirVar() 1902d1c57edSBram Moolenaar var result: string 1912d1c57edSBram Moolenaar redir =>> result 1922d1c57edSBram Moolenaar echo "text" 1932d1c57edSBram Moolenaar redir END 1942d1c57edSBram Moolenaarenddef 1952d1c57edSBram Moolenaar 1962d1c57edSBram Moolenaardef Test_disassemble_redir_var() 1972d1c57edSBram Moolenaar var res = execute('disass s:RedirVar') 1982d1c57edSBram Moolenaar assert_match('<SNR>\d*_RedirVar.*' .. 1992d1c57edSBram Moolenaar ' var result: string\_s*' .. 2002d1c57edSBram Moolenaar '\d PUSHS "\[NULL\]"\_s*' .. 2012d1c57edSBram Moolenaar '\d STORE $0\_s*' .. 2022d1c57edSBram Moolenaar ' redir =>> result\_s*' .. 2032d1c57edSBram Moolenaar '\d REDIR\_s*' .. 2042d1c57edSBram Moolenaar ' echo "text"\_s*' .. 2052d1c57edSBram Moolenaar '\d PUSHS "text"\_s*' .. 2062d1c57edSBram Moolenaar '\d ECHO 1\_s*' .. 2072d1c57edSBram Moolenaar ' redir END\_s*' .. 2082d1c57edSBram Moolenaar '\d LOAD $0\_s*' .. 2092d1c57edSBram Moolenaar '\d REDIR END\_s*' .. 2102d1c57edSBram Moolenaar '\d CONCAT\_s*' .. 2112d1c57edSBram Moolenaar '\d STORE $0\_s*' .. 212f57b43c2SBram Moolenaar '\d RETURN void', 2132d1c57edSBram Moolenaar res) 2142d1c57edSBram Moolenaarenddef 2152d1c57edSBram Moolenaar 2165f7d4c04SBram Moolenaardef s:Cexpr() 2175f7d4c04SBram Moolenaar var errors = "list of errors" 2185f7d4c04SBram Moolenaar cexpr errors 2195f7d4c04SBram Moolenaarenddef 2205f7d4c04SBram Moolenaar 2215f7d4c04SBram Moolenaardef Test_disassemble_cexpr() 2225f7d4c04SBram Moolenaar var res = execute('disass s:Cexpr') 2235f7d4c04SBram Moolenaar assert_match('<SNR>\d*_Cexpr.*' .. 2245f7d4c04SBram Moolenaar ' var errors = "list of errors"\_s*' .. 2255f7d4c04SBram Moolenaar '\d PUSHS "list of errors"\_s*' .. 2265f7d4c04SBram Moolenaar '\d STORE $0\_s*' .. 2275f7d4c04SBram Moolenaar ' cexpr errors\_s*' .. 2285f7d4c04SBram Moolenaar '\d CEXPR pre cexpr\_s*' .. 2295f7d4c04SBram Moolenaar '\d LOAD $0\_s*' .. 2305f7d4c04SBram Moolenaar '\d CEXPR core cexpr "cexpr errors"\_s*' .. 231f57b43c2SBram Moolenaar '\d RETURN void', 2325f7d4c04SBram Moolenaar res) 2335f7d4c04SBram Moolenaarenddef 2345f7d4c04SBram Moolenaar 2357c5ad348SBram Moolenaardef s:YankRange() 2367c5ad348SBram Moolenaar norm! m[jjm] 2377c5ad348SBram Moolenaar :'[,']yank 2387c5ad348SBram Moolenaarenddef 2397c5ad348SBram Moolenaar 2407c5ad348SBram Moolenaardef Test_disassemble_yank_range() 241ac564082SBram Moolenaar var res = execute('disass s:YankRange') 2427c5ad348SBram Moolenaar assert_match('<SNR>\d*_YankRange.*' .. 2437c5ad348SBram Moolenaar ' norm! m\[jjm\]\_s*' .. 2447c5ad348SBram Moolenaar '\d EXEC norm! m\[jjm\]\_s*' .. 2457c5ad348SBram Moolenaar ' :''\[,''\]yank\_s*' .. 2467c5ad348SBram Moolenaar '\d EXEC :''\[,''\]yank\_s*' .. 247f57b43c2SBram Moolenaar '\d RETURN void', 248cfe435d7SBram Moolenaar res) 249cfe435d7SBram Moolenaarenddef 250cfe435d7SBram Moolenaar 251c3516f7eSBram Moolenaardef s:PutExpr() 252c3516f7eSBram Moolenaar :3put ="text" 253c3516f7eSBram Moolenaarenddef 254c3516f7eSBram Moolenaar 255c3516f7eSBram Moolenaardef Test_disassemble_put_expr() 256ac564082SBram Moolenaar var res = execute('disass s:PutExpr') 257c3516f7eSBram Moolenaar assert_match('<SNR>\d*_PutExpr.*' .. 258c3516f7eSBram Moolenaar ' :3put ="text"\_s*' .. 259c3516f7eSBram Moolenaar '\d PUSHS "text"\_s*' .. 260c3516f7eSBram Moolenaar '\d PUT = 3\_s*' .. 261f57b43c2SBram Moolenaar '\d RETURN void', 262c3516f7eSBram Moolenaar res) 263c3516f7eSBram Moolenaarenddef 264c3516f7eSBram Moolenaar 26508597875SBram Moolenaardef s:PutRange() 26608597875SBram Moolenaar :$-2put a 26708597875SBram Moolenaarenddef 26808597875SBram Moolenaar 26908597875SBram Moolenaardef Test_disassemble_put_range() 27008597875SBram Moolenaar var res = execute('disass s:PutRange') 27108597875SBram Moolenaar assert_match('<SNR>\d*_PutRange.*' .. 27208597875SBram Moolenaar ' :$-2put a\_s*' .. 27308597875SBram Moolenaar '\d RANGE $-2\_s*' .. 27408597875SBram Moolenaar '\d PUT a range\_s*' .. 275f57b43c2SBram Moolenaar '\d RETURN void', 27608597875SBram Moolenaar res) 27708597875SBram Moolenaarenddef 27808597875SBram Moolenaar 2795cab73f8SBram Moolenaardef s:ScriptFuncPush() 280ac564082SBram Moolenaar var localbool = true 281ac564082SBram Moolenaar var localspec = v:none 282ac564082SBram Moolenaar var localblob = 0z1234 2835cab73f8SBram Moolenaar if has('float') 284ac564082SBram Moolenaar var localfloat = 1.234 2855cab73f8SBram Moolenaar endif 2865cab73f8SBram Moolenaarenddef 2875cab73f8SBram Moolenaar 288f2460a3aSBram Moolenaardef Test_disassemble_push() 289ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncPush') 290675f716eSBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' .. 291675f716eSBram Moolenaar 'localbool = true.*' .. 292a8b8af19SBram Moolenaar ' PUSH true.*' .. 293675f716eSBram Moolenaar 'localspec = v:none.*' .. 294675f716eSBram Moolenaar ' PUSH v:none.*' .. 295675f716eSBram Moolenaar 'localblob = 0z1234.*' .. 296675f716eSBram Moolenaar ' PUSHBLOB 0z1234.*', 297675f716eSBram Moolenaar res) 2985cab73f8SBram Moolenaar if has('float') 299675f716eSBram Moolenaar assert_match('<SNR>\d*_ScriptFuncPush.*' .. 300675f716eSBram Moolenaar 'localfloat = 1.234.*' .. 301675f716eSBram Moolenaar ' PUSHF 1.234.*', 302675f716eSBram Moolenaar res) 3035cab73f8SBram Moolenaar endif 3045cab73f8SBram Moolenaarenddef 3055cab73f8SBram Moolenaar 3065cab73f8SBram Moolenaardef s:ScriptFuncStore() 307ac564082SBram Moolenaar var localnr = 1 3085cab73f8SBram Moolenaar localnr = 2 309ac564082SBram Moolenaar var localstr = 'abc' 3105cab73f8SBram Moolenaar localstr = 'xyz' 3115cab73f8SBram Moolenaar v:char = 'abc' 3125cab73f8SBram Moolenaar s:scriptvar = 'sv' 3135cab73f8SBram Moolenaar g:globalvar = 'gv' 31403290b84SBram Moolenaar g:auto#var = 'av' 315d3aac291SBram Moolenaar b:buffervar = 'bv' 316d3aac291SBram Moolenaar w:windowvar = 'wv' 317d3aac291SBram Moolenaar t:tabpagevar = 'tv' 3185cab73f8SBram Moolenaar &tabstop = 8 3195cab73f8SBram Moolenaar $ENVVAR = 'ev' 3205cab73f8SBram Moolenaar @z = 'rv' 3215cab73f8SBram Moolenaarenddef 3225cab73f8SBram Moolenaar 323f2460a3aSBram Moolenaardef Test_disassemble_store() 324ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncStore') 325675f716eSBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStore.*' .. 326ac564082SBram Moolenaar 'var localnr = 1.*' .. 327675f716eSBram Moolenaar 'localnr = 2.*' .. 328675f716eSBram Moolenaar ' STORE 2 in $0.*' .. 329ac564082SBram Moolenaar 'var localstr = ''abc''.*' .. 330675f716eSBram Moolenaar 'localstr = ''xyz''.*' .. 331675f716eSBram Moolenaar ' STORE $1.*' .. 332675f716eSBram Moolenaar 'v:char = ''abc''.*' .. 333675f716eSBram Moolenaar 'STOREV v:char.*' .. 334675f716eSBram Moolenaar 's:scriptvar = ''sv''.*' .. 335675f716eSBram Moolenaar ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' .. 336675f716eSBram Moolenaar 'g:globalvar = ''gv''.*' .. 337675f716eSBram Moolenaar ' STOREG g:globalvar.*' .. 33803290b84SBram Moolenaar 'g:auto#var = ''av''.*' .. 33903290b84SBram Moolenaar ' STOREAUTO g:auto#var.*' .. 340d3aac291SBram Moolenaar 'b:buffervar = ''bv''.*' .. 341d3aac291SBram Moolenaar ' STOREB b:buffervar.*' .. 342d3aac291SBram Moolenaar 'w:windowvar = ''wv''.*' .. 343d3aac291SBram Moolenaar ' STOREW w:windowvar.*' .. 344d3aac291SBram Moolenaar 't:tabpagevar = ''tv''.*' .. 345d3aac291SBram Moolenaar ' STORET t:tabpagevar.*' .. 346675f716eSBram Moolenaar '&tabstop = 8.*' .. 347675f716eSBram Moolenaar ' STOREOPT &tabstop.*' .. 348675f716eSBram Moolenaar '$ENVVAR = ''ev''.*' .. 349675f716eSBram Moolenaar ' STOREENV $ENVVAR.*' .. 350675f716eSBram Moolenaar '@z = ''rv''.*' .. 351675f716eSBram Moolenaar ' STOREREG @z.*', 352675f716eSBram Moolenaar res) 3535cab73f8SBram Moolenaarenddef 3545cab73f8SBram Moolenaar 355cb790401SBram Moolenaardef s:ScriptFuncStoreMember() 356ac564082SBram Moolenaar var locallist: list<number> = [] 357cb790401SBram Moolenaar locallist[0] = 123 358ac564082SBram Moolenaar var localdict: dict<number> = {} 359cb790401SBram Moolenaar localdict["a"] = 456 36051e93326SBram Moolenaar var localblob: blob = 0z1122 36151e93326SBram Moolenaar localblob[1] = 33 362cb790401SBram Moolenaarenddef 363cb790401SBram Moolenaar 364cb790401SBram Moolenaardef Test_disassemble_store_member() 365ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncStoreMember') 366cb790401SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' .. 367ac564082SBram Moolenaar 'var locallist: list<number> = []\_s*' .. 368cb790401SBram Moolenaar '\d NEWLIST size 0\_s*' .. 369aa210a3aSBram Moolenaar '\d SETTYPE list<number>\_s*' .. 370cb790401SBram Moolenaar '\d STORE $0\_s*' .. 371cb790401SBram Moolenaar 'locallist\[0\] = 123\_s*' .. 372cb790401SBram Moolenaar '\d PUSHNR 123\_s*' .. 373cb790401SBram Moolenaar '\d PUSHNR 0\_s*' .. 374cb790401SBram Moolenaar '\d LOAD $0\_s*' .. 37551e93326SBram Moolenaar '\d STOREINDEX list\_s*' .. 376ac564082SBram Moolenaar 'var localdict: dict<number> = {}\_s*' .. 377cb790401SBram Moolenaar '\d NEWDICT size 0\_s*' .. 378aa210a3aSBram Moolenaar '\d SETTYPE dict<number>\_s*' .. 379cb790401SBram Moolenaar '\d STORE $1\_s*' .. 380cb790401SBram Moolenaar 'localdict\["a"\] = 456\_s*' .. 381cb790401SBram Moolenaar '\d\+ PUSHNR 456\_s*' .. 382cb790401SBram Moolenaar '\d\+ PUSHS "a"\_s*' .. 383cb790401SBram Moolenaar '\d\+ LOAD $1\_s*' .. 38451e93326SBram Moolenaar '\d\+ STOREINDEX dict\_s*' .. 38551e93326SBram Moolenaar 'var localblob: blob = 0z1122\_s*' .. 38651e93326SBram Moolenaar '\d\+ PUSHBLOB 0z1122\_s*' .. 38751e93326SBram Moolenaar '\d\+ STORE $2\_s*' .. 38851e93326SBram Moolenaar 'localblob\[1\] = 33\_s*' .. 38951e93326SBram Moolenaar '\d\+ PUSHNR 33\_s*' .. 39051e93326SBram Moolenaar '\d\+ PUSHNR 1\_s*' .. 39151e93326SBram Moolenaar '\d\+ LOAD $2\_s*' .. 39251e93326SBram Moolenaar '\d\+ STOREINDEX blob\_s*' .. 393f57b43c2SBram Moolenaar '\d\+ RETURN void', 394cb790401SBram Moolenaar res) 395cb790401SBram Moolenaarenddef 396cb790401SBram Moolenaar 3974f5e3977SBram Moolenaardef s:ScriptFuncStoreIndex() 3984f5e3977SBram Moolenaar var d = {dd: {}} 3994f5e3977SBram Moolenaar d.dd[0] = 0 4004f5e3977SBram Moolenaarenddef 4014f5e3977SBram Moolenaar 4024f5e3977SBram Moolenaardef Test_disassemble_store_index() 4034f5e3977SBram Moolenaar var res = execute('disass s:ScriptFuncStoreIndex') 4044f5e3977SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' .. 4054f5e3977SBram Moolenaar 'var d = {dd: {}}\_s*' .. 4064f5e3977SBram Moolenaar '\d PUSHS "dd"\_s*' .. 4074f5e3977SBram Moolenaar '\d NEWDICT size 0\_s*' .. 4084f5e3977SBram Moolenaar '\d NEWDICT size 1\_s*' .. 4094f5e3977SBram Moolenaar '\d STORE $0\_s*' .. 4104f5e3977SBram Moolenaar 'd.dd\[0\] = 0\_s*' .. 4114f5e3977SBram Moolenaar '\d PUSHNR 0\_s*' .. 4124f5e3977SBram Moolenaar '\d PUSHNR 0\_s*' .. 4134f5e3977SBram Moolenaar '\d LOAD $0\_s*' .. 4144f5e3977SBram Moolenaar '\d MEMBER dd\_s*' .. 415b1b6f4deSBram Moolenaar '\d\+ USEDICT\_s*' .. 416b1b6f4deSBram Moolenaar '\d\+ STOREINDEX any\_s*' .. 417f57b43c2SBram Moolenaar '\d\+ RETURN void', 4184f5e3977SBram Moolenaar res) 4194f5e3977SBram Moolenaarenddef 4204f5e3977SBram Moolenaar 4210779fab2SBram Moolenaardef s:ListAssign() 422ac564082SBram Moolenaar var x: string 423ac564082SBram Moolenaar var y: string 424ac564082SBram Moolenaar var l: list<any> 4250779fab2SBram Moolenaar [x, y; l] = g:stringlist 4260779fab2SBram Moolenaarenddef 4270779fab2SBram Moolenaar 4280779fab2SBram Moolenaardef Test_disassemble_list_assign() 429ac564082SBram Moolenaar var res = execute('disass s:ListAssign') 4300779fab2SBram Moolenaar assert_match('<SNR>\d*_ListAssign\_s*' .. 431ac564082SBram Moolenaar 'var x: string\_s*' .. 4320779fab2SBram Moolenaar '\d PUSHS "\[NULL\]"\_s*' .. 4330779fab2SBram Moolenaar '\d STORE $0\_s*' .. 434ac564082SBram Moolenaar 'var y: string\_s*' .. 4350779fab2SBram Moolenaar '\d PUSHS "\[NULL\]"\_s*' .. 4360779fab2SBram Moolenaar '\d STORE $1\_s*' .. 437ac564082SBram Moolenaar 'var l: list<any>\_s*' .. 4380779fab2SBram Moolenaar '\d NEWLIST size 0\_s*' .. 4396e48b84cSBram Moolenaar '\d SETTYPE list<any>\_s*' .. 4400779fab2SBram Moolenaar '\d STORE $2\_s*' .. 4410779fab2SBram Moolenaar '\[x, y; l\] = g:stringlist\_s*' .. 4420779fab2SBram Moolenaar '\d LOADG g:stringlist\_s*' .. 4435e654230SBram Moolenaar '\d CHECKTYPE list<any> stack\[-1\]\_s*' .. 4440779fab2SBram Moolenaar '\d CHECKLEN >= 2\_s*' .. 4450779fab2SBram Moolenaar '\d\+ ITEM 0\_s*' .. 4464270d8b7SBram Moolenaar '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' .. 4470779fab2SBram Moolenaar '\d\+ STORE $0\_s*' .. 4480779fab2SBram Moolenaar '\d\+ ITEM 1\_s*' .. 4494270d8b7SBram Moolenaar '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' .. 4500779fab2SBram Moolenaar '\d\+ STORE $1\_s*' .. 4510779fab2SBram Moolenaar '\d\+ SLICE 2\_s*' .. 4520779fab2SBram Moolenaar '\d\+ STORE $2\_s*' .. 453f57b43c2SBram Moolenaar '\d\+ RETURN void', 4540779fab2SBram Moolenaar res) 4550779fab2SBram Moolenaarenddef 4560779fab2SBram Moolenaar 457035bd1c9SBram Moolenaardef s:ListAssignWithOp() 458035bd1c9SBram Moolenaar var a = 2 459035bd1c9SBram Moolenaar var b = 3 460035bd1c9SBram Moolenaar [a, b] += [4, 5] 461035bd1c9SBram Moolenaarenddef 462035bd1c9SBram Moolenaar 463035bd1c9SBram Moolenaardef Test_disassemble_list_assign_with_op() 464035bd1c9SBram Moolenaar var res = execute('disass s:ListAssignWithOp') 465035bd1c9SBram Moolenaar assert_match('<SNR>\d*_ListAssignWithOp\_s*' .. 466035bd1c9SBram Moolenaar 'var a = 2\_s*' .. 467035bd1c9SBram Moolenaar '\d STORE 2 in $0\_s*' .. 468035bd1c9SBram Moolenaar 'var b = 3\_s*' .. 469035bd1c9SBram Moolenaar '\d STORE 3 in $1\_s*' .. 470035bd1c9SBram Moolenaar '\[a, b\] += \[4, 5\]\_s*' .. 471035bd1c9SBram Moolenaar '\d\+ PUSHNR 4\_s*' .. 472035bd1c9SBram Moolenaar '\d\+ PUSHNR 5\_s*' .. 473035bd1c9SBram Moolenaar '\d\+ NEWLIST size 2\_s*' .. 474035bd1c9SBram Moolenaar '\d\+ CHECKLEN 2\_s*' .. 475035bd1c9SBram Moolenaar '\d\+ LOAD $0\_s*' .. 476035bd1c9SBram Moolenaar '\d\+ ITEM 0 with op\_s*' .. 477035bd1c9SBram Moolenaar '\d\+ OPNR +\_s*' .. 478035bd1c9SBram Moolenaar '\d\+ STORE $0\_s*' .. 479035bd1c9SBram Moolenaar '\d\+ LOAD $1\_s*' .. 480035bd1c9SBram Moolenaar '\d\+ ITEM 1 with op\_s*' .. 481035bd1c9SBram Moolenaar '\d\+ OPNR +\_s*' .. 482035bd1c9SBram Moolenaar '\d\+ STORE $1\_s*' .. 483035bd1c9SBram Moolenaar '\d\+ DROP\_s*' .. 484035bd1c9SBram Moolenaar '\d\+ RETURN void', 485035bd1c9SBram Moolenaar res) 486035bd1c9SBram Moolenaarenddef 487035bd1c9SBram Moolenaar 4881dcae599SBram Moolenaardef s:ListAdd() 4891dcae599SBram Moolenaar var l: list<number> = [] 4901dcae599SBram Moolenaar add(l, 123) 4911dcae599SBram Moolenaar add(l, g:aNumber) 4921dcae599SBram Moolenaarenddef 4931dcae599SBram Moolenaar 4941dcae599SBram Moolenaardef Test_disassemble_list_add() 4951dcae599SBram Moolenaar var res = execute('disass s:ListAdd') 4961dcae599SBram Moolenaar assert_match('<SNR>\d*_ListAdd\_s*' .. 4971dcae599SBram Moolenaar 'var l: list<number> = []\_s*' .. 4981dcae599SBram Moolenaar '\d NEWLIST size 0\_s*' .. 499aa210a3aSBram Moolenaar '\d SETTYPE list<number>\_s*' .. 5001dcae599SBram Moolenaar '\d STORE $0\_s*' .. 5011dcae599SBram Moolenaar 'add(l, 123)\_s*' .. 5021dcae599SBram Moolenaar '\d LOAD $0\_s*' .. 5031dcae599SBram Moolenaar '\d PUSHNR 123\_s*' .. 5041dcae599SBram Moolenaar '\d LISTAPPEND\_s*' .. 5051dcae599SBram Moolenaar '\d DROP\_s*' .. 5061dcae599SBram Moolenaar 'add(l, g:aNumber)\_s*' .. 5071dcae599SBram Moolenaar '\d LOAD $0\_s*' .. 5081dcae599SBram Moolenaar '\d\+ LOADG g:aNumber\_s*' .. 5091dcae599SBram Moolenaar '\d\+ CHECKTYPE number stack\[-1\]\_s*' .. 5101dcae599SBram Moolenaar '\d\+ LISTAPPEND\_s*' .. 5111dcae599SBram Moolenaar '\d\+ DROP\_s*' .. 512f57b43c2SBram Moolenaar '\d\+ RETURN void', 5131dcae599SBram Moolenaar res) 5141dcae599SBram Moolenaarenddef 5151dcae599SBram Moolenaar 51680b0e5eaSBram Moolenaardef s:BlobAdd() 51780b0e5eaSBram Moolenaar var b: blob = 0z 51880b0e5eaSBram Moolenaar add(b, 123) 51980b0e5eaSBram Moolenaar add(b, g:aNumber) 52080b0e5eaSBram Moolenaarenddef 52180b0e5eaSBram Moolenaar 52280b0e5eaSBram Moolenaardef Test_disassemble_blob_add() 52380b0e5eaSBram Moolenaar var res = execute('disass s:BlobAdd') 52480b0e5eaSBram Moolenaar assert_match('<SNR>\d*_BlobAdd\_s*' .. 52580b0e5eaSBram Moolenaar 'var b: blob = 0z\_s*' .. 52680b0e5eaSBram Moolenaar '\d PUSHBLOB 0z\_s*' .. 52780b0e5eaSBram Moolenaar '\d STORE $0\_s*' .. 52880b0e5eaSBram Moolenaar 'add(b, 123)\_s*' .. 52980b0e5eaSBram Moolenaar '\d LOAD $0\_s*' .. 53080b0e5eaSBram Moolenaar '\d PUSHNR 123\_s*' .. 53180b0e5eaSBram Moolenaar '\d BLOBAPPEND\_s*' .. 53280b0e5eaSBram Moolenaar '\d DROP\_s*' .. 53380b0e5eaSBram Moolenaar 'add(b, g:aNumber)\_s*' .. 53480b0e5eaSBram Moolenaar '\d LOAD $0\_s*' .. 53580b0e5eaSBram Moolenaar '\d\+ LOADG g:aNumber\_s*' .. 53680b0e5eaSBram Moolenaar '\d\+ CHECKTYPE number stack\[-1\]\_s*' .. 53780b0e5eaSBram Moolenaar '\d\+ BLOBAPPEND\_s*' .. 53880b0e5eaSBram Moolenaar '\d\+ DROP\_s*' .. 539f57b43c2SBram Moolenaar '\d\+ RETURN void', 54080b0e5eaSBram Moolenaar res) 54180b0e5eaSBram Moolenaarenddef 54280b0e5eaSBram Moolenaar 543f62d7393SBram Moolenaardef s:BlobIndexSlice() 544f62d7393SBram Moolenaar var b: blob = 0z112233 545f62d7393SBram Moolenaar echo b[1] 546f62d7393SBram Moolenaar echo b[1 : 2] 547f62d7393SBram Moolenaarenddef 548f62d7393SBram Moolenaar 549f62d7393SBram Moolenaardef Test_disassemble_blob_index_slice() 550f62d7393SBram Moolenaar var res = execute('disass s:BlobIndexSlice') 551f62d7393SBram Moolenaar assert_match('<SNR>\d*_BlobIndexSlice\_s*' .. 552f62d7393SBram Moolenaar 'var b: blob = 0z112233\_s*' .. 553f62d7393SBram Moolenaar '\d PUSHBLOB 0z112233\_s*' .. 554f62d7393SBram Moolenaar '\d STORE $0\_s*' .. 555f62d7393SBram Moolenaar 'echo b\[1\]\_s*' .. 556f62d7393SBram Moolenaar '\d LOAD $0\_s*' .. 557f62d7393SBram Moolenaar '\d PUSHNR 1\_s*' .. 558f62d7393SBram Moolenaar '\d BLOBINDEX\_s*' .. 559f62d7393SBram Moolenaar '\d ECHO 1\_s*' .. 560f62d7393SBram Moolenaar 'echo b\[1 : 2\]\_s*' .. 561f62d7393SBram Moolenaar '\d LOAD $0\_s*' .. 562f62d7393SBram Moolenaar '\d PUSHNR 1\_s*' .. 563f62d7393SBram Moolenaar '\d\+ PUSHNR 2\_s*' .. 564f62d7393SBram Moolenaar '\d\+ BLOBSLICE\_s*' .. 565f62d7393SBram Moolenaar '\d\+ ECHO 1\_s*' .. 566f57b43c2SBram Moolenaar '\d\+ RETURN void', 567f62d7393SBram Moolenaar res) 568f62d7393SBram Moolenaarenddef 569f62d7393SBram Moolenaar 570d72c1bf0SBram Moolenaardef s:ScriptFuncUnlet() 571d72c1bf0SBram Moolenaar g:somevar = "value" 572d72c1bf0SBram Moolenaar unlet g:somevar 573d72c1bf0SBram Moolenaar unlet! g:somevar 5747bdaea6eSBram Moolenaar unlet $SOMEVAR 575d72c1bf0SBram Moolenaarenddef 576d72c1bf0SBram Moolenaar 577d72c1bf0SBram Moolenaardef Test_disassemble_unlet() 578ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncUnlet') 579cb790401SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' .. 580cb790401SBram Moolenaar 'g:somevar = "value"\_s*' .. 581cb790401SBram Moolenaar '\d PUSHS "value"\_s*' .. 582cb790401SBram Moolenaar '\d STOREG g:somevar\_s*' .. 583cb790401SBram Moolenaar 'unlet g:somevar\_s*' .. 584cb790401SBram Moolenaar '\d UNLET g:somevar\_s*' .. 585cb790401SBram Moolenaar 'unlet! g:somevar\_s*' .. 586cb790401SBram Moolenaar '\d UNLET! g:somevar\_s*' .. 587cb790401SBram Moolenaar 'unlet $SOMEVAR\_s*' .. 588cb790401SBram Moolenaar '\d UNLETENV $SOMEVAR\_s*', 589d72c1bf0SBram Moolenaar res) 590d72c1bf0SBram Moolenaarenddef 591d72c1bf0SBram Moolenaar 592aacc966cSBram Moolenaardef s:LockLocal() 593aacc966cSBram Moolenaar var d = {a: 1} 594aacc966cSBram Moolenaar lockvar d.a 595aacc966cSBram Moolenaarenddef 596aacc966cSBram Moolenaar 597aacc966cSBram Moolenaardef Test_disassemble_locl_local() 598aacc966cSBram Moolenaar var res = execute('disass s:LockLocal') 599aacc966cSBram Moolenaar assert_match('<SNR>\d*_LockLocal\_s*' .. 600aacc966cSBram Moolenaar 'var d = {a: 1}\_s*' .. 601aacc966cSBram Moolenaar '\d PUSHS "a"\_s*' .. 602aacc966cSBram Moolenaar '\d PUSHNR 1\_s*' .. 603aacc966cSBram Moolenaar '\d NEWDICT size 1\_s*' .. 604aacc966cSBram Moolenaar '\d STORE $0\_s*' .. 605aacc966cSBram Moolenaar 'lockvar d.a\_s*' .. 606aacc966cSBram Moolenaar '\d LOAD $0\_s*' .. 607aacc966cSBram Moolenaar '\d LOCKUNLOCK lockvar d.a\_s*', 608aacc966cSBram Moolenaar res) 609aacc966cSBram Moolenaarenddef 610aacc966cSBram Moolenaar 6115cab73f8SBram Moolenaardef s:ScriptFuncTry() 6125cab73f8SBram Moolenaar try 613cb790401SBram Moolenaar echo "yes" 6145cab73f8SBram Moolenaar catch /fail/ 615cb790401SBram Moolenaar echo "no" 6165cab73f8SBram Moolenaar finally 617cb790401SBram Moolenaar throw "end" 6185cab73f8SBram Moolenaar endtry 6195cab73f8SBram Moolenaarenddef 6205cab73f8SBram Moolenaar 621f2460a3aSBram Moolenaardef Test_disassemble_try() 622ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncTry') 623cb790401SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncTry\_s*' .. 624cb790401SBram Moolenaar 'try\_s*' .. 6257e82c5f3SBram Moolenaar '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' .. 626cb790401SBram Moolenaar 'echo "yes"\_s*' .. 627cb790401SBram Moolenaar '\d PUSHS "yes"\_s*' .. 628cb790401SBram Moolenaar '\d ECHO 1\_s*' .. 629cb790401SBram Moolenaar 'catch /fail/\_s*' .. 630cb790401SBram Moolenaar '\d JUMP -> \d\+\_s*' .. 631cb790401SBram Moolenaar '\d PUSH v:exception\_s*' .. 632cb790401SBram Moolenaar '\d PUSHS "fail"\_s*' .. 633cb790401SBram Moolenaar '\d COMPARESTRING =\~\_s*' .. 634cb790401SBram Moolenaar '\d JUMP_IF_FALSE -> \d\+\_s*' .. 635cb790401SBram Moolenaar '\d CATCH\_s*' .. 636cb790401SBram Moolenaar 'echo "no"\_s*' .. 637cb790401SBram Moolenaar '\d\+ PUSHS "no"\_s*' .. 638cb790401SBram Moolenaar '\d\+ ECHO 1\_s*' .. 639cb790401SBram Moolenaar 'finally\_s*' .. 6407e82c5f3SBram Moolenaar '\d\+ FINALLY\_s*' .. 641cb790401SBram Moolenaar 'throw "end"\_s*' .. 642cb790401SBram Moolenaar '\d\+ PUSHS "end"\_s*' .. 643cb790401SBram Moolenaar '\d\+ THROW\_s*' .. 644cb790401SBram Moolenaar 'endtry\_s*' .. 645cb790401SBram Moolenaar '\d\+ ENDTRY', 646675f716eSBram Moolenaar res) 6475cab73f8SBram Moolenaarenddef 6485cab73f8SBram Moolenaar 6495cab73f8SBram Moolenaardef s:ScriptFuncNew() 650ac564082SBram Moolenaar var ll = [1, "two", 333] 651e0de171eSBram Moolenaar var dd = {one: 1, two: "val"} 6525cab73f8SBram Moolenaarenddef 6535cab73f8SBram Moolenaar 654f2460a3aSBram Moolenaardef Test_disassemble_new() 655ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncNew') 656cb790401SBram Moolenaar assert_match('<SNR>\d*_ScriptFuncNew\_s*' .. 657ac564082SBram Moolenaar 'var ll = \[1, "two", 333\]\_s*' .. 658cb790401SBram Moolenaar '\d PUSHNR 1\_s*' .. 659cb790401SBram Moolenaar '\d PUSHS "two"\_s*' .. 660cb790401SBram Moolenaar '\d PUSHNR 333\_s*' .. 661cb790401SBram Moolenaar '\d NEWLIST size 3\_s*' .. 662cb790401SBram Moolenaar '\d STORE $0\_s*' .. 663e0de171eSBram Moolenaar 'var dd = {one: 1, two: "val"}\_s*' .. 664cb790401SBram Moolenaar '\d PUSHS "one"\_s*' .. 665cb790401SBram Moolenaar '\d PUSHNR 1\_s*' .. 666cb790401SBram Moolenaar '\d PUSHS "two"\_s*' .. 667cb790401SBram Moolenaar '\d PUSHS "val"\_s*' .. 668cb790401SBram Moolenaar '\d NEWDICT size 2\_s*', 669675f716eSBram Moolenaar res) 6705cab73f8SBram Moolenaarenddef 6715cab73f8SBram Moolenaar 6726e949784SBram Moolenaardef FuncWithArg(arg: any) 6735cab73f8SBram Moolenaar echo arg 6745cab73f8SBram Moolenaarenddef 6755cab73f8SBram Moolenaar 6765cab73f8SBram Moolenaarfunc UserFunc() 6775cab73f8SBram Moolenaar echo 'nothing' 6785cab73f8SBram Moolenaarendfunc 6795cab73f8SBram Moolenaar 6805cab73f8SBram Moolenaarfunc UserFuncWithArg(arg) 6815cab73f8SBram Moolenaar echo a:arg 6825cab73f8SBram Moolenaarendfunc 6835cab73f8SBram Moolenaar 6845cab73f8SBram Moolenaardef s:ScriptFuncCall(): string 6855cab73f8SBram Moolenaar changenr() 6865cab73f8SBram Moolenaar char2nr("abc") 687f2460a3aSBram Moolenaar Test_disassemble_new() 6885cab73f8SBram Moolenaar FuncWithArg(343) 6895cab73f8SBram Moolenaar ScriptFuncNew() 6905cab73f8SBram Moolenaar s:ScriptFuncNew() 6915cab73f8SBram Moolenaar UserFunc() 6925cab73f8SBram Moolenaar UserFuncWithArg("foo") 693ac564082SBram Moolenaar var FuncRef = function("UserFunc") 6945cab73f8SBram Moolenaar FuncRef() 695ac564082SBram Moolenaar var FuncRefWithArg = function("UserFuncWithArg") 6965cab73f8SBram Moolenaar FuncRefWithArg("bar") 6975cab73f8SBram Moolenaar return "yes" 6985cab73f8SBram Moolenaarenddef 6995cab73f8SBram Moolenaar 700f2460a3aSBram Moolenaardef Test_disassemble_call() 701ac564082SBram Moolenaar var res = execute('disass s:ScriptFuncCall') 702cb790401SBram Moolenaar assert_match('<SNR>\d\+_ScriptFuncCall\_s*' .. 703cb790401SBram Moolenaar 'changenr()\_s*' .. 704cb790401SBram Moolenaar '\d BCALL changenr(argc 0)\_s*' .. 705cb790401SBram Moolenaar '\d DROP\_s*' .. 706cb790401SBram Moolenaar 'char2nr("abc")\_s*' .. 707cb790401SBram Moolenaar '\d PUSHS "abc"\_s*' .. 708cb790401SBram Moolenaar '\d BCALL char2nr(argc 1)\_s*' .. 709cb790401SBram Moolenaar '\d DROP\_s*' .. 710cb790401SBram Moolenaar 'Test_disassemble_new()\_s*' .. 711cb790401SBram Moolenaar '\d DCALL Test_disassemble_new(argc 0)\_s*' .. 712cb790401SBram Moolenaar '\d DROP\_s*' .. 713cb790401SBram Moolenaar 'FuncWithArg(343)\_s*' .. 714cb790401SBram Moolenaar '\d\+ PUSHNR 343\_s*' .. 715cb790401SBram Moolenaar '\d\+ DCALL FuncWithArg(argc 1)\_s*' .. 716cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 717cb790401SBram Moolenaar 'ScriptFuncNew()\_s*' .. 718cb790401SBram Moolenaar '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' .. 719cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 720cb790401SBram Moolenaar 's:ScriptFuncNew()\_s*' .. 721cb790401SBram Moolenaar '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' .. 722cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 723cb790401SBram Moolenaar 'UserFunc()\_s*' .. 724cb790401SBram Moolenaar '\d\+ UCALL UserFunc(argc 0)\_s*' .. 725cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 726cb790401SBram Moolenaar 'UserFuncWithArg("foo")\_s*' .. 727cb790401SBram Moolenaar '\d\+ PUSHS "foo"\_s*' .. 728cb790401SBram Moolenaar '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' .. 729cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 730ac564082SBram Moolenaar 'var FuncRef = function("UserFunc")\_s*' .. 731cb790401SBram Moolenaar '\d\+ PUSHS "UserFunc"\_s*' .. 732cb790401SBram Moolenaar '\d\+ BCALL function(argc 1)\_s*' .. 733cb790401SBram Moolenaar '\d\+ STORE $0\_s*' .. 734cb790401SBram Moolenaar 'FuncRef()\_s*' .. 735cb790401SBram Moolenaar '\d\+ LOAD $\d\_s*' .. 736cb790401SBram Moolenaar '\d\+ PCALL (argc 0)\_s*' .. 737cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 738ac564082SBram Moolenaar 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' .. 739cb790401SBram Moolenaar '\d\+ PUSHS "UserFuncWithArg"\_s*' .. 740cb790401SBram Moolenaar '\d\+ BCALL function(argc 1)\_s*' .. 741cb790401SBram Moolenaar '\d\+ STORE $1\_s*' .. 742cb790401SBram Moolenaar 'FuncRefWithArg("bar")\_s*' .. 743cb790401SBram Moolenaar '\d\+ PUSHS "bar"\_s*' .. 744cb790401SBram Moolenaar '\d\+ LOAD $\d\_s*' .. 745cb790401SBram Moolenaar '\d\+ PCALL (argc 1)\_s*' .. 746cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 747cb790401SBram Moolenaar 'return "yes"\_s*' .. 748cb790401SBram Moolenaar '\d\+ PUSHS "yes"\_s*' .. 749cb790401SBram Moolenaar '\d\+ RETURN', 750675f716eSBram Moolenaar res) 7515cab73f8SBram Moolenaarenddef 7525cab73f8SBram Moolenaar 75385d5e2b7SBram Moolenaar 75485d5e2b7SBram Moolenaardef s:CreateRefs() 75585d5e2b7SBram Moolenaar var local = 'a' 75685d5e2b7SBram Moolenaar def Append(arg: string) 75785d5e2b7SBram Moolenaar local ..= arg 75885d5e2b7SBram Moolenaar enddef 75985d5e2b7SBram Moolenaar g:Append = Append 76085d5e2b7SBram Moolenaar def Get(): string 76185d5e2b7SBram Moolenaar return local 76285d5e2b7SBram Moolenaar enddef 76385d5e2b7SBram Moolenaar g:Get = Get 76485d5e2b7SBram Moolenaarenddef 76585d5e2b7SBram Moolenaar 76685d5e2b7SBram Moolenaardef Test_disassemble_closure() 76785d5e2b7SBram Moolenaar CreateRefs() 76885d5e2b7SBram Moolenaar var res = execute('disass g:Append') 76985d5e2b7SBram Moolenaar assert_match('<lambda>\d\_s*' .. 77085d5e2b7SBram Moolenaar 'local ..= arg\_s*' .. 771ab360526SBram Moolenaar '\d LOADOUTER level 1 $0\_s*' .. 77285d5e2b7SBram Moolenaar '\d LOAD arg\[-1\]\_s*' .. 77385d5e2b7SBram Moolenaar '\d CONCAT\_s*' .. 774ab360526SBram Moolenaar '\d STOREOUTER level 1 $0\_s*' .. 775f57b43c2SBram Moolenaar '\d RETURN void', 77685d5e2b7SBram Moolenaar res) 77785d5e2b7SBram Moolenaar 77885d5e2b7SBram Moolenaar res = execute('disass g:Get') 77985d5e2b7SBram Moolenaar assert_match('<lambda>\d\_s*' .. 78085d5e2b7SBram Moolenaar 'return local\_s*' .. 781ab360526SBram Moolenaar '\d LOADOUTER level 1 $0\_s*' .. 78285d5e2b7SBram Moolenaar '\d RETURN', 78385d5e2b7SBram Moolenaar res) 78485d5e2b7SBram Moolenaar 78585d5e2b7SBram Moolenaar unlet g:Append 78685d5e2b7SBram Moolenaar unlet g:Get 78785d5e2b7SBram Moolenaarenddef 788b68b346eSBram Moolenaar 7898ed04587SBram Moolenaar 790bd5da371SBram Moolenaardef EchoArg(arg: string): string 791bd5da371SBram Moolenaar return arg 792bd5da371SBram Moolenaarenddef 793bd5da371SBram Moolenaardef RefThis(): func 794bd5da371SBram Moolenaar return function('EchoArg') 795bd5da371SBram Moolenaarenddef 796bd5da371SBram Moolenaardef s:ScriptPCall() 797bd5da371SBram Moolenaar RefThis()("text") 798bd5da371SBram Moolenaarenddef 799bd5da371SBram Moolenaar 800bd5da371SBram Moolenaardef Test_disassemble_pcall() 801ac564082SBram Moolenaar var res = execute('disass s:ScriptPCall') 802cb790401SBram Moolenaar assert_match('<SNR>\d\+_ScriptPCall\_s*' .. 803cb790401SBram Moolenaar 'RefThis()("text")\_s*' .. 804cb790401SBram Moolenaar '\d DCALL RefThis(argc 0)\_s*' .. 805cb790401SBram Moolenaar '\d PUSHS "text"\_s*' .. 806cb790401SBram Moolenaar '\d PCALL top (argc 1)\_s*' .. 807cb790401SBram Moolenaar '\d PCALL end\_s*' .. 808cb790401SBram Moolenaar '\d DROP\_s*' .. 809f57b43c2SBram Moolenaar '\d RETURN void', 810675f716eSBram Moolenaar res) 811bd5da371SBram Moolenaarenddef 812bd5da371SBram Moolenaar 813bd5da371SBram Moolenaar 814a26b9700SBram Moolenaardef s:FuncWithForwardCall(): string 815a26b9700SBram Moolenaar return g:DefinedLater("yes") 8167eeefd4aSBram Moolenaarenddef 8177eeefd4aSBram Moolenaar 8187eeefd4aSBram Moolenaardef DefinedLater(arg: string): string 8197eeefd4aSBram Moolenaar return arg 8207eeefd4aSBram Moolenaarenddef 8217eeefd4aSBram Moolenaar 8227eeefd4aSBram Moolenaardef Test_disassemble_update_instr() 823ac564082SBram Moolenaar var res = execute('disass s:FuncWithForwardCall') 824cb790401SBram Moolenaar assert_match('FuncWithForwardCall\_s*' .. 825cb790401SBram Moolenaar 'return g:DefinedLater("yes")\_s*' .. 826cb790401SBram Moolenaar '\d PUSHS "yes"\_s*' .. 827822ba247SBram Moolenaar '\d DCALL DefinedLater(argc 1)\_s*' .. 828cb790401SBram Moolenaar '\d RETURN', 829675f716eSBram Moolenaar res) 8307eeefd4aSBram Moolenaar 831f5be8cdbSBram Moolenaar # Calling the function will change UCALL into the faster DCALL 8327eeefd4aSBram Moolenaar assert_equal('yes', FuncWithForwardCall()) 8337eeefd4aSBram Moolenaar 834a26b9700SBram Moolenaar res = execute('disass s:FuncWithForwardCall') 835cb790401SBram Moolenaar assert_match('FuncWithForwardCall\_s*' .. 836cb790401SBram Moolenaar 'return g:DefinedLater("yes")\_s*' .. 837cb790401SBram Moolenaar '\d PUSHS "yes"\_s*' .. 838cb790401SBram Moolenaar '\d DCALL DefinedLater(argc 1)\_s*' .. 839cb790401SBram Moolenaar '\d RETURN', 840675f716eSBram Moolenaar res) 8417eeefd4aSBram Moolenaarenddef 8427eeefd4aSBram Moolenaar 8437eeefd4aSBram Moolenaar 8449ce47ec0SBram Moolenaardef FuncWithDefault(l: number, arg: string = "default", nr = 77): string 84538a3bfa9SBram Moolenaar return arg .. nr 8468ed04587SBram Moolenaarenddef 8478ed04587SBram Moolenaar 8488ed04587SBram Moolenaardef Test_disassemble_call_default() 849ac564082SBram Moolenaar var res = execute('disass FuncWithDefault') 850cb790401SBram Moolenaar assert_match('FuncWithDefault\_s*' .. 8519ce47ec0SBram Moolenaar ' arg = "default"\_s*' .. 85238a3bfa9SBram Moolenaar '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' .. 853cb790401SBram Moolenaar '\d PUSHS "default"\_s*' .. 85438a3bfa9SBram Moolenaar '\d STORE arg\[-2]\_s*' .. 8559ce47ec0SBram Moolenaar ' nr = 77\_s*' .. 85638a3bfa9SBram Moolenaar '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' .. 85738a3bfa9SBram Moolenaar '\d PUSHNR 77\_s*' .. 858cb790401SBram Moolenaar '\d STORE arg\[-1]\_s*' .. 85938a3bfa9SBram Moolenaar ' return arg .. nr\_s*' .. 86038a3bfa9SBram Moolenaar '6 LOAD arg\[-2]\_s*' .. 861cb790401SBram Moolenaar '\d LOAD arg\[-1]\_s*' .. 86238a3bfa9SBram Moolenaar '\d 2STRING stack\[-1]\_s*' .. 86338a3bfa9SBram Moolenaar '\d\+ CONCAT\_s*' .. 86438a3bfa9SBram Moolenaar '\d\+ RETURN', 865675f716eSBram Moolenaar res) 8668ed04587SBram Moolenaarenddef 8678ed04587SBram Moolenaar 8688ed04587SBram Moolenaar 869158906cfSBram Moolenaardef HasEval() 870158906cfSBram Moolenaar if has("eval") 871158906cfSBram Moolenaar echo "yes" 872158906cfSBram Moolenaar else 873158906cfSBram Moolenaar echo "no" 874158906cfSBram Moolenaar endif 875158906cfSBram Moolenaarenddef 876158906cfSBram Moolenaar 877158906cfSBram Moolenaardef HasNothing() 878158906cfSBram Moolenaar if has("nothing") 879158906cfSBram Moolenaar echo "yes" 880158906cfSBram Moolenaar else 881158906cfSBram Moolenaar echo "no" 882158906cfSBram Moolenaar endif 883158906cfSBram Moolenaarenddef 884158906cfSBram Moolenaar 885158906cfSBram Moolenaardef HasSomething() 886158906cfSBram Moolenaar if has("nothing") 887158906cfSBram Moolenaar echo "nothing" 888158906cfSBram Moolenaar elseif has("something") 889158906cfSBram Moolenaar echo "something" 890158906cfSBram Moolenaar elseif has("eval") 891158906cfSBram Moolenaar echo "eval" 892158906cfSBram Moolenaar elseif has("less") 893158906cfSBram Moolenaar echo "less" 894158906cfSBram Moolenaar endif 895158906cfSBram Moolenaarenddef 896158906cfSBram Moolenaar 8978cebd43eSBram Moolenaardef HasGuiRunning() 8988cebd43eSBram Moolenaar if has("gui_running") 8998cebd43eSBram Moolenaar echo "yes" 9008cebd43eSBram Moolenaar else 9018cebd43eSBram Moolenaar echo "no" 9028cebd43eSBram Moolenaar endif 9038cebd43eSBram Moolenaarenddef 9048cebd43eSBram Moolenaar 905f2460a3aSBram Moolenaardef Test_disassemble_const_expr() 906d2c61705SBram Moolenaar assert_equal("\nyes", execute('HasEval()')) 907ac564082SBram Moolenaar var instr = execute('disassemble HasEval') 908cb790401SBram Moolenaar assert_match('HasEval\_s*' .. 909cb790401SBram Moolenaar 'if has("eval")\_s*' .. 910cb790401SBram Moolenaar 'echo "yes"\_s*' .. 911cb790401SBram Moolenaar '\d PUSHS "yes"\_s*' .. 912cb790401SBram Moolenaar '\d ECHO 1\_s*' .. 913cb790401SBram Moolenaar 'else\_s*' .. 914cb790401SBram Moolenaar 'echo "no"\_s*' .. 915cb790401SBram Moolenaar 'endif\_s*', 916675f716eSBram Moolenaar instr) 917158906cfSBram Moolenaar assert_notmatch('JUMP', instr) 918158906cfSBram Moolenaar 919d2c61705SBram Moolenaar assert_equal("\nno", execute('HasNothing()')) 920158906cfSBram Moolenaar instr = execute('disassemble HasNothing') 921cb790401SBram Moolenaar assert_match('HasNothing\_s*' .. 922cb790401SBram Moolenaar 'if has("nothing")\_s*' .. 923cb790401SBram Moolenaar 'echo "yes"\_s*' .. 924cb790401SBram Moolenaar 'else\_s*' .. 925cb790401SBram Moolenaar 'echo "no"\_s*' .. 926cb790401SBram Moolenaar '\d PUSHS "no"\_s*' .. 927cb790401SBram Moolenaar '\d ECHO 1\_s*' .. 928cb790401SBram Moolenaar 'endif', 929675f716eSBram Moolenaar instr) 930158906cfSBram Moolenaar assert_notmatch('PUSHS "yes"', instr) 931158906cfSBram Moolenaar assert_notmatch('JUMP', instr) 932158906cfSBram Moolenaar 933d2c61705SBram Moolenaar assert_equal("\neval", execute('HasSomething()')) 934158906cfSBram Moolenaar instr = execute('disassemble HasSomething') 935675f716eSBram Moolenaar assert_match('HasSomething.*' .. 936cb790401SBram Moolenaar 'if has("nothing")\_s*' .. 937cb790401SBram Moolenaar 'echo "nothing"\_s*' .. 938cb790401SBram Moolenaar 'elseif has("something")\_s*' .. 939cb790401SBram Moolenaar 'echo "something"\_s*' .. 940cb790401SBram Moolenaar 'elseif has("eval")\_s*' .. 941cb790401SBram Moolenaar 'echo "eval"\_s*' .. 942cb790401SBram Moolenaar '\d PUSHS "eval"\_s*' .. 943cb790401SBram Moolenaar '\d ECHO 1\_s*' .. 944cb790401SBram Moolenaar 'elseif has("less").*' .. 945cb790401SBram Moolenaar 'echo "less"\_s*' .. 946cb790401SBram Moolenaar 'endif', 947675f716eSBram Moolenaar instr) 948158906cfSBram Moolenaar assert_notmatch('PUSHS "nothing"', instr) 949158906cfSBram Moolenaar assert_notmatch('PUSHS "something"', instr) 950158906cfSBram Moolenaar assert_notmatch('PUSHS "less"', instr) 951158906cfSBram Moolenaar assert_notmatch('JUMP', instr) 9528cebd43eSBram Moolenaar 9538cebd43eSBram Moolenaar var result: string 9548cebd43eSBram Moolenaar var instr_expected: string 9558cebd43eSBram Moolenaar if has('gui') 9568cebd43eSBram Moolenaar if has('gui_running') 9578cebd43eSBram Moolenaar # GUI already running, always returns "yes" 9588cebd43eSBram Moolenaar result = "\nyes" 9598cebd43eSBram Moolenaar instr_expected = 'HasGuiRunning.*' .. 9608cebd43eSBram Moolenaar 'if has("gui_running")\_s*' .. 9618cebd43eSBram Moolenaar ' echo "yes"\_s*' .. 9628cebd43eSBram Moolenaar '\d PUSHS "yes"\_s*' .. 9638cebd43eSBram Moolenaar '\d ECHO 1\_s*' .. 9648cebd43eSBram Moolenaar 'else\_s*' .. 9658cebd43eSBram Moolenaar ' echo "no"\_s*' .. 9668cebd43eSBram Moolenaar 'endif' 9678cebd43eSBram Moolenaar else 9688cebd43eSBram Moolenaar result = "\nno" 9698cebd43eSBram Moolenaar if has('unix') 9708cebd43eSBram Moolenaar # GUI not running but can start later, call has() 9718cebd43eSBram Moolenaar instr_expected = 'HasGuiRunning.*' .. 9728cebd43eSBram Moolenaar 'if has("gui_running")\_s*' .. 9738cebd43eSBram Moolenaar '\d PUSHS "gui_running"\_s*' .. 9748cebd43eSBram Moolenaar '\d BCALL has(argc 1)\_s*' .. 975af8ea0d0SBram Moolenaar '\d COND2BOOL\_s*' .. 9768cebd43eSBram Moolenaar '\d JUMP_IF_FALSE -> \d\_s*' .. 9778cebd43eSBram Moolenaar ' echo "yes"\_s*' .. 9788cebd43eSBram Moolenaar '\d PUSHS "yes"\_s*' .. 9798cebd43eSBram Moolenaar '\d ECHO 1\_s*' .. 9808cebd43eSBram Moolenaar 'else\_s*' .. 9818cebd43eSBram Moolenaar '\d JUMP -> \d\_s*' .. 9828cebd43eSBram Moolenaar ' echo "no"\_s*' .. 9838cebd43eSBram Moolenaar '\d PUSHS "no"\_s*' .. 9848cebd43eSBram Moolenaar '\d ECHO 1\_s*' .. 9858cebd43eSBram Moolenaar 'endif' 9868cebd43eSBram Moolenaar else 9878cebd43eSBram Moolenaar # GUI not running, always return "no" 9888cebd43eSBram Moolenaar instr_expected = 'HasGuiRunning.*' .. 9898cebd43eSBram Moolenaar 'if has("gui_running")\_s*' .. 9908cebd43eSBram Moolenaar ' echo "yes"\_s*' .. 9918cebd43eSBram Moolenaar 'else\_s*' .. 9928cebd43eSBram Moolenaar ' echo "no"\_s*' .. 9938cebd43eSBram Moolenaar '\d PUSHS "no"\_s*' .. 9948cebd43eSBram Moolenaar '\d ECHO 1\_s*' .. 9958cebd43eSBram Moolenaar 'endif' 9968cebd43eSBram Moolenaar endif 9978cebd43eSBram Moolenaar endif 9988cebd43eSBram Moolenaar else 9998cebd43eSBram Moolenaar # GUI not supported, always return "no" 10008cebd43eSBram Moolenaar result = "\nno" 10018cebd43eSBram Moolenaar instr_expected = 'HasGuiRunning.*' .. 10028cebd43eSBram Moolenaar 'if has("gui_running")\_s*' .. 10038cebd43eSBram Moolenaar ' echo "yes"\_s*' .. 10048cebd43eSBram Moolenaar 'else\_s*' .. 10058cebd43eSBram Moolenaar ' echo "no"\_s*' .. 10068cebd43eSBram Moolenaar '\d PUSHS "no"\_s*' .. 10078cebd43eSBram Moolenaar '\d ECHO 1\_s*' .. 10088cebd43eSBram Moolenaar 'endif' 10098cebd43eSBram Moolenaar endif 10108cebd43eSBram Moolenaar 10118cebd43eSBram Moolenaar assert_equal(result, execute('HasGuiRunning()')) 10128cebd43eSBram Moolenaar instr = execute('disassemble HasGuiRunning') 10138cebd43eSBram Moolenaar assert_match(instr_expected, instr) 1014158906cfSBram Moolenaarenddef 1015158906cfSBram Moolenaar 1016efd88555SBram Moolenaardef ReturnInIf(): string 10178e02faf4SBram Moolenaar if 1 < 0 10188e02faf4SBram Moolenaar return "maybe" 10198e02faf4SBram Moolenaar endif 1020efd88555SBram Moolenaar if g:cond 1021efd88555SBram Moolenaar return "yes" 1022efd88555SBram Moolenaar else 1023efd88555SBram Moolenaar return "no" 1024efd88555SBram Moolenaar endif 1025efd88555SBram Moolenaarenddef 1026efd88555SBram Moolenaar 1027efd88555SBram Moolenaardef Test_disassemble_return_in_if() 1028ac564082SBram Moolenaar var instr = execute('disassemble ReturnInIf') 1029efd88555SBram Moolenaar assert_match('ReturnInIf\_s*' .. 10308e02faf4SBram Moolenaar 'if 1 < 0\_s*' .. 10318e02faf4SBram Moolenaar ' return "maybe"\_s*' .. 10328e02faf4SBram Moolenaar 'endif\_s*' .. 1033efd88555SBram Moolenaar 'if g:cond\_s*' .. 1034efd88555SBram Moolenaar '0 LOADG g:cond\_s*' .. 1035ea2d407fSBram Moolenaar '1 COND2BOOL\_s*' .. 1036ea2d407fSBram Moolenaar '2 JUMP_IF_FALSE -> 5\_s*' .. 1037efd88555SBram Moolenaar 'return "yes"\_s*' .. 1038ea2d407fSBram Moolenaar '3 PUSHS "yes"\_s*' .. 1039ea2d407fSBram Moolenaar '4 RETURN\_s*' .. 1040efd88555SBram Moolenaar 'else\_s*' .. 1041efd88555SBram Moolenaar ' return "no"\_s*' .. 1042ea2d407fSBram Moolenaar '5 PUSHS "no"\_s*' .. 1043ea2d407fSBram Moolenaar '6 RETURN$', 1044efd88555SBram Moolenaar instr) 1045efd88555SBram Moolenaarenddef 1046efd88555SBram Moolenaar 1047f51cb4e0SBram Moolenaardef WithFunc() 1048ac564082SBram Moolenaar var Funky1: func 1049ac564082SBram Moolenaar var Funky2: func = function("len") 1050ac564082SBram Moolenaar var Party2: func = funcref("UserFunc") 1051f51cb4e0SBram Moolenaarenddef 1052f51cb4e0SBram Moolenaar 1053f51cb4e0SBram Moolenaardef Test_disassemble_function() 1054ac564082SBram Moolenaar var instr = execute('disassemble WithFunc') 1055cb790401SBram Moolenaar assert_match('WithFunc\_s*' .. 1056ac564082SBram Moolenaar 'var Funky1: func\_s*' .. 1057cb790401SBram Moolenaar '0 PUSHFUNC "\[none]"\_s*' .. 1058cb790401SBram Moolenaar '1 STORE $0\_s*' .. 1059ac564082SBram Moolenaar 'var Funky2: func = function("len")\_s*' .. 1060cb790401SBram Moolenaar '2 PUSHS "len"\_s*' .. 1061cb790401SBram Moolenaar '3 BCALL function(argc 1)\_s*' .. 1062cb790401SBram Moolenaar '4 STORE $1\_s*' .. 1063ac564082SBram Moolenaar 'var Party2: func = funcref("UserFunc")\_s*' .. 1064cb790401SBram Moolenaar '\d PUSHS "UserFunc"\_s*' .. 1065cb790401SBram Moolenaar '\d BCALL funcref(argc 1)\_s*' .. 1066cb790401SBram Moolenaar '\d STORE $2\_s*' .. 1067f57b43c2SBram Moolenaar '\d RETURN void', 1068675f716eSBram Moolenaar instr) 1069f51cb4e0SBram Moolenaarenddef 1070f51cb4e0SBram Moolenaar 1071f51cb4e0SBram Moolenaarif has('channel') 1072f51cb4e0SBram Moolenaar def WithChannel() 1073ac564082SBram Moolenaar var job1: job 1074ac564082SBram Moolenaar var job2: job = job_start("donothing") 1075ac564082SBram Moolenaar var chan1: channel 1076f51cb4e0SBram Moolenaar enddef 1077f51cb4e0SBram Moolenaarendif 1078f51cb4e0SBram Moolenaar 1079f51cb4e0SBram Moolenaardef Test_disassemble_channel() 1080f51cb4e0SBram Moolenaar CheckFeature channel 1081f51cb4e0SBram Moolenaar 1082ac564082SBram Moolenaar var instr = execute('disassemble WithChannel') 1083cb790401SBram Moolenaar assert_match('WithChannel\_s*' .. 1084ac564082SBram Moolenaar 'var job1: job\_s*' .. 1085cb790401SBram Moolenaar '\d PUSHJOB "no process"\_s*' .. 1086cb790401SBram Moolenaar '\d STORE $0\_s*' .. 1087ac564082SBram Moolenaar 'var job2: job = job_start("donothing")\_s*' .. 1088cb790401SBram Moolenaar '\d PUSHS "donothing"\_s*' .. 1089cb790401SBram Moolenaar '\d BCALL job_start(argc 1)\_s*' .. 1090cb790401SBram Moolenaar '\d STORE $1\_s*' .. 1091ac564082SBram Moolenaar 'var chan1: channel\_s*' .. 1092cb790401SBram Moolenaar '\d PUSHCHANNEL 0\_s*' .. 1093cb790401SBram Moolenaar '\d STORE $2\_s*' .. 1094f57b43c2SBram Moolenaar '\d RETURN void', 1095675f716eSBram Moolenaar instr) 1096f51cb4e0SBram Moolenaarenddef 1097f51cb4e0SBram Moolenaar 1098777770fbSBram Moolenaardef WithLambda(): string 10992949cfdbSBram Moolenaar var F = (a) => "X" .. a .. "X" 1100777770fbSBram Moolenaar return F("x") 1101777770fbSBram Moolenaarenddef 1102777770fbSBram Moolenaar 1103f2460a3aSBram Moolenaardef Test_disassemble_lambda() 1104777770fbSBram Moolenaar assert_equal("XxX", WithLambda()) 1105ac564082SBram Moolenaar var instr = execute('disassemble WithLambda') 1106cb790401SBram Moolenaar assert_match('WithLambda\_s*' .. 11072949cfdbSBram Moolenaar 'var F = (a) => "X" .. a .. "X"\_s*' .. 1108148ce7aeSBram Moolenaar '\d FUNCREF <lambda>\d\+\_s*' .. 1109cb790401SBram Moolenaar '\d STORE $0\_s*' .. 1110cb790401SBram Moolenaar 'return F("x")\_s*' .. 1111cb790401SBram Moolenaar '\d PUSHS "x"\_s*' .. 1112cb790401SBram Moolenaar '\d LOAD $0\_s*' .. 1113cb790401SBram Moolenaar '\d PCALL (argc 1)\_s*' .. 1114822ba247SBram Moolenaar '\d RETURN', 1115675f716eSBram Moolenaar instr) 1116bfd65589SBram Moolenaar 1117ac564082SBram Moolenaar var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '') 1118bfd65589SBram Moolenaar instr = execute('disassemble ' .. name) 1119bfd65589SBram Moolenaar assert_match('<lambda>\d\+\_s*' .. 1120bfd65589SBram Moolenaar 'return "X" .. a .. "X"\_s*' .. 1121bfd65589SBram Moolenaar '\d PUSHS "X"\_s*' .. 1122bfd65589SBram Moolenaar '\d LOAD arg\[-1\]\_s*' .. 1123418f1df5SBram Moolenaar '\d 2STRING_ANY stack\[-1\]\_s*' .. 1124bfd65589SBram Moolenaar '\d CONCAT\_s*' .. 1125bfd65589SBram Moolenaar '\d PUSHS "X"\_s*' .. 1126bfd65589SBram Moolenaar '\d CONCAT\_s*' .. 1127bfd65589SBram Moolenaar '\d RETURN', 1128bfd65589SBram Moolenaar instr) 1129777770fbSBram Moolenaarenddef 1130777770fbSBram Moolenaar 1131b4d16cb1SBram Moolenaardef LambdaWithType(): number 11322949cfdbSBram Moolenaar var Ref = (a: number) => a + 10 1133b4d16cb1SBram Moolenaar return Ref(g:value) 1134b4d16cb1SBram Moolenaarenddef 1135b4d16cb1SBram Moolenaar 1136b4d16cb1SBram Moolenaardef Test_disassemble_lambda_with_type() 1137b4d16cb1SBram Moolenaar g:value = 5 1138b4d16cb1SBram Moolenaar assert_equal(15, LambdaWithType()) 1139b4d16cb1SBram Moolenaar var instr = execute('disassemble LambdaWithType') 1140b4d16cb1SBram Moolenaar assert_match('LambdaWithType\_s*' .. 11412949cfdbSBram Moolenaar 'var Ref = (a: number) => a + 10\_s*' .. 1142b4d16cb1SBram Moolenaar '\d FUNCREF <lambda>\d\+\_s*' .. 1143b4d16cb1SBram Moolenaar '\d STORE $0\_s*' .. 1144b4d16cb1SBram Moolenaar 'return Ref(g:value)\_s*' .. 1145b4d16cb1SBram Moolenaar '\d LOADG g:value\_s*' .. 1146b4d16cb1SBram Moolenaar '\d LOAD $0\_s*' .. 1147e32e516dSBram Moolenaar '\d CHECKTYPE number stack\[-2\] arg 1\_s*' .. 1148b4d16cb1SBram Moolenaar '\d PCALL (argc 1)\_s*' .. 1149b4d16cb1SBram Moolenaar '\d RETURN', 1150b4d16cb1SBram Moolenaar instr) 1151b4d16cb1SBram Moolenaarenddef 1152b4d16cb1SBram Moolenaar 115338ddf333SBram Moolenaardef NestedOuter() 115438ddf333SBram Moolenaar def g:Inner() 115538ddf333SBram Moolenaar echomsg "inner" 115638ddf333SBram Moolenaar enddef 115738ddf333SBram Moolenaarenddef 115838ddf333SBram Moolenaar 11598863bda2SBram Moolenaardef Test_disassemble_nested_func() 1160ac564082SBram Moolenaar var instr = execute('disassemble NestedOuter') 116138ddf333SBram Moolenaar assert_match('NestedOuter\_s*' .. 116238ddf333SBram Moolenaar 'def g:Inner()\_s*' .. 116338ddf333SBram Moolenaar 'echomsg "inner"\_s*' .. 116438ddf333SBram Moolenaar 'enddef\_s*' .. 116538ddf333SBram Moolenaar '\d NEWFUNC <lambda>\d\+ Inner\_s*' .. 1166f57b43c2SBram Moolenaar '\d RETURN void', 116738ddf333SBram Moolenaar instr) 116838ddf333SBram Moolenaarenddef 116938ddf333SBram Moolenaar 11706abdcf82SBram Moolenaardef NestedDefList() 11716abdcf82SBram Moolenaar def 11726abdcf82SBram Moolenaar def Info 11736abdcf82SBram Moolenaar def /Info 11746abdcf82SBram Moolenaar def /Info/ 11756abdcf82SBram Moolenaarenddef 11766abdcf82SBram Moolenaar 11778863bda2SBram Moolenaardef Test_disassemble_nested_def_list() 11786abdcf82SBram Moolenaar var instr = execute('disassemble NestedDefList') 11796abdcf82SBram Moolenaar assert_match('NestedDefList\_s*' .. 11806abdcf82SBram Moolenaar 'def\_s*' .. 11816abdcf82SBram Moolenaar '\d DEF \_s*' .. 11826abdcf82SBram Moolenaar 'def Info\_s*' .. 11836abdcf82SBram Moolenaar '\d DEF Info\_s*' .. 11846abdcf82SBram Moolenaar 'def /Info\_s*' .. 11856abdcf82SBram Moolenaar '\d DEF /Info\_s*' .. 11866abdcf82SBram Moolenaar 'def /Info/\_s*' .. 11876abdcf82SBram Moolenaar '\d DEF /Info/\_s*' .. 1188f57b43c2SBram Moolenaar '\d RETURN void', 11896abdcf82SBram Moolenaar instr) 11906abdcf82SBram Moolenaarenddef 11916abdcf82SBram Moolenaar 11926e949784SBram Moolenaardef AndOr(arg: any): string 1193777770fbSBram Moolenaar if arg == 1 && arg != 2 || arg == 4 1194777770fbSBram Moolenaar return 'yes' 1195777770fbSBram Moolenaar endif 1196777770fbSBram Moolenaar return 'no' 1197777770fbSBram Moolenaarenddef 1198777770fbSBram Moolenaar 1199f2460a3aSBram Moolenaardef Test_disassemble_and_or() 1200777770fbSBram Moolenaar assert_equal("yes", AndOr(1)) 1201777770fbSBram Moolenaar assert_equal("no", AndOr(2)) 1202777770fbSBram Moolenaar assert_equal("yes", AndOr(4)) 1203ac564082SBram Moolenaar var instr = execute('disassemble AndOr') 1204cb790401SBram Moolenaar assert_match('AndOr\_s*' .. 1205cb790401SBram Moolenaar 'if arg == 1 && arg != 2 || arg == 4\_s*' .. 1206cb790401SBram Moolenaar '\d LOAD arg\[-1]\_s*' .. 1207cb790401SBram Moolenaar '\d PUSHNR 1\_s*' .. 1208cb790401SBram Moolenaar '\d COMPAREANY ==\_s*' .. 12092bb2658bSBram Moolenaar '\d JUMP_IF_COND_FALSE -> \d\+\_s*' .. 1210cb790401SBram Moolenaar '\d LOAD arg\[-1]\_s*' .. 1211cb790401SBram Moolenaar '\d PUSHNR 2\_s*' .. 1212cb790401SBram Moolenaar '\d COMPAREANY !=\_s*' .. 12132bb2658bSBram Moolenaar '\d JUMP_IF_COND_TRUE -> \d\+\_s*' .. 1214cb790401SBram Moolenaar '\d LOAD arg\[-1]\_s*' .. 1215cb790401SBram Moolenaar '\d\+ PUSHNR 4\_s*' .. 1216cb790401SBram Moolenaar '\d\+ COMPAREANY ==\_s*' .. 1217cb790401SBram Moolenaar '\d\+ JUMP_IF_FALSE -> \d\+', 1218675f716eSBram Moolenaar instr) 1219777770fbSBram Moolenaarenddef 1220777770fbSBram Moolenaar 1221*1a7ee4ddSBram Moolenaardef AndConstant(arg: any): string 1222*1a7ee4ddSBram Moolenaar if true && arg 1223*1a7ee4ddSBram Moolenaar return "yes" 1224*1a7ee4ddSBram Moolenaar endif 1225*1a7ee4ddSBram Moolenaar if false && arg 1226*1a7ee4ddSBram Moolenaar return "never" 1227*1a7ee4ddSBram Moolenaar endif 1228*1a7ee4ddSBram Moolenaar return "no" 1229*1a7ee4ddSBram Moolenaarenddef 1230*1a7ee4ddSBram Moolenaar 1231*1a7ee4ddSBram Moolenaardef Test_disassemble_and_constant() 1232*1a7ee4ddSBram Moolenaar assert_equal("yes", AndConstant(1)) 1233*1a7ee4ddSBram Moolenaar assert_equal("no", AndConstant(false)) 1234*1a7ee4ddSBram Moolenaar var instr = execute('disassemble AndConstant') 1235*1a7ee4ddSBram Moolenaar assert_match('AndConstant\_s*' .. 1236*1a7ee4ddSBram Moolenaar 'if true && arg\_s*' .. 1237*1a7ee4ddSBram Moolenaar '0 LOAD arg\[-1\]\_s*' .. 1238*1a7ee4ddSBram Moolenaar '1 COND2BOOL\_s*' .. 1239*1a7ee4ddSBram Moolenaar '2 JUMP_IF_FALSE -> 5\_s*' .. 1240*1a7ee4ddSBram Moolenaar 'return "yes"\_s*' .. 1241*1a7ee4ddSBram Moolenaar '3 PUSHS "yes"\_s*' .. 1242*1a7ee4ddSBram Moolenaar '4 RETURN\_s*' .. 1243*1a7ee4ddSBram Moolenaar 'endif\_s*' .. 1244*1a7ee4ddSBram Moolenaar 'if false && arg\_s*' .. 1245*1a7ee4ddSBram Moolenaar 'return "never"\_s*' .. 1246*1a7ee4ddSBram Moolenaar 'endif\_s*' .. 1247*1a7ee4ddSBram Moolenaar 'return "no"\_s*' .. 1248*1a7ee4ddSBram Moolenaar '5 PUSHS "no"\_s*' .. 1249*1a7ee4ddSBram Moolenaar '6 RETURN', 1250*1a7ee4ddSBram Moolenaar instr) 1251*1a7ee4ddSBram Moolenaarenddef 1252*1a7ee4ddSBram Moolenaar 125304d05220SBram Moolenaardef ForLoop(): list<number> 1254ac564082SBram Moolenaar var res: list<number> 125504d05220SBram Moolenaar for i in range(3) 125604d05220SBram Moolenaar res->add(i) 125704d05220SBram Moolenaar endfor 125804d05220SBram Moolenaar return res 125904d05220SBram Moolenaarenddef 126004d05220SBram Moolenaar 1261f2460a3aSBram Moolenaardef Test_disassemble_for_loop() 126204d05220SBram Moolenaar assert_equal([0, 1, 2], ForLoop()) 1263ac564082SBram Moolenaar var instr = execute('disassemble ForLoop') 1264cb790401SBram Moolenaar assert_match('ForLoop\_s*' .. 1265ac564082SBram Moolenaar 'var res: list<number>\_s*' .. 1266cb790401SBram Moolenaar '\d NEWLIST size 0\_s*' .. 1267aa210a3aSBram Moolenaar '\d SETTYPE list<number>\_s*' .. 1268cb790401SBram Moolenaar '\d STORE $0\_s*' .. 1269cb790401SBram Moolenaar 'for i in range(3)\_s*' .. 1270cb790401SBram Moolenaar '\d STORE -1 in $1\_s*' .. 1271cb790401SBram Moolenaar '\d PUSHNR 3\_s*' .. 1272cb790401SBram Moolenaar '\d BCALL range(argc 1)\_s*' .. 1273cb790401SBram Moolenaar '\d FOR $1 -> \d\+\_s*' .. 1274cb790401SBram Moolenaar '\d STORE $2\_s*' .. 1275cb790401SBram Moolenaar 'res->add(i)\_s*' .. 1276cb790401SBram Moolenaar '\d LOAD $0\_s*' .. 1277cb790401SBram Moolenaar '\d LOAD $2\_s*' .. 12781dcae599SBram Moolenaar '\d\+ LISTAPPEND\_s*' .. 1279cb790401SBram Moolenaar '\d\+ DROP\_s*' .. 1280cb790401SBram Moolenaar 'endfor\_s*' .. 1281cb790401SBram Moolenaar '\d\+ JUMP -> \d\+\_s*' .. 1282cb790401SBram Moolenaar '\d\+ DROP', 1283675f716eSBram Moolenaar instr) 128404d05220SBram Moolenaarenddef 128504d05220SBram Moolenaar 12860ad3e894SBram Moolenaardef ForLoopEval(): string 1287ac564082SBram Moolenaar var res = "" 12880ad3e894SBram Moolenaar for str in eval('["one", "two"]') 12890ad3e894SBram Moolenaar res ..= str 12900ad3e894SBram Moolenaar endfor 12910ad3e894SBram Moolenaar return res 12920ad3e894SBram Moolenaarenddef 12930ad3e894SBram Moolenaar 12940ad3e894SBram Moolenaardef Test_disassemble_for_loop_eval() 12950ad3e894SBram Moolenaar assert_equal('onetwo', ForLoopEval()) 1296ac564082SBram Moolenaar var instr = execute('disassemble ForLoopEval') 12970ad3e894SBram Moolenaar assert_match('ForLoopEval\_s*' .. 1298ac564082SBram Moolenaar 'var res = ""\_s*' .. 12990ad3e894SBram Moolenaar '\d PUSHS ""\_s*' .. 13000ad3e894SBram Moolenaar '\d STORE $0\_s*' .. 13010ad3e894SBram Moolenaar 'for str in eval(''\["one", "two"\]'')\_s*' .. 13020ad3e894SBram Moolenaar '\d STORE -1 in $1\_s*' .. 13030ad3e894SBram Moolenaar '\d PUSHS "\["one", "two"\]"\_s*' .. 13040ad3e894SBram Moolenaar '\d BCALL eval(argc 1)\_s*' .. 13050ad3e894SBram Moolenaar '\d FOR $1 -> \d\+\_s*' .. 13060ad3e894SBram Moolenaar '\d STORE $2\_s*' .. 13070ad3e894SBram Moolenaar 'res ..= str\_s*' .. 13080ad3e894SBram Moolenaar '\d\+ LOAD $0\_s*' .. 13090ad3e894SBram Moolenaar '\d\+ LOAD $2\_s*' .. 1310f5d52c90SBram Moolenaar '\d 2STRING_ANY stack\[-1\]\_s*' .. 13110ad3e894SBram Moolenaar '\d\+ CONCAT\_s*' .. 13120ad3e894SBram Moolenaar '\d\+ STORE $0\_s*' .. 13130ad3e894SBram Moolenaar 'endfor\_s*' .. 131474e54fcbSBram Moolenaar '\d\+ JUMP -> 5\_s*' .. 13150ad3e894SBram Moolenaar '\d\+ DROP\_s*' .. 13160ad3e894SBram Moolenaar 'return res\_s*' .. 13170ad3e894SBram Moolenaar '\d\+ LOAD $0\_s*' .. 13180ad3e894SBram Moolenaar '\d\+ RETURN', 13190ad3e894SBram Moolenaar instr) 13200ad3e894SBram Moolenaarenddef 13210ad3e894SBram Moolenaar 1322792f786aSBram Moolenaardef ForLoopUnpack() 1323792f786aSBram Moolenaar for [x1, x2] in [[1, 2], [3, 4]] 1324792f786aSBram Moolenaar echo x1 x2 1325792f786aSBram Moolenaar endfor 1326792f786aSBram Moolenaarenddef 1327792f786aSBram Moolenaar 1328792f786aSBram Moolenaardef Test_disassemble_for_loop_unpack() 1329792f786aSBram Moolenaar var instr = execute('disassemble ForLoopUnpack') 1330792f786aSBram Moolenaar assert_match('ForLoopUnpack\_s*' .. 1331792f786aSBram Moolenaar 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' .. 1332792f786aSBram Moolenaar '\d\+ STORE -1 in $0\_s*' .. 1333792f786aSBram Moolenaar '\d\+ PUSHNR 1\_s*' .. 1334792f786aSBram Moolenaar '\d\+ PUSHNR 2\_s*' .. 1335792f786aSBram Moolenaar '\d\+ NEWLIST size 2\_s*' .. 1336792f786aSBram Moolenaar '\d\+ PUSHNR 3\_s*' .. 1337792f786aSBram Moolenaar '\d\+ PUSHNR 4\_s*' .. 1338792f786aSBram Moolenaar '\d\+ NEWLIST size 2\_s*' .. 1339792f786aSBram Moolenaar '\d\+ NEWLIST size 2\_s*' .. 1340792f786aSBram Moolenaar '\d\+ FOR $0 -> 16\_s*' .. 1341792f786aSBram Moolenaar '\d\+ UNPACK 2\_s*' .. 1342792f786aSBram Moolenaar '\d\+ STORE $1\_s*' .. 1343792f786aSBram Moolenaar '\d\+ STORE $2\_s*' .. 1344792f786aSBram Moolenaar 'echo x1 x2\_s*' .. 1345792f786aSBram Moolenaar '\d\+ LOAD $1\_s*' .. 1346792f786aSBram Moolenaar '\d\+ LOAD $2\_s*' .. 1347792f786aSBram Moolenaar '\d\+ ECHO 2\_s*' .. 1348792f786aSBram Moolenaar 'endfor\_s*' .. 1349792f786aSBram Moolenaar '\d\+ JUMP -> 8\_s*' .. 1350792f786aSBram Moolenaar '\d\+ DROP\_s*' .. 1351f57b43c2SBram Moolenaar '\d\+ RETURN void', 1352792f786aSBram Moolenaar instr) 1353792f786aSBram Moolenaarenddef 1354792f786aSBram Moolenaar 1355c150c09eSBram Moolenaardef ForLoopContinue() 1356c150c09eSBram Moolenaar for nr in [1, 2] 1357c150c09eSBram Moolenaar try 1358c150c09eSBram Moolenaar echo "ok" 1359c150c09eSBram Moolenaar try 1360c150c09eSBram Moolenaar echo "deeper" 1361c150c09eSBram Moolenaar catch 1362c150c09eSBram Moolenaar continue 1363c150c09eSBram Moolenaar endtry 1364c150c09eSBram Moolenaar catch 1365c150c09eSBram Moolenaar echo "not ok" 1366c150c09eSBram Moolenaar endtry 1367c150c09eSBram Moolenaar endfor 1368c150c09eSBram Moolenaarenddef 1369c150c09eSBram Moolenaar 1370c150c09eSBram Moolenaardef Test_disassemble_for_loop_continue() 1371c150c09eSBram Moolenaar var instr = execute('disassemble ForLoopContinue') 1372c150c09eSBram Moolenaar assert_match('ForLoopContinue\_s*' .. 1373c150c09eSBram Moolenaar 'for nr in \[1, 2]\_s*' .. 1374c150c09eSBram Moolenaar '0 STORE -1 in $0\_s*' .. 1375c150c09eSBram Moolenaar '1 PUSHNR 1\_s*' .. 1376c150c09eSBram Moolenaar '2 PUSHNR 2\_s*' .. 1377c150c09eSBram Moolenaar '3 NEWLIST size 2\_s*' .. 1378c150c09eSBram Moolenaar '4 FOR $0 -> 22\_s*' .. 1379c150c09eSBram Moolenaar '5 STORE $1\_s*' .. 1380c150c09eSBram Moolenaar 'try\_s*' .. 13817e82c5f3SBram Moolenaar '6 TRY catch -> 17, endtry -> 20\_s*' .. 1382c150c09eSBram Moolenaar 'echo "ok"\_s*' .. 1383c150c09eSBram Moolenaar '7 PUSHS "ok"\_s*' .. 1384c150c09eSBram Moolenaar '8 ECHO 1\_s*' .. 1385c150c09eSBram Moolenaar 'try\_s*' .. 13867e82c5f3SBram Moolenaar '9 TRY catch -> 13, endtry -> 15\_s*' .. 1387c150c09eSBram Moolenaar 'echo "deeper"\_s*' .. 1388c150c09eSBram Moolenaar '10 PUSHS "deeper"\_s*' .. 1389c150c09eSBram Moolenaar '11 ECHO 1\_s*' .. 1390c150c09eSBram Moolenaar 'catch\_s*' .. 1391c150c09eSBram Moolenaar '12 JUMP -> 15\_s*' .. 1392c150c09eSBram Moolenaar '13 CATCH\_s*' .. 1393c150c09eSBram Moolenaar 'continue\_s*' .. 1394c150c09eSBram Moolenaar '14 TRY-CONTINUE 2 levels -> 4\_s*' .. 1395c150c09eSBram Moolenaar 'endtry\_s*' .. 1396c150c09eSBram Moolenaar '15 ENDTRY\_s*' .. 1397c150c09eSBram Moolenaar 'catch\_s*' .. 1398c150c09eSBram Moolenaar '16 JUMP -> 20\_s*' .. 1399c150c09eSBram Moolenaar '17 CATCH\_s*' .. 1400c150c09eSBram Moolenaar 'echo "not ok"\_s*' .. 1401c150c09eSBram Moolenaar '18 PUSHS "not ok"\_s*' .. 1402c150c09eSBram Moolenaar '19 ECHO 1\_s*' .. 1403c150c09eSBram Moolenaar 'endtry\_s*' .. 1404c150c09eSBram Moolenaar '20 ENDTRY\_s*' .. 1405c150c09eSBram Moolenaar 'endfor\_s*' .. 1406c150c09eSBram Moolenaar '21 JUMP -> 4\_s*' .. 1407c150c09eSBram Moolenaar '\d\+ DROP\_s*' .. 1408f57b43c2SBram Moolenaar '\d\+ RETURN void', 1409c150c09eSBram Moolenaar instr) 1410c150c09eSBram Moolenaarenddef 1411c150c09eSBram Moolenaar 1412c2a4b35bSBram Moolenaarlet g:number = 42 1413c2a4b35bSBram Moolenaar 141464d662d5SBram Moolenaardef TypeCast() 1415ac564082SBram Moolenaar var l: list<number> = [23, <number>g:number] 141664d662d5SBram Moolenaarenddef 141764d662d5SBram Moolenaar 141864d662d5SBram Moolenaardef Test_disassemble_typecast() 1419ac564082SBram Moolenaar var instr = execute('disassemble TypeCast') 142064d662d5SBram Moolenaar assert_match('TypeCast.*' .. 1421ac564082SBram Moolenaar 'var l: list<number> = \[23, <number>g:number\].*' .. 142264d662d5SBram Moolenaar '\d PUSHNR 23\_s*' .. 142364d662d5SBram Moolenaar '\d LOADG g:number\_s*' .. 142464d662d5SBram Moolenaar '\d CHECKTYPE number stack\[-1\]\_s*' .. 142564d662d5SBram Moolenaar '\d NEWLIST size 2\_s*' .. 1426aa210a3aSBram Moolenaar '\d SETTYPE list<number>\_s*' .. 142764d662d5SBram Moolenaar '\d STORE $0\_s*' .. 1428f57b43c2SBram Moolenaar '\d RETURN void\_s*', 142964d662d5SBram Moolenaar instr) 143064d662d5SBram Moolenaarenddef 143164d662d5SBram Moolenaar 1432c2a4b35bSBram Moolenaardef Computing() 1433ac564082SBram Moolenaar var nr = 3 1434ac564082SBram Moolenaar var nrres = nr + 7 1435c2a4b35bSBram Moolenaar nrres = nr - 7 1436c2a4b35bSBram Moolenaar nrres = nr * 7 1437c2a4b35bSBram Moolenaar nrres = nr / 7 1438c2a4b35bSBram Moolenaar nrres = nr % 7 1439c2a4b35bSBram Moolenaar 1440ac564082SBram Moolenaar var anyres = g:number + 7 1441c2a4b35bSBram Moolenaar anyres = g:number - 7 1442c2a4b35bSBram Moolenaar anyres = g:number * 7 1443c2a4b35bSBram Moolenaar anyres = g:number / 7 1444c2a4b35bSBram Moolenaar anyres = g:number % 7 1445c2a4b35bSBram Moolenaar 1446c2a4b35bSBram Moolenaar if has('float') 1447ac564082SBram Moolenaar var fl = 3.0 1448ac564082SBram Moolenaar var flres = fl + 7.0 1449c2a4b35bSBram Moolenaar flres = fl - 7.0 1450c2a4b35bSBram Moolenaar flres = fl * 7.0 1451c2a4b35bSBram Moolenaar flres = fl / 7.0 1452c2a4b35bSBram Moolenaar endif 1453c2a4b35bSBram Moolenaarenddef 1454c2a4b35bSBram Moolenaar 1455f2460a3aSBram Moolenaardef Test_disassemble_computing() 1456ac564082SBram Moolenaar var instr = execute('disassemble Computing') 1457675f716eSBram Moolenaar assert_match('Computing.*' .. 1458ac564082SBram Moolenaar 'var nr = 3.*' .. 1459675f716eSBram Moolenaar '\d STORE 3 in $0.*' .. 1460ac564082SBram Moolenaar 'var nrres = nr + 7.*' .. 1461675f716eSBram Moolenaar '\d LOAD $0.*' .. 1462675f716eSBram Moolenaar '\d PUSHNR 7.*' .. 1463675f716eSBram Moolenaar '\d OPNR +.*' .. 1464675f716eSBram Moolenaar '\d STORE $1.*' .. 1465675f716eSBram Moolenaar 'nrres = nr - 7.*' .. 1466675f716eSBram Moolenaar '\d OPNR -.*' .. 1467675f716eSBram Moolenaar 'nrres = nr \* 7.*' .. 1468675f716eSBram Moolenaar '\d OPNR \*.*' .. 1469675f716eSBram Moolenaar 'nrres = nr / 7.*' .. 1470675f716eSBram Moolenaar '\d OPNR /.*' .. 1471675f716eSBram Moolenaar 'nrres = nr % 7.*' .. 1472675f716eSBram Moolenaar '\d OPNR %.*' .. 1473ac564082SBram Moolenaar 'var anyres = g:number + 7.*' .. 1474675f716eSBram Moolenaar '\d LOADG g:number.*' .. 1475675f716eSBram Moolenaar '\d PUSHNR 7.*' .. 1476675f716eSBram Moolenaar '\d OPANY +.*' .. 1477675f716eSBram Moolenaar '\d STORE $2.*' .. 1478675f716eSBram Moolenaar 'anyres = g:number - 7.*' .. 1479675f716eSBram Moolenaar '\d OPANY -.*' .. 1480675f716eSBram Moolenaar 'anyres = g:number \* 7.*' .. 1481675f716eSBram Moolenaar '\d OPANY \*.*' .. 1482675f716eSBram Moolenaar 'anyres = g:number / 7.*' .. 1483675f716eSBram Moolenaar '\d OPANY /.*' .. 1484675f716eSBram Moolenaar 'anyres = g:number % 7.*' .. 1485675f716eSBram Moolenaar '\d OPANY %.*', 1486675f716eSBram Moolenaar instr) 1487c2a4b35bSBram Moolenaar if has('float') 1488675f716eSBram Moolenaar assert_match('Computing.*' .. 1489ac564082SBram Moolenaar 'var fl = 3.0.*' .. 1490675f716eSBram Moolenaar '\d PUSHF 3.0.*' .. 1491675f716eSBram Moolenaar '\d STORE $3.*' .. 1492ac564082SBram Moolenaar 'var flres = fl + 7.0.*' .. 1493675f716eSBram Moolenaar '\d LOAD $3.*' .. 1494675f716eSBram Moolenaar '\d PUSHF 7.0.*' .. 1495675f716eSBram Moolenaar '\d OPFLOAT +.*' .. 1496675f716eSBram Moolenaar '\d STORE $4.*' .. 1497675f716eSBram Moolenaar 'flres = fl - 7.0.*' .. 1498675f716eSBram Moolenaar '\d OPFLOAT -.*' .. 1499675f716eSBram Moolenaar 'flres = fl \* 7.0.*' .. 1500675f716eSBram Moolenaar '\d OPFLOAT \*.*' .. 1501675f716eSBram Moolenaar 'flres = fl / 7.0.*' .. 1502675f716eSBram Moolenaar '\d OPFLOAT /.*', 1503675f716eSBram Moolenaar instr) 1504c2a4b35bSBram Moolenaar endif 1505c2a4b35bSBram Moolenaarenddef 15065cab73f8SBram Moolenaar 1507ee2e52aaSBram Moolenaardef AddListBlob() 1508ac564082SBram Moolenaar var reslist = [1, 2] + [3, 4] 1509ac564082SBram Moolenaar var resblob = 0z1122 + 0z3344 1510ee2e52aaSBram Moolenaarenddef 1511ee2e52aaSBram Moolenaar 1512ee2e52aaSBram Moolenaardef Test_disassemble_add_list_blob() 1513ac564082SBram Moolenaar var instr = execute('disassemble AddListBlob') 1514675f716eSBram Moolenaar assert_match('AddListBlob.*' .. 1515ac564082SBram Moolenaar 'var reslist = \[1, 2] + \[3, 4].*' .. 1516675f716eSBram Moolenaar '\d PUSHNR 1.*' .. 1517675f716eSBram Moolenaar '\d PUSHNR 2.*' .. 1518675f716eSBram Moolenaar '\d NEWLIST size 2.*' .. 1519675f716eSBram Moolenaar '\d PUSHNR 3.*' .. 1520675f716eSBram Moolenaar '\d PUSHNR 4.*' .. 1521675f716eSBram Moolenaar '\d NEWLIST size 2.*' .. 1522675f716eSBram Moolenaar '\d ADDLIST.*' .. 1523675f716eSBram Moolenaar '\d STORE $.*.*' .. 1524ac564082SBram Moolenaar 'var resblob = 0z1122 + 0z3344.*' .. 1525675f716eSBram Moolenaar '\d PUSHBLOB 0z1122.*' .. 1526675f716eSBram Moolenaar '\d PUSHBLOB 0z3344.*' .. 1527675f716eSBram Moolenaar '\d ADDBLOB.*' .. 1528675f716eSBram Moolenaar '\d STORE $.*', 1529675f716eSBram Moolenaar instr) 1530ee2e52aaSBram Moolenaarenddef 1531ee2e52aaSBram Moolenaar 1532ee2e52aaSBram Moolenaarlet g:aa = 'aa' 1533ee2e52aaSBram Moolenaardef ConcatString(): string 1534ac564082SBram Moolenaar var res = g:aa .. "bb" 1535ee2e52aaSBram Moolenaar return res 1536ee2e52aaSBram Moolenaarenddef 1537ee2e52aaSBram Moolenaar 1538ee2e52aaSBram Moolenaardef Test_disassemble_concat() 1539ac564082SBram Moolenaar var instr = execute('disassemble ConcatString') 1540675f716eSBram Moolenaar assert_match('ConcatString.*' .. 1541ac564082SBram Moolenaar 'var res = g:aa .. "bb".*' .. 1542675f716eSBram Moolenaar '\d LOADG g:aa.*' .. 1543675f716eSBram Moolenaar '\d PUSHS "bb".*' .. 1544418f1df5SBram Moolenaar '\d 2STRING_ANY stack\[-2].*' .. 1545675f716eSBram Moolenaar '\d CONCAT.*' .. 1546675f716eSBram Moolenaar '\d STORE $.*', 1547675f716eSBram Moolenaar instr) 1548ee2e52aaSBram Moolenaar assert_equal('aabb', ConcatString()) 1549ee2e52aaSBram Moolenaarenddef 1550ee2e52aaSBram Moolenaar 155111107babSBram Moolenaardef StringIndex(): string 1552ac564082SBram Moolenaar var s = "abcd" 1553ac564082SBram Moolenaar var res = s[1] 1554747f11adSBram Moolenaar return res 1555747f11adSBram Moolenaarenddef 1556747f11adSBram Moolenaar 1557747f11adSBram Moolenaardef Test_disassemble_string_index() 1558ac564082SBram Moolenaar var instr = execute('disassemble StringIndex') 1559747f11adSBram Moolenaar assert_match('StringIndex\_s*' .. 1560ac564082SBram Moolenaar 'var s = "abcd"\_s*' .. 1561747f11adSBram Moolenaar '\d PUSHS "abcd"\_s*' .. 1562747f11adSBram Moolenaar '\d STORE $0\_s*' .. 1563ac564082SBram Moolenaar 'var res = s\[1]\_s*' .. 1564747f11adSBram Moolenaar '\d LOAD $0\_s*' .. 1565747f11adSBram Moolenaar '\d PUSHNR 1\_s*' .. 1566747f11adSBram Moolenaar '\d STRINDEX\_s*' .. 1567747f11adSBram Moolenaar '\d STORE $1\_s*', 1568747f11adSBram Moolenaar instr) 1569747f11adSBram Moolenaar assert_equal('b', StringIndex()) 1570747f11adSBram Moolenaarenddef 1571747f11adSBram Moolenaar 1572ed591877SBram Moolenaardef StringSlice(): string 1573ac564082SBram Moolenaar var s = "abcd" 1574ac564082SBram Moolenaar var res = s[1 : 8] 1575ed591877SBram Moolenaar return res 1576ed591877SBram Moolenaarenddef 1577ed591877SBram Moolenaar 1578ed591877SBram Moolenaardef Test_disassemble_string_slice() 1579ac564082SBram Moolenaar var instr = execute('disassemble StringSlice') 1580ed591877SBram Moolenaar assert_match('StringSlice\_s*' .. 1581ac564082SBram Moolenaar 'var s = "abcd"\_s*' .. 1582ed591877SBram Moolenaar '\d PUSHS "abcd"\_s*' .. 1583ed591877SBram Moolenaar '\d STORE $0\_s*' .. 1584ac564082SBram Moolenaar 'var res = s\[1 : 8]\_s*' .. 1585ed591877SBram Moolenaar '\d LOAD $0\_s*' .. 1586ed591877SBram Moolenaar '\d PUSHNR 1\_s*' .. 1587ed591877SBram Moolenaar '\d PUSHNR 8\_s*' .. 1588ed591877SBram Moolenaar '\d STRSLICE\_s*' .. 1589ed591877SBram Moolenaar '\d STORE $1\_s*', 1590ed591877SBram Moolenaar instr) 1591ed591877SBram Moolenaar assert_equal('bcd', StringSlice()) 1592ed591877SBram Moolenaarenddef 1593ed591877SBram Moolenaar 1594ee2e52aaSBram Moolenaardef ListIndex(): number 1595ac564082SBram Moolenaar var l = [1, 2, 3] 1596ac564082SBram Moolenaar var res = l[1] 1597ee2e52aaSBram Moolenaar return res 1598ee2e52aaSBram Moolenaarenddef 1599ee2e52aaSBram Moolenaar 1600ee2e52aaSBram Moolenaardef Test_disassemble_list_index() 1601ac564082SBram Moolenaar var instr = execute('disassemble ListIndex') 16024902ab16SBram Moolenaar assert_match('ListIndex\_s*' .. 1603ac564082SBram Moolenaar 'var l = \[1, 2, 3]\_s*' .. 16044902ab16SBram Moolenaar '\d PUSHNR 1\_s*' .. 16054902ab16SBram Moolenaar '\d PUSHNR 2\_s*' .. 16064902ab16SBram Moolenaar '\d PUSHNR 3\_s*' .. 16074902ab16SBram Moolenaar '\d NEWLIST size 3\_s*' .. 16084902ab16SBram Moolenaar '\d STORE $0\_s*' .. 1609ac564082SBram Moolenaar 'var res = l\[1]\_s*' .. 16104902ab16SBram Moolenaar '\d LOAD $0\_s*' .. 16114902ab16SBram Moolenaar '\d PUSHNR 1\_s*' .. 1612747f11adSBram Moolenaar '\d LISTINDEX\_s*' .. 16134902ab16SBram Moolenaar '\d STORE $1\_s*', 1614675f716eSBram Moolenaar instr) 1615ee2e52aaSBram Moolenaar assert_equal(2, ListIndex()) 1616ee2e52aaSBram Moolenaarenddef 1617ee2e52aaSBram Moolenaar 1618ed591877SBram Moolenaardef ListSlice(): list<number> 1619ac564082SBram Moolenaar var l = [1, 2, 3] 1620ac564082SBram Moolenaar var res = l[1 : 8] 1621ed591877SBram Moolenaar return res 1622ed591877SBram Moolenaarenddef 1623ed591877SBram Moolenaar 1624ed591877SBram Moolenaardef Test_disassemble_list_slice() 1625ac564082SBram Moolenaar var instr = execute('disassemble ListSlice') 1626ed591877SBram Moolenaar assert_match('ListSlice\_s*' .. 1627ac564082SBram Moolenaar 'var l = \[1, 2, 3]\_s*' .. 1628ed591877SBram Moolenaar '\d PUSHNR 1\_s*' .. 1629ed591877SBram Moolenaar '\d PUSHNR 2\_s*' .. 1630ed591877SBram Moolenaar '\d PUSHNR 3\_s*' .. 1631ed591877SBram Moolenaar '\d NEWLIST size 3\_s*' .. 1632ed591877SBram Moolenaar '\d STORE $0\_s*' .. 1633ac564082SBram Moolenaar 'var res = l\[1 : 8]\_s*' .. 1634ed591877SBram Moolenaar '\d LOAD $0\_s*' .. 1635ed591877SBram Moolenaar '\d PUSHNR 1\_s*' .. 1636ed591877SBram Moolenaar '\d PUSHNR 8\_s*' .. 1637ed591877SBram Moolenaar '\d LISTSLICE\_s*' .. 1638ed591877SBram Moolenaar '\d STORE $1\_s*', 1639ed591877SBram Moolenaar instr) 1640ed591877SBram Moolenaar assert_equal([2, 3], ListSlice()) 1641ed591877SBram Moolenaarenddef 1642ed591877SBram Moolenaar 1643ee2e52aaSBram Moolenaardef DictMember(): number 1644e0de171eSBram Moolenaar var d = {item: 1} 1645ac564082SBram Moolenaar var res = d.item 16464902ab16SBram Moolenaar res = d["item"] 1647ee2e52aaSBram Moolenaar return res 1648ee2e52aaSBram Moolenaarenddef 1649ee2e52aaSBram Moolenaar 1650ee2e52aaSBram Moolenaardef Test_disassemble_dict_member() 1651ac564082SBram Moolenaar var instr = execute('disassemble DictMember') 16524902ab16SBram Moolenaar assert_match('DictMember\_s*' .. 1653e0de171eSBram Moolenaar 'var d = {item: 1}\_s*' .. 16544902ab16SBram Moolenaar '\d PUSHS "item"\_s*' .. 16554902ab16SBram Moolenaar '\d PUSHNR 1\_s*' .. 16564902ab16SBram Moolenaar '\d NEWDICT size 1\_s*' .. 16574902ab16SBram Moolenaar '\d STORE $0\_s*' .. 1658ac564082SBram Moolenaar 'var res = d.item\_s*' .. 16594902ab16SBram Moolenaar '\d\+ LOAD $0\_s*' .. 16604902ab16SBram Moolenaar '\d\+ MEMBER item\_s*' .. 1661b1b6f4deSBram Moolenaar '\d\+ USEDICT\_s*' .. 16624902ab16SBram Moolenaar '\d\+ STORE $1\_s*' .. 16634902ab16SBram Moolenaar 'res = d\["item"\]\_s*' .. 16644902ab16SBram Moolenaar '\d\+ LOAD $0\_s*' .. 16654902ab16SBram Moolenaar '\d\+ PUSHS "item"\_s*' .. 16664902ab16SBram Moolenaar '\d\+ MEMBER\_s*' .. 1667b1b6f4deSBram Moolenaar '\d\+ USEDICT\_s*' .. 16684902ab16SBram Moolenaar '\d\+ STORE $1\_s*', 1669675f716eSBram Moolenaar instr) 1670d2c61705SBram Moolenaar assert_equal(1, DictMember()) 1671ee2e52aaSBram Moolenaarenddef 1672ee2e52aaSBram Moolenaar 1673cc673e74SBram Moolenaarlet somelist = [1, 2, 3, 4, 5] 1674cc673e74SBram Moolenaardef AnyIndex(): number 1675ac564082SBram Moolenaar var res = g:somelist[2] 1676cc673e74SBram Moolenaar return res 1677cc673e74SBram Moolenaarenddef 1678cc673e74SBram Moolenaar 1679cc673e74SBram Moolenaardef Test_disassemble_any_index() 1680ac564082SBram Moolenaar var instr = execute('disassemble AnyIndex') 1681cc673e74SBram Moolenaar assert_match('AnyIndex\_s*' .. 1682ac564082SBram Moolenaar 'var res = g:somelist\[2\]\_s*' .. 1683cc673e74SBram Moolenaar '\d LOADG g:somelist\_s*' .. 1684cc673e74SBram Moolenaar '\d PUSHNR 2\_s*' .. 1685cc673e74SBram Moolenaar '\d ANYINDEX\_s*' .. 1686cc673e74SBram Moolenaar '\d STORE $0\_s*' .. 1687cc673e74SBram Moolenaar 'return res\_s*' .. 1688cc673e74SBram Moolenaar '\d LOAD $0\_s*' .. 1689cc673e74SBram Moolenaar '\d CHECKTYPE number stack\[-1\]\_s*' .. 1690cc673e74SBram Moolenaar '\d RETURN', 1691cc673e74SBram Moolenaar instr) 1692cc673e74SBram Moolenaar assert_equal(3, AnyIndex()) 1693cc673e74SBram Moolenaarenddef 1694cc673e74SBram Moolenaar 1695cc673e74SBram Moolenaardef AnySlice(): list<number> 1696ac564082SBram Moolenaar var res = g:somelist[1 : 3] 1697cc673e74SBram Moolenaar return res 1698cc673e74SBram Moolenaarenddef 1699cc673e74SBram Moolenaar 1700cc673e74SBram Moolenaardef Test_disassemble_any_slice() 1701ac564082SBram Moolenaar var instr = execute('disassemble AnySlice') 1702cc673e74SBram Moolenaar assert_match('AnySlice\_s*' .. 1703ac564082SBram Moolenaar 'var res = g:somelist\[1 : 3\]\_s*' .. 1704cc673e74SBram Moolenaar '\d LOADG g:somelist\_s*' .. 1705cc673e74SBram Moolenaar '\d PUSHNR 1\_s*' .. 1706cc673e74SBram Moolenaar '\d PUSHNR 3\_s*' .. 1707cc673e74SBram Moolenaar '\d ANYSLICE\_s*' .. 1708cc673e74SBram Moolenaar '\d STORE $0\_s*' .. 1709cc673e74SBram Moolenaar 'return res\_s*' .. 1710cc673e74SBram Moolenaar '\d LOAD $0\_s*' .. 17115e654230SBram Moolenaar '\d CHECKTYPE list<number> stack\[-1\]\_s*' .. 1712cc673e74SBram Moolenaar '\d RETURN', 1713cc673e74SBram Moolenaar instr) 1714cc673e74SBram Moolenaar assert_equal([2, 3, 4], AnySlice()) 1715cc673e74SBram Moolenaarenddef 1716cc673e74SBram Moolenaar 1717ee2e52aaSBram Moolenaardef NegateNumber(): number 1718cd6b4f30SBram Moolenaar g:nr = 9 1719cd6b4f30SBram Moolenaar var plus = +g:nr 1720cd6b4f30SBram Moolenaar var minus = -g:nr 1721cd6b4f30SBram Moolenaar return minus 1722ee2e52aaSBram Moolenaarenddef 1723ee2e52aaSBram Moolenaar 1724ee2e52aaSBram Moolenaardef Test_disassemble_negate_number() 1725ac564082SBram Moolenaar var instr = execute('disassemble NegateNumber') 17264902ab16SBram Moolenaar assert_match('NegateNumber\_s*' .. 1727cd6b4f30SBram Moolenaar 'g:nr = 9\_s*' .. 1728cd6b4f30SBram Moolenaar '\d PUSHNR 9\_s*' .. 1729cd6b4f30SBram Moolenaar '\d STOREG g:nr\_s*' .. 1730cd6b4f30SBram Moolenaar 'var plus = +g:nr\_s*' .. 1731cd6b4f30SBram Moolenaar '\d LOADG g:nr\_s*' .. 1732cd6b4f30SBram Moolenaar '\d CHECKTYPE number stack\[-1\]\_s*' .. 1733cd6b4f30SBram Moolenaar '\d STORE $0\_s*' .. 1734cd6b4f30SBram Moolenaar 'var minus = -g:nr\_s*' .. 1735cd6b4f30SBram Moolenaar '\d LOADG g:nr\_s*' .. 1736cd6b4f30SBram Moolenaar '\d CHECKTYPE number stack\[-1\]\_s*' .. 17374902ab16SBram Moolenaar '\d NEGATENR\_s*' .. 1738cd6b4f30SBram Moolenaar '\d STORE $1\_s*', 1739675f716eSBram Moolenaar instr) 1740d2c61705SBram Moolenaar assert_equal(-9, NegateNumber()) 1741ee2e52aaSBram Moolenaarenddef 1742ee2e52aaSBram Moolenaar 1743ee2e52aaSBram Moolenaardef InvertBool(): bool 1744ac564082SBram Moolenaar var flag = true 1745ac564082SBram Moolenaar var invert = !flag 1746ac564082SBram Moolenaar var res = !!flag 1747ee2e52aaSBram Moolenaar return res 1748ee2e52aaSBram Moolenaarenddef 1749ee2e52aaSBram Moolenaar 1750ee2e52aaSBram Moolenaardef Test_disassemble_invert_bool() 1751ac564082SBram Moolenaar var instr = execute('disassemble InvertBool') 17524902ab16SBram Moolenaar assert_match('InvertBool\_s*' .. 1753ac564082SBram Moolenaar 'var flag = true\_s*' .. 1754a8b8af19SBram Moolenaar '\d PUSH true\_s*' .. 17554902ab16SBram Moolenaar '\d STORE $0\_s*' .. 1756ac564082SBram Moolenaar 'var invert = !flag\_s*' .. 17574902ab16SBram Moolenaar '\d LOAD $0\_s*' .. 17585fa9b244SBram Moolenaar '\d INVERT -1 (!val)\_s*' .. 17594902ab16SBram Moolenaar '\d STORE $1\_s*' .. 1760ac564082SBram Moolenaar 'var res = !!flag\_s*' .. 17614902ab16SBram Moolenaar '\d LOAD $0\_s*' .. 17625fa9b244SBram Moolenaar '\d 2BOOL -1 (!!val)\_s*' .. 17634902ab16SBram Moolenaar '\d STORE $2\_s*', 1764675f716eSBram Moolenaar instr) 1765d2c61705SBram Moolenaar assert_equal(true, InvertBool()) 1766ee2e52aaSBram Moolenaarenddef 1767ee2e52aaSBram Moolenaar 17684ed124ccSBram Moolenaardef ReturnBool(): bool 1769*1a7ee4ddSBram Moolenaar var one = 1 1770*1a7ee4ddSBram Moolenaar var zero = 0 1771*1a7ee4ddSBram Moolenaar var name: bool = one && zero || one 17722bb2658bSBram Moolenaar return name 17734ed124ccSBram Moolenaarenddef 17744ed124ccSBram Moolenaar 17754ed124ccSBram Moolenaardef Test_disassemble_return_bool() 1776ac564082SBram Moolenaar var instr = execute('disassemble ReturnBool') 17774ed124ccSBram Moolenaar assert_match('ReturnBool\_s*' .. 1778*1a7ee4ddSBram Moolenaar 'var one = 1\_s*' .. 1779*1a7ee4ddSBram Moolenaar '0 STORE 1 in $0\_s*' .. 1780*1a7ee4ddSBram Moolenaar 'var zero = 0\_s*' .. 1781*1a7ee4ddSBram Moolenaar '1 STORE 0 in $1\_s*' .. 1782*1a7ee4ddSBram Moolenaar 'var name: bool = one && zero || one\_s*' .. 1783*1a7ee4ddSBram Moolenaar '2 LOAD $0\_s*' .. 1784*1a7ee4ddSBram Moolenaar '3 COND2BOOL\_s*' .. 1785*1a7ee4ddSBram Moolenaar '4 JUMP_IF_COND_FALSE -> 7\_s*' .. 1786*1a7ee4ddSBram Moolenaar '5 LOAD $1\_s*' .. 1787*1a7ee4ddSBram Moolenaar '6 COND2BOOL\_s*' .. 1788*1a7ee4ddSBram Moolenaar '7 JUMP_IF_COND_TRUE -> 10\_s*' .. 1789*1a7ee4ddSBram Moolenaar '8 LOAD $0\_s*' .. 1790*1a7ee4ddSBram Moolenaar '9 COND2BOOL\_s*' .. 1791*1a7ee4ddSBram Moolenaar '10 STORE $2\_s*' .. 17922bb2658bSBram Moolenaar 'return name\_s*' .. 1793*1a7ee4ddSBram Moolenaar '\d\+ LOAD $2\_s*' .. 1794ea2d407fSBram Moolenaar '\d\+ RETURN', 17954ed124ccSBram Moolenaar instr) 17964ed124ccSBram Moolenaar assert_equal(true, InvertBool()) 17974ed124ccSBram Moolenaarenddef 17984ed124ccSBram Moolenaar 1799f2460a3aSBram Moolenaardef Test_disassemble_compare() 1800ac564082SBram Moolenaar var cases = [ 1801a5565e41SBram Moolenaar ['true == isFalse', 'COMPAREBOOL =='], 1802a5565e41SBram Moolenaar ['true != isFalse', 'COMPAREBOOL !='], 1803a5565e41SBram Moolenaar ['v:none == isNull', 'COMPARESPECIAL =='], 1804a5565e41SBram Moolenaar ['v:none != isNull', 'COMPARESPECIAL !='], 1805675f716eSBram Moolenaar 1806a5565e41SBram Moolenaar ['111 == aNumber', 'COMPARENR =='], 1807a5565e41SBram Moolenaar ['111 != aNumber', 'COMPARENR !='], 1808a5565e41SBram Moolenaar ['111 > aNumber', 'COMPARENR >'], 1809a5565e41SBram Moolenaar ['111 < aNumber', 'COMPARENR <'], 1810a5565e41SBram Moolenaar ['111 >= aNumber', 'COMPARENR >='], 1811a5565e41SBram Moolenaar ['111 <= aNumber', 'COMPARENR <='], 1812a5565e41SBram Moolenaar ['111 =~ aNumber', 'COMPARENR =\~'], 1813a5565e41SBram Moolenaar ['111 !~ aNumber', 'COMPARENR !\~'], 1814675f716eSBram Moolenaar 1815a5565e41SBram Moolenaar ['"xx" != aString', 'COMPARESTRING !='], 1816a5565e41SBram Moolenaar ['"xx" > aString', 'COMPARESTRING >'], 1817a5565e41SBram Moolenaar ['"xx" < aString', 'COMPARESTRING <'], 1818a5565e41SBram Moolenaar ['"xx" >= aString', 'COMPARESTRING >='], 1819a5565e41SBram Moolenaar ['"xx" <= aString', 'COMPARESTRING <='], 1820a5565e41SBram Moolenaar ['"xx" =~ aString', 'COMPARESTRING =\~'], 1821a5565e41SBram Moolenaar ['"xx" !~ aString', 'COMPARESTRING !\~'], 1822a5565e41SBram Moolenaar ['"xx" is aString', 'COMPARESTRING is'], 1823a5565e41SBram Moolenaar ['"xx" isnot aString', 'COMPARESTRING isnot'], 1824675f716eSBram Moolenaar 1825a5565e41SBram Moolenaar ['0z11 == aBlob', 'COMPAREBLOB =='], 1826a5565e41SBram Moolenaar ['0z11 != aBlob', 'COMPAREBLOB !='], 1827a5565e41SBram Moolenaar ['0z11 is aBlob', 'COMPAREBLOB is'], 1828a5565e41SBram Moolenaar ['0z11 isnot aBlob', 'COMPAREBLOB isnot'], 1829675f716eSBram Moolenaar 1830a5565e41SBram Moolenaar ['[1, 2] == aList', 'COMPARELIST =='], 1831a5565e41SBram Moolenaar ['[1, 2] != aList', 'COMPARELIST !='], 1832a5565e41SBram Moolenaar ['[1, 2] is aList', 'COMPARELIST is'], 1833a5565e41SBram Moolenaar ['[1, 2] isnot aList', 'COMPARELIST isnot'], 1834675f716eSBram Moolenaar 1835e0de171eSBram Moolenaar ['{a: 1} == aDict', 'COMPAREDICT =='], 1836e0de171eSBram Moolenaar ['{a: 1} != aDict', 'COMPAREDICT !='], 1837e0de171eSBram Moolenaar ['{a: 1} is aDict', 'COMPAREDICT is'], 1838e0de171eSBram Moolenaar ['{a: 1} isnot aDict', 'COMPAREDICT isnot'], 1839675f716eSBram Moolenaar 18402949cfdbSBram Moolenaar ['(() => 33) == (() => 44)', 'COMPAREFUNC =='], 18412949cfdbSBram Moolenaar ['(() => 33) != (() => 44)', 'COMPAREFUNC !='], 18422949cfdbSBram Moolenaar ['(() => 33) is (() => 44)', 'COMPAREFUNC is'], 18432949cfdbSBram Moolenaar ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'], 1844675f716eSBram Moolenaar 1845675f716eSBram Moolenaar ['77 == g:xx', 'COMPAREANY =='], 1846675f716eSBram Moolenaar ['77 != g:xx', 'COMPAREANY !='], 1847675f716eSBram Moolenaar ['77 > g:xx', 'COMPAREANY >'], 1848675f716eSBram Moolenaar ['77 < g:xx', 'COMPAREANY <'], 1849675f716eSBram Moolenaar ['77 >= g:xx', 'COMPAREANY >='], 1850675f716eSBram Moolenaar ['77 <= g:xx', 'COMPAREANY <='], 1851675f716eSBram Moolenaar ['77 =~ g:xx', 'COMPAREANY =\~'], 1852675f716eSBram Moolenaar ['77 !~ g:xx', 'COMPAREANY !\~'], 1853675f716eSBram Moolenaar ['77 is g:xx', 'COMPAREANY is'], 1854675f716eSBram Moolenaar ['77 isnot g:xx', 'COMPAREANY isnot'], 1855675f716eSBram Moolenaar ] 1856ac564082SBram Moolenaar var floatDecl = '' 1857f2460a3aSBram Moolenaar if has('float') 1858f2460a3aSBram Moolenaar cases->extend([ 1859a5565e41SBram Moolenaar ['1.1 == aFloat', 'COMPAREFLOAT =='], 1860a5565e41SBram Moolenaar ['1.1 != aFloat', 'COMPAREFLOAT !='], 1861a5565e41SBram Moolenaar ['1.1 > aFloat', 'COMPAREFLOAT >'], 1862a5565e41SBram Moolenaar ['1.1 < aFloat', 'COMPAREFLOAT <'], 1863a5565e41SBram Moolenaar ['1.1 >= aFloat', 'COMPAREFLOAT >='], 1864a5565e41SBram Moolenaar ['1.1 <= aFloat', 'COMPAREFLOAT <='], 1865a5565e41SBram Moolenaar ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'], 1866a5565e41SBram Moolenaar ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'], 1867675f716eSBram Moolenaar ]) 1868ac564082SBram Moolenaar floatDecl = 'var aFloat = 2.2' 1869f2460a3aSBram Moolenaar endif 1870f2460a3aSBram Moolenaar 1871ac564082SBram Moolenaar var nr = 1 1872f2460a3aSBram Moolenaar for case in cases 1873f5be8cdbSBram Moolenaar # declare local variables to get a non-constant with the right type 1874f2460a3aSBram Moolenaar writefile(['def TestCase' .. nr .. '()', 1875ac564082SBram Moolenaar ' var isFalse = false', 1876ac564082SBram Moolenaar ' var isNull = v:null', 1877ac564082SBram Moolenaar ' var aNumber = 222', 1878ac564082SBram Moolenaar ' var aString = "yy"', 1879ac564082SBram Moolenaar ' var aBlob = 0z22', 1880ac564082SBram Moolenaar ' var aList = [3, 4]', 1881e0de171eSBram Moolenaar ' var aDict = {x: 2}', 1882a5565e41SBram Moolenaar floatDecl, 1883675f716eSBram Moolenaar ' if ' .. case[0], 1884675f716eSBram Moolenaar ' echo 42' 1885675f716eSBram Moolenaar ' endif', 1886675f716eSBram Moolenaar 'enddef'], 'Xdisassemble') 1887f2460a3aSBram Moolenaar source Xdisassemble 1888ac564082SBram Moolenaar var instr = execute('disassemble TestCase' .. nr) 1889675f716eSBram Moolenaar assert_match('TestCase' .. nr .. '.*' .. 1890675f716eSBram Moolenaar 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' .. 1891675f716eSBram Moolenaar '\d \(PUSH\|FUNCREF\).*' .. 1892a5565e41SBram Moolenaar '\d \(PUSH\|FUNCREF\|LOAD\).*' .. 1893675f716eSBram Moolenaar '\d ' .. case[1] .. '.*' .. 1894675f716eSBram Moolenaar '\d JUMP_IF_FALSE -> \d\+.*', 1895675f716eSBram Moolenaar instr) 1896f2460a3aSBram Moolenaar 1897f2460a3aSBram Moolenaar nr += 1 1898f2460a3aSBram Moolenaar endfor 1899f2460a3aSBram Moolenaar 190022da5596SBram Moolenaar delete('Xdisassemble') 1901f2460a3aSBram Moolenaarenddef 1902f2460a3aSBram Moolenaar 190392f26c25SBram Moolenaardef s:FalsyOp() 190492f26c25SBram Moolenaar echo g:flag ?? "yes" 190592f26c25SBram Moolenaar echo [] ?? "empty list" 190692f26c25SBram Moolenaar echo "" ?? "empty string" 190792f26c25SBram Moolenaarenddef 190892f26c25SBram Moolenaar 190992f26c25SBram Moolenaardef Test_dsassemble_falsy_op() 191092f26c25SBram Moolenaar var res = execute('disass s:FalsyOp') 191192f26c25SBram Moolenaar assert_match('\<SNR>\d*_FalsyOp\_s*' .. 191292f26c25SBram Moolenaar 'echo g:flag ?? "yes"\_s*' .. 191392f26c25SBram Moolenaar '0 LOADG g:flag\_s*' .. 191492f26c25SBram Moolenaar '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' .. 191592f26c25SBram Moolenaar '2 PUSHS "yes"\_s*' .. 191692f26c25SBram Moolenaar '3 ECHO 1\_s*' .. 191792f26c25SBram Moolenaar 'echo \[\] ?? "empty list"\_s*' .. 191892f26c25SBram Moolenaar '4 NEWLIST size 0\_s*' .. 191992f26c25SBram Moolenaar '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' .. 192092f26c25SBram Moolenaar '6 PUSHS "empty list"\_s*' .. 192192f26c25SBram Moolenaar '7 ECHO 1\_s*' .. 192292f26c25SBram Moolenaar 'echo "" ?? "empty string"\_s*' .. 192392f26c25SBram Moolenaar '\d\+ PUSHS "empty string"\_s*' .. 192492f26c25SBram Moolenaar '\d\+ ECHO 1\_s*' .. 1925f57b43c2SBram Moolenaar '\d\+ RETURN void', 192692f26c25SBram Moolenaar res) 192792f26c25SBram Moolenaarenddef 192892f26c25SBram Moolenaar 1929a4d4cf49SBram Moolenaardef Test_disassemble_compare_const() 1930ac564082SBram Moolenaar var cases = [ 1931675f716eSBram Moolenaar ['"xx" == "yy"', false], 1932675f716eSBram Moolenaar ['"aa" == "aa"', true], 1933675f716eSBram Moolenaar ['has("eval") ? true : false', true], 1934675f716eSBram Moolenaar ['has("asdf") ? true : false', false], 1935675f716eSBram Moolenaar ] 1936a4d4cf49SBram Moolenaar 1937ac564082SBram Moolenaar var nr = 1 1938a4d4cf49SBram Moolenaar for case in cases 1939a4d4cf49SBram Moolenaar writefile(['def TestCase' .. nr .. '()', 1940675f716eSBram Moolenaar ' if ' .. case[0], 1941675f716eSBram Moolenaar ' echo 42' 1942675f716eSBram Moolenaar ' endif', 1943675f716eSBram Moolenaar 'enddef'], 'Xdisassemble') 1944a4d4cf49SBram Moolenaar source Xdisassemble 1945ac564082SBram Moolenaar var instr = execute('disassemble TestCase' .. nr) 1946a4d4cf49SBram Moolenaar if case[1] 1947f5be8cdbSBram Moolenaar # condition true, "echo 42" executed 1948675f716eSBram Moolenaar assert_match('TestCase' .. nr .. '.*' .. 1949675f716eSBram Moolenaar 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' .. 1950675f716eSBram Moolenaar '\d PUSHNR 42.*' .. 1951675f716eSBram Moolenaar '\d ECHO 1.*' .. 1952f57b43c2SBram Moolenaar '\d RETURN void', 1953675f716eSBram Moolenaar instr) 1954a4d4cf49SBram Moolenaar else 1955f5be8cdbSBram Moolenaar # condition false, function just returns 1956675f716eSBram Moolenaar assert_match('TestCase' .. nr .. '.*' .. 1957675f716eSBram Moolenaar 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' .. 1958675f716eSBram Moolenaar 'echo 42[ \n]*' .. 1959675f716eSBram Moolenaar 'endif[ \n]*' .. 1960f57b43c2SBram Moolenaar '\d RETURN void', 1961675f716eSBram Moolenaar instr) 1962a4d4cf49SBram Moolenaar endif 1963a4d4cf49SBram Moolenaar 1964a4d4cf49SBram Moolenaar nr += 1 1965a4d4cf49SBram Moolenaar endfor 1966a4d4cf49SBram Moolenaar 1967a4d4cf49SBram Moolenaar delete('Xdisassemble') 1968a4d4cf49SBram Moolenaarenddef 1969a4d4cf49SBram Moolenaar 1970ad39c094SBram Moolenaardef s:Execute() 1971ad39c094SBram Moolenaar execute 'help vim9.txt' 1972ac564082SBram Moolenaar var cmd = 'help vim9.txt' 1973ad39c094SBram Moolenaar execute cmd 1974ac564082SBram Moolenaar var tag = 'vim9.txt' 1975ad39c094SBram Moolenaar execute 'help ' .. tag 1976ad39c094SBram Moolenaarenddef 1977ad39c094SBram Moolenaar 1978ad39c094SBram Moolenaardef Test_disassemble_execute() 1979ac564082SBram Moolenaar var res = execute('disass s:Execute') 19804902ab16SBram Moolenaar assert_match('\<SNR>\d*_Execute\_s*' .. 19814902ab16SBram Moolenaar "execute 'help vim9.txt'\\_s*" .. 19824902ab16SBram Moolenaar '\d PUSHS "help vim9.txt"\_s*' .. 19834902ab16SBram Moolenaar '\d EXECUTE 1\_s*' .. 1984ac564082SBram Moolenaar "var cmd = 'help vim9.txt'\\_s*" .. 19854902ab16SBram Moolenaar '\d PUSHS "help vim9.txt"\_s*' .. 19864902ab16SBram Moolenaar '\d STORE $0\_s*' .. 19874902ab16SBram Moolenaar 'execute cmd\_s*' .. 19884902ab16SBram Moolenaar '\d LOAD $0\_s*' .. 19894902ab16SBram Moolenaar '\d EXECUTE 1\_s*' .. 1990ac564082SBram Moolenaar "var tag = 'vim9.txt'\\_s*" .. 19914902ab16SBram Moolenaar '\d PUSHS "vim9.txt"\_s*' .. 19924902ab16SBram Moolenaar '\d STORE $1\_s*' .. 19934902ab16SBram Moolenaar "execute 'help ' .. tag\\_s*" .. 19944902ab16SBram Moolenaar '\d\+ PUSHS "help "\_s*' .. 19954902ab16SBram Moolenaar '\d\+ LOAD $1\_s*' .. 19964902ab16SBram Moolenaar '\d\+ CONCAT\_s*' .. 19974902ab16SBram Moolenaar '\d\+ EXECUTE 1\_s*' .. 1998f57b43c2SBram Moolenaar '\d\+ RETURN void', 1999675f716eSBram Moolenaar res) 2000ad39c094SBram Moolenaarenddef 2001ad39c094SBram Moolenaar 2002f93c7feaSBram Moolenaardef s:Echomsg() 2003f93c7feaSBram Moolenaar echomsg 'some' 'message' 20047de62623SBram Moolenaar echoconsole 'nothing' 2005f93c7feaSBram Moolenaar echoerr 'went' .. 'wrong' 2006f93c7feaSBram Moolenaarenddef 2007f93c7feaSBram Moolenaar 2008f93c7feaSBram Moolenaardef Test_disassemble_echomsg() 2009ac564082SBram Moolenaar var res = execute('disass s:Echomsg') 20104902ab16SBram Moolenaar assert_match('\<SNR>\d*_Echomsg\_s*' .. 20114902ab16SBram Moolenaar "echomsg 'some' 'message'\\_s*" .. 20124902ab16SBram Moolenaar '\d PUSHS "some"\_s*' .. 20134902ab16SBram Moolenaar '\d PUSHS "message"\_s*' .. 20144902ab16SBram Moolenaar '\d ECHOMSG 2\_s*' .. 20157de62623SBram Moolenaar "echoconsole 'nothing'\\_s*" .. 20167de62623SBram Moolenaar '\d PUSHS "nothing"\_s*' .. 20177de62623SBram Moolenaar '\d ECHOCONSOLE 1\_s*' .. 20184902ab16SBram Moolenaar "echoerr 'went' .. 'wrong'\\_s*" .. 20194902ab16SBram Moolenaar '\d PUSHS "wentwrong"\_s*' .. 20204902ab16SBram Moolenaar '\d ECHOERR 1\_s*' .. 2021f57b43c2SBram Moolenaar '\d RETURN void', 2022f93c7feaSBram Moolenaar res) 2023f93c7feaSBram Moolenaarenddef 2024f93c7feaSBram Moolenaar 202561a6d4e4SBram Moolenaardef SomeStringArg(arg: string) 202661a6d4e4SBram Moolenaar echo arg 202761a6d4e4SBram Moolenaarenddef 202861a6d4e4SBram Moolenaar 202961a6d4e4SBram Moolenaardef SomeAnyArg(arg: any) 203061a6d4e4SBram Moolenaar echo arg 203161a6d4e4SBram Moolenaarenddef 203261a6d4e4SBram Moolenaar 203361a6d4e4SBram Moolenaardef SomeStringArgAndReturn(arg: string): string 203461a6d4e4SBram Moolenaar return arg 203561a6d4e4SBram Moolenaarenddef 203661a6d4e4SBram Moolenaar 203761a6d4e4SBram Moolenaardef Test_display_func() 2038ac564082SBram Moolenaar var res1 = execute('function SomeStringArg') 20394902ab16SBram Moolenaar assert_match('.* def SomeStringArg(arg: string)\_s*' .. 20404902ab16SBram Moolenaar '\d *echo arg.*' .. 20414902ab16SBram Moolenaar ' *enddef', 2042675f716eSBram Moolenaar res1) 204361a6d4e4SBram Moolenaar 2044ac564082SBram Moolenaar var res2 = execute('function SomeAnyArg') 20454902ab16SBram Moolenaar assert_match('.* def SomeAnyArg(arg: any)\_s*' .. 20464902ab16SBram Moolenaar '\d *echo arg\_s*' .. 20474902ab16SBram Moolenaar ' *enddef', 2048675f716eSBram Moolenaar res2) 204961a6d4e4SBram Moolenaar 2050ac564082SBram Moolenaar var res3 = execute('function SomeStringArgAndReturn') 20514902ab16SBram Moolenaar assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' .. 20524902ab16SBram Moolenaar '\d *return arg\_s*' .. 20534902ab16SBram Moolenaar ' *enddef', 2054675f716eSBram Moolenaar res3) 205561a6d4e4SBram Moolenaarenddef 205661a6d4e4SBram Moolenaar 205709689a02SBram Moolenaardef Test_vim9script_forward_func() 2058ac564082SBram Moolenaar var lines =<< trim END 205909689a02SBram Moolenaar vim9script 206009689a02SBram Moolenaar def FuncOne(): string 206109689a02SBram Moolenaar return FuncTwo() 206209689a02SBram Moolenaar enddef 206309689a02SBram Moolenaar def FuncTwo(): string 206409689a02SBram Moolenaar return 'two' 206509689a02SBram Moolenaar enddef 20666797966dSBram Moolenaar g:res_FuncOne = execute('disass FuncOne') 206709689a02SBram Moolenaar END 206809689a02SBram Moolenaar writefile(lines, 'Xdisassemble') 206909689a02SBram Moolenaar source Xdisassemble 207009689a02SBram Moolenaar 2071f5be8cdbSBram Moolenaar # check that the first function calls the second with DCALL 20724902ab16SBram Moolenaar assert_match('\<SNR>\d*_FuncOne\_s*' .. 20734902ab16SBram Moolenaar 'return FuncTwo()\_s*' .. 20744902ab16SBram Moolenaar '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' .. 207509689a02SBram Moolenaar '\d RETURN', 207609689a02SBram Moolenaar g:res_FuncOne) 207709689a02SBram Moolenaar 207809689a02SBram Moolenaar delete('Xdisassemble') 207909689a02SBram Moolenaar unlet g:res_FuncOne 208009689a02SBram Moolenaarenddef 208109689a02SBram Moolenaar 208261a89816SBram Moolenaardef s:ConcatStrings(): string 208361a89816SBram Moolenaar return 'one' .. 'two' .. 'three' 208461a89816SBram Moolenaarenddef 208561a89816SBram Moolenaar 20867d131b07SBram Moolenaardef s:ComputeConst(): number 20877d131b07SBram Moolenaar return 2 + 3 * 4 / 6 + 7 20887d131b07SBram Moolenaarenddef 20897d131b07SBram Moolenaar 20901c747212SBram Moolenaardef s:ComputeConstParen(): number 20911c747212SBram Moolenaar return ((2 + 4) * (8 / 2)) / (3 + 4) 20921c747212SBram Moolenaarenddef 20931c747212SBram Moolenaar 209461a89816SBram Moolenaardef Test_simplify_const_expr() 2095ac564082SBram Moolenaar var res = execute('disass s:ConcatStrings') 20964902ab16SBram Moolenaar assert_match('<SNR>\d*_ConcatStrings\_s*' .. 20974902ab16SBram Moolenaar "return 'one' .. 'two' .. 'three'\\_s*" .. 20984902ab16SBram Moolenaar '\d PUSHS "onetwothree"\_s*' .. 209961a89816SBram Moolenaar '\d RETURN', 210061a89816SBram Moolenaar res) 21017d131b07SBram Moolenaar 21027d131b07SBram Moolenaar res = execute('disass s:ComputeConst') 21034902ab16SBram Moolenaar assert_match('<SNR>\d*_ComputeConst\_s*' .. 21044902ab16SBram Moolenaar 'return 2 + 3 \* 4 / 6 + 7\_s*' .. 21054902ab16SBram Moolenaar '\d PUSHNR 11\_s*' .. 21067d131b07SBram Moolenaar '\d RETURN', 21077d131b07SBram Moolenaar res) 21081c747212SBram Moolenaar 21091c747212SBram Moolenaar res = execute('disass s:ComputeConstParen') 21104902ab16SBram Moolenaar assert_match('<SNR>\d*_ComputeConstParen\_s*' .. 21114902ab16SBram Moolenaar 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' .. 21124902ab16SBram Moolenaar '\d PUSHNR 3\>\_s*' .. 21131c747212SBram Moolenaar '\d RETURN', 21141c747212SBram Moolenaar res) 211561a89816SBram Moolenaarenddef 211661a89816SBram Moolenaar 2117389df259SBram Moolenaardef s:CallAppend() 2118389df259SBram Moolenaar eval "some text"->append(2) 2119389df259SBram Moolenaarenddef 2120389df259SBram Moolenaar 2121389df259SBram Moolenaardef Test_shuffle() 2122ac564082SBram Moolenaar var res = execute('disass s:CallAppend') 2123389df259SBram Moolenaar assert_match('<SNR>\d*_CallAppend\_s*' .. 2124389df259SBram Moolenaar 'eval "some text"->append(2)\_s*' .. 2125389df259SBram Moolenaar '\d PUSHS "some text"\_s*' .. 2126389df259SBram Moolenaar '\d PUSHNR 2\_s*' .. 2127389df259SBram Moolenaar '\d SHUFFLE 2 up 1\_s*' .. 2128389df259SBram Moolenaar '\d BCALL append(argc 2)\_s*' .. 2129389df259SBram Moolenaar '\d DROP\_s*' .. 2130f57b43c2SBram Moolenaar '\d RETURN void', 2131389df259SBram Moolenaar res) 2132389df259SBram Moolenaarenddef 2133389df259SBram Moolenaar 2134f4c6e1e7SBram Moolenaar 2135f4c6e1e7SBram Moolenaardef s:SilentMessage() 2136f4c6e1e7SBram Moolenaar silent echomsg "text" 2137f4c6e1e7SBram Moolenaar silent! echoerr "error" 2138f4c6e1e7SBram Moolenaarenddef 2139f4c6e1e7SBram Moolenaar 2140f4c6e1e7SBram Moolenaardef Test_silent() 2141f4c6e1e7SBram Moolenaar var res = execute('disass s:SilentMessage') 2142f4c6e1e7SBram Moolenaar assert_match('<SNR>\d*_SilentMessage\_s*' .. 2143f4c6e1e7SBram Moolenaar 'silent echomsg "text"\_s*' .. 214402194d2bSBram Moolenaar '\d CMDMOD silent\_s*' .. 2145f4c6e1e7SBram Moolenaar '\d PUSHS "text"\_s*' .. 2146f4c6e1e7SBram Moolenaar '\d ECHOMSG 1\_s*' .. 214702194d2bSBram Moolenaar '\d CMDMOD_REV\_s*' .. 2148f4c6e1e7SBram Moolenaar 'silent! echoerr "error"\_s*' .. 214902194d2bSBram Moolenaar '\d CMDMOD silent!\_s*' .. 2150f4c6e1e7SBram Moolenaar '\d PUSHS "error"\_s*' .. 2151f4c6e1e7SBram Moolenaar '\d ECHOERR 1\_s*' .. 215202194d2bSBram Moolenaar '\d CMDMOD_REV\_s*' .. 2153f57b43c2SBram Moolenaar '\d\+ RETURN void', 2154a91a7132SBram Moolenaar res) 2155a91a7132SBram Moolenaarenddef 2156a91a7132SBram Moolenaar 2157a91a7132SBram Moolenaardef s:SilentIf() 2158a91a7132SBram Moolenaar silent if 4 == g:five 2159a91a7132SBram Moolenaar silent elseif 4 == g:five 2160fa984418SBram Moolenaar endif 2161a91a7132SBram Moolenaarenddef 2162a91a7132SBram Moolenaar 2163a91a7132SBram Moolenaardef Test_silent_if() 2164a91a7132SBram Moolenaar var res = execute('disass s:SilentIf') 2165a91a7132SBram Moolenaar assert_match('<SNR>\d*_SilentIf\_s*' .. 2166a91a7132SBram Moolenaar 'silent if 4 == g:five\_s*' .. 2167a91a7132SBram Moolenaar '\d\+ CMDMOD silent\_s*' .. 2168a91a7132SBram Moolenaar '\d\+ PUSHNR 4\_s*' .. 2169a91a7132SBram Moolenaar '\d\+ LOADG g:five\_s*' .. 2170a91a7132SBram Moolenaar '\d\+ COMPAREANY ==\_s*' .. 2171a91a7132SBram Moolenaar '\d\+ CMDMOD_REV\_s*' .. 2172a91a7132SBram Moolenaar '\d\+ JUMP_IF_FALSE -> \d\+\_s*' .. 2173a91a7132SBram Moolenaar 'silent elseif 4 == g:five\_s*' .. 2174a91a7132SBram Moolenaar '\d\+ JUMP -> \d\+\_s*' .. 2175a91a7132SBram Moolenaar '\d\+ CMDMOD silent\_s*' .. 2176a91a7132SBram Moolenaar '\d\+ PUSHNR 4\_s*' .. 2177a91a7132SBram Moolenaar '\d\+ LOADG g:five\_s*' .. 2178a91a7132SBram Moolenaar '\d\+ COMPAREANY ==\_s*' .. 2179a91a7132SBram Moolenaar '\d\+ CMDMOD_REV\_s*' .. 2180a91a7132SBram Moolenaar '\d\+ JUMP_IF_FALSE -> \d\+\_s*' .. 2181fa984418SBram Moolenaar 'endif\_s*' .. 2182f57b43c2SBram Moolenaar '\d\+ RETURN void', 2183a91a7132SBram Moolenaar res) 2184a91a7132SBram Moolenaarenddef 2185a91a7132SBram Moolenaar 2186a91a7132SBram Moolenaardef s:SilentFor() 2187a91a7132SBram Moolenaar silent for i in [0] 2188fa984418SBram Moolenaar endfor 2189a91a7132SBram Moolenaarenddef 2190a91a7132SBram Moolenaar 2191a91a7132SBram Moolenaardef Test_silent_for() 2192a91a7132SBram Moolenaar var res = execute('disass s:SilentFor') 2193a91a7132SBram Moolenaar assert_match('<SNR>\d*_SilentFor\_s*' .. 2194a91a7132SBram Moolenaar 'silent for i in \[0\]\_s*' .. 2195a91a7132SBram Moolenaar '\d CMDMOD silent\_s*' .. 2196a91a7132SBram Moolenaar '\d STORE -1 in $0\_s*' .. 2197a91a7132SBram Moolenaar '\d PUSHNR 0\_s*' .. 2198a91a7132SBram Moolenaar '\d NEWLIST size 1\_s*' .. 2199a91a7132SBram Moolenaar '\d CMDMOD_REV\_s*' .. 2200a91a7132SBram Moolenaar '5 FOR $0 -> 8\_s*' .. 2201a91a7132SBram Moolenaar '\d STORE $1\_s*' .. 2202fa984418SBram Moolenaar 'endfor\_s*' .. 2203a91a7132SBram Moolenaar '\d JUMP -> 5\_s*' .. 2204a91a7132SBram Moolenaar '8 DROP\_s*' .. 2205f57b43c2SBram Moolenaar '\d RETURN void\_s*', 2206a91a7132SBram Moolenaar res) 2207a91a7132SBram Moolenaarenddef 2208a91a7132SBram Moolenaar 2209a91a7132SBram Moolenaardef s:SilentWhile() 2210a91a7132SBram Moolenaar silent while g:not 2211fa984418SBram Moolenaar endwhile 2212a91a7132SBram Moolenaarenddef 2213a91a7132SBram Moolenaar 2214a91a7132SBram Moolenaardef Test_silent_while() 2215a91a7132SBram Moolenaar var res = execute('disass s:SilentWhile') 2216a91a7132SBram Moolenaar assert_match('<SNR>\d*_SilentWhile\_s*' .. 2217a91a7132SBram Moolenaar 'silent while g:not\_s*' .. 2218a91a7132SBram Moolenaar '0 CMDMOD silent\_s*' .. 2219a91a7132SBram Moolenaar '\d LOADG g:not\_s*' .. 2220a91a7132SBram Moolenaar '\d COND2BOOL\_s*' .. 2221a91a7132SBram Moolenaar '\d CMDMOD_REV\_s*' .. 2222a91a7132SBram Moolenaar '\d JUMP_IF_FALSE -> 6\_s*' .. 2223a91a7132SBram Moolenaar 2224fa984418SBram Moolenaar 'endwhile\_s*' .. 2225a91a7132SBram Moolenaar '\d JUMP -> 0\_s*' .. 2226f57b43c2SBram Moolenaar '6 RETURN void\_s*', 2227a91a7132SBram Moolenaar res) 2228a91a7132SBram Moolenaarenddef 2229a91a7132SBram Moolenaar 2230a91a7132SBram Moolenaardef s:SilentReturn(): string 2231a91a7132SBram Moolenaar silent return "done" 2232a91a7132SBram Moolenaarenddef 2233a91a7132SBram Moolenaar 2234a91a7132SBram Moolenaardef Test_silent_return() 2235a91a7132SBram Moolenaar var res = execute('disass s:SilentReturn') 2236a91a7132SBram Moolenaar assert_match('<SNR>\d*_SilentReturn\_s*' .. 2237a91a7132SBram Moolenaar 'silent return "done"\_s*' .. 2238a91a7132SBram Moolenaar '\d CMDMOD silent\_s*' .. 2239a91a7132SBram Moolenaar '\d PUSHS "done"\_s*' .. 2240a91a7132SBram Moolenaar '\d CMDMOD_REV\_s*' .. 2241a91a7132SBram Moolenaar '\d RETURN', 2242f4c6e1e7SBram Moolenaar res) 2243f4c6e1e7SBram Moolenaarenddef 2244f4c6e1e7SBram Moolenaar 2245b2049903SBram Moolenaardef s:Profiled(): string 22468cec9273SBram Moolenaar # comment 2247b2049903SBram Moolenaar echo "profiled" 22488cec9273SBram Moolenaar # comment 224926d71164SBram Moolenaar var some = "some text" 2250b2049903SBram Moolenaar return "done" 2251b2049903SBram Moolenaarenddef 2252b2049903SBram Moolenaar 2253b2049903SBram Moolenaardef Test_profiled() 2254f002a41dSBram Moolenaar if !has('profile') 2255f002a41dSBram Moolenaar MissingFeature 'profile' 2256f002a41dSBram Moolenaar endif 2257e99d422bSBram Moolenaar var res = execute('disass profile s:Profiled') 2258b2049903SBram Moolenaar assert_match('<SNR>\d*_Profiled\_s*' .. 22598cec9273SBram Moolenaar '# comment\_s*' .. 2260b2049903SBram Moolenaar 'echo "profiled"\_s*' .. 22618cec9273SBram Moolenaar '\d PROFILE START line 2\_s*' .. 2262b2049903SBram Moolenaar '\d PUSHS "profiled"\_s*' .. 2263b2049903SBram Moolenaar '\d ECHO 1\_s*' .. 22648cec9273SBram Moolenaar '# comment\_s*' .. 226526d71164SBram Moolenaar 'var some = "some text"\_s*' .. 2266ced68a00SBram Moolenaar '\d PROFILE END\_s*' .. 22678cec9273SBram Moolenaar '\d PROFILE START line 4\_s*' .. 226826d71164SBram Moolenaar '\d PUSHS "some text"\_s*' .. 226926d71164SBram Moolenaar '\d STORE $0\_s*' .. 227026d71164SBram Moolenaar 'return "done"\_s*' .. 227126d71164SBram Moolenaar '\d PROFILE END\_s*' .. 22728cec9273SBram Moolenaar '\d PROFILE START line 5\_s*' .. 2273b2049903SBram Moolenaar '\d PUSHS "done"\_s*' .. 227426d71164SBram Moolenaar '\d\+ RETURN\_s*' .. 227526d71164SBram Moolenaar '\d\+ PROFILE END', 2276b2049903SBram Moolenaar res) 2277b2049903SBram Moolenaarenddef 2278b2049903SBram Moolenaar 2279e99d422bSBram Moolenaardef Test_debugged() 2280e99d422bSBram Moolenaar var res = execute('disass debug s:Profiled') 2281e99d422bSBram Moolenaar assert_match('<SNR>\d*_Profiled\_s*' .. 22828cec9273SBram Moolenaar '# comment\_s*' .. 2283e99d422bSBram Moolenaar 'echo "profiled"\_s*' .. 22848cec9273SBram Moolenaar '\d DEBUG line 1-2 varcount 0\_s*' .. 2285e99d422bSBram Moolenaar '\d PUSHS "profiled"\_s*' .. 2286e99d422bSBram Moolenaar '\d ECHO 1\_s*' .. 22878cec9273SBram Moolenaar '# comment\_s*' .. 228826d71164SBram Moolenaar 'var some = "some text"\_s*' .. 22898cec9273SBram Moolenaar '\d DEBUG line 3-4 varcount 0\_s*' .. 229026d71164SBram Moolenaar '\d PUSHS "some text"\_s*' .. 229126d71164SBram Moolenaar '\d STORE $0\_s*' .. 2292e99d422bSBram Moolenaar 'return "done"\_s*' .. 22938cec9273SBram Moolenaar '\d DEBUG line 5-5 varcount 1\_s*' .. 2294e99d422bSBram Moolenaar '\d PUSHS "done"\_s*' .. 2295e99d422bSBram Moolenaar '\d RETURN\_s*', 2296e99d422bSBram Moolenaar res) 2297e99d422bSBram Moolenaarenddef 2298e99d422bSBram Moolenaar 2299093165c8SBram Moolenaardef s:DebugElseif() 2300093165c8SBram Moolenaar var b = false 2301093165c8SBram Moolenaar if b 2302093165c8SBram Moolenaar eval 1 + 0 2303093165c8SBram Moolenaar silent elseif !b 2304093165c8SBram Moolenaar eval 2 + 0 2305093165c8SBram Moolenaar endif 2306093165c8SBram Moolenaarenddef 2307093165c8SBram Moolenaar 2308093165c8SBram Moolenaardef Test_debug_elseif() 2309093165c8SBram Moolenaar var res = execute('disass debug s:DebugElseif') 2310093165c8SBram Moolenaar assert_match('<SNR>\d*_DebugElseif\_s*' .. 2311093165c8SBram Moolenaar 'var b = false\_s*' .. 2312093165c8SBram Moolenaar '0 DEBUG line 1-1 varcount 0\_s*' .. 2313093165c8SBram Moolenaar '1 PUSH false\_s*' .. 2314093165c8SBram Moolenaar '2 STORE $0\_s*' .. 2315093165c8SBram Moolenaar 2316093165c8SBram Moolenaar 'if b\_s*' .. 2317093165c8SBram Moolenaar '3 DEBUG line 2-2 varcount 1\_s*' .. 2318093165c8SBram Moolenaar '4 LOAD $0\_s*' .. 2319093165c8SBram Moolenaar '5 JUMP_IF_FALSE -> 10\_s*' .. 2320093165c8SBram Moolenaar 2321093165c8SBram Moolenaar 'eval 1 + 0\_s*' .. 2322093165c8SBram Moolenaar '6 DEBUG line 3-3 varcount 1\_s*' .. 2323093165c8SBram Moolenaar '7 PUSHNR 1\_s*' .. 2324093165c8SBram Moolenaar '8 DROP\_s*' .. 2325093165c8SBram Moolenaar 2326093165c8SBram Moolenaar 'silent elseif !b\_s*' .. 2327093165c8SBram Moolenaar '9 JUMP -> 20\_s*' .. 2328093165c8SBram Moolenaar '10 CMDMOD silent\_s*' .. 2329093165c8SBram Moolenaar '11 DEBUG line 4-4 varcount 1\_s*' .. 2330093165c8SBram Moolenaar '12 LOAD $0\_s*' .. 2331093165c8SBram Moolenaar '13 INVERT -1 (!val)\_s*' .. 2332093165c8SBram Moolenaar '14 CMDMOD_REV\_s*' .. 2333093165c8SBram Moolenaar '15 JUMP_IF_FALSE -> 20\_s*' .. 2334093165c8SBram Moolenaar 2335093165c8SBram Moolenaar 'eval 2 + 0\_s*' .. 2336093165c8SBram Moolenaar '16 DEBUG line 5-5 varcount 1\_s*' .. 2337093165c8SBram Moolenaar '17 PUSHNR 2\_s*' .. 2338093165c8SBram Moolenaar '18 DROP\_s*' .. 2339093165c8SBram Moolenaar 2340093165c8SBram Moolenaar 'endif\_s*' .. 2341093165c8SBram Moolenaar '19 DEBUG line 6-6 varcount 1\_s*' .. 2342093165c8SBram Moolenaar '20 RETURN void*', 2343093165c8SBram Moolenaar res) 2344093165c8SBram Moolenaarenddef 2345093165c8SBram Moolenaar 2346b1b6f4deSBram Moolenaarfunc Legacy() dict 2347b1b6f4deSBram Moolenaar echo 'legacy' 2348b1b6f4deSBram Moolenaarendfunc 2349b1b6f4deSBram Moolenaar 2350b1b6f4deSBram Moolenaardef s:UseMember() 2351b1b6f4deSBram Moolenaar var d = {func: Legacy} 2352b1b6f4deSBram Moolenaar var v = d.func() 2353b1b6f4deSBram Moolenaarenddef 2354b1b6f4deSBram Moolenaar 2355b1b6f4deSBram Moolenaardef Test_disassemble_dict_stack() 2356b1b6f4deSBram Moolenaar var res = execute('disass s:UseMember') 2357b1b6f4deSBram Moolenaar assert_match('<SNR>\d*_UseMember\_s*' .. 2358b1b6f4deSBram Moolenaar 'var d = {func: Legacy}\_s*' .. 2359b1b6f4deSBram Moolenaar '\d PUSHS "func"\_s*' .. 2360b1b6f4deSBram Moolenaar '\d PUSHFUNC "Legacy"\_s*' .. 2361b1b6f4deSBram Moolenaar '\d NEWDICT size 1\_s*' .. 2362b1b6f4deSBram Moolenaar '\d STORE $0\_s*' .. 2363b1b6f4deSBram Moolenaar 2364b1b6f4deSBram Moolenaar 'var v = d.func()\_s*' .. 2365b1b6f4deSBram Moolenaar '\d LOAD $0\_s*' .. 2366b1b6f4deSBram Moolenaar '\d MEMBER func\_s*' .. 2367b1b6f4deSBram Moolenaar '\d PCALL top (argc 0)\_s*' .. 2368b1b6f4deSBram Moolenaar '\d PCALL end\_s*' .. 2369b1b6f4deSBram Moolenaar '\d CLEARDICT\_s*' .. 2370b1b6f4deSBram Moolenaar '\d\+ STORE $1\_s*' .. 2371b1b6f4deSBram Moolenaar '\d\+ RETURN void*', 2372b1b6f4deSBram Moolenaar res) 2373b1b6f4deSBram Moolenaarenddef 2374b1b6f4deSBram Moolenaar 2375f62d7393SBram Moolenaardef s:EchoMessages() 2376f62d7393SBram Moolenaar echohl ErrorMsg | echom v:exception | echohl NONE 2377f62d7393SBram Moolenaarenddef 2378f62d7393SBram Moolenaar 2379f62d7393SBram Moolenaardef Test_disassemble_nextcmd() 2380f62d7393SBram Moolenaar # splitting commands and removing trailing blanks should not change the line 2381f62d7393SBram Moolenaar var res = execute('disass s:EchoMessages') 2382f62d7393SBram Moolenaar assert_match('<SNR>\d*_EchoMessages\_s*' .. 2383f62d7393SBram Moolenaar 'echohl ErrorMsg | echom v:exception | echohl NONE', 2384f62d7393SBram Moolenaar res) 2385f62d7393SBram Moolenaarenddef 2386f62d7393SBram Moolenaar 23876db660beSBram Moolenaardef Test_disassemble_after_reload() 23886db660beSBram Moolenaar var lines =<< trim END 23896db660beSBram Moolenaar vim9script 23906db660beSBram Moolenaar if exists('g:ThisFunc') 23916db660beSBram Moolenaar finish 23926db660beSBram Moolenaar endif 23936db660beSBram Moolenaar var name: any 23946db660beSBram Moolenaar def g:ThisFunc(): number 23956db660beSBram Moolenaar g:name = name 23966db660beSBram Moolenaar return 0 23976db660beSBram Moolenaar enddef 23986db660beSBram Moolenaar def g:ThatFunc(): number 23996db660beSBram Moolenaar name = g:name 24006db660beSBram Moolenaar return 0 24016db660beSBram Moolenaar enddef 24026db660beSBram Moolenaar END 24036db660beSBram Moolenaar lines->writefile('Xreload.vim') 24046db660beSBram Moolenaar 24056db660beSBram Moolenaar source Xreload.vim 24066db660beSBram Moolenaar g:ThisFunc() 24076db660beSBram Moolenaar g:ThatFunc() 24086db660beSBram Moolenaar 24096db660beSBram Moolenaar source Xreload.vim 24106db660beSBram Moolenaar var res = execute('disass g:ThisFunc') 24116db660beSBram Moolenaar assert_match('ThisFunc\_s*' .. 24126db660beSBram Moolenaar 'g:name = name\_s*' .. 24136db660beSBram Moolenaar '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' .. 24146db660beSBram Moolenaar '\d STOREG g:name\_s*' .. 24156db660beSBram Moolenaar 'return 0\_s*' .. 24166db660beSBram Moolenaar '\d PUSHNR 0\_s*' .. 24176db660beSBram Moolenaar '\d RETURN\_s*', 24186db660beSBram Moolenaar res) 24196db660beSBram Moolenaar 24206db660beSBram Moolenaar res = execute('disass g:ThatFunc') 24216db660beSBram Moolenaar assert_match('ThatFunc\_s*' .. 24226db660beSBram Moolenaar 'name = g:name\_s*' .. 24236db660beSBram Moolenaar '\d LOADG g:name\_s*' .. 24246db660beSBram Moolenaar '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' .. 24256db660beSBram Moolenaar 'return 0\_s*' .. 24266db660beSBram Moolenaar '\d PUSHNR 0\_s*' .. 24276db660beSBram Moolenaar '\d RETURN\_s*', 24286db660beSBram Moolenaar res) 24296db660beSBram Moolenaar 24306db660beSBram Moolenaar delete('Xreload.vim') 24316db660beSBram Moolenaar delfunc g:ThisFunc 24326db660beSBram Moolenaar delfunc g:ThatFunc 24336db660beSBram Moolenaarenddef 24346db660beSBram Moolenaar 24357cd24227SBram Moolenaar 2436b1b6f4deSBram Moolenaar 24375cab73f8SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2438