blob: 086522ea32dda13a0880744a674b10d8d53f1e47 [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00004import './vim9.vim' as v9
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01005
Bram Moolenaar62aec932022-01-29 21:45:34 +00006func s:NotCompiled()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01007 echo "not"
8endfunc
9
10let s:scriptvar = 4
11let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020012let b:buffervar = 'b'
13let w:windowvar = 'w'
14let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010015
16def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020017 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010018 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010019 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010020 echo arg
21 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020022 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010023 echo v:version
24 echo s:scriptvar
25 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020026 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010027 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020028 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020029 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020030 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020031 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020032 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020033 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010034 echo &tabstop
35 echo $ENVVAR
36 echo @z
37enddef
38
Bram Moolenaarf2460a32020-02-07 22:09:54 +010039def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010040 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020041 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010042 assert_fails('disass', 'E471:')
43 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020044 assert_fails('disass 234', 'E129:')
45 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010046
Bram Moolenaarac564082020-09-27 19:05:33 +020047 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020048 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010049 'buffers\_s*' ..
50 '\d\+ EXEC \+buffers\_s*' ..
51 'echo\_s*' ..
52 'echo arg\_s*' ..
53 '\d\+ LOAD arg\[-1\]\_s*' ..
54 '\d\+ ECHO 1\_s*' ..
55 'echo local\_s*' ..
56 '\d\+ LOAD $0\_s*' ..
57 '\d\+ ECHO 1\_s*' ..
58 'echo &lines\_s*' ..
59 '\d\+ LOADOPT &lines\_s*' ..
60 '\d\+ ECHO 1\_s*' ..
61 'echo v:version\_s*' ..
62 '\d\+ LOADV v:version\_s*' ..
63 '\d\+ ECHO 1\_s*' ..
64 'echo s:scriptvar\_s*' ..
65 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
66 '\d\+ ECHO 1\_s*' ..
67 'echo g:globalvar\_s*' ..
68 '\d\+ LOADG g:globalvar\_s*' ..
69 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020070 'echo get(g:, "global")\_s*' ..
71 '\d\+ LOAD g:\_s*' ..
72 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010073 '\d\+ BCALL get(argc 2)\_s*' ..
74 '\d\+ ECHO 1\_s*' ..
75 'echo g:auto#var\_s*' ..
76 '\d\+ LOADAUTO g:auto#var\_s*' ..
77 '\d\+ ECHO 1\_s*' ..
78 'echo b:buffervar\_s*' ..
79 '\d\+ LOADB b:buffervar\_s*' ..
80 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020081 'echo get(b:, "buffer")\_s*' ..
82 '\d\+ LOAD b:\_s*' ..
83 '\d\+ PUSHS "buffer"\_s*' ..
84 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020085 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020086 'echo get(w:, "window")\_s*' ..
87 '\d\+ LOAD w:\_s*' ..
88 '\d\+ PUSHS "window"\_s*' ..
89 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020090 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020091 'echo get(t:, "tab")\_s*' ..
92 '\d\+ LOAD t:\_s*' ..
93 '\d\+ PUSHS "tab"\_s*' ..
94 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020095 ' LOADENV $ENVVAR.*' ..
96 ' LOADREG @z.*',
97 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010098enddef
99
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200100def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200101 var filename = "file"
102 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200103 edit the`=filename``=filenr`.txt
104enddef
105
106def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200107 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200108 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200109 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200110 '\d PUSHS "file"\_s*' ..
111 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200112 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200113 '\d STORE 123 in $1\_s*' ..
114 ' edit the`=filename``=filenr`.txt\_s*' ..
115 '\d PUSHS "edit the"\_s*' ..
116 '\d LOAD $0\_s*' ..
117 '\d LOAD $1\_s*' ..
118 '\d 2STRING stack\[-1\]\_s*' ..
119 '\d\+ PUSHS ".txt"\_s*' ..
120 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200121 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200122 res)
123enddef
124
Bram Moolenaar20677332021-06-06 17:02:53 +0200125if has('python3')
126 def s:PyHeredoc()
127 python3 << EOF
128 print('hello')
129EOF
130 enddef
131
132 def Test_disassemble_python_heredoc()
133 var res = execute('disass s:PyHeredoc')
134 assert_match('<SNR>\d*_PyHeredoc.*' ..
135 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
136 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200137 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200138 res)
139 enddef
140endif
141
Bram Moolenaar4c137212021-04-19 16:48:48 +0200142def s:Substitute()
143 var expr = "abc"
144 :%s/a/\=expr/&g#c
145enddef
146
147def Test_disassemble_substitute()
148 var res = execute('disass s:Substitute')
149 assert_match('<SNR>\d*_Substitute.*' ..
150 ' var expr = "abc"\_s*' ..
151 '\d PUSHS "abc"\_s*' ..
152 '\d STORE $0\_s*' ..
153 ' :%s/a/\\=expr/&g#c\_s*' ..
154 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
155 ' 0 LOAD $0\_s*' ..
156 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200157 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200158 res)
159enddef
160
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200161
162def s:SearchPair()
163 var col = 8
164 searchpair("{", "", "}", "", "col('.') > col")
165enddef
166
167def Test_disassemble_seachpair()
168 var res = execute('disass s:SearchPair')
169 assert_match('<SNR>\d*_SearchPair.*' ..
170 ' var col = 8\_s*' ..
171 '\d STORE 8 in $0\_s*' ..
172 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
173 '\d PUSHS "{"\_s*' ..
174 '\d PUSHS ""\_s*' ..
175 '\d PUSHS "}"\_s*' ..
176 '\d PUSHS ""\_s*' ..
177 '\d INSTR\_s*' ..
178 ' 0 PUSHS "."\_s*' ..
179 ' 1 BCALL col(argc 1)\_s*' ..
180 ' 2 LOAD $0\_s*' ..
181 ' 3 COMPARENR >\_s*' ..
182 ' -------------\_s*' ..
183 '\d BCALL searchpair(argc 5)\_s*' ..
184 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200185 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200186 res)
187enddef
188
189
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200190def s:RedirVar()
191 var result: string
192 redir =>> result
193 echo "text"
194 redir END
195enddef
196
197def Test_disassemble_redir_var()
198 var res = execute('disass s:RedirVar')
199 assert_match('<SNR>\d*_RedirVar.*' ..
200 ' var result: string\_s*' ..
201 '\d PUSHS "\[NULL\]"\_s*' ..
202 '\d STORE $0\_s*' ..
203 ' redir =>> result\_s*' ..
204 '\d REDIR\_s*' ..
205 ' echo "text"\_s*' ..
206 '\d PUSHS "text"\_s*' ..
207 '\d ECHO 1\_s*' ..
208 ' redir END\_s*' ..
209 '\d LOAD $0\_s*' ..
210 '\d REDIR END\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100211 '\d CONCAT size 2\_s*' ..
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200212 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200213 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200214 res)
215enddef
216
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200217def s:Cexpr()
218 var errors = "list of errors"
219 cexpr errors
220enddef
221
222def Test_disassemble_cexpr()
223 var res = execute('disass s:Cexpr')
224 assert_match('<SNR>\d*_Cexpr.*' ..
225 ' var errors = "list of errors"\_s*' ..
226 '\d PUSHS "list of errors"\_s*' ..
227 '\d STORE $0\_s*' ..
228 ' cexpr errors\_s*' ..
229 '\d CEXPR pre cexpr\_s*' ..
230 '\d LOAD $0\_s*' ..
231 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200232 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200233 res)
234enddef
235
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200236def s:YankRange()
237 norm! m[jjm]
238 :'[,']yank
239enddef
240
241def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200242 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200243 assert_match('<SNR>\d*_YankRange.*' ..
244 ' norm! m\[jjm\]\_s*' ..
245 '\d EXEC norm! m\[jjm\]\_s*' ..
246 ' :''\[,''\]yank\_s*' ..
247 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200248 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200249 res)
250enddef
251
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200252def s:PutExpr()
253 :3put ="text"
254enddef
255
256def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200257 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200258 assert_match('<SNR>\d*_PutExpr.*' ..
259 ' :3put ="text"\_s*' ..
260 '\d PUSHS "text"\_s*' ..
261 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200262 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200263 res)
264enddef
265
Bram Moolenaar08597872020-12-10 19:43:40 +0100266def s:PutRange()
267 :$-2put a
268enddef
269
270def Test_disassemble_put_range()
271 var res = execute('disass s:PutRange')
272 assert_match('<SNR>\d*_PutRange.*' ..
273 ' :$-2put a\_s*' ..
274 '\d RANGE $-2\_s*' ..
275 '\d PUT a range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200276 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100277 res)
278enddef
279
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100280def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200281 var localbool = true
282 var localspec = v:none
283 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100284 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200285 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100286 endif
287enddef
288
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100289def Test_disassemble_push()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000290 mkdir('Xdir/autoload', 'p')
291 var save_rtp = &rtp
292 exe 'set rtp^=' .. getcwd() .. '/Xdir'
293
294 var lines =<< trim END
295 vim9script
296 END
297 writefile(lines, 'Xdir/autoload/autoscript.vim')
298
299 lines =<< trim END
300 vim9script
301 import autoload 'autoscript.vim'
302
Bram Moolenaara749a422022-02-12 19:52:25 +0000303 def AutoloadFunc()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000304 &operatorfunc = autoscript.Opfunc
305 enddef
306
Bram Moolenaara749a422022-02-12 19:52:25 +0000307 var res = execute('disass AutoloadFunc')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000308 assert_match('<SNR>\d*_AutoloadFunc.*' ..
309 '&operatorfunc = autoscript.Opfunc\_s*' ..
310 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
311 '1 STOREFUNCOPT &operatorfunc\_s*' ..
312 '2 RETURN void',
313 res)
314 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000315 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000316
317 delete('Xdir', 'rf')
318 &rtp = save_rtp
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100319enddef
320
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100321def Test_disassemble_import_autoload()
322 writefile(['vim9script'], 'XimportAL.vim')
323
324 var lines =<< trim END
325 vim9script
326 import autoload './XimportAL.vim'
327
328 def AutoloadFunc()
329 echo XimportAL.SomeFunc()
330 echo XimportAL.someVar
331 XimportAL.someVar = "yes"
332 enddef
333
334 var res = execute('disass AutoloadFunc')
335 assert_match('<SNR>\d*_AutoloadFunc.*' ..
336 'echo XimportAL.SomeFunc()\_s*' ..
Bram Moolenaar17125182022-03-30 21:57:50 +0100337 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100338 '\d PUSHFUNC "<80><fd>R\d\+_SomeFunc"\_s*' ..
339 '\d PCALL top (argc 0)\_s*' ..
340 '\d PCALL end\_s*' ..
341 '\d ECHO 1\_s*' ..
342
343 'echo XimportAL.someVar\_s*' ..
344 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
345 '\d LOADEXPORT s:someVar from .*/testdir/XimportAL.vim\_s*' ..
346 '\d ECHO 1\_s*' ..
347
348 'XimportAL.someVar = "yes"\_s*' ..
349 '\d\+ PUSHS "yes"\_s*' ..
350 '\d\+ SOURCE .*/testdir/XimportAL.vim\_s*' ..
351 '\d\+ STOREEXPORT someVar in .*/testdir/XimportAL.vim\_s*' ..
352
353 '\d\+ RETURN void',
354 res)
355 END
356 v9.CheckScriptSuccess(lines)
357
358 delete('XimportAL.vim')
359enddef
360
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100361def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200362 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100363 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200364 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100365 localstr = 'xyz'
366 v:char = 'abc'
367 s:scriptvar = 'sv'
368 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100369 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200370 b:buffervar = 'bv'
371 w:windowvar = 'wv'
372 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100373 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000374 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100375 $ENVVAR = 'ev'
376 @z = 'rv'
377enddef
378
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100379def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200380 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200381 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200382 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200383 'localnr = 2.*' ..
384 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200385 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200386 'localstr = ''xyz''.*' ..
387 ' STORE $1.*' ..
388 'v:char = ''abc''.*' ..
389 'STOREV v:char.*' ..
390 's:scriptvar = ''sv''.*' ..
391 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
392 'g:globalvar = ''gv''.*' ..
393 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100394 'g:auto#var = ''av''.*' ..
395 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200396 'b:buffervar = ''bv''.*' ..
397 ' STOREB b:buffervar.*' ..
398 'w:windowvar = ''wv''.*' ..
399 ' STOREW w:windowvar.*' ..
400 't:tabpagevar = ''tv''.*' ..
401 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000402 '&tabstop = 8\_s*' ..
403 '\d\+ PUSHNR 8\_s*' ..
404 '\d\+ STOREOPT &tabstop\_s*' ..
405 '&opfunc = (t) => len(t)\_s*' ..
406 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
407 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
408 '$ENVVAR = ''ev''\_s*' ..
409 '\d\+ PUSHS "ev"\_s*' ..
410 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200411 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000412 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200413 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100414enddef
415
Bram Moolenaarcb790402020-05-15 20:53:00 +0200416def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200417 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200418 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200419 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200420 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200421 var localblob: blob = 0z1122
422 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200423enddef
424
425def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200426 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200427 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200428 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200429 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100430 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200431 '\d STORE $0\_s*' ..
432 'locallist\[0\] = 123\_s*' ..
433 '\d PUSHNR 123\_s*' ..
434 '\d PUSHNR 0\_s*' ..
435 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200436 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200437 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200438 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100439 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200440 '\d STORE $1\_s*' ..
441 'localdict\["a"\] = 456\_s*' ..
442 '\d\+ PUSHNR 456\_s*' ..
443 '\d\+ PUSHS "a"\_s*' ..
444 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200445 '\d\+ STOREINDEX dict\_s*' ..
446 'var localblob: blob = 0z1122\_s*' ..
447 '\d\+ PUSHBLOB 0z1122\_s*' ..
448 '\d\+ STORE $2\_s*' ..
449 'localblob\[1\] = 33\_s*' ..
450 '\d\+ PUSHNR 33\_s*' ..
451 '\d\+ PUSHNR 1\_s*' ..
452 '\d\+ LOAD $2\_s*' ..
453 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200454 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200455 res)
456enddef
457
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000458if has('job')
459 def s:StoreNull()
460 var ss = null_string
461 var bb = null_blob
462 var dd = null_dict
463 var ll = null_list
464 var Ff = null_function
465 var Pp = null_partial
466 var jj = null_job
467 var cc = null_channel
468 enddef
469
470 def Test_disassemble_assign_null()
471 var res = execute('disass s:StoreNull')
472 assert_match('<SNR>\d*_StoreNull\_s*' ..
473 'var ss = null_string\_s*' ..
474 '\d\+ PUSHS "\[NULL\]"\_s*' ..
475 '\d\+ STORE $\d\_s*' ..
476
477 'var bb = null_blob\_s*' ..
478 '\d\+ PUSHBLOB 0z\_s*' ..
479 '\d\+ STORE $\d\_s*' ..
480
481 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100482 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000483 '\d\+ STORE $\d\_s*' ..
484
485 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100486 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000487 '\d\+ STORE $\d\_s*' ..
488
489 'var Ff = null_function\_s*' ..
490 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
491 '\d\+ STORE $\d\_s*' ..
492
493 'var Pp = null_partial\_s*' ..
494 '\d\+ NEWPARTIAL\_s*' ..
495 '\d\+ STORE $\d\_s*' ..
496
497 'var jj = null_job\_s*' ..
498 '\d\+ PUSHJOB "no process"\_s*' ..
499 '\d\+ STORE $\d\_s*' ..
500
501 'var cc = null_channel\_s*' ..
502 '\d\+ PUSHCHANNEL 0\_s*' ..
503 '\d\+ STORE $\d\_s*' ..
504
505 '\d\+ RETURN void',
506 res)
507 enddef
508endif
509
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100510def s:ScriptFuncStoreIndex()
511 var d = {dd: {}}
512 d.dd[0] = 0
513enddef
514
515def Test_disassemble_store_index()
516 var res = execute('disass s:ScriptFuncStoreIndex')
517 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
518 'var d = {dd: {}}\_s*' ..
519 '\d PUSHS "dd"\_s*' ..
520 '\d NEWDICT size 0\_s*' ..
521 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000522 '\d SETTYPE dict<dict<unknown>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100523 '\d STORE $0\_s*' ..
524 'd.dd\[0\] = 0\_s*' ..
525 '\d PUSHNR 0\_s*' ..
526 '\d PUSHNR 0\_s*' ..
527 '\d LOAD $0\_s*' ..
528 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200529 '\d\+ USEDICT\_s*' ..
530 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200531 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100532 res)
533enddef
534
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200535def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200536 var x: string
537 var y: string
538 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200539 [x, y; l] = g:stringlist
540enddef
541
542def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200543 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200544 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200545 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200546 '\d PUSHS "\[NULL\]"\_s*' ..
547 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200548 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200549 '\d PUSHS "\[NULL\]"\_s*' ..
550 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200551 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200552 '\d NEWLIST size 0\_s*' ..
553 '\d STORE $2\_s*' ..
554 '\[x, y; l\] = g:stringlist\_s*' ..
555 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200556 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200557 '\d CHECKLEN >= 2\_s*' ..
558 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200559 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200560 '\d\+ STORE $0\_s*' ..
561 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200562 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200563 '\d\+ STORE $1\_s*' ..
564 '\d\+ SLICE 2\_s*' ..
565 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200566 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200567 res)
568enddef
569
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200570def s:ListAssignWithOp()
571 var a = 2
572 var b = 3
573 [a, b] += [4, 5]
574enddef
575
576def Test_disassemble_list_assign_with_op()
577 var res = execute('disass s:ListAssignWithOp')
578 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
579 'var a = 2\_s*' ..
580 '\d STORE 2 in $0\_s*' ..
581 'var b = 3\_s*' ..
582 '\d STORE 3 in $1\_s*' ..
583 '\[a, b\] += \[4, 5\]\_s*' ..
584 '\d\+ PUSHNR 4\_s*' ..
585 '\d\+ PUSHNR 5\_s*' ..
586 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200587 '\d\+ LOAD $0\_s*' ..
588 '\d\+ ITEM 0 with op\_s*' ..
589 '\d\+ OPNR +\_s*' ..
590 '\d\+ STORE $0\_s*' ..
591 '\d\+ LOAD $1\_s*' ..
592 '\d\+ ITEM 1 with op\_s*' ..
593 '\d\+ OPNR +\_s*' ..
594 '\d\+ STORE $1\_s*' ..
595 '\d\+ DROP\_s*' ..
596 '\d\+ RETURN void',
597 res)
598enddef
599
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200600def s:ListAdd()
601 var l: list<number> = []
602 add(l, 123)
603 add(l, g:aNumber)
604enddef
605
606def Test_disassemble_list_add()
607 var res = execute('disass s:ListAdd')
608 assert_match('<SNR>\d*_ListAdd\_s*' ..
609 'var l: list<number> = []\_s*' ..
610 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100611 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200612 '\d STORE $0\_s*' ..
613 'add(l, 123)\_s*' ..
614 '\d LOAD $0\_s*' ..
615 '\d PUSHNR 123\_s*' ..
616 '\d LISTAPPEND\_s*' ..
617 '\d DROP\_s*' ..
618 'add(l, g:aNumber)\_s*' ..
619 '\d LOAD $0\_s*' ..
620 '\d\+ LOADG g:aNumber\_s*' ..
621 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
622 '\d\+ LISTAPPEND\_s*' ..
623 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200624 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200625 res)
626enddef
627
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200628def s:BlobAdd()
629 var b: blob = 0z
630 add(b, 123)
631 add(b, g:aNumber)
632enddef
633
634def Test_disassemble_blob_add()
635 var res = execute('disass s:BlobAdd')
636 assert_match('<SNR>\d*_BlobAdd\_s*' ..
637 'var b: blob = 0z\_s*' ..
638 '\d PUSHBLOB 0z\_s*' ..
639 '\d STORE $0\_s*' ..
640 'add(b, 123)\_s*' ..
641 '\d LOAD $0\_s*' ..
642 '\d PUSHNR 123\_s*' ..
643 '\d BLOBAPPEND\_s*' ..
644 '\d DROP\_s*' ..
645 'add(b, g:aNumber)\_s*' ..
646 '\d LOAD $0\_s*' ..
647 '\d\+ LOADG g:aNumber\_s*' ..
648 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
649 '\d\+ BLOBAPPEND\_s*' ..
650 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200651 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200652 res)
653enddef
654
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200655def s:BlobIndexSlice()
656 var b: blob = 0z112233
657 echo b[1]
658 echo b[1 : 2]
659enddef
660
661def Test_disassemble_blob_index_slice()
662 var res = execute('disass s:BlobIndexSlice')
663 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
664 'var b: blob = 0z112233\_s*' ..
665 '\d PUSHBLOB 0z112233\_s*' ..
666 '\d STORE $0\_s*' ..
667 'echo b\[1\]\_s*' ..
668 '\d LOAD $0\_s*' ..
669 '\d PUSHNR 1\_s*' ..
670 '\d BLOBINDEX\_s*' ..
671 '\d ECHO 1\_s*' ..
672 'echo b\[1 : 2\]\_s*' ..
673 '\d LOAD $0\_s*' ..
674 '\d PUSHNR 1\_s*' ..
675 '\d\+ PUSHNR 2\_s*' ..
676 '\d\+ BLOBSLICE\_s*' ..
677 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200678 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200679 res)
680enddef
681
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200682def s:ScriptFuncUnlet()
683 g:somevar = "value"
684 unlet g:somevar
685 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200686 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200687enddef
688
689def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200690 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200691 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
692 'g:somevar = "value"\_s*' ..
693 '\d PUSHS "value"\_s*' ..
694 '\d STOREG g:somevar\_s*' ..
695 'unlet g:somevar\_s*' ..
696 '\d UNLET g:somevar\_s*' ..
697 'unlet! g:somevar\_s*' ..
698 '\d UNLET! g:somevar\_s*' ..
699 'unlet $SOMEVAR\_s*' ..
700 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200701 res)
702enddef
703
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200704def s:LockLocal()
705 var d = {a: 1}
706 lockvar d.a
707enddef
708
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000709def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200710 var res = execute('disass s:LockLocal')
711 assert_match('<SNR>\d*_LockLocal\_s*' ..
712 'var d = {a: 1}\_s*' ..
713 '\d PUSHS "a"\_s*' ..
714 '\d PUSHNR 1\_s*' ..
715 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000716 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200717 '\d STORE $0\_s*' ..
718 'lockvar d.a\_s*' ..
719 '\d LOAD $0\_s*' ..
Bram Moolenaar70c43d82022-01-26 21:01:15 +0000720 '\d LOCKUNLOCK lockvar 2 d.a\_s*',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200721 res)
722enddef
723
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100724def s:ScriptFuncTry()
725 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200726 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100727 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200728 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100729 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200730 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100731 endtry
732enddef
733
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100734def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200735 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200736 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
737 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100738 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200739 'echo "yes"\_s*' ..
740 '\d PUSHS "yes"\_s*' ..
741 '\d ECHO 1\_s*' ..
742 'catch /fail/\_s*' ..
743 '\d JUMP -> \d\+\_s*' ..
744 '\d PUSH v:exception\_s*' ..
745 '\d PUSHS "fail"\_s*' ..
746 '\d COMPARESTRING =\~\_s*' ..
747 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
748 '\d CATCH\_s*' ..
749 'echo "no"\_s*' ..
750 '\d\+ PUSHS "no"\_s*' ..
751 '\d\+ ECHO 1\_s*' ..
752 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100753 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200754 'throw "end"\_s*' ..
755 '\d\+ PUSHS "end"\_s*' ..
756 '\d\+ THROW\_s*' ..
757 'endtry\_s*' ..
758 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200759 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100760enddef
761
762def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200763 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100764 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100765enddef
766
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100767def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200768 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200769 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200770 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200771 '\d PUSHNR 1\_s*' ..
772 '\d PUSHS "two"\_s*' ..
773 '\d PUSHNR 333\_s*' ..
774 '\d NEWLIST size 3\_s*' ..
775 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100776 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200777 '\d PUSHS "one"\_s*' ..
778 '\d PUSHNR 1\_s*' ..
779 '\d PUSHS "two"\_s*' ..
780 '\d PUSHS "val"\_s*' ..
781 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200782 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100783enddef
784
Bram Moolenaar62aec932022-01-29 21:45:34 +0000785def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100786 echo arg
787enddef
788
Bram Moolenaar62aec932022-01-29 21:45:34 +0000789func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100790 echo 'nothing'
791endfunc
792
Bram Moolenaar62aec932022-01-29 21:45:34 +0000793func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100794 echo a:arg
795endfunc
796
797def s:ScriptFuncCall(): string
798 changenr()
799 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000800 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100801 FuncWithArg(343)
802 ScriptFuncNew()
803 s:ScriptFuncNew()
804 UserFunc()
805 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200806 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100807 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200808 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100809 FuncRefWithArg("bar")
810 return "yes"
811enddef
812
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100813def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200814 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200815 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
816 'changenr()\_s*' ..
817 '\d BCALL changenr(argc 0)\_s*' ..
818 '\d DROP\_s*' ..
819 'char2nr("abc")\_s*' ..
820 '\d PUSHS "abc"\_s*' ..
821 '\d BCALL char2nr(argc 1)\_s*' ..
822 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000823 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200824 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
825 '\d DROP\_s*' ..
826 'FuncWithArg(343)\_s*' ..
827 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000828 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200829 '\d\+ DROP\_s*' ..
830 'ScriptFuncNew()\_s*' ..
831 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
832 '\d\+ DROP\_s*' ..
833 's:ScriptFuncNew()\_s*' ..
834 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
835 '\d\+ DROP\_s*' ..
836 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000837 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200838 '\d\+ DROP\_s*' ..
839 'UserFuncWithArg("foo")\_s*' ..
840 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000841 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200842 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200843 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200844 '\d\+ PUSHS "UserFunc"\_s*' ..
845 '\d\+ BCALL function(argc 1)\_s*' ..
846 '\d\+ STORE $0\_s*' ..
847 'FuncRef()\_s*' ..
848 '\d\+ LOAD $\d\_s*' ..
849 '\d\+ PCALL (argc 0)\_s*' ..
850 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200851 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200852 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
853 '\d\+ BCALL function(argc 1)\_s*' ..
854 '\d\+ STORE $1\_s*' ..
855 'FuncRefWithArg("bar")\_s*' ..
856 '\d\+ PUSHS "bar"\_s*' ..
857 '\d\+ LOAD $\d\_s*' ..
858 '\d\+ PCALL (argc 1)\_s*' ..
859 '\d\+ DROP\_s*' ..
860 'return "yes"\_s*' ..
861 '\d\+ PUSHS "yes"\_s*' ..
862 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200863 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100864enddef
865
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200866
867def s:CreateRefs()
868 var local = 'a'
869 def Append(arg: string)
870 local ..= arg
871 enddef
872 g:Append = Append
873 def Get(): string
874 return local
875 enddef
876 g:Get = Get
877enddef
878
879def Test_disassemble_closure()
880 CreateRefs()
881 var res = execute('disass g:Append')
882 assert_match('<lambda>\d\_s*' ..
883 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100884 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200885 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100886 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100887 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200888 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200889 res)
890
891 res = execute('disass g:Get')
892 assert_match('<lambda>\d\_s*' ..
893 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100894 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200895 '\d RETURN',
896 res)
897
898 unlet g:Append
899 unlet g:Get
900enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200901
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100902def s:ClosureArg(arg: string)
903 var Ref = () => arg .. "x"
904enddef
905
906def Test_disassemble_closure_arg()
907 var res = execute('disass s:ClosureArg')
908 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
909 'var Ref = () => arg .. "x"\_s*' ..
910 '\d FUNCREF <lambda>\d\+',
911 res)
912 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
913 assert_match('<lambda>\d\+\_s*' ..
914 'return arg .. "x"\_s*' ..
915 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
916 '\d PUSHS "x"\_s*' ..
917 '\d CONCAT size 2\_s*' ..
918 '\d RETURN',
919 lres)
920enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100921
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200922def EchoArg(arg: string): string
923 return arg
924enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +0000925def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200926 return function('EchoArg')
927enddef
928def s:ScriptPCall()
929 RefThis()("text")
930enddef
931
932def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200933 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200934 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
935 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000936 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200937 '\d PUSHS "text"\_s*' ..
938 '\d PCALL top (argc 1)\_s*' ..
939 '\d PCALL end\_s*' ..
940 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200941 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200942 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200943enddef
944
945
Bram Moolenaara26b9702020-04-18 19:53:28 +0200946def s:FuncWithForwardCall(): string
947 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100948enddef
949
950def DefinedLater(arg: string): string
951 return arg
952enddef
953
954def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200955 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200956 assert_match('FuncWithForwardCall\_s*' ..
957 'return g:DefinedLater("yes")\_s*' ..
958 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200959 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200960 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200961 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100962
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200963 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100964 assert_equal('yes', FuncWithForwardCall())
965
Bram Moolenaara26b9702020-04-18 19:53:28 +0200966 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200967 assert_match('FuncWithForwardCall\_s*' ..
968 'return g:DefinedLater("yes")\_s*' ..
969 '\d PUSHS "yes"\_s*' ..
970 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200971 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200972 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100973enddef
974
975
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200976def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200977 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100978enddef
979
980def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200981 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200982 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200983 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200984 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200985 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200986 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200987 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200988 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
989 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200990 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200991 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200992 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200993 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200994 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100995 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200996 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200997 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100998enddef
999
1000
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001001def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001002 if has("eval")
1003 echo "yes"
1004 else
1005 echo "no"
1006 endif
1007enddef
1008
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001009def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001010 if has("nothing")
1011 echo "yes"
1012 else
1013 echo "no"
1014 endif
1015enddef
1016
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001017def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001018 if has("nothing")
1019 echo "nothing"
1020 elseif has("something")
1021 echo "something"
1022 elseif has("eval")
1023 echo "eval"
1024 elseif has("less")
1025 echo "less"
1026 endif
1027enddef
1028
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001029def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001030 if has("gui_running")
1031 echo "yes"
1032 else
1033 echo "no"
1034 endif
1035enddef
1036
LemonBoy58f331a2022-04-02 21:59:06 +01001037def s:LenConstant(): number
1038 return len("foo") + len("fighters")
1039enddef
1040
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001041def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001042 var instr = execute('disassemble LenConstant')
1043 assert_match('LenConstant\_s*' ..
1044 'return len("foo") + len("fighters")\_s*' ..
1045 '\d PUSHNR 11\_s*',
1046 instr)
1047 assert_notmatch('BCALL len', instr)
1048
Bram Moolenaard2c61702020-09-06 15:58:36 +02001049 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001050 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001051 assert_match('HasEval\_s*' ..
1052 'if has("eval")\_s*' ..
1053 'echo "yes"\_s*' ..
1054 '\d PUSHS "yes"\_s*' ..
1055 '\d ECHO 1\_s*' ..
1056 'else\_s*' ..
1057 'echo "no"\_s*' ..
1058 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001059 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001060 assert_notmatch('JUMP', instr)
1061
Bram Moolenaard2c61702020-09-06 15:58:36 +02001062 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001063 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001064 assert_match('HasNothing\_s*' ..
1065 'if has("nothing")\_s*' ..
1066 'echo "yes"\_s*' ..
1067 'else\_s*' ..
1068 'echo "no"\_s*' ..
1069 '\d PUSHS "no"\_s*' ..
1070 '\d ECHO 1\_s*' ..
1071 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001072 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001073 assert_notmatch('PUSHS "yes"', instr)
1074 assert_notmatch('JUMP', instr)
1075
Bram Moolenaard2c61702020-09-06 15:58:36 +02001076 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001077 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001078 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001079 'if has("nothing")\_s*' ..
1080 'echo "nothing"\_s*' ..
1081 'elseif has("something")\_s*' ..
1082 'echo "something"\_s*' ..
1083 'elseif has("eval")\_s*' ..
1084 'echo "eval"\_s*' ..
1085 '\d PUSHS "eval"\_s*' ..
1086 '\d ECHO 1\_s*' ..
1087 'elseif has("less").*' ..
1088 'echo "less"\_s*' ..
1089 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001090 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001091 assert_notmatch('PUSHS "nothing"', instr)
1092 assert_notmatch('PUSHS "something"', instr)
1093 assert_notmatch('PUSHS "less"', instr)
1094 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001095
1096 var result: string
1097 var instr_expected: string
1098 if has('gui')
1099 if has('gui_running')
1100 # GUI already running, always returns "yes"
1101 result = "\nyes"
1102 instr_expected = 'HasGuiRunning.*' ..
1103 'if has("gui_running")\_s*' ..
1104 ' echo "yes"\_s*' ..
1105 '\d PUSHS "yes"\_s*' ..
1106 '\d ECHO 1\_s*' ..
1107 'else\_s*' ..
1108 ' echo "no"\_s*' ..
1109 'endif'
1110 else
1111 result = "\nno"
1112 if has('unix')
1113 # GUI not running but can start later, call has()
1114 instr_expected = 'HasGuiRunning.*' ..
1115 'if has("gui_running")\_s*' ..
1116 '\d PUSHS "gui_running"\_s*' ..
1117 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001118 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001119 '\d JUMP_IF_FALSE -> \d\_s*' ..
1120 ' echo "yes"\_s*' ..
1121 '\d PUSHS "yes"\_s*' ..
1122 '\d ECHO 1\_s*' ..
1123 'else\_s*' ..
1124 '\d JUMP -> \d\_s*' ..
1125 ' echo "no"\_s*' ..
1126 '\d PUSHS "no"\_s*' ..
1127 '\d ECHO 1\_s*' ..
1128 'endif'
1129 else
1130 # GUI not running, always return "no"
1131 instr_expected = 'HasGuiRunning.*' ..
1132 'if has("gui_running")\_s*' ..
1133 ' echo "yes"\_s*' ..
1134 'else\_s*' ..
1135 ' echo "no"\_s*' ..
1136 '\d PUSHS "no"\_s*' ..
1137 '\d ECHO 1\_s*' ..
1138 'endif'
1139 endif
1140 endif
1141 else
1142 # GUI not supported, always return "no"
1143 result = "\nno"
1144 instr_expected = 'HasGuiRunning.*' ..
1145 'if has("gui_running")\_s*' ..
1146 ' echo "yes"\_s*' ..
1147 'else\_s*' ..
1148 ' echo "no"\_s*' ..
1149 '\d PUSHS "no"\_s*' ..
1150 '\d ECHO 1\_s*' ..
1151 'endif'
1152 endif
1153
1154 assert_equal(result, execute('HasGuiRunning()'))
1155 instr = execute('disassemble HasGuiRunning')
1156 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001157enddef
1158
Bram Moolenaarefd88552020-06-18 20:50:10 +02001159def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001160 if 1 < 0
1161 return "maybe"
1162 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001163 if g:cond
1164 return "yes"
1165 else
1166 return "no"
1167 endif
1168enddef
1169
1170def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001171 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001172 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001173 'if 1 < 0\_s*' ..
1174 ' return "maybe"\_s*' ..
1175 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001176 'if g:cond\_s*' ..
1177 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001178 '1 COND2BOOL\_s*' ..
1179 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001180 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001181 '3 PUSHS "yes"\_s*' ..
1182 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001183 'else\_s*' ..
1184 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001185 '5 PUSHS "no"\_s*' ..
1186 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001187 instr)
1188enddef
1189
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001190def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001191 var Funky1: func
1192 var Funky2: func = function("len")
1193 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001194enddef
1195
1196def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001197 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001198 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001199 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001200 '0 PUSHFUNC "\[none]"\_s*' ..
1201 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001202 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001203 '2 PUSHS "len"\_s*' ..
1204 '3 BCALL function(argc 1)\_s*' ..
1205 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001206 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001207 '\d PUSHS "UserFunc"\_s*' ..
1208 '\d BCALL funcref(argc 1)\_s*' ..
1209 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001210 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001211 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001212enddef
1213
1214if has('channel')
1215 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001216 var job1: job
1217 var job2: job = job_start("donothing")
1218 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001219 enddef
1220endif
1221
1222def Test_disassemble_channel()
1223 CheckFeature channel
1224
Bram Moolenaarac564082020-09-27 19:05:33 +02001225 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001226 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001227 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001228 '\d PUSHJOB "no process"\_s*' ..
1229 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001230 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001231 '\d PUSHS "donothing"\_s*' ..
1232 '\d BCALL job_start(argc 1)\_s*' ..
1233 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001234 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001235 '\d PUSHCHANNEL 0\_s*' ..
1236 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001237 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001238 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001239enddef
1240
Bram Moolenaar62aec932022-01-29 21:45:34 +00001241def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001242 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001243 return F("x")
1244enddef
1245
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001246def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001247 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001248 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001249 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001250 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001251 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001252 '\d STORE $0\_s*' ..
1253 'return F("x")\_s*' ..
1254 '\d PUSHS "x"\_s*' ..
1255 '\d LOAD $0\_s*' ..
1256 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001257 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001258 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001259
Bram Moolenaarac564082020-09-27 19:05:33 +02001260 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001261 instr = execute('disassemble ' .. name)
1262 assert_match('<lambda>\d\+\_s*' ..
1263 'return "X" .. a .. "X"\_s*' ..
1264 '\d PUSHS "X"\_s*' ..
1265 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001266 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001267 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001268 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001269 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001270 '\d RETURN',
1271 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001272enddef
1273
Bram Moolenaar62aec932022-01-29 21:45:34 +00001274def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001275 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001276 return Ref(g:value)
1277enddef
1278
1279def Test_disassemble_lambda_with_type()
1280 g:value = 5
1281 assert_equal(15, LambdaWithType())
1282 var instr = execute('disassemble LambdaWithType')
1283 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001284 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001285 '\d FUNCREF <lambda>\d\+\_s*' ..
1286 '\d STORE $0\_s*' ..
1287 'return Ref(g:value)\_s*' ..
1288 '\d LOADG g:value\_s*' ..
1289 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001290 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001291 '\d PCALL (argc 1)\_s*' ..
1292 '\d RETURN',
1293 instr)
1294enddef
1295
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001296def NestedOuter()
1297 def g:Inner()
1298 echomsg "inner"
1299 enddef
1300enddef
1301
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001302def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001303 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001304 assert_match('NestedOuter\_s*' ..
1305 'def g:Inner()\_s*' ..
1306 'echomsg "inner"\_s*' ..
1307 'enddef\_s*' ..
1308 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001309 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001310 instr)
1311enddef
1312
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001313def NestedDefList()
1314 def
1315 def Info
1316 def /Info
1317 def /Info/
1318enddef
1319
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001320def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001321 var instr = execute('disassemble NestedDefList')
1322 assert_match('NestedDefList\_s*' ..
1323 'def\_s*' ..
1324 '\d DEF \_s*' ..
1325 'def Info\_s*' ..
1326 '\d DEF Info\_s*' ..
1327 'def /Info\_s*' ..
1328 '\d DEF /Info\_s*' ..
1329 'def /Info/\_s*' ..
1330 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001331 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001332 instr)
1333enddef
1334
Bram Moolenaar62aec932022-01-29 21:45:34 +00001335def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001336 if arg == 1 && arg != 2 || arg == 4
1337 return 'yes'
1338 endif
1339 return 'no'
1340enddef
1341
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001342def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001343 assert_equal("yes", AndOr(1))
1344 assert_equal("no", AndOr(2))
1345 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001346 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001347 assert_match('AndOr\_s*' ..
1348 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1349 '\d LOAD arg\[-1]\_s*' ..
1350 '\d PUSHNR 1\_s*' ..
1351 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001352 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001353 '\d LOAD arg\[-1]\_s*' ..
1354 '\d PUSHNR 2\_s*' ..
1355 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001356 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001357 '\d LOAD arg\[-1]\_s*' ..
1358 '\d\+ PUSHNR 4\_s*' ..
1359 '\d\+ COMPAREANY ==\_s*' ..
1360 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001361 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001362enddef
1363
Bram Moolenaar62aec932022-01-29 21:45:34 +00001364def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001365 if true && arg
1366 return "yes"
1367 endif
1368 if false && arg
1369 return "never"
1370 endif
1371 return "no"
1372enddef
1373
1374def Test_disassemble_and_constant()
1375 assert_equal("yes", AndConstant(1))
1376 assert_equal("no", AndConstant(false))
1377 var instr = execute('disassemble AndConstant')
1378 assert_match('AndConstant\_s*' ..
1379 'if true && arg\_s*' ..
1380 '0 LOAD arg\[-1\]\_s*' ..
1381 '1 COND2BOOL\_s*' ..
1382 '2 JUMP_IF_FALSE -> 5\_s*' ..
1383 'return "yes"\_s*' ..
1384 '3 PUSHS "yes"\_s*' ..
1385 '4 RETURN\_s*' ..
1386 'endif\_s*' ..
1387 'if false && arg\_s*' ..
1388 'return "never"\_s*' ..
1389 'endif\_s*' ..
1390 'return "no"\_s*' ..
1391 '5 PUSHS "no"\_s*' ..
1392 '6 RETURN',
1393 instr)
1394enddef
1395
Bram Moolenaar62aec932022-01-29 21:45:34 +00001396def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001397 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001398 for i in range(3)
1399 res->add(i)
1400 endfor
1401 return res
1402enddef
1403
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001404def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001405 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001406 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001407 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001408 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001409 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001410 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001411 '\d STORE $0\_s*' ..
1412 'for i in range(3)\_s*' ..
1413 '\d STORE -1 in $1\_s*' ..
1414 '\d PUSHNR 3\_s*' ..
1415 '\d BCALL range(argc 1)\_s*' ..
1416 '\d FOR $1 -> \d\+\_s*' ..
1417 '\d STORE $2\_s*' ..
1418 'res->add(i)\_s*' ..
1419 '\d LOAD $0\_s*' ..
1420 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001421 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001422 '\d\+ DROP\_s*' ..
1423 'endfor\_s*' ..
1424 '\d\+ JUMP -> \d\+\_s*' ..
1425 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001426 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001427enddef
1428
Bram Moolenaar62aec932022-01-29 21:45:34 +00001429def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001431 for str in eval('["one", "two"]')
1432 res ..= str
1433 endfor
1434 return res
1435enddef
1436
1437def Test_disassemble_for_loop_eval()
1438 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001440 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001441 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001442 '\d PUSHS ""\_s*' ..
1443 '\d STORE $0\_s*' ..
1444 'for str in eval(''\["one", "two"\]'')\_s*' ..
1445 '\d STORE -1 in $1\_s*' ..
1446 '\d PUSHS "\["one", "two"\]"\_s*' ..
1447 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001448 '\d FOR $1 -> \d\+\_s*' ..
1449 '\d STORE $2\_s*' ..
1450 'res ..= str\_s*' ..
1451 '\d\+ LOAD $0\_s*' ..
1452 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001453 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001454 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001455 '\d\+ STORE $0\_s*' ..
1456 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001457 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001458 '\d\+ DROP\_s*' ..
1459 'return res\_s*' ..
1460 '\d\+ LOAD $0\_s*' ..
1461 '\d\+ RETURN',
1462 instr)
1463enddef
1464
Bram Moolenaar62aec932022-01-29 21:45:34 +00001465def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001466 for [x1, x2] in [[1, 2], [3, 4]]
1467 echo x1 x2
1468 endfor
1469enddef
1470
1471def Test_disassemble_for_loop_unpack()
1472 var instr = execute('disassemble ForLoopUnpack')
1473 assert_match('ForLoopUnpack\_s*' ..
1474 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1475 '\d\+ STORE -1 in $0\_s*' ..
1476 '\d\+ PUSHNR 1\_s*' ..
1477 '\d\+ PUSHNR 2\_s*' ..
1478 '\d\+ NEWLIST size 2\_s*' ..
1479 '\d\+ PUSHNR 3\_s*' ..
1480 '\d\+ PUSHNR 4\_s*' ..
1481 '\d\+ NEWLIST size 2\_s*' ..
1482 '\d\+ NEWLIST size 2\_s*' ..
1483 '\d\+ FOR $0 -> 16\_s*' ..
1484 '\d\+ UNPACK 2\_s*' ..
1485 '\d\+ STORE $1\_s*' ..
1486 '\d\+ STORE $2\_s*' ..
1487 'echo x1 x2\_s*' ..
1488 '\d\+ LOAD $1\_s*' ..
1489 '\d\+ LOAD $2\_s*' ..
1490 '\d\+ ECHO 2\_s*' ..
1491 'endfor\_s*' ..
1492 '\d\+ JUMP -> 8\_s*' ..
1493 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001494 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001495 instr)
1496enddef
1497
Bram Moolenaar62aec932022-01-29 21:45:34 +00001498def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001499 for nr in [1, 2]
1500 try
1501 echo "ok"
1502 try
1503 echo "deeper"
1504 catch
1505 continue
1506 endtry
1507 catch
1508 echo "not ok"
1509 endtry
1510 endfor
1511enddef
1512
1513def Test_disassemble_for_loop_continue()
1514 var instr = execute('disassemble ForLoopContinue')
1515 assert_match('ForLoopContinue\_s*' ..
1516 'for nr in \[1, 2]\_s*' ..
1517 '0 STORE -1 in $0\_s*' ..
1518 '1 PUSHNR 1\_s*' ..
1519 '2 PUSHNR 2\_s*' ..
1520 '3 NEWLIST size 2\_s*' ..
1521 '4 FOR $0 -> 22\_s*' ..
1522 '5 STORE $1\_s*' ..
1523 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001524 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001525 'echo "ok"\_s*' ..
1526 '7 PUSHS "ok"\_s*' ..
1527 '8 ECHO 1\_s*' ..
1528 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001529 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001530 'echo "deeper"\_s*' ..
1531 '10 PUSHS "deeper"\_s*' ..
1532 '11 ECHO 1\_s*' ..
1533 'catch\_s*' ..
1534 '12 JUMP -> 15\_s*' ..
1535 '13 CATCH\_s*' ..
1536 'continue\_s*' ..
1537 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1538 'endtry\_s*' ..
1539 '15 ENDTRY\_s*' ..
1540 'catch\_s*' ..
1541 '16 JUMP -> 20\_s*' ..
1542 '17 CATCH\_s*' ..
1543 'echo "not ok"\_s*' ..
1544 '18 PUSHS "not ok"\_s*' ..
1545 '19 ECHO 1\_s*' ..
1546 'endtry\_s*' ..
1547 '20 ENDTRY\_s*' ..
1548 'endfor\_s*' ..
1549 '21 JUMP -> 4\_s*' ..
1550 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001551 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001552 instr)
1553enddef
1554
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001555let g:number = 42
1556
Bram Moolenaar62aec932022-01-29 21:45:34 +00001557def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001558 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001559enddef
1560
1561def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001562 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001563 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001564 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001565 '\d PUSHNR 23\_s*' ..
1566 '\d LOADG g:number\_s*' ..
1567 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1568 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001569 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001570 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001571 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001572 instr)
1573enddef
1574
Bram Moolenaar62aec932022-01-29 21:45:34 +00001575def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001576 var nr = 3
1577 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001578 nrres = nr - 7
1579 nrres = nr * 7
1580 nrres = nr / 7
1581 nrres = nr % 7
1582
Bram Moolenaarac564082020-09-27 19:05:33 +02001583 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001584 anyres = g:number - 7
1585 anyres = g:number * 7
1586 anyres = g:number / 7
1587 anyres = g:number % 7
1588
1589 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001590 var fl = 3.0
1591 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001592 flres = fl - 7.0
1593 flres = fl * 7.0
1594 flres = fl / 7.0
1595 endif
1596enddef
1597
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001598def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001599 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001600 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001601 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001602 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001603 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001604 '\d LOAD $0.*' ..
1605 '\d PUSHNR 7.*' ..
1606 '\d OPNR +.*' ..
1607 '\d STORE $1.*' ..
1608 'nrres = nr - 7.*' ..
1609 '\d OPNR -.*' ..
1610 'nrres = nr \* 7.*' ..
1611 '\d OPNR \*.*' ..
1612 'nrres = nr / 7.*' ..
1613 '\d OPNR /.*' ..
1614 'nrres = nr % 7.*' ..
1615 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001616 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001617 '\d LOADG g:number.*' ..
1618 '\d PUSHNR 7.*' ..
1619 '\d OPANY +.*' ..
1620 '\d STORE $2.*' ..
1621 'anyres = g:number - 7.*' ..
1622 '\d OPANY -.*' ..
1623 'anyres = g:number \* 7.*' ..
1624 '\d OPANY \*.*' ..
1625 'anyres = g:number / 7.*' ..
1626 '\d OPANY /.*' ..
1627 'anyres = g:number % 7.*' ..
1628 '\d OPANY %.*',
1629 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001630 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001631 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001632 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001633 '\d PUSHF 3.0.*' ..
1634 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001635 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001636 '\d LOAD $3.*' ..
1637 '\d PUSHF 7.0.*' ..
1638 '\d OPFLOAT +.*' ..
1639 '\d STORE $4.*' ..
1640 'flres = fl - 7.0.*' ..
1641 '\d OPFLOAT -.*' ..
1642 'flres = fl \* 7.0.*' ..
1643 '\d OPFLOAT \*.*' ..
1644 'flres = fl / 7.0.*' ..
1645 '\d OPFLOAT /.*',
1646 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001647 endif
1648enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001649
Bram Moolenaar62aec932022-01-29 21:45:34 +00001650def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001651 var reslist = [1, 2] + [3, 4]
1652 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001653enddef
1654
1655def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001656 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001657 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001658 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001659 '\d PUSHNR 1.*' ..
1660 '\d PUSHNR 2.*' ..
1661 '\d NEWLIST size 2.*' ..
1662 '\d PUSHNR 3.*' ..
1663 '\d PUSHNR 4.*' ..
1664 '\d NEWLIST size 2.*' ..
1665 '\d ADDLIST.*' ..
1666 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001667 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001668 '\d PUSHBLOB 0z1122.*' ..
1669 '\d PUSHBLOB 0z3344.*' ..
1670 '\d ADDBLOB.*' ..
1671 '\d STORE $.*',
1672 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001673enddef
1674
1675let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001676def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001677 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001678 return res
1679enddef
1680
1681def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001682 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001683 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001684 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001685 '\d LOADG g:aa.*' ..
1686 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001687 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001688 '\d CONCAT.*' ..
1689 '\d STORE $.*',
1690 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001691 assert_equal('aabb', ConcatString())
1692enddef
1693
Bram Moolenaar62aec932022-01-29 21:45:34 +00001694def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001695 var s = "abcd"
1696 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001697 return res
1698enddef
1699
1700def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001702 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001703 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001704 '\d PUSHS "abcd"\_s*' ..
1705 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001706 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001707 '\d LOAD $0\_s*' ..
1708 '\d PUSHNR 1\_s*' ..
1709 '\d STRINDEX\_s*' ..
1710 '\d STORE $1\_s*',
1711 instr)
1712 assert_equal('b', StringIndex())
1713enddef
1714
Bram Moolenaar62aec932022-01-29 21:45:34 +00001715def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001717 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001718 return res
1719enddef
1720
1721def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001722 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001723 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001724 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001725 '\d PUSHS "abcd"\_s*' ..
1726 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001727 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001728 '\d LOAD $0\_s*' ..
1729 '\d PUSHNR 1\_s*' ..
1730 '\d PUSHNR 8\_s*' ..
1731 '\d STRSLICE\_s*' ..
1732 '\d STORE $1\_s*',
1733 instr)
1734 assert_equal('bcd', StringSlice())
1735enddef
1736
Bram Moolenaar62aec932022-01-29 21:45:34 +00001737def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001738 var l = [1, 2, 3]
1739 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001740 return res
1741enddef
1742
1743def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001744 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001745 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001746 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001747 '\d PUSHNR 1\_s*' ..
1748 '\d PUSHNR 2\_s*' ..
1749 '\d PUSHNR 3\_s*' ..
1750 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001751 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001752 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001753 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001754 '\d LOAD $0\_s*' ..
1755 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001756 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001757 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001758 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001759 assert_equal(2, ListIndex())
1760enddef
1761
Bram Moolenaar62aec932022-01-29 21:45:34 +00001762def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001763 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001764 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001765 return res
1766enddef
1767
1768def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001769 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001770 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001771 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001772 '\d PUSHNR 1\_s*' ..
1773 '\d PUSHNR 2\_s*' ..
1774 '\d PUSHNR 3\_s*' ..
1775 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001776 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001777 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001778 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001779 '\d LOAD $0\_s*' ..
1780 '\d PUSHNR 1\_s*' ..
1781 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001782 '\d\+ LISTSLICE\_s*' ..
1783 '\d\+ SETTYPE list<number>\_s*' ..
1784 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001785 instr)
1786 assert_equal([2, 3], ListSlice())
1787enddef
1788
Bram Moolenaar62aec932022-01-29 21:45:34 +00001789def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001790 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001791 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001792 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001793 return res
1794enddef
1795
1796def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001797 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001798 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001799 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001800 '\d PUSHS "item"\_s*' ..
1801 '\d PUSHNR 1\_s*' ..
1802 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001803 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001804 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001806 '\d\+ LOAD $0\_s*' ..
1807 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001808 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001809 '\d\+ STORE $1\_s*' ..
1810 'res = d\["item"\]\_s*' ..
1811 '\d\+ LOAD $0\_s*' ..
1812 '\d\+ PUSHS "item"\_s*' ..
1813 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001814 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001815 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001816 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001817 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001818enddef
1819
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001820let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001821def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001822 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001823 return res
1824enddef
1825
1826def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001827 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001828 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001829 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001830 '\d LOADG g:somelist\_s*' ..
1831 '\d PUSHNR 2\_s*' ..
1832 '\d ANYINDEX\_s*' ..
1833 '\d STORE $0\_s*' ..
1834 'return res\_s*' ..
1835 '\d LOAD $0\_s*' ..
1836 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1837 '\d RETURN',
1838 instr)
1839 assert_equal(3, AnyIndex())
1840enddef
1841
Bram Moolenaar62aec932022-01-29 21:45:34 +00001842def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001843 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001844 return res
1845enddef
1846
1847def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001848 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001849 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001850 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001851 '\d LOADG g:somelist\_s*' ..
1852 '\d PUSHNR 1\_s*' ..
1853 '\d PUSHNR 3\_s*' ..
1854 '\d ANYSLICE\_s*' ..
1855 '\d STORE $0\_s*' ..
1856 'return res\_s*' ..
1857 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001858 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001859 '\d RETURN',
1860 instr)
1861 assert_equal([2, 3, 4], AnySlice())
1862enddef
1863
Bram Moolenaar62aec932022-01-29 21:45:34 +00001864def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001865 g:nr = 9
1866 var plus = +g:nr
1867 var minus = -g:nr
1868 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001869enddef
1870
1871def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001872 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001873 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001874 'g:nr = 9\_s*' ..
1875 '\d PUSHNR 9\_s*' ..
1876 '\d STOREG g:nr\_s*' ..
1877 'var plus = +g:nr\_s*' ..
1878 '\d LOADG g:nr\_s*' ..
1879 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1880 '\d STORE $0\_s*' ..
1881 'var minus = -g:nr\_s*' ..
1882 '\d LOADG g:nr\_s*' ..
1883 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001884 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001885 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001886 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001887 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001888enddef
1889
Bram Moolenaar62aec932022-01-29 21:45:34 +00001890def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001891 var flag = true
1892 var invert = !flag
1893 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001894 return res
1895enddef
1896
1897def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001898 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001899 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001900 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001901 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001902 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001903 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001904 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001905 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001906 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001907 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001908 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001909 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001910 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001911 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001912 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001913enddef
1914
Bram Moolenaar62aec932022-01-29 21:45:34 +00001915def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001916 var one = 1
1917 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001918 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001919 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001920 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001921enddef
1922
1923def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001924 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001925 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001926 'var one = 1\_s*' ..
1927 '0 STORE 1 in $0\_s*' ..
1928 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001929 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001930 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001931 '1 LOAD $0\_s*' ..
1932 '2 COND2BOOL\_s*' ..
1933 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1934 '4 LOAD $1\_s*' ..
1935 '5 COND2BOOL\_s*' ..
1936 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1937 '7 LOAD $0\_s*' ..
1938 '8 COND2BOOL\_s*' ..
1939 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001940 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001941 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001942 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001943 instr)
1944 assert_equal(true, InvertBool())
1945enddef
1946
Bram Moolenaar62aec932022-01-29 21:45:34 +00001947def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00001948 var t: number
1949 t = 1
1950 t = 0
1951enddef
1952
1953def Test_disassemble_auto_init()
1954 var instr = execute('disassemble AutoInit')
1955 assert_match('AutoInit\_s*' ..
1956 'var t: number\_s*' ..
1957 't = 1\_s*' ..
1958 '\d STORE 1 in $0\_s*' ..
1959 't = 0\_s*' ..
1960 '\d STORE 0 in $0\_s*' ..
1961 '\d\+ RETURN void',
1962 instr)
1963enddef
1964
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001965def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001966 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001967 ['true == isFalse', 'COMPAREBOOL =='],
1968 ['true != isFalse', 'COMPAREBOOL !='],
1969 ['v:none == isNull', 'COMPARESPECIAL =='],
1970 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00001971 ['"text" == isNull', 'COMPARENULL =='],
1972 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001973
Bram Moolenaara5565e42020-05-09 15:44:01 +02001974 ['111 == aNumber', 'COMPARENR =='],
1975 ['111 != aNumber', 'COMPARENR !='],
1976 ['111 > aNumber', 'COMPARENR >'],
1977 ['111 < aNumber', 'COMPARENR <'],
1978 ['111 >= aNumber', 'COMPARENR >='],
1979 ['111 <= aNumber', 'COMPARENR <='],
1980 ['111 =~ aNumber', 'COMPARENR =\~'],
1981 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001982
Bram Moolenaara5565e42020-05-09 15:44:01 +02001983 ['"xx" != aString', 'COMPARESTRING !='],
1984 ['"xx" > aString', 'COMPARESTRING >'],
1985 ['"xx" < aString', 'COMPARESTRING <'],
1986 ['"xx" >= aString', 'COMPARESTRING >='],
1987 ['"xx" <= aString', 'COMPARESTRING <='],
1988 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1989 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1990 ['"xx" is aString', 'COMPARESTRING is'],
1991 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001992
Bram Moolenaara5565e42020-05-09 15:44:01 +02001993 ['0z11 == aBlob', 'COMPAREBLOB =='],
1994 ['0z11 != aBlob', 'COMPAREBLOB !='],
1995 ['0z11 is aBlob', 'COMPAREBLOB is'],
1996 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001997
Bram Moolenaara5565e42020-05-09 15:44:01 +02001998 ['[1, 2] == aList', 'COMPARELIST =='],
1999 ['[1, 2] != aList', 'COMPARELIST !='],
2000 ['[1, 2] is aList', 'COMPARELIST is'],
2001 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002002
Bram Moolenaare0de1712020-12-02 17:36:54 +01002003 ['{a: 1} == aDict', 'COMPAREDICT =='],
2004 ['{a: 1} != aDict', 'COMPAREDICT !='],
2005 ['{a: 1} is aDict', 'COMPAREDICT is'],
2006 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002007
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002008 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2009 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2010 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2011 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002012
2013 ['77 == g:xx', 'COMPAREANY =='],
2014 ['77 != g:xx', 'COMPAREANY !='],
2015 ['77 > g:xx', 'COMPAREANY >'],
2016 ['77 < g:xx', 'COMPAREANY <'],
2017 ['77 >= g:xx', 'COMPAREANY >='],
2018 ['77 <= g:xx', 'COMPAREANY <='],
2019 ['77 =~ g:xx', 'COMPAREANY =\~'],
2020 ['77 !~ g:xx', 'COMPAREANY !\~'],
2021 ['77 is g:xx', 'COMPAREANY is'],
2022 ['77 isnot g:xx', 'COMPAREANY isnot'],
2023 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002024 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002025 if has('float')
2026 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02002027 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2028 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2029 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2030 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2031 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2032 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2033 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2034 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002035 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02002036 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002037 endif
2038
Bram Moolenaarac564082020-09-27 19:05:33 +02002039 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002040 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002041 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002042 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002043 ' var isFalse = false',
2044 ' var isNull = v:null',
2045 ' var aNumber = 222',
2046 ' var aString = "yy"',
2047 ' var aBlob = 0z22',
2048 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002049 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002050 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002051 ' if ' .. case[0],
2052 ' echo 42'
2053 ' endif',
2054 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002055 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002056 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002057 assert_match('TestCase' .. nr .. '.*' ..
2058 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2059 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002060 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002061 '\d ' .. case[1] .. '.*' ..
2062 '\d JUMP_IF_FALSE -> \d\+.*',
2063 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002064
2065 nr += 1
2066 endfor
2067
Bram Moolenaar22da5592020-03-19 14:52:20 +01002068 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002069enddef
2070
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002071def s:FalsyOp()
2072 echo g:flag ?? "yes"
2073 echo [] ?? "empty list"
2074 echo "" ?? "empty string"
2075enddef
2076
Dominique Pelle81b573d2022-03-22 21:14:55 +00002077def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002078 var res = execute('disass s:FalsyOp')
2079 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2080 'echo g:flag ?? "yes"\_s*' ..
2081 '0 LOADG g:flag\_s*' ..
2082 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2083 '2 PUSHS "yes"\_s*' ..
2084 '3 ECHO 1\_s*' ..
2085 'echo \[\] ?? "empty list"\_s*' ..
2086 '4 NEWLIST size 0\_s*' ..
2087 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2088 '6 PUSHS "empty list"\_s*' ..
2089 '7 ECHO 1\_s*' ..
2090 'echo "" ?? "empty string"\_s*' ..
2091 '\d\+ PUSHS "empty string"\_s*' ..
2092 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002093 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002094 res)
2095enddef
2096
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002097def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002098 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002099 ['"xx" == "yy"', false],
2100 ['"aa" == "aa"', true],
2101 ['has("eval") ? true : false', true],
2102 ['has("asdf") ? true : false', false],
2103 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002104
Bram Moolenaarac564082020-09-27 19:05:33 +02002105 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002106 for case in cases
2107 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002108 ' if ' .. case[0],
2109 ' echo 42'
2110 ' endif',
2111 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002112 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002113 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002114 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002115 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002116 assert_match('TestCase' .. nr .. '.*' ..
2117 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2118 '\d PUSHNR 42.*' ..
2119 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002120 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002121 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002122 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002123 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002124 assert_match('TestCase' .. nr .. '.*' ..
2125 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2126 'echo 42[ \n]*' ..
2127 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002128 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002129 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002130 endif
2131
2132 nr += 1
2133 endfor
2134
2135 delete('Xdisassemble')
2136enddef
2137
Bram Moolenaarad39c092020-02-26 18:23:43 +01002138def s:Execute()
2139 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002140 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002141 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002142 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002143 execute 'help ' .. tag
2144enddef
2145
2146def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002147 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002148 assert_match('\<SNR>\d*_Execute\_s*' ..
2149 "execute 'help vim9.txt'\\_s*" ..
2150 '\d PUSHS "help vim9.txt"\_s*' ..
2151 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002152 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002153 '\d PUSHS "help vim9.txt"\_s*' ..
2154 '\d STORE $0\_s*' ..
2155 'execute cmd\_s*' ..
2156 '\d LOAD $0\_s*' ..
2157 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002158 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002159 '\d PUSHS "vim9.txt"\_s*' ..
2160 '\d STORE $1\_s*' ..
2161 "execute 'help ' .. tag\\_s*" ..
2162 '\d\+ PUSHS "help "\_s*' ..
2163 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002164 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002165 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002166 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002167 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002168enddef
2169
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002170def s:OnlyRange()
2171 :$
2172 :123
2173 :'m
2174enddef
2175
2176def Test_disassemble_range_only()
2177 var res = execute('disass s:OnlyRange')
2178 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2179 ':$\_s*' ..
2180 '\d EXECRANGE $\_s*' ..
2181 ':123\_s*' ..
2182 '\d EXECRANGE 123\_s*' ..
2183 ':''m\_s*' ..
2184 '\d EXECRANGE ''m\_s*' ..
2185 '\d\+ RETURN void',
2186 res)
2187enddef
2188
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002189def s:Echomsg()
2190 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002191 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002192 echoerr 'went' .. 'wrong'
2193enddef
2194
2195def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002196 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002197 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2198 "echomsg 'some' 'message'\\_s*" ..
2199 '\d PUSHS "some"\_s*' ..
2200 '\d PUSHS "message"\_s*' ..
2201 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002202 "echoconsole 'nothing'\\_s*" ..
2203 '\d PUSHS "nothing"\_s*' ..
2204 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002205 "echoerr 'went' .. 'wrong'\\_s*" ..
2206 '\d PUSHS "wentwrong"\_s*' ..
2207 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002208 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002209 res)
2210enddef
2211
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002212def SomeStringArg(arg: string)
2213 echo arg
2214enddef
2215
2216def SomeAnyArg(arg: any)
2217 echo arg
2218enddef
2219
2220def SomeStringArgAndReturn(arg: string): string
2221 return arg
2222enddef
2223
2224def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002225 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002226 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2227 '\d *echo arg.*' ..
2228 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002229 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002230
Bram Moolenaarac564082020-09-27 19:05:33 +02002231 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002232 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2233 '\d *echo arg\_s*' ..
2234 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002235 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002236
Bram Moolenaarac564082020-09-27 19:05:33 +02002237 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002238 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2239 '\d *return arg\_s*' ..
2240 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002241 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002242enddef
2243
Bram Moolenaar09689a02020-05-09 22:50:08 +02002244def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002245 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002246 vim9script
2247 def FuncOne(): string
2248 return FuncTwo()
2249 enddef
2250 def FuncTwo(): string
2251 return 'two'
2252 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002253 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002254 END
2255 writefile(lines, 'Xdisassemble')
2256 source Xdisassemble
2257
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002258 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002259 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2260 'return FuncTwo()\_s*' ..
2261 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002262 '\d RETURN',
2263 g:res_FuncOne)
2264
2265 delete('Xdisassemble')
2266 unlet g:res_FuncOne
2267enddef
2268
Bram Moolenaar61a89812020-05-07 16:58:17 +02002269def s:ConcatStrings(): string
2270 return 'one' .. 'two' .. 'three'
2271enddef
2272
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002273def s:ComputeConst(): number
2274 return 2 + 3 * 4 / 6 + 7
2275enddef
2276
Bram Moolenaar1c747212020-05-09 18:28:34 +02002277def s:ComputeConstParen(): number
2278 return ((2 + 4) * (8 / 2)) / (3 + 4)
2279enddef
2280
Bram Moolenaar61a89812020-05-07 16:58:17 +02002281def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002282 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002283 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2284 "return 'one' .. 'two' .. 'three'\\_s*" ..
2285 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002286 '\d RETURN',
2287 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002288
2289 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002290 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2291 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2292 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002293 '\d RETURN',
2294 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002295
2296 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002297 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2298 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2299 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002300 '\d RETURN',
2301 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002302enddef
2303
Bram Moolenaar389df252020-07-09 21:20:47 +02002304def s:CallAppend()
2305 eval "some text"->append(2)
2306enddef
2307
2308def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002309 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002310 assert_match('<SNR>\d*_CallAppend\_s*' ..
2311 'eval "some text"->append(2)\_s*' ..
2312 '\d PUSHS "some text"\_s*' ..
2313 '\d PUSHNR 2\_s*' ..
2314 '\d SHUFFLE 2 up 1\_s*' ..
2315 '\d BCALL append(argc 2)\_s*' ..
2316 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002317 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002318 res)
2319enddef
2320
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002321
2322def s:SilentMessage()
2323 silent echomsg "text"
2324 silent! echoerr "error"
2325enddef
2326
2327def Test_silent()
2328 var res = execute('disass s:SilentMessage')
2329 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2330 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002331 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002332 '\d PUSHS "text"\_s*' ..
2333 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002334 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002335 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002336 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002337 '\d PUSHS "error"\_s*' ..
2338 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002339 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002340 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002341 res)
2342enddef
2343
2344def s:SilentIf()
2345 silent if 4 == g:five
2346 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002347 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002348enddef
2349
2350def Test_silent_if()
2351 var res = execute('disass s:SilentIf')
2352 assert_match('<SNR>\d*_SilentIf\_s*' ..
2353 'silent if 4 == g:five\_s*' ..
2354 '\d\+ CMDMOD silent\_s*' ..
2355 '\d\+ PUSHNR 4\_s*' ..
2356 '\d\+ LOADG g:five\_s*' ..
2357 '\d\+ COMPAREANY ==\_s*' ..
2358 '\d\+ CMDMOD_REV\_s*' ..
2359 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2360 'silent elseif 4 == g:five\_s*' ..
2361 '\d\+ JUMP -> \d\+\_s*' ..
2362 '\d\+ CMDMOD silent\_s*' ..
2363 '\d\+ PUSHNR 4\_s*' ..
2364 '\d\+ LOADG g:five\_s*' ..
2365 '\d\+ COMPAREANY ==\_s*' ..
2366 '\d\+ CMDMOD_REV\_s*' ..
2367 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002368 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002369 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002370 res)
2371enddef
2372
2373def s:SilentFor()
2374 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002375 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002376enddef
2377
2378def Test_silent_for()
2379 var res = execute('disass s:SilentFor')
2380 assert_match('<SNR>\d*_SilentFor\_s*' ..
2381 'silent for i in \[0\]\_s*' ..
2382 '\d CMDMOD silent\_s*' ..
2383 '\d STORE -1 in $0\_s*' ..
2384 '\d PUSHNR 0\_s*' ..
2385 '\d NEWLIST size 1\_s*' ..
2386 '\d CMDMOD_REV\_s*' ..
2387 '5 FOR $0 -> 8\_s*' ..
2388 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002389 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002390 '\d JUMP -> 5\_s*' ..
2391 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002392 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002393 res)
2394enddef
2395
2396def s:SilentWhile()
2397 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002398 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002399enddef
2400
2401def Test_silent_while()
2402 var res = execute('disass s:SilentWhile')
2403 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2404 'silent while g:not\_s*' ..
2405 '0 CMDMOD silent\_s*' ..
2406 '\d LOADG g:not\_s*' ..
2407 '\d COND2BOOL\_s*' ..
2408 '\d CMDMOD_REV\_s*' ..
2409 '\d JUMP_IF_FALSE -> 6\_s*' ..
2410
Bram Moolenaarfa984412021-03-25 22:15:28 +01002411 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002412 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002413 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002414 res)
2415enddef
2416
2417def s:SilentReturn(): string
2418 silent return "done"
2419enddef
2420
2421def Test_silent_return()
2422 var res = execute('disass s:SilentReturn')
2423 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2424 'silent return "done"\_s*' ..
2425 '\d CMDMOD silent\_s*' ..
2426 '\d PUSHS "done"\_s*' ..
2427 '\d CMDMOD_REV\_s*' ..
2428 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002429 res)
2430enddef
2431
Bram Moolenaarb2049902021-01-24 12:53:53 +01002432def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002433 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002434 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002435 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002436 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002437 return "done"
2438enddef
2439
2440def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002441 if !has('profile')
2442 MissingFeature 'profile'
2443 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002444 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002445 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002446 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002447 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002448 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002449 '\d PUSHS "profiled"\_s*' ..
2450 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002451 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002452 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002453 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002454 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002455 '\d PUSHS "some text"\_s*' ..
2456 '\d STORE $0\_s*' ..
2457 'return "done"\_s*' ..
2458 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002459 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002460 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002461 '\d\+ RETURN\_s*' ..
2462 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002463 res)
2464enddef
2465
Bram Moolenaare99d4222021-06-13 14:01:26 +02002466def Test_debugged()
2467 var res = execute('disass debug s:Profiled')
2468 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002469 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002470 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002471 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002472 '\d PUSHS "profiled"\_s*' ..
2473 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002474 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002475 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002476 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002477 '\d PUSHS "some text"\_s*' ..
2478 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002479 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002480 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002481 '\d PUSHS "done"\_s*' ..
2482 '\d RETURN\_s*',
2483 res)
2484enddef
2485
Bram Moolenaar90770b72021-11-30 20:57:38 +00002486def s:ElseifConstant()
2487 if g:value
2488 echo "one"
2489 elseif true
2490 echo "true"
2491 elseif false
2492 echo "false"
2493 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002494 if 0
2495 echo "yes"
2496 elseif 0
2497 echo "no"
2498 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002499enddef
2500
2501def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002502 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002503 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2504 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002505 '0 DEBUG line 1-1 varcount 0\_s*' ..
2506 '1 LOADG g:value\_s*' ..
2507 '2 COND2BOOL\_s*' ..
2508 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002509 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002510 '4 DEBUG line 2-2 varcount 0\_s*' ..
2511 '5 PUSHS "one"\_s*' ..
2512 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002513 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002514 '7 JUMP -> 12\_s*' ..
2515 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002516 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002517 '9 DEBUG line 4-4 varcount 0\_s*' ..
2518 '10 PUSHS "true"\_s*' ..
2519 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002520 'elseif false\_s*' ..
2521 'echo "false"\_s*' ..
2522 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002523 'if 0\_s*' ..
2524 '12 DEBUG line 8-8 varcount 0\_s*' ..
2525 'echo "yes"\_s*' ..
2526 'elseif 0\_s*' ..
2527 '13 DEBUG line 11-10 varcount 0\_s*' ..
2528 'echo "no"\_s*' ..
2529 'endif\_s*' ..
2530 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002531 res)
2532enddef
2533
Bram Moolenaar093165c2021-08-22 13:35:31 +02002534def s:DebugElseif()
2535 var b = false
2536 if b
2537 eval 1 + 0
2538 silent elseif !b
2539 eval 2 + 0
2540 endif
2541enddef
2542
2543def Test_debug_elseif()
2544 var res = execute('disass debug s:DebugElseif')
2545 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2546 'var b = false\_s*' ..
2547 '0 DEBUG line 1-1 varcount 0\_s*' ..
2548 '1 PUSH false\_s*' ..
2549 '2 STORE $0\_s*' ..
2550
2551 'if b\_s*' ..
2552 '3 DEBUG line 2-2 varcount 1\_s*' ..
2553 '4 LOAD $0\_s*' ..
2554 '5 JUMP_IF_FALSE -> 10\_s*' ..
2555
2556 'eval 1 + 0\_s*' ..
2557 '6 DEBUG line 3-3 varcount 1\_s*' ..
2558 '7 PUSHNR 1\_s*' ..
2559 '8 DROP\_s*' ..
2560
2561 'silent elseif !b\_s*' ..
2562 '9 JUMP -> 20\_s*' ..
2563 '10 CMDMOD silent\_s*' ..
2564 '11 DEBUG line 4-4 varcount 1\_s*' ..
2565 '12 LOAD $0\_s*' ..
2566 '13 INVERT -1 (!val)\_s*' ..
2567 '14 CMDMOD_REV\_s*' ..
2568 '15 JUMP_IF_FALSE -> 20\_s*' ..
2569
2570 'eval 2 + 0\_s*' ..
2571 '16 DEBUG line 5-5 varcount 1\_s*' ..
2572 '17 PUSHNR 2\_s*' ..
2573 '18 DROP\_s*' ..
2574
2575 'endif\_s*' ..
2576 '19 DEBUG line 6-6 varcount 1\_s*' ..
2577 '20 RETURN void*',
2578 res)
2579enddef
2580
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002581def s:DebugFor()
2582 echo "hello"
2583 for a in [0]
2584 echo a
2585 endfor
2586enddef
2587
2588def Test_debug_for()
2589 var res = execute('disass debug s:DebugFor')
2590 assert_match('<SNR>\d*_DebugFor\_s*' ..
2591 'echo "hello"\_s*' ..
2592 '0 DEBUG line 1-1 varcount 0\_s*' ..
2593 '1 PUSHS "hello"\_s*' ..
2594 '2 ECHO 1\_s*' ..
2595
2596 'for a in \[0\]\_s*' ..
2597 '3 DEBUG line 2-2 varcount 0\_s*' ..
2598 '4 STORE -1 in $0\_s*' ..
2599 '5 PUSHNR 0\_s*' ..
2600 '6 NEWLIST size 1\_s*' ..
2601 '7 DEBUG line 2-2 varcount 2\_s*' ..
2602 '8 FOR $0 -> 15\_s*' ..
2603 '9 STORE $1\_s*' ..
2604
2605 'echo a\_s*' ..
2606 '10 DEBUG line 3-3 varcount 2\_s*' ..
2607 '11 LOAD $1\_s*' ..
2608 '12 ECHO 1\_s*' ..
2609
2610 'endfor\_s*' ..
2611 '13 DEBUG line 4-4 varcount 2\_s*' ..
2612 '14 JUMP -> 7\_s*' ..
2613 '15 DROP\_s*' ..
2614 '16 RETURN void*',
2615 res)
2616enddef
2617
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002618def s:TryCatch()
2619 try
2620 echo "try"
2621 catch /error/
2622 echo "caught"
2623 endtry
2624enddef
2625
2626def Test_debug_try_catch()
2627 var res = execute('disass debug s:TryCatch')
2628 assert_match('<SNR>\d*_TryCatch\_s*' ..
2629 'try\_s*' ..
2630 '0 DEBUG line 1-1 varcount 0\_s*' ..
2631 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2632 'echo "try"\_s*' ..
2633 '2 DEBUG line 2-2 varcount 0\_s*' ..
2634 '3 PUSHS "try"\_s*' ..
2635 '4 ECHO 1\_s*' ..
2636 'catch /error/\_s*' ..
2637 '5 DEBUG line 3-3 varcount 0\_s*' ..
2638 '6 JUMP -> 17\_s*' ..
2639 '7 DEBUG line 4-3 varcount 0\_s*' ..
2640 '8 PUSH v:exception\_s*' ..
2641 '9 PUSHS "error"\_s*' ..
2642 '10 COMPARESTRING =\~\_s*' ..
2643 '11 JUMP_IF_FALSE -> 17\_s*' ..
2644 '12 CATCH\_s*' ..
2645 'echo "caught"\_s*' ..
2646 '13 DEBUG line 4-4 varcount 0\_s*' ..
2647 '14 PUSHS "caught"\_s*' ..
2648 '15 ECHO 1\_s*' ..
2649 'endtry\_s*' ..
2650 '16 DEBUG line 5-5 varcount 0\_s*' ..
2651 '17 ENDTRY\_s*' ..
2652 '\d\+ RETURN void',
2653 res)
2654enddef
2655
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002656func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002657 echo 'legacy'
2658endfunc
2659
2660def s:UseMember()
2661 var d = {func: Legacy}
2662 var v = d.func()
2663enddef
2664
2665def Test_disassemble_dict_stack()
2666 var res = execute('disass s:UseMember')
2667 assert_match('<SNR>\d*_UseMember\_s*' ..
2668 'var d = {func: Legacy}\_s*' ..
2669 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002670 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002671 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002672 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002673 '\d STORE $0\_s*' ..
2674
2675 'var v = d.func()\_s*' ..
2676 '\d LOAD $0\_s*' ..
2677 '\d MEMBER func\_s*' ..
2678 '\d PCALL top (argc 0)\_s*' ..
2679 '\d PCALL end\_s*' ..
2680 '\d CLEARDICT\_s*' ..
2681 '\d\+ STORE $1\_s*' ..
2682 '\d\+ RETURN void*',
2683 res)
2684enddef
2685
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002686def s:RetLegacy(): string
2687 legacy return "yes"
2688enddef
2689
2690def Test_disassemble_return_legacy()
2691 var res = execute('disass s:RetLegacy')
2692 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2693 'legacy return "yes"\_s*' ..
2694 '\d CMDMOD legacy\_s*' ..
2695 '\d EVAL legacy "yes"\_s*' ..
2696 '\d CHECKTYPE string stack\[-1]\_s*' ..
2697 '\d CMDMOD_REV\_s*' ..
2698 '\d RETURN',
2699 res)
2700enddef
2701
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002702def s:EchoMessages()
2703 echohl ErrorMsg | echom v:exception | echohl NONE
2704enddef
2705
2706def Test_disassemble_nextcmd()
2707 # splitting commands and removing trailing blanks should not change the line
2708 var res = execute('disass s:EchoMessages')
2709 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2710 'echohl ErrorMsg | echom v:exception | echohl NONE',
2711 res)
2712enddef
2713
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002714def Test_disassemble_after_reload()
2715 var lines =<< trim END
2716 vim9script
2717 if exists('g:ThisFunc')
2718 finish
2719 endif
2720 var name: any
2721 def g:ThisFunc(): number
2722 g:name = name
2723 return 0
2724 enddef
2725 def g:ThatFunc(): number
2726 name = g:name
2727 return 0
2728 enddef
2729 END
2730 lines->writefile('Xreload.vim')
2731
2732 source Xreload.vim
2733 g:ThisFunc()
2734 g:ThatFunc()
2735
2736 source Xreload.vim
2737 var res = execute('disass g:ThisFunc')
2738 assert_match('ThisFunc\_s*' ..
2739 'g:name = name\_s*' ..
2740 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2741 '\d STOREG g:name\_s*' ..
2742 'return 0\_s*' ..
2743 '\d PUSHNR 0\_s*' ..
2744 '\d RETURN\_s*',
2745 res)
2746
2747 res = execute('disass g:ThatFunc')
2748 assert_match('ThatFunc\_s*' ..
2749 'name = g:name\_s*' ..
2750 '\d LOADG g:name\_s*' ..
2751 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2752 'return 0\_s*' ..
2753 '\d PUSHNR 0\_s*' ..
2754 '\d RETURN\_s*',
2755 res)
2756
2757 delete('Xreload.vim')
2758 delfunc g:ThisFunc
2759 delfunc g:ThatFunc
2760enddef
2761
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002762
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002763
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002764" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker