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