blob: 07e4936ea05dce2894e23521da7711e35fa0e903 [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 Moolenaarf79d9dd2022-05-21 15:39:02 +010046 assert_fails('disass Test_disassemble_load burp', 'E488:')
47 assert_fails('disass debug debug Test_disassemble_load', 'E488:')
48 assert_fails('disass profile profile Test_disassemble_load', 'E488:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010049
Bram Moolenaarac564082020-09-27 19:05:33 +020050 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020051 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010052 'buffers\_s*' ..
53 '\d\+ EXEC \+buffers\_s*' ..
54 'echo\_s*' ..
55 'echo arg\_s*' ..
56 '\d\+ LOAD arg\[-1\]\_s*' ..
57 '\d\+ ECHO 1\_s*' ..
58 'echo local\_s*' ..
59 '\d\+ LOAD $0\_s*' ..
60 '\d\+ ECHO 1\_s*' ..
61 'echo &lines\_s*' ..
62 '\d\+ LOADOPT &lines\_s*' ..
63 '\d\+ ECHO 1\_s*' ..
64 'echo v:version\_s*' ..
65 '\d\+ LOADV v:version\_s*' ..
66 '\d\+ ECHO 1\_s*' ..
67 'echo s:scriptvar\_s*' ..
68 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
69 '\d\+ ECHO 1\_s*' ..
70 'echo g:globalvar\_s*' ..
71 '\d\+ LOADG g:globalvar\_s*' ..
72 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020073 'echo get(g:, "global")\_s*' ..
74 '\d\+ LOAD g:\_s*' ..
75 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010076 '\d\+ BCALL get(argc 2)\_s*' ..
77 '\d\+ ECHO 1\_s*' ..
78 'echo g:auto#var\_s*' ..
79 '\d\+ LOADAUTO g:auto#var\_s*' ..
80 '\d\+ ECHO 1\_s*' ..
81 'echo b:buffervar\_s*' ..
82 '\d\+ LOADB b:buffervar\_s*' ..
83 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020084 'echo get(b:, "buffer")\_s*' ..
85 '\d\+ LOAD b:\_s*' ..
86 '\d\+ PUSHS "buffer"\_s*' ..
87 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020088 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020089 'echo get(w:, "window")\_s*' ..
90 '\d\+ LOAD w:\_s*' ..
91 '\d\+ PUSHS "window"\_s*' ..
92 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020093 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020094 'echo get(t:, "tab")\_s*' ..
95 '\d\+ LOAD t:\_s*' ..
96 '\d\+ PUSHS "tab"\_s*' ..
97 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020098 ' LOADENV $ENVVAR.*' ..
99 ' LOADREG @z.*',
100 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100101enddef
102
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200103def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200104 var filename = "file"
105 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200106 edit the`=filename``=filenr`.txt
107enddef
108
109def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200110 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200111 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200112 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200113 '\d PUSHS "file"\_s*' ..
114 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200115 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200116 '\d STORE 123 in $1\_s*' ..
117 ' edit the`=filename``=filenr`.txt\_s*' ..
118 '\d PUSHS "edit the"\_s*' ..
119 '\d LOAD $0\_s*' ..
120 '\d LOAD $1\_s*' ..
121 '\d 2STRING stack\[-1\]\_s*' ..
122 '\d\+ PUSHS ".txt"\_s*' ..
123 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200124 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200125 res)
126enddef
127
Bram Moolenaar20677332021-06-06 17:02:53 +0200128if has('python3')
129 def s:PyHeredoc()
130 python3 << EOF
131 print('hello')
132EOF
133 enddef
134
135 def Test_disassemble_python_heredoc()
136 var res = execute('disass s:PyHeredoc')
137 assert_match('<SNR>\d*_PyHeredoc.*' ..
138 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
139 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200140 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200141 res)
142 enddef
143endif
144
Bram Moolenaar4c137212021-04-19 16:48:48 +0200145def s:Substitute()
146 var expr = "abc"
147 :%s/a/\=expr/&g#c
148enddef
149
150def Test_disassemble_substitute()
151 var res = execute('disass s:Substitute')
152 assert_match('<SNR>\d*_Substitute.*' ..
153 ' var expr = "abc"\_s*' ..
154 '\d PUSHS "abc"\_s*' ..
155 '\d STORE $0\_s*' ..
156 ' :%s/a/\\=expr/&g#c\_s*' ..
157 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
158 ' 0 LOAD $0\_s*' ..
159 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200160 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200161 res)
162enddef
163
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200164
165def s:SearchPair()
166 var col = 8
167 searchpair("{", "", "}", "", "col('.') > col")
168enddef
169
170def Test_disassemble_seachpair()
171 var res = execute('disass s:SearchPair')
172 assert_match('<SNR>\d*_SearchPair.*' ..
173 ' var col = 8\_s*' ..
174 '\d STORE 8 in $0\_s*' ..
175 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
176 '\d PUSHS "{"\_s*' ..
177 '\d PUSHS ""\_s*' ..
178 '\d PUSHS "}"\_s*' ..
179 '\d PUSHS ""\_s*' ..
180 '\d INSTR\_s*' ..
181 ' 0 PUSHS "."\_s*' ..
182 ' 1 BCALL col(argc 1)\_s*' ..
183 ' 2 LOAD $0\_s*' ..
184 ' 3 COMPARENR >\_s*' ..
185 ' -------------\_s*' ..
186 '\d BCALL searchpair(argc 5)\_s*' ..
187 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200188 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200189 res)
190enddef
191
192
LemonBoyf3b48952022-05-05 13:53:03 +0100193def s:SubstituteExpr()
194 substitute('a', 'b', '\=123', 'g')
195enddef
196
197def Test_disassemble_substitute_expr()
198 var res = execute('disass s:SubstituteExpr')
199 assert_match('<SNR>\d*_SubstituteExpr.*' ..
200 'substitute(''a'', ''b'', ''\\=123'', ''g'')\_s*' ..
201 '\d PUSHS "a"\_s*' ..
202 '\d PUSHS "b"\_s*' ..
203 '\d INSTR\_s*' ..
204 ' 0 PUSHNR 123\_s*' ..
205 ' -------------\_s*' ..
206 '\d PUSHS "g"\_s*' ..
207 '\d BCALL substitute(argc 4)\_s*' ..
208 '\d DROP\_s*' ..
209 '\d RETURN void',
210 res)
211enddef
212
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200213def s:RedirVar()
214 var result: string
215 redir =>> result
216 echo "text"
217 redir END
218enddef
219
220def Test_disassemble_redir_var()
221 var res = execute('disass s:RedirVar')
222 assert_match('<SNR>\d*_RedirVar.*' ..
223 ' var result: string\_s*' ..
224 '\d PUSHS "\[NULL\]"\_s*' ..
225 '\d STORE $0\_s*' ..
226 ' redir =>> result\_s*' ..
227 '\d REDIR\_s*' ..
228 ' echo "text"\_s*' ..
229 '\d PUSHS "text"\_s*' ..
230 '\d ECHO 1\_s*' ..
231 ' redir END\_s*' ..
232 '\d LOAD $0\_s*' ..
233 '\d REDIR END\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100234 '\d CONCAT size 2\_s*' ..
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200235 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200236 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200237 res)
238enddef
239
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200240def s:Cexpr()
241 var errors = "list of errors"
242 cexpr errors
243enddef
244
245def Test_disassemble_cexpr()
246 var res = execute('disass s:Cexpr')
247 assert_match('<SNR>\d*_Cexpr.*' ..
248 ' var errors = "list of errors"\_s*' ..
249 '\d PUSHS "list of errors"\_s*' ..
250 '\d STORE $0\_s*' ..
251 ' cexpr errors\_s*' ..
252 '\d CEXPR pre cexpr\_s*' ..
253 '\d LOAD $0\_s*' ..
254 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200255 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200256 res)
257enddef
258
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200259def s:YankRange()
260 norm! m[jjm]
261 :'[,']yank
262enddef
263
264def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200265 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200266 assert_match('<SNR>\d*_YankRange.*' ..
267 ' norm! m\[jjm\]\_s*' ..
268 '\d EXEC norm! m\[jjm\]\_s*' ..
269 ' :''\[,''\]yank\_s*' ..
270 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200271 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200272 res)
273enddef
274
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200275def s:PutExpr()
276 :3put ="text"
277enddef
278
279def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200280 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200281 assert_match('<SNR>\d*_PutExpr.*' ..
282 ' :3put ="text"\_s*' ..
283 '\d PUSHS "text"\_s*' ..
284 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200285 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200286 res)
287enddef
288
Bram Moolenaar08597872020-12-10 19:43:40 +0100289def s:PutRange()
290 :$-2put a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100291 :$-3put! b
Bram Moolenaar08597872020-12-10 19:43:40 +0100292enddef
293
294def Test_disassemble_put_range()
295 var res = execute('disass s:PutRange')
296 assert_match('<SNR>\d*_PutRange.*' ..
297 ' :$-2put a\_s*' ..
298 '\d RANGE $-2\_s*' ..
299 '\d PUT a range\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100300
301 ' :$-3put! b\_s*' ..
302 '\d RANGE $-3\_s*' ..
303 '\d PUT b above range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200304 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100305 res)
306enddef
307
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100308def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 var localbool = true
310 var localspec = v:none
311 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100312 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200313 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100314 endif
315enddef
316
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100317def Test_disassemble_push()
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100318 mkdir('Xdisdir/autoload', 'p')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000319 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100320 exe 'set rtp^=' .. getcwd() .. '/Xdisdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000321
322 var lines =<< trim END
323 vim9script
324 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100325 writefile(lines, 'Xdisdir/autoload/autoscript.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000326
327 lines =<< trim END
328 vim9script
329 import autoload 'autoscript.vim'
330
Bram Moolenaara749a422022-02-12 19:52:25 +0000331 def AutoloadFunc()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000332 &operatorfunc = autoscript.Opfunc
333 enddef
334
Bram Moolenaara749a422022-02-12 19:52:25 +0000335 var res = execute('disass AutoloadFunc')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000336 assert_match('<SNR>\d*_AutoloadFunc.*' ..
337 '&operatorfunc = autoscript.Opfunc\_s*' ..
338 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
339 '1 STOREFUNCOPT &operatorfunc\_s*' ..
340 '2 RETURN void',
341 res)
342 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000343 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000344
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100345 delete('Xdisdir', 'rf')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000346 &rtp = save_rtp
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100347enddef
348
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100349def Test_disassemble_import_autoload()
350 writefile(['vim9script'], 'XimportAL.vim')
351
352 var lines =<< trim END
353 vim9script
354 import autoload './XimportAL.vim'
355
356 def AutoloadFunc()
357 echo XimportAL.SomeFunc()
358 echo XimportAL.someVar
359 XimportAL.someVar = "yes"
360 enddef
361
362 var res = execute('disass AutoloadFunc')
363 assert_match('<SNR>\d*_AutoloadFunc.*' ..
364 'echo XimportAL.SomeFunc()\_s*' ..
Bram Moolenaar17125182022-03-30 21:57:50 +0100365 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100366 '\d PUSHFUNC "<80><fd>R\d\+_SomeFunc"\_s*' ..
367 '\d PCALL top (argc 0)\_s*' ..
368 '\d PCALL end\_s*' ..
369 '\d ECHO 1\_s*' ..
370
371 'echo XimportAL.someVar\_s*' ..
372 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
373 '\d LOADEXPORT s:someVar from .*/testdir/XimportAL.vim\_s*' ..
374 '\d ECHO 1\_s*' ..
375
376 'XimportAL.someVar = "yes"\_s*' ..
377 '\d\+ PUSHS "yes"\_s*' ..
378 '\d\+ SOURCE .*/testdir/XimportAL.vim\_s*' ..
379 '\d\+ STOREEXPORT someVar in .*/testdir/XimportAL.vim\_s*' ..
380
381 '\d\+ RETURN void',
382 res)
383 END
384 v9.CheckScriptSuccess(lines)
385
386 delete('XimportAL.vim')
387enddef
388
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100389def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200390 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100391 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200392 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100393 localstr = 'xyz'
394 v:char = 'abc'
395 s:scriptvar = 'sv'
396 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100397 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200398 b:buffervar = 'bv'
399 w:windowvar = 'wv'
400 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100401 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000402 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100403 $ENVVAR = 'ev'
404 @z = 'rv'
405enddef
406
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100407def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200408 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200409 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200410 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200411 'localnr = 2.*' ..
412 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200413 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200414 'localstr = ''xyz''.*' ..
415 ' STORE $1.*' ..
416 'v:char = ''abc''.*' ..
417 'STOREV v:char.*' ..
418 's:scriptvar = ''sv''.*' ..
419 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
420 'g:globalvar = ''gv''.*' ..
421 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100422 'g:auto#var = ''av''.*' ..
423 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200424 'b:buffervar = ''bv''.*' ..
425 ' STOREB b:buffervar.*' ..
426 'w:windowvar = ''wv''.*' ..
427 ' STOREW w:windowvar.*' ..
428 't:tabpagevar = ''tv''.*' ..
429 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000430 '&tabstop = 8\_s*' ..
431 '\d\+ PUSHNR 8\_s*' ..
432 '\d\+ STOREOPT &tabstop\_s*' ..
433 '&opfunc = (t) => len(t)\_s*' ..
434 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
435 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
436 '$ENVVAR = ''ev''\_s*' ..
437 '\d\+ PUSHS "ev"\_s*' ..
438 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200439 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000440 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200441 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100442enddef
443
Bram Moolenaarcb790402020-05-15 20:53:00 +0200444def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200445 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200446 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200447 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200448 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200449 var localblob: blob = 0z1122
450 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200451enddef
452
453def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200454 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200455 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200456 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200457 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100458 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200459 '\d STORE $0\_s*' ..
460 'locallist\[0\] = 123\_s*' ..
461 '\d PUSHNR 123\_s*' ..
462 '\d PUSHNR 0\_s*' ..
463 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200464 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200465 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200466 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100467 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200468 '\d STORE $1\_s*' ..
469 'localdict\["a"\] = 456\_s*' ..
470 '\d\+ PUSHNR 456\_s*' ..
471 '\d\+ PUSHS "a"\_s*' ..
472 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200473 '\d\+ STOREINDEX dict\_s*' ..
474 'var localblob: blob = 0z1122\_s*' ..
475 '\d\+ PUSHBLOB 0z1122\_s*' ..
476 '\d\+ STORE $2\_s*' ..
477 'localblob\[1\] = 33\_s*' ..
478 '\d\+ PUSHNR 33\_s*' ..
479 '\d\+ PUSHNR 1\_s*' ..
480 '\d\+ LOAD $2\_s*' ..
481 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200482 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200483 res)
484enddef
485
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000486if has('job')
487 def s:StoreNull()
488 var ss = null_string
489 var bb = null_blob
490 var dd = null_dict
491 var ll = null_list
492 var Ff = null_function
493 var Pp = null_partial
494 var jj = null_job
495 var cc = null_channel
496 enddef
497
498 def Test_disassemble_assign_null()
499 var res = execute('disass s:StoreNull')
500 assert_match('<SNR>\d*_StoreNull\_s*' ..
501 'var ss = null_string\_s*' ..
502 '\d\+ PUSHS "\[NULL\]"\_s*' ..
503 '\d\+ STORE $\d\_s*' ..
504
505 'var bb = null_blob\_s*' ..
506 '\d\+ PUSHBLOB 0z\_s*' ..
507 '\d\+ STORE $\d\_s*' ..
508
509 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100510 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000511 '\d\+ STORE $\d\_s*' ..
512
513 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100514 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000515 '\d\+ STORE $\d\_s*' ..
516
517 'var Ff = null_function\_s*' ..
518 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
519 '\d\+ STORE $\d\_s*' ..
520
521 'var Pp = null_partial\_s*' ..
522 '\d\+ NEWPARTIAL\_s*' ..
523 '\d\+ STORE $\d\_s*' ..
524
525 'var jj = null_job\_s*' ..
526 '\d\+ PUSHJOB "no process"\_s*' ..
527 '\d\+ STORE $\d\_s*' ..
528
529 'var cc = null_channel\_s*' ..
530 '\d\+ PUSHCHANNEL 0\_s*' ..
531 '\d\+ STORE $\d\_s*' ..
532
533 '\d\+ RETURN void',
534 res)
535 enddef
536endif
537
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100538def s:ScriptFuncStoreIndex()
539 var d = {dd: {}}
540 d.dd[0] = 0
541enddef
542
543def Test_disassemble_store_index()
544 var res = execute('disass s:ScriptFuncStoreIndex')
545 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
546 'var d = {dd: {}}\_s*' ..
547 '\d PUSHS "dd"\_s*' ..
548 '\d NEWDICT size 0\_s*' ..
549 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000550 '\d SETTYPE dict<dict<unknown>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100551 '\d STORE $0\_s*' ..
552 'd.dd\[0\] = 0\_s*' ..
553 '\d PUSHNR 0\_s*' ..
554 '\d PUSHNR 0\_s*' ..
555 '\d LOAD $0\_s*' ..
556 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200557 '\d\+ USEDICT\_s*' ..
558 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200559 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100560 res)
561enddef
562
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200563def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200564 var x: string
565 var y: string
566 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200567 [x, y; l] = g:stringlist
568enddef
569
570def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200571 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200572 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200573 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200574 '\d PUSHS "\[NULL\]"\_s*' ..
575 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200576 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200577 '\d PUSHS "\[NULL\]"\_s*' ..
578 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200579 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200580 '\d NEWLIST size 0\_s*' ..
581 '\d STORE $2\_s*' ..
582 '\[x, y; l\] = g:stringlist\_s*' ..
583 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200584 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200585 '\d CHECKLEN >= 2\_s*' ..
586 '\d\+ ITEM 0\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100587 '\d\+ CHECKTYPE string stack\[-1\] var 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200588 '\d\+ STORE $0\_s*' ..
589 '\d\+ ITEM 1\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100590 '\d\+ CHECKTYPE string stack\[-1\] var 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200591 '\d\+ STORE $1\_s*' ..
592 '\d\+ SLICE 2\_s*' ..
593 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200594 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200595 res)
596enddef
597
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200598def s:ListAssignWithOp()
599 var a = 2
600 var b = 3
601 [a, b] += [4, 5]
602enddef
603
604def Test_disassemble_list_assign_with_op()
605 var res = execute('disass s:ListAssignWithOp')
606 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
607 'var a = 2\_s*' ..
608 '\d STORE 2 in $0\_s*' ..
609 'var b = 3\_s*' ..
610 '\d STORE 3 in $1\_s*' ..
611 '\[a, b\] += \[4, 5\]\_s*' ..
612 '\d\+ PUSHNR 4\_s*' ..
613 '\d\+ PUSHNR 5\_s*' ..
614 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200615 '\d\+ LOAD $0\_s*' ..
616 '\d\+ ITEM 0 with op\_s*' ..
617 '\d\+ OPNR +\_s*' ..
618 '\d\+ STORE $0\_s*' ..
619 '\d\+ LOAD $1\_s*' ..
620 '\d\+ ITEM 1 with op\_s*' ..
621 '\d\+ OPNR +\_s*' ..
622 '\d\+ STORE $1\_s*' ..
623 '\d\+ DROP\_s*' ..
624 '\d\+ RETURN void',
625 res)
626enddef
627
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200628def s:ListAdd()
629 var l: list<number> = []
630 add(l, 123)
631 add(l, g:aNumber)
632enddef
633
634def Test_disassemble_list_add()
635 var res = execute('disass s:ListAdd')
636 assert_match('<SNR>\d*_ListAdd\_s*' ..
637 'var l: list<number> = []\_s*' ..
638 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100639 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200640 '\d STORE $0\_s*' ..
641 'add(l, 123)\_s*' ..
642 '\d LOAD $0\_s*' ..
643 '\d PUSHNR 123\_s*' ..
644 '\d LISTAPPEND\_s*' ..
645 '\d DROP\_s*' ..
646 'add(l, g:aNumber)\_s*' ..
647 '\d LOAD $0\_s*' ..
648 '\d\+ LOADG g:aNumber\_s*' ..
649 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
650 '\d\+ LISTAPPEND\_s*' ..
651 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200652 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200653 res)
654enddef
655
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200656def s:BlobAdd()
657 var b: blob = 0z
658 add(b, 123)
659 add(b, g:aNumber)
660enddef
661
662def Test_disassemble_blob_add()
663 var res = execute('disass s:BlobAdd')
664 assert_match('<SNR>\d*_BlobAdd\_s*' ..
665 'var b: blob = 0z\_s*' ..
666 '\d PUSHBLOB 0z\_s*' ..
667 '\d STORE $0\_s*' ..
668 'add(b, 123)\_s*' ..
669 '\d LOAD $0\_s*' ..
670 '\d PUSHNR 123\_s*' ..
671 '\d BLOBAPPEND\_s*' ..
672 '\d DROP\_s*' ..
673 'add(b, g:aNumber)\_s*' ..
674 '\d LOAD $0\_s*' ..
675 '\d\+ LOADG g:aNumber\_s*' ..
676 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
677 '\d\+ BLOBAPPEND\_s*' ..
678 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200679 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200680 res)
681enddef
682
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200683def s:BlobIndexSlice()
684 var b: blob = 0z112233
685 echo b[1]
686 echo b[1 : 2]
687enddef
688
689def Test_disassemble_blob_index_slice()
690 var res = execute('disass s:BlobIndexSlice')
691 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
692 'var b: blob = 0z112233\_s*' ..
693 '\d PUSHBLOB 0z112233\_s*' ..
694 '\d STORE $0\_s*' ..
695 'echo b\[1\]\_s*' ..
696 '\d LOAD $0\_s*' ..
697 '\d PUSHNR 1\_s*' ..
698 '\d BLOBINDEX\_s*' ..
699 '\d ECHO 1\_s*' ..
700 'echo b\[1 : 2\]\_s*' ..
701 '\d LOAD $0\_s*' ..
702 '\d PUSHNR 1\_s*' ..
703 '\d\+ PUSHNR 2\_s*' ..
704 '\d\+ BLOBSLICE\_s*' ..
705 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200706 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200707 res)
708enddef
709
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200710def s:ScriptFuncUnlet()
711 g:somevar = "value"
712 unlet g:somevar
713 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200714 unlet $SOMEVAR
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100715
716 var l = [1, 2, 3]
717 unlet l[2]
718 unlet l[0 : 1]
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200719enddef
720
721def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200722 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200723 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
724 'g:somevar = "value"\_s*' ..
725 '\d PUSHS "value"\_s*' ..
726 '\d STOREG g:somevar\_s*' ..
727 'unlet g:somevar\_s*' ..
728 '\d UNLET g:somevar\_s*' ..
729 'unlet! g:somevar\_s*' ..
730 '\d UNLET! g:somevar\_s*' ..
731 'unlet $SOMEVAR\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100732 '\d UNLETENV $SOMEVAR\_s*' ..
733
734 'var l = \[1, 2, 3]\_s*' ..
735 '\d\+ PUSHNR 1\_s*' ..
736 '\d\+ PUSHNR 2\_s*' ..
737 '\d\+ PUSHNR 3\_s*' ..
738 '\d\+ NEWLIST size 3\_s*' ..
739 '\d\+ SETTYPE list<number>\_s*' ..
740 '\d\+ STORE $0\_s*' ..
741
742 'unlet l\[2]\_s*' ..
743 '\d\+ PUSHNR 2\_s*' ..
744 '\d\+ LOAD $0\_s*' ..
745 '\d\+ UNLETINDEX\_s*' ..
746
747 'unlet l\[0 : 1]\_s*' ..
748 '\d\+ PUSHNR 0\_s*' ..
749 '\d\+ PUSHNR 1\_s*' ..
750 '\d\+ LOAD $0\_s*' ..
751 '\d\+ UNLETRANGE\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200752 res)
753enddef
754
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200755def s:LockLocal()
756 var d = {a: 1}
757 lockvar d.a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100758 const nr = 22
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200759enddef
760
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000761def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200762 var res = execute('disass s:LockLocal')
763 assert_match('<SNR>\d*_LockLocal\_s*' ..
764 'var d = {a: 1}\_s*' ..
765 '\d PUSHS "a"\_s*' ..
766 '\d PUSHNR 1\_s*' ..
767 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000768 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200769 '\d STORE $0\_s*' ..
770 'lockvar d.a\_s*' ..
771 '\d LOAD $0\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100772 '\d LOCKUNLOCK lockvar 2 d.a\_s*' ..
773
774 'const nr = 22\_s*' ..
775 '\d\+ PUSHNR 22\_s*' ..
776 '\d\+ LOCKCONST\_s*' ..
777 '\d\+ STORE $1',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200778 res)
779enddef
780
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100781def s:ScriptFuncTry()
782 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200783 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100784 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200785 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100786 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200787 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100788 endtry
789enddef
790
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100791def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200792 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200793 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
794 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100795 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200796 'echo "yes"\_s*' ..
797 '\d PUSHS "yes"\_s*' ..
798 '\d ECHO 1\_s*' ..
799 'catch /fail/\_s*' ..
800 '\d JUMP -> \d\+\_s*' ..
801 '\d PUSH v:exception\_s*' ..
802 '\d PUSHS "fail"\_s*' ..
803 '\d COMPARESTRING =\~\_s*' ..
804 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
805 '\d CATCH\_s*' ..
806 'echo "no"\_s*' ..
807 '\d\+ PUSHS "no"\_s*' ..
808 '\d\+ ECHO 1\_s*' ..
809 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100810 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200811 'throw "end"\_s*' ..
812 '\d\+ PUSHS "end"\_s*' ..
813 '\d\+ THROW\_s*' ..
814 'endtry\_s*' ..
815 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200816 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100817enddef
818
819def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200820 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100821 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100822enddef
823
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100824def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200825 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200826 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200827 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200828 '\d PUSHNR 1\_s*' ..
829 '\d PUSHS "two"\_s*' ..
830 '\d PUSHNR 333\_s*' ..
831 '\d NEWLIST size 3\_s*' ..
832 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100833 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200834 '\d PUSHS "one"\_s*' ..
835 '\d PUSHNR 1\_s*' ..
836 '\d PUSHS "two"\_s*' ..
837 '\d PUSHS "val"\_s*' ..
838 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200839 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100840enddef
841
Bram Moolenaar62aec932022-01-29 21:45:34 +0000842def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100843 echo arg
844enddef
845
Bram Moolenaar62aec932022-01-29 21:45:34 +0000846func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100847 echo 'nothing'
848endfunc
849
Bram Moolenaar62aec932022-01-29 21:45:34 +0000850func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100851 echo a:arg
852endfunc
853
854def s:ScriptFuncCall(): string
855 changenr()
856 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000857 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100858 FuncWithArg(343)
859 ScriptFuncNew()
860 s:ScriptFuncNew()
861 UserFunc()
862 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200863 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100864 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200865 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100866 FuncRefWithArg("bar")
867 return "yes"
868enddef
869
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100870def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200871 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200872 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
873 'changenr()\_s*' ..
874 '\d BCALL changenr(argc 0)\_s*' ..
875 '\d DROP\_s*' ..
876 'char2nr("abc")\_s*' ..
877 '\d PUSHS "abc"\_s*' ..
878 '\d BCALL char2nr(argc 1)\_s*' ..
879 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000880 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200881 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
882 '\d DROP\_s*' ..
883 'FuncWithArg(343)\_s*' ..
884 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000885 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200886 '\d\+ DROP\_s*' ..
887 'ScriptFuncNew()\_s*' ..
888 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
889 '\d\+ DROP\_s*' ..
890 's:ScriptFuncNew()\_s*' ..
891 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
892 '\d\+ DROP\_s*' ..
893 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000894 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200895 '\d\+ DROP\_s*' ..
896 'UserFuncWithArg("foo")\_s*' ..
897 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000898 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200899 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200900 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200901 '\d\+ PUSHS "UserFunc"\_s*' ..
902 '\d\+ BCALL function(argc 1)\_s*' ..
903 '\d\+ STORE $0\_s*' ..
904 'FuncRef()\_s*' ..
905 '\d\+ LOAD $\d\_s*' ..
906 '\d\+ PCALL (argc 0)\_s*' ..
907 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200908 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200909 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
910 '\d\+ BCALL function(argc 1)\_s*' ..
911 '\d\+ STORE $1\_s*' ..
912 'FuncRefWithArg("bar")\_s*' ..
913 '\d\+ PUSHS "bar"\_s*' ..
914 '\d\+ LOAD $\d\_s*' ..
915 '\d\+ PCALL (argc 1)\_s*' ..
916 '\d\+ DROP\_s*' ..
917 'return "yes"\_s*' ..
918 '\d\+ PUSHS "yes"\_s*' ..
919 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200920 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100921enddef
922
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200923
924def s:CreateRefs()
925 var local = 'a'
926 def Append(arg: string)
927 local ..= arg
928 enddef
929 g:Append = Append
930 def Get(): string
931 return local
932 enddef
933 g:Get = Get
934enddef
935
936def Test_disassemble_closure()
937 CreateRefs()
938 var res = execute('disass g:Append')
939 assert_match('<lambda>\d\_s*' ..
940 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100941 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200942 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100943 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100944 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200945 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200946 res)
947
948 res = execute('disass g:Get')
949 assert_match('<lambda>\d\_s*' ..
950 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100951 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200952 '\d RETURN',
953 res)
954
955 unlet g:Append
956 unlet g:Get
957enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200958
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100959def s:ClosureArg(arg: string)
960 var Ref = () => arg .. "x"
961enddef
962
963def Test_disassemble_closure_arg()
964 var res = execute('disass s:ClosureArg')
965 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
966 'var Ref = () => arg .. "x"\_s*' ..
967 '\d FUNCREF <lambda>\d\+',
968 res)
969 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
970 assert_match('<lambda>\d\+\_s*' ..
971 'return arg .. "x"\_s*' ..
972 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
973 '\d PUSHS "x"\_s*' ..
974 '\d CONCAT size 2\_s*' ..
975 '\d RETURN',
976 lres)
977enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100978
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200979def EchoArg(arg: string): string
980 return arg
981enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +0000982def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200983 return function('EchoArg')
984enddef
985def s:ScriptPCall()
986 RefThis()("text")
987enddef
988
989def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200990 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200991 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
992 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000993 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200994 '\d PUSHS "text"\_s*' ..
995 '\d PCALL top (argc 1)\_s*' ..
996 '\d PCALL end\_s*' ..
997 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200998 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200999 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001000enddef
1001
1002
Bram Moolenaara26b9702020-04-18 19:53:28 +02001003def s:FuncWithForwardCall(): string
1004 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001005enddef
1006
1007def DefinedLater(arg: string): string
1008 return arg
1009enddef
1010
1011def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001012 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001013 assert_match('FuncWithForwardCall\_s*' ..
1014 'return g:DefinedLater("yes")\_s*' ..
1015 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001016 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001017 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001018 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001019
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001020 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001021 assert_equal('yes', FuncWithForwardCall())
1022
Bram Moolenaara26b9702020-04-18 19:53:28 +02001023 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001024 assert_match('FuncWithForwardCall\_s*' ..
1025 'return g:DefinedLater("yes")\_s*' ..
1026 '\d PUSHS "yes"\_s*' ..
1027 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001028 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001029 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001030enddef
1031
1032
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001033def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001034 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001035enddef
1036
1037def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +02001038 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001039 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001040 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001041 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001042 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001043 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001044 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001045 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
1046 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001047 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001048 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001049 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001050 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001051 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001052 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001053 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001054 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001055enddef
1056
1057
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001058def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001059 if has("eval")
1060 echo "yes"
1061 else
1062 echo "no"
1063 endif
1064enddef
1065
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001066def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001067 if has("nothing")
1068 echo "yes"
1069 else
1070 echo "no"
1071 endif
1072enddef
1073
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001074def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001075 if has("nothing")
1076 echo "nothing"
1077 elseif has("something")
1078 echo "something"
1079 elseif has("eval")
1080 echo "eval"
1081 elseif has("less")
1082 echo "less"
1083 endif
1084enddef
1085
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001086def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001087 if has("gui_running")
1088 echo "yes"
1089 else
1090 echo "no"
1091 endif
1092enddef
1093
LemonBoy58f331a2022-04-02 21:59:06 +01001094def s:LenConstant(): number
1095 return len("foo") + len("fighters")
1096enddef
1097
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001098def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001099 var instr = execute('disassemble LenConstant')
1100 assert_match('LenConstant\_s*' ..
1101 'return len("foo") + len("fighters")\_s*' ..
1102 '\d PUSHNR 11\_s*',
1103 instr)
1104 assert_notmatch('BCALL len', instr)
1105
Bram Moolenaard2c61702020-09-06 15:58:36 +02001106 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001107 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001108 assert_match('HasEval\_s*' ..
1109 'if has("eval")\_s*' ..
1110 'echo "yes"\_s*' ..
1111 '\d PUSHS "yes"\_s*' ..
1112 '\d ECHO 1\_s*' ..
1113 'else\_s*' ..
1114 'echo "no"\_s*' ..
1115 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001116 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001117 assert_notmatch('JUMP', instr)
1118
Bram Moolenaard2c61702020-09-06 15:58:36 +02001119 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001120 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001121 assert_match('HasNothing\_s*' ..
1122 'if has("nothing")\_s*' ..
1123 'echo "yes"\_s*' ..
1124 'else\_s*' ..
1125 'echo "no"\_s*' ..
1126 '\d PUSHS "no"\_s*' ..
1127 '\d ECHO 1\_s*' ..
1128 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001129 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001130 assert_notmatch('PUSHS "yes"', instr)
1131 assert_notmatch('JUMP', instr)
1132
Bram Moolenaard2c61702020-09-06 15:58:36 +02001133 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001134 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001135 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001136 'if has("nothing")\_s*' ..
1137 'echo "nothing"\_s*' ..
1138 'elseif has("something")\_s*' ..
1139 'echo "something"\_s*' ..
1140 'elseif has("eval")\_s*' ..
1141 'echo "eval"\_s*' ..
1142 '\d PUSHS "eval"\_s*' ..
1143 '\d ECHO 1\_s*' ..
1144 'elseif has("less").*' ..
1145 'echo "less"\_s*' ..
1146 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001147 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001148 assert_notmatch('PUSHS "nothing"', instr)
1149 assert_notmatch('PUSHS "something"', instr)
1150 assert_notmatch('PUSHS "less"', instr)
1151 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001152
1153 var result: string
1154 var instr_expected: string
1155 if has('gui')
1156 if has('gui_running')
1157 # GUI already running, always returns "yes"
1158 result = "\nyes"
1159 instr_expected = 'HasGuiRunning.*' ..
1160 'if has("gui_running")\_s*' ..
1161 ' echo "yes"\_s*' ..
1162 '\d PUSHS "yes"\_s*' ..
1163 '\d ECHO 1\_s*' ..
1164 'else\_s*' ..
1165 ' echo "no"\_s*' ..
1166 'endif'
1167 else
1168 result = "\nno"
1169 if has('unix')
1170 # GUI not running but can start later, call has()
1171 instr_expected = 'HasGuiRunning.*' ..
1172 'if has("gui_running")\_s*' ..
1173 '\d PUSHS "gui_running"\_s*' ..
1174 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001175 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001176 '\d JUMP_IF_FALSE -> \d\_s*' ..
1177 ' echo "yes"\_s*' ..
1178 '\d PUSHS "yes"\_s*' ..
1179 '\d ECHO 1\_s*' ..
1180 'else\_s*' ..
1181 '\d JUMP -> \d\_s*' ..
1182 ' echo "no"\_s*' ..
1183 '\d PUSHS "no"\_s*' ..
1184 '\d ECHO 1\_s*' ..
1185 'endif'
1186 else
1187 # GUI not running, always return "no"
1188 instr_expected = 'HasGuiRunning.*' ..
1189 'if has("gui_running")\_s*' ..
1190 ' echo "yes"\_s*' ..
1191 'else\_s*' ..
1192 ' echo "no"\_s*' ..
1193 '\d PUSHS "no"\_s*' ..
1194 '\d ECHO 1\_s*' ..
1195 'endif'
1196 endif
1197 endif
1198 else
1199 # GUI not supported, always return "no"
1200 result = "\nno"
1201 instr_expected = 'HasGuiRunning.*' ..
1202 'if has("gui_running")\_s*' ..
1203 ' echo "yes"\_s*' ..
1204 'else\_s*' ..
1205 ' echo "no"\_s*' ..
1206 '\d PUSHS "no"\_s*' ..
1207 '\d ECHO 1\_s*' ..
1208 'endif'
1209 endif
1210
1211 assert_equal(result, execute('HasGuiRunning()'))
1212 instr = execute('disassemble HasGuiRunning')
1213 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001214enddef
1215
Bram Moolenaarefd88552020-06-18 20:50:10 +02001216def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001217 if 1 < 0
1218 return "maybe"
1219 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001220 if g:cond
1221 return "yes"
1222 else
1223 return "no"
1224 endif
1225enddef
1226
1227def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001228 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001229 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001230 'if 1 < 0\_s*' ..
1231 ' return "maybe"\_s*' ..
1232 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001233 'if g:cond\_s*' ..
1234 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001235 '1 COND2BOOL\_s*' ..
1236 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001237 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001238 '3 PUSHS "yes"\_s*' ..
1239 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001240 'else\_s*' ..
1241 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001242 '5 PUSHS "no"\_s*' ..
1243 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001244 instr)
1245enddef
1246
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001247def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001248 var Funky1: func
1249 var Funky2: func = function("len")
1250 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001251enddef
1252
1253def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001254 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001255 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001256 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001257 '0 PUSHFUNC "\[none]"\_s*' ..
1258 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001259 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001260 '2 PUSHS "len"\_s*' ..
1261 '3 BCALL function(argc 1)\_s*' ..
1262 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001263 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001264 '\d PUSHS "UserFunc"\_s*' ..
1265 '\d BCALL funcref(argc 1)\_s*' ..
1266 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001267 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001268 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001269enddef
1270
1271if has('channel')
1272 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001273 var job1: job
1274 var job2: job = job_start("donothing")
1275 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001276 enddef
1277endif
1278
1279def Test_disassemble_channel()
1280 CheckFeature channel
1281
Bram Moolenaarac564082020-09-27 19:05:33 +02001282 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001283 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001285 '\d PUSHJOB "no process"\_s*' ..
1286 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001287 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001288 '\d PUSHS "donothing"\_s*' ..
1289 '\d BCALL job_start(argc 1)\_s*' ..
1290 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001291 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001292 '\d PUSHCHANNEL 0\_s*' ..
1293 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001294 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001295 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001296enddef
1297
Bram Moolenaar62aec932022-01-29 21:45:34 +00001298def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001299 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001300 return F("x")
1301enddef
1302
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001303def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001304 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001305 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001306 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001307 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001308 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001309 '\d STORE $0\_s*' ..
1310 'return F("x")\_s*' ..
1311 '\d PUSHS "x"\_s*' ..
1312 '\d LOAD $0\_s*' ..
1313 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001314 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001315 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001316
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001318 instr = execute('disassemble ' .. name)
1319 assert_match('<lambda>\d\+\_s*' ..
1320 'return "X" .. a .. "X"\_s*' ..
1321 '\d PUSHS "X"\_s*' ..
1322 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001323 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001324 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001325 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001326 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001327 '\d RETURN',
1328 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001329enddef
1330
Bram Moolenaar62aec932022-01-29 21:45:34 +00001331def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001332 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001333 return Ref(g:value)
1334enddef
1335
1336def Test_disassemble_lambda_with_type()
1337 g:value = 5
1338 assert_equal(15, LambdaWithType())
1339 var instr = execute('disassemble LambdaWithType')
1340 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001341 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001342 '\d FUNCREF <lambda>\d\+\_s*' ..
1343 '\d STORE $0\_s*' ..
1344 'return Ref(g:value)\_s*' ..
1345 '\d LOADG g:value\_s*' ..
1346 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001347 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001348 '\d PCALL (argc 1)\_s*' ..
1349 '\d RETURN',
1350 instr)
1351enddef
1352
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001353def NestedOuter()
1354 def g:Inner()
1355 echomsg "inner"
1356 enddef
1357enddef
1358
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001359def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001361 assert_match('NestedOuter\_s*' ..
1362 'def g:Inner()\_s*' ..
1363 'echomsg "inner"\_s*' ..
1364 'enddef\_s*' ..
1365 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001366 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001367 instr)
1368enddef
1369
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001370def NestedDefList()
1371 def
1372 def Info
1373 def /Info
1374 def /Info/
1375enddef
1376
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001377def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001378 var instr = execute('disassemble NestedDefList')
1379 assert_match('NestedDefList\_s*' ..
1380 'def\_s*' ..
1381 '\d DEF \_s*' ..
1382 'def Info\_s*' ..
1383 '\d DEF Info\_s*' ..
1384 'def /Info\_s*' ..
1385 '\d DEF /Info\_s*' ..
1386 'def /Info/\_s*' ..
1387 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001388 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001389 instr)
1390enddef
1391
Bram Moolenaar62aec932022-01-29 21:45:34 +00001392def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001393 if arg == 1 && arg != 2 || arg == 4
1394 return 'yes'
1395 endif
1396 return 'no'
1397enddef
1398
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001399def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001400 assert_equal("yes", AndOr(1))
1401 assert_equal("no", AndOr(2))
1402 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001404 assert_match('AndOr\_s*' ..
1405 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1406 '\d LOAD arg\[-1]\_s*' ..
1407 '\d PUSHNR 1\_s*' ..
1408 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001409 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001410 '\d LOAD arg\[-1]\_s*' ..
1411 '\d PUSHNR 2\_s*' ..
1412 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001413 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001414 '\d LOAD arg\[-1]\_s*' ..
1415 '\d\+ PUSHNR 4\_s*' ..
1416 '\d\+ COMPAREANY ==\_s*' ..
1417 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001418 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001419enddef
1420
Bram Moolenaar62aec932022-01-29 21:45:34 +00001421def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001422 if true && arg
1423 return "yes"
1424 endif
1425 if false && arg
1426 return "never"
1427 endif
1428 return "no"
1429enddef
1430
1431def Test_disassemble_and_constant()
1432 assert_equal("yes", AndConstant(1))
1433 assert_equal("no", AndConstant(false))
1434 var instr = execute('disassemble AndConstant')
1435 assert_match('AndConstant\_s*' ..
1436 'if true && arg\_s*' ..
1437 '0 LOAD arg\[-1\]\_s*' ..
1438 '1 COND2BOOL\_s*' ..
1439 '2 JUMP_IF_FALSE -> 5\_s*' ..
1440 'return "yes"\_s*' ..
1441 '3 PUSHS "yes"\_s*' ..
1442 '4 RETURN\_s*' ..
1443 'endif\_s*' ..
1444 'if false && arg\_s*' ..
1445 'return "never"\_s*' ..
1446 'endif\_s*' ..
1447 'return "no"\_s*' ..
1448 '5 PUSHS "no"\_s*' ..
1449 '6 RETURN',
1450 instr)
1451enddef
1452
Bram Moolenaar62aec932022-01-29 21:45:34 +00001453def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001454 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001455 for i in range(3)
1456 res->add(i)
1457 endfor
1458 return res
1459enddef
1460
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001461def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001462 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001463 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001464 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001465 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001466 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001467 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001468 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001469
Bram Moolenaarcb790402020-05-15 20:53:00 +02001470 'for i in range(3)\_s*' ..
1471 '\d STORE -1 in $1\_s*' ..
1472 '\d PUSHNR 3\_s*' ..
1473 '\d BCALL range(argc 1)\_s*' ..
1474 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001475 '\d STORE $3\_s*' ..
1476
Bram Moolenaarcb790402020-05-15 20:53:00 +02001477 'res->add(i)\_s*' ..
1478 '\d LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001479 '\d LOAD $3\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001480 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001481 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001482
Bram Moolenaarcb790402020-05-15 20:53:00 +02001483 'endfor\_s*' ..
1484 '\d\+ JUMP -> \d\+\_s*' ..
1485 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001486 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001487enddef
1488
Bram Moolenaar62aec932022-01-29 21:45:34 +00001489def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001490 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001491 for str in eval('["one", "two"]')
1492 res ..= str
1493 endfor
1494 return res
1495enddef
1496
1497def Test_disassemble_for_loop_eval()
1498 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001499 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001500 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001501 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001502 '\d PUSHS ""\_s*' ..
1503 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001504
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001505 'for str in eval(''\["one", "two"\]'')\_s*' ..
1506 '\d STORE -1 in $1\_s*' ..
1507 '\d PUSHS "\["one", "two"\]"\_s*' ..
1508 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001509 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001510 '\d STORE $3\_s*' ..
1511
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001512 'res ..= str\_s*' ..
1513 '\d\+ LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001514 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001515 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001516 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001517 '\d\+ STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001518
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001519 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001520 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001521 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001522
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001523 'return res\_s*' ..
1524 '\d\+ LOAD $0\_s*' ..
1525 '\d\+ RETURN',
1526 instr)
1527enddef
1528
Bram Moolenaar62aec932022-01-29 21:45:34 +00001529def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001530 for [x1, x2] in [[1, 2], [3, 4]]
1531 echo x1 x2
1532 endfor
1533enddef
1534
1535def Test_disassemble_for_loop_unpack()
1536 var instr = execute('disassemble ForLoopUnpack')
1537 assert_match('ForLoopUnpack\_s*' ..
1538 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1539 '\d\+ STORE -1 in $0\_s*' ..
1540 '\d\+ PUSHNR 1\_s*' ..
1541 '\d\+ PUSHNR 2\_s*' ..
1542 '\d\+ NEWLIST size 2\_s*' ..
1543 '\d\+ PUSHNR 3\_s*' ..
1544 '\d\+ PUSHNR 4\_s*' ..
1545 '\d\+ NEWLIST size 2\_s*' ..
1546 '\d\+ NEWLIST size 2\_s*' ..
1547 '\d\+ FOR $0 -> 16\_s*' ..
1548 '\d\+ UNPACK 2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001549 '\d\+ STORE $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001550 '\d\+ STORE $3\_s*' ..
1551
Bram Moolenaar792f7862020-11-23 08:31:18 +01001552 'echo x1 x2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001553 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001554 '\d\+ LOAD $3\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001555 '\d\+ ECHO 2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001556
Bram Moolenaar792f7862020-11-23 08:31:18 +01001557 'endfor\_s*' ..
1558 '\d\+ JUMP -> 8\_s*' ..
1559 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001560 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001561 instr)
1562enddef
1563
Bram Moolenaar62aec932022-01-29 21:45:34 +00001564def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001565 for nr in [1, 2]
1566 try
1567 echo "ok"
1568 try
1569 echo "deeper"
1570 catch
1571 continue
1572 endtry
1573 catch
1574 echo "not ok"
1575 endtry
1576 endfor
1577enddef
1578
1579def Test_disassemble_for_loop_continue()
1580 var instr = execute('disassemble ForLoopContinue')
1581 assert_match('ForLoopContinue\_s*' ..
1582 'for nr in \[1, 2]\_s*' ..
1583 '0 STORE -1 in $0\_s*' ..
1584 '1 PUSHNR 1\_s*' ..
1585 '2 PUSHNR 2\_s*' ..
1586 '3 NEWLIST size 2\_s*' ..
1587 '4 FOR $0 -> 22\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001588 '5 STORE $2\_s*' ..
1589
Bram Moolenaarc150c092021-02-13 15:02:46 +01001590 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001591 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001592
Bram Moolenaarc150c092021-02-13 15:02:46 +01001593 'echo "ok"\_s*' ..
1594 '7 PUSHS "ok"\_s*' ..
1595 '8 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001596
Bram Moolenaarc150c092021-02-13 15:02:46 +01001597 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001598 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001599
Bram Moolenaarc150c092021-02-13 15:02:46 +01001600 'echo "deeper"\_s*' ..
1601 '10 PUSHS "deeper"\_s*' ..
1602 '11 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001603
Bram Moolenaarc150c092021-02-13 15:02:46 +01001604 'catch\_s*' ..
1605 '12 JUMP -> 15\_s*' ..
1606 '13 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001607
Bram Moolenaarc150c092021-02-13 15:02:46 +01001608 'continue\_s*' ..
1609 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001610
Bram Moolenaarc150c092021-02-13 15:02:46 +01001611 'endtry\_s*' ..
1612 '15 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001613
Bram Moolenaarc150c092021-02-13 15:02:46 +01001614 'catch\_s*' ..
1615 '16 JUMP -> 20\_s*' ..
1616 '17 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001617
Bram Moolenaarc150c092021-02-13 15:02:46 +01001618 'echo "not ok"\_s*' ..
1619 '18 PUSHS "not ok"\_s*' ..
1620 '19 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001621
Bram Moolenaarc150c092021-02-13 15:02:46 +01001622 'endtry\_s*' ..
1623 '20 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001624
Bram Moolenaarc150c092021-02-13 15:02:46 +01001625 'endfor\_s*' ..
1626 '21 JUMP -> 4\_s*' ..
1627 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001628 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001629 instr)
1630enddef
1631
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001632let g:number = 42
1633
Bram Moolenaar62aec932022-01-29 21:45:34 +00001634def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001635 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001636enddef
1637
1638def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001639 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001640 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001641 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001642 '\d PUSHNR 23\_s*' ..
1643 '\d LOADG g:number\_s*' ..
1644 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1645 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001646 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001647 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001648 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001649 instr)
1650enddef
1651
Bram Moolenaar62aec932022-01-29 21:45:34 +00001652def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001653 var nr = 3
1654 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001655 nrres = nr - 7
1656 nrres = nr * 7
1657 nrres = nr / 7
1658 nrres = nr % 7
1659
Bram Moolenaarac564082020-09-27 19:05:33 +02001660 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001661 anyres = g:number - 7
1662 anyres = g:number * 7
1663 anyres = g:number / 7
1664 anyres = g:number % 7
1665
1666 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001667 var fl = 3.0
1668 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001669 flres = fl - 7.0
1670 flres = fl * 7.0
1671 flres = fl / 7.0
1672 endif
1673enddef
1674
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001675def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001676 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001677 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001678 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001679 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001680 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001681 '\d LOAD $0.*' ..
1682 '\d PUSHNR 7.*' ..
1683 '\d OPNR +.*' ..
1684 '\d STORE $1.*' ..
1685 'nrres = nr - 7.*' ..
1686 '\d OPNR -.*' ..
1687 'nrres = nr \* 7.*' ..
1688 '\d OPNR \*.*' ..
1689 'nrres = nr / 7.*' ..
1690 '\d OPNR /.*' ..
1691 'nrres = nr % 7.*' ..
1692 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001693 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001694 '\d LOADG g:number.*' ..
1695 '\d PUSHNR 7.*' ..
1696 '\d OPANY +.*' ..
1697 '\d STORE $2.*' ..
1698 'anyres = g:number - 7.*' ..
1699 '\d OPANY -.*' ..
1700 'anyres = g:number \* 7.*' ..
1701 '\d OPANY \*.*' ..
1702 'anyres = g:number / 7.*' ..
1703 '\d OPANY /.*' ..
1704 'anyres = g:number % 7.*' ..
1705 '\d OPANY %.*',
1706 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001707 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001708 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001709 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001710 '\d PUSHF 3.0.*' ..
1711 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001712 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001713 '\d LOAD $3.*' ..
1714 '\d PUSHF 7.0.*' ..
1715 '\d OPFLOAT +.*' ..
1716 '\d STORE $4.*' ..
1717 'flres = fl - 7.0.*' ..
1718 '\d OPFLOAT -.*' ..
1719 'flres = fl \* 7.0.*' ..
1720 '\d OPFLOAT \*.*' ..
1721 'flres = fl / 7.0.*' ..
1722 '\d OPFLOAT /.*',
1723 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001724 endif
1725enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001726
Bram Moolenaar62aec932022-01-29 21:45:34 +00001727def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001728 var reslist = [1, 2] + [3, 4]
1729 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001730enddef
1731
1732def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001733 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001734 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001735 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001736 '\d PUSHNR 1.*' ..
1737 '\d PUSHNR 2.*' ..
1738 '\d NEWLIST size 2.*' ..
1739 '\d PUSHNR 3.*' ..
1740 '\d PUSHNR 4.*' ..
1741 '\d NEWLIST size 2.*' ..
1742 '\d ADDLIST.*' ..
1743 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001744 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001745 '\d PUSHBLOB 0z1122.*' ..
1746 '\d PUSHBLOB 0z3344.*' ..
1747 '\d ADDBLOB.*' ..
1748 '\d STORE $.*',
1749 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001750enddef
1751
1752let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001753def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001754 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001755 return res
1756enddef
1757
1758def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001759 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001760 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001761 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001762 '\d LOADG g:aa.*' ..
1763 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001764 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001765 '\d CONCAT.*' ..
1766 '\d STORE $.*',
1767 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001768 assert_equal('aabb', ConcatString())
1769enddef
1770
Bram Moolenaar62aec932022-01-29 21:45:34 +00001771def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001772 var s = "abcd"
1773 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001774 return res
1775enddef
1776
1777def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001778 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001779 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001780 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001781 '\d PUSHS "abcd"\_s*' ..
1782 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001783 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001784 '\d LOAD $0\_s*' ..
1785 '\d PUSHNR 1\_s*' ..
1786 '\d STRINDEX\_s*' ..
1787 '\d STORE $1\_s*',
1788 instr)
1789 assert_equal('b', StringIndex())
1790enddef
1791
Bram Moolenaar62aec932022-01-29 21:45:34 +00001792def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001793 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001794 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001795 return res
1796enddef
1797
1798def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001799 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001800 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001801 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001802 '\d PUSHS "abcd"\_s*' ..
1803 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001804 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001805 '\d LOAD $0\_s*' ..
1806 '\d PUSHNR 1\_s*' ..
1807 '\d PUSHNR 8\_s*' ..
1808 '\d STRSLICE\_s*' ..
1809 '\d STORE $1\_s*',
1810 instr)
1811 assert_equal('bcd', StringSlice())
1812enddef
1813
Bram Moolenaar62aec932022-01-29 21:45:34 +00001814def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001815 var l = [1, 2, 3]
1816 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001817 return res
1818enddef
1819
1820def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001821 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001822 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001823 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001824 '\d PUSHNR 1\_s*' ..
1825 '\d PUSHNR 2\_s*' ..
1826 '\d PUSHNR 3\_s*' ..
1827 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001828 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001829 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001830 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001831 '\d LOAD $0\_s*' ..
1832 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001833 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001834 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001835 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001836 assert_equal(2, ListIndex())
1837enddef
1838
Bram Moolenaar62aec932022-01-29 21:45:34 +00001839def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001840 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001841 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001842 return res
1843enddef
1844
1845def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001846 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001847 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001848 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001849 '\d PUSHNR 1\_s*' ..
1850 '\d PUSHNR 2\_s*' ..
1851 '\d PUSHNR 3\_s*' ..
1852 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001853 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001854 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001855 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001856 '\d LOAD $0\_s*' ..
1857 '\d PUSHNR 1\_s*' ..
1858 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001859 '\d\+ LISTSLICE\_s*' ..
1860 '\d\+ SETTYPE list<number>\_s*' ..
1861 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001862 instr)
1863 assert_equal([2, 3], ListSlice())
1864enddef
1865
Bram Moolenaar62aec932022-01-29 21:45:34 +00001866def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001867 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001868 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001869 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001870 return res
1871enddef
1872
1873def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001874 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001875 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001876 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001877 '\d PUSHS "item"\_s*' ..
1878 '\d PUSHNR 1\_s*' ..
1879 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001880 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001881 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001882 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001883 '\d\+ LOAD $0\_s*' ..
1884 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001885 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001886 '\d\+ STORE $1\_s*' ..
1887 'res = d\["item"\]\_s*' ..
1888 '\d\+ LOAD $0\_s*' ..
1889 '\d\+ PUSHS "item"\_s*' ..
1890 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001891 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001892 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001893 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001894 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001895enddef
1896
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001897let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001898def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001899 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001900 return res
1901enddef
1902
1903def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001904 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001905 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001906 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001907 '\d LOADG g:somelist\_s*' ..
1908 '\d PUSHNR 2\_s*' ..
1909 '\d ANYINDEX\_s*' ..
1910 '\d STORE $0\_s*' ..
1911 'return res\_s*' ..
1912 '\d LOAD $0\_s*' ..
1913 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1914 '\d RETURN',
1915 instr)
1916 assert_equal(3, AnyIndex())
1917enddef
1918
Bram Moolenaar62aec932022-01-29 21:45:34 +00001919def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001920 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001921 return res
1922enddef
1923
1924def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001925 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001926 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001927 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001928 '\d LOADG g:somelist\_s*' ..
1929 '\d PUSHNR 1\_s*' ..
1930 '\d PUSHNR 3\_s*' ..
1931 '\d ANYSLICE\_s*' ..
1932 '\d STORE $0\_s*' ..
1933 'return res\_s*' ..
1934 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001935 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001936 '\d RETURN',
1937 instr)
1938 assert_equal([2, 3, 4], AnySlice())
1939enddef
1940
Bram Moolenaar62aec932022-01-29 21:45:34 +00001941def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001942 g:nr = 9
1943 var plus = +g:nr
1944 var minus = -g:nr
1945 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001946enddef
1947
1948def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001949 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001950 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001951 'g:nr = 9\_s*' ..
1952 '\d PUSHNR 9\_s*' ..
1953 '\d STOREG g:nr\_s*' ..
1954 'var plus = +g:nr\_s*' ..
1955 '\d LOADG g:nr\_s*' ..
1956 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1957 '\d STORE $0\_s*' ..
1958 'var minus = -g:nr\_s*' ..
1959 '\d LOADG g:nr\_s*' ..
1960 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001961 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001962 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001963 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001964 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001965enddef
1966
Bram Moolenaar62aec932022-01-29 21:45:34 +00001967def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001968 var flag = true
1969 var invert = !flag
1970 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001971 return res
1972enddef
1973
1974def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001975 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001976 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001977 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001978 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001979 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001980 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001981 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001982 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001983 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001984 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001985 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001986 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001987 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001988 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001989 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001990enddef
1991
Bram Moolenaar62aec932022-01-29 21:45:34 +00001992def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001993 var one = 1
1994 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001995 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001996 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001997 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001998enddef
1999
2000def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002001 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002002 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002003 'var one = 1\_s*' ..
2004 '0 STORE 1 in $0\_s*' ..
2005 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002006 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002007 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002008 '1 LOAD $0\_s*' ..
2009 '2 COND2BOOL\_s*' ..
2010 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
2011 '4 LOAD $1\_s*' ..
2012 '5 COND2BOOL\_s*' ..
2013 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
2014 '7 LOAD $0\_s*' ..
2015 '8 COND2BOOL\_s*' ..
2016 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002017 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002018 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01002019 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002020 instr)
2021 assert_equal(true, InvertBool())
2022enddef
2023
Bram Moolenaar62aec932022-01-29 21:45:34 +00002024def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00002025 var t: number
2026 t = 1
2027 t = 0
2028enddef
2029
2030def Test_disassemble_auto_init()
2031 var instr = execute('disassemble AutoInit')
2032 assert_match('AutoInit\_s*' ..
2033 'var t: number\_s*' ..
2034 't = 1\_s*' ..
2035 '\d STORE 1 in $0\_s*' ..
2036 't = 0\_s*' ..
2037 '\d STORE 0 in $0\_s*' ..
2038 '\d\+ RETURN void',
2039 instr)
2040enddef
2041
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002042def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02002043 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02002044 ['true == isFalse', 'COMPAREBOOL =='],
2045 ['true != isFalse', 'COMPAREBOOL !='],
2046 ['v:none == isNull', 'COMPARESPECIAL =='],
2047 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00002048 ['"text" == isNull', 'COMPARENULL =='],
2049 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002050
Bram Moolenaara5565e42020-05-09 15:44:01 +02002051 ['111 == aNumber', 'COMPARENR =='],
2052 ['111 != aNumber', 'COMPARENR !='],
2053 ['111 > aNumber', 'COMPARENR >'],
2054 ['111 < aNumber', 'COMPARENR <'],
2055 ['111 >= aNumber', 'COMPARENR >='],
2056 ['111 <= aNumber', 'COMPARENR <='],
2057 ['111 =~ aNumber', 'COMPARENR =\~'],
2058 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002059
Bram Moolenaara5565e42020-05-09 15:44:01 +02002060 ['"xx" != aString', 'COMPARESTRING !='],
2061 ['"xx" > aString', 'COMPARESTRING >'],
2062 ['"xx" < aString', 'COMPARESTRING <'],
2063 ['"xx" >= aString', 'COMPARESTRING >='],
2064 ['"xx" <= aString', 'COMPARESTRING <='],
2065 ['"xx" =~ aString', 'COMPARESTRING =\~'],
2066 ['"xx" !~ aString', 'COMPARESTRING !\~'],
2067 ['"xx" is aString', 'COMPARESTRING is'],
2068 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002069
Bram Moolenaara5565e42020-05-09 15:44:01 +02002070 ['0z11 == aBlob', 'COMPAREBLOB =='],
2071 ['0z11 != aBlob', 'COMPAREBLOB !='],
2072 ['0z11 is aBlob', 'COMPAREBLOB is'],
2073 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002074
Bram Moolenaara5565e42020-05-09 15:44:01 +02002075 ['[1, 2] == aList', 'COMPARELIST =='],
2076 ['[1, 2] != aList', 'COMPARELIST !='],
2077 ['[1, 2] is aList', 'COMPARELIST is'],
2078 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002079
Bram Moolenaare0de1712020-12-02 17:36:54 +01002080 ['{a: 1} == aDict', 'COMPAREDICT =='],
2081 ['{a: 1} != aDict', 'COMPAREDICT !='],
2082 ['{a: 1} is aDict', 'COMPAREDICT is'],
2083 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002084
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002085 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2086 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2087 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2088 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002089
2090 ['77 == g:xx', 'COMPAREANY =='],
2091 ['77 != g:xx', 'COMPAREANY !='],
2092 ['77 > g:xx', 'COMPAREANY >'],
2093 ['77 < g:xx', 'COMPAREANY <'],
2094 ['77 >= g:xx', 'COMPAREANY >='],
2095 ['77 <= g:xx', 'COMPAREANY <='],
2096 ['77 =~ g:xx', 'COMPAREANY =\~'],
2097 ['77 !~ g:xx', 'COMPAREANY !\~'],
2098 ['77 is g:xx', 'COMPAREANY is'],
2099 ['77 isnot g:xx', 'COMPAREANY isnot'],
2100 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002101 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002102 if has('float')
2103 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02002104 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2105 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2106 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2107 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2108 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2109 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2110 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2111 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002112 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02002113 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002114 endif
2115
Bram Moolenaarac564082020-09-27 19:05:33 +02002116 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002117 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002118 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002119 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002120 ' var isFalse = false',
2121 ' var isNull = v:null',
2122 ' var aNumber = 222',
2123 ' var aString = "yy"',
2124 ' var aBlob = 0z22',
2125 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002126 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002127 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002128 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002129 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002130 ' endif',
2131 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002132 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002133 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002134 assert_match('TestCase' .. nr .. '.*' ..
2135 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2136 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002137 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002138 '\d ' .. case[1] .. '.*' ..
2139 '\d JUMP_IF_FALSE -> \d\+.*',
2140 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002141
2142 nr += 1
2143 endfor
2144
Bram Moolenaar22da5592020-03-19 14:52:20 +01002145 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002146enddef
2147
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002148def s:FalsyOp()
2149 echo g:flag ?? "yes"
2150 echo [] ?? "empty list"
2151 echo "" ?? "empty string"
2152enddef
2153
Dominique Pelle81b573d2022-03-22 21:14:55 +00002154def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002155 var res = execute('disass s:FalsyOp')
2156 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2157 'echo g:flag ?? "yes"\_s*' ..
2158 '0 LOADG g:flag\_s*' ..
2159 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2160 '2 PUSHS "yes"\_s*' ..
2161 '3 ECHO 1\_s*' ..
2162 'echo \[\] ?? "empty list"\_s*' ..
2163 '4 NEWLIST size 0\_s*' ..
2164 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2165 '6 PUSHS "empty list"\_s*' ..
2166 '7 ECHO 1\_s*' ..
2167 'echo "" ?? "empty string"\_s*' ..
2168 '\d\+ PUSHS "empty string"\_s*' ..
2169 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002170 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002171 res)
2172enddef
2173
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002174def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002175 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002176 ['"xx" == "yy"', false],
2177 ['"aa" == "aa"', true],
2178 ['has("eval") ? true : false', true],
2179 ['has("asdf") ? true : false', false],
2180 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002181
Bram Moolenaarac564082020-09-27 19:05:33 +02002182 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002183 for case in cases
2184 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002185 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002186 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002187 ' endif',
2188 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002189 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002190 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002191 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002192 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002193 assert_match('TestCase' .. nr .. '.*' ..
2194 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2195 '\d PUSHNR 42.*' ..
2196 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002197 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002198 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002199 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002200 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002201 assert_match('TestCase' .. nr .. '.*' ..
2202 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2203 'echo 42[ \n]*' ..
2204 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002205 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002206 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002207 endif
2208
2209 nr += 1
2210 endfor
2211
2212 delete('Xdisassemble')
2213enddef
2214
Bram Moolenaarad39c092020-02-26 18:23:43 +01002215def s:Execute()
2216 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002217 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002218 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002219 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002220 execute 'help ' .. tag
2221enddef
2222
2223def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002224 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002225 assert_match('\<SNR>\d*_Execute\_s*' ..
2226 "execute 'help vim9.txt'\\_s*" ..
2227 '\d PUSHS "help vim9.txt"\_s*' ..
2228 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002229 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002230 '\d PUSHS "help vim9.txt"\_s*' ..
2231 '\d STORE $0\_s*' ..
2232 'execute cmd\_s*' ..
2233 '\d LOAD $0\_s*' ..
2234 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002235 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002236 '\d PUSHS "vim9.txt"\_s*' ..
2237 '\d STORE $1\_s*' ..
2238 "execute 'help ' .. tag\\_s*" ..
2239 '\d\+ PUSHS "help "\_s*' ..
2240 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002241 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002242 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002243 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002244 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002245enddef
2246
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002247def s:OnlyRange()
2248 :$
2249 :123
2250 :'m
2251enddef
2252
2253def Test_disassemble_range_only()
2254 var res = execute('disass s:OnlyRange')
2255 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2256 ':$\_s*' ..
2257 '\d EXECRANGE $\_s*' ..
2258 ':123\_s*' ..
2259 '\d EXECRANGE 123\_s*' ..
2260 ':''m\_s*' ..
2261 '\d EXECRANGE ''m\_s*' ..
2262 '\d\+ RETURN void',
2263 res)
2264enddef
2265
Bram Moolenaarf6ced982022-04-28 12:00:49 +01002266def s:StoreRange()
2267 var l = [1, 2]
2268 l[0 : 1] = [7, 8]
2269enddef
2270
2271def Test_disassemble_store_range()
2272 var res = execute('disass s:StoreRange')
2273 assert_match('\<SNR>\d*_StoreRange\_s*' ..
2274 'var l = \[1, 2]\_s*' ..
2275 '\d PUSHNR 1\_s*' ..
2276 '\d PUSHNR 2\_s*' ..
2277 '\d NEWLIST size 2\_s*' ..
2278 '\d SETTYPE list<number>\_s*' ..
2279 '\d STORE $0\_s*' ..
2280
2281 'l\[0 : 1] = \[7, 8]\_s*' ..
2282 '\d\+ PUSHNR 7\_s*' ..
2283 '\d\+ PUSHNR 8\_s*' ..
2284 '\d\+ NEWLIST size 2\_s*' ..
2285 '\d\+ PUSHNR 0\_s*' ..
2286 '\d\+ PUSHNR 1\_s*' ..
2287 '\d\+ LOAD $0\_s*' ..
2288 '\d\+ STORERANGE\_s*' ..
2289 '\d\+ RETURN void',
2290 res)
2291enddef
2292
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002293def s:Echomsg()
2294 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002295 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002296 echoerr 'went' .. 'wrong'
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002297 var local = 'window'
2298 echowin 'in' local
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002299enddef
2300
2301def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002302 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002303 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2304 "echomsg 'some' 'message'\\_s*" ..
2305 '\d PUSHS "some"\_s*' ..
2306 '\d PUSHS "message"\_s*' ..
2307 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002308 "echoconsole 'nothing'\\_s*" ..
2309 '\d PUSHS "nothing"\_s*' ..
2310 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002311 "echoerr 'went' .. 'wrong'\\_s*" ..
2312 '\d PUSHS "wentwrong"\_s*' ..
2313 '\d ECHOERR 1\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002314 "var local = 'window'\\_s*" ..
2315 '\d\+ PUSHS "window"\_s*' ..
2316 '\d\+ STORE $0\_s*' ..
2317 "echowin 'in' local\\_s*" ..
2318 '\d\+ PUSHS "in"\_s*' ..
2319 '\d\+ LOAD $0\_s*' ..
2320 '\d\+ ECHOWINDOW 2\_s*' ..
2321 '\d\+ RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002322 res)
2323enddef
2324
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002325def SomeStringArg(arg: string)
2326 echo arg
2327enddef
2328
2329def SomeAnyArg(arg: any)
2330 echo arg
2331enddef
2332
2333def SomeStringArgAndReturn(arg: string): string
2334 return arg
2335enddef
2336
2337def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002338 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002339 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2340 '\d *echo arg.*' ..
2341 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002342 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002343
Bram Moolenaarac564082020-09-27 19:05:33 +02002344 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002345 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2346 '\d *echo arg\_s*' ..
2347 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002348 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002349
Bram Moolenaarac564082020-09-27 19:05:33 +02002350 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002351 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2352 '\d *return arg\_s*' ..
2353 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002354 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002355enddef
2356
Bram Moolenaar09689a02020-05-09 22:50:08 +02002357def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002358 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002359 vim9script
2360 def FuncOne(): string
2361 return FuncTwo()
2362 enddef
2363 def FuncTwo(): string
2364 return 'two'
2365 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002366 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002367 END
2368 writefile(lines, 'Xdisassemble')
2369 source Xdisassemble
2370
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002371 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002372 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2373 'return FuncTwo()\_s*' ..
2374 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002375 '\d RETURN',
2376 g:res_FuncOne)
2377
2378 delete('Xdisassemble')
2379 unlet g:res_FuncOne
2380enddef
2381
Bram Moolenaar61a89812020-05-07 16:58:17 +02002382def s:ConcatStrings(): string
2383 return 'one' .. 'two' .. 'three'
2384enddef
2385
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002386def s:ComputeConst(): number
2387 return 2 + 3 * 4 / 6 + 7
2388enddef
2389
Bram Moolenaar1c747212020-05-09 18:28:34 +02002390def s:ComputeConstParen(): number
2391 return ((2 + 4) * (8 / 2)) / (3 + 4)
2392enddef
2393
Bram Moolenaar61a89812020-05-07 16:58:17 +02002394def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002395 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002396 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2397 "return 'one' .. 'two' .. 'three'\\_s*" ..
2398 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002399 '\d RETURN',
2400 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002401
2402 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002403 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2404 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2405 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002406 '\d RETURN',
2407 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002408
2409 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002410 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2411 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2412 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002413 '\d RETURN',
2414 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002415enddef
2416
Bram Moolenaar389df252020-07-09 21:20:47 +02002417def s:CallAppend()
2418 eval "some text"->append(2)
2419enddef
2420
2421def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002422 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002423 assert_match('<SNR>\d*_CallAppend\_s*' ..
2424 'eval "some text"->append(2)\_s*' ..
2425 '\d PUSHS "some text"\_s*' ..
2426 '\d PUSHNR 2\_s*' ..
2427 '\d SHUFFLE 2 up 1\_s*' ..
2428 '\d BCALL append(argc 2)\_s*' ..
2429 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002430 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002431 res)
2432enddef
2433
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002434
2435def s:SilentMessage()
2436 silent echomsg "text"
2437 silent! echoerr "error"
2438enddef
2439
2440def Test_silent()
2441 var res = execute('disass s:SilentMessage')
2442 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2443 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002444 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002445 '\d PUSHS "text"\_s*' ..
2446 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002447 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002448 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002449 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002450 '\d PUSHS "error"\_s*' ..
2451 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002452 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002453 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002454 res)
2455enddef
2456
2457def s:SilentIf()
2458 silent if 4 == g:five
2459 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002460 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002461enddef
2462
2463def Test_silent_if()
2464 var res = execute('disass s:SilentIf')
2465 assert_match('<SNR>\d*_SilentIf\_s*' ..
2466 'silent if 4 == g:five\_s*' ..
2467 '\d\+ CMDMOD silent\_s*' ..
2468 '\d\+ PUSHNR 4\_s*' ..
2469 '\d\+ LOADG g:five\_s*' ..
2470 '\d\+ COMPAREANY ==\_s*' ..
2471 '\d\+ CMDMOD_REV\_s*' ..
2472 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2473 'silent elseif 4 == g:five\_s*' ..
2474 '\d\+ JUMP -> \d\+\_s*' ..
2475 '\d\+ CMDMOD silent\_s*' ..
2476 '\d\+ PUSHNR 4\_s*' ..
2477 '\d\+ LOADG g:five\_s*' ..
2478 '\d\+ COMPAREANY ==\_s*' ..
2479 '\d\+ CMDMOD_REV\_s*' ..
2480 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002481 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002482 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002483 res)
2484enddef
2485
2486def s:SilentFor()
2487 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002488 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002489enddef
2490
2491def Test_silent_for()
2492 var res = execute('disass s:SilentFor')
2493 assert_match('<SNR>\d*_SilentFor\_s*' ..
2494 'silent for i in \[0\]\_s*' ..
2495 '\d CMDMOD silent\_s*' ..
2496 '\d STORE -1 in $0\_s*' ..
2497 '\d PUSHNR 0\_s*' ..
2498 '\d NEWLIST size 1\_s*' ..
2499 '\d CMDMOD_REV\_s*' ..
2500 '5 FOR $0 -> 8\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002501 '\d STORE $2\_s*' ..
2502
Bram Moolenaarfa984412021-03-25 22:15:28 +01002503 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002504 '\d JUMP -> 5\_s*' ..
2505 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002506 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002507 res)
2508enddef
2509
2510def s:SilentWhile()
2511 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002512 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002513enddef
2514
2515def Test_silent_while()
2516 var res = execute('disass s:SilentWhile')
2517 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2518 'silent while g:not\_s*' ..
2519 '0 CMDMOD silent\_s*' ..
2520 '\d LOADG g:not\_s*' ..
2521 '\d COND2BOOL\_s*' ..
2522 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002523 '\d WHILE $0 -> 6\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002524
Bram Moolenaarfa984412021-03-25 22:15:28 +01002525 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002526 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002527 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002528 res)
2529enddef
2530
2531def s:SilentReturn(): string
2532 silent return "done"
2533enddef
2534
2535def Test_silent_return()
2536 var res = execute('disass s:SilentReturn')
2537 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2538 'silent return "done"\_s*' ..
2539 '\d CMDMOD silent\_s*' ..
2540 '\d PUSHS "done"\_s*' ..
2541 '\d CMDMOD_REV\_s*' ..
2542 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002543 res)
2544enddef
2545
Bram Moolenaarb2049902021-01-24 12:53:53 +01002546def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002547 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002548 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002549 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002550 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002551 return "done"
2552enddef
2553
2554def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002555 if !has('profile')
2556 MissingFeature 'profile'
2557 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002558 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002559 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002560 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002561 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002562 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002563 '\d PUSHS "profiled"\_s*' ..
2564 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002565 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002566 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002567 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002568 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002569 '\d PUSHS "some text"\_s*' ..
2570 '\d STORE $0\_s*' ..
2571 'return "done"\_s*' ..
2572 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002573 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002574 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002575 '\d\+ RETURN\_s*' ..
2576 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002577 res)
2578enddef
2579
Bram Moolenaare99d4222021-06-13 14:01:26 +02002580def Test_debugged()
2581 var res = execute('disass debug s:Profiled')
2582 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002583 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002584 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002585 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002586 '\d PUSHS "profiled"\_s*' ..
2587 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002588 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002589 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002590 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002591 '\d PUSHS "some text"\_s*' ..
2592 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002593 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002594 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002595 '\d PUSHS "done"\_s*' ..
2596 '\d RETURN\_s*',
2597 res)
2598enddef
2599
Bram Moolenaar90770b72021-11-30 20:57:38 +00002600def s:ElseifConstant()
2601 if g:value
2602 echo "one"
2603 elseif true
2604 echo "true"
2605 elseif false
2606 echo "false"
2607 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002608 if 0
2609 echo "yes"
2610 elseif 0
2611 echo "no"
2612 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002613enddef
2614
2615def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002616 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002617 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2618 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002619 '0 DEBUG line 1-1 varcount 0\_s*' ..
2620 '1 LOADG g:value\_s*' ..
2621 '2 COND2BOOL\_s*' ..
2622 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002623 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002624 '4 DEBUG line 2-2 varcount 0\_s*' ..
2625 '5 PUSHS "one"\_s*' ..
2626 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002627 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002628 '7 JUMP -> 12\_s*' ..
2629 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002630 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002631 '9 DEBUG line 4-4 varcount 0\_s*' ..
2632 '10 PUSHS "true"\_s*' ..
2633 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002634 'elseif false\_s*' ..
2635 'echo "false"\_s*' ..
2636 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002637 'if 0\_s*' ..
2638 '12 DEBUG line 8-8 varcount 0\_s*' ..
2639 'echo "yes"\_s*' ..
2640 'elseif 0\_s*' ..
2641 '13 DEBUG line 11-10 varcount 0\_s*' ..
2642 'echo "no"\_s*' ..
2643 'endif\_s*' ..
2644 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002645 res)
2646enddef
2647
Bram Moolenaar093165c2021-08-22 13:35:31 +02002648def s:DebugElseif()
2649 var b = false
2650 if b
2651 eval 1 + 0
2652 silent elseif !b
2653 eval 2 + 0
2654 endif
2655enddef
2656
2657def Test_debug_elseif()
2658 var res = execute('disass debug s:DebugElseif')
2659 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2660 'var b = false\_s*' ..
2661 '0 DEBUG line 1-1 varcount 0\_s*' ..
2662 '1 PUSH false\_s*' ..
2663 '2 STORE $0\_s*' ..
2664
2665 'if b\_s*' ..
2666 '3 DEBUG line 2-2 varcount 1\_s*' ..
2667 '4 LOAD $0\_s*' ..
2668 '5 JUMP_IF_FALSE -> 10\_s*' ..
2669
2670 'eval 1 + 0\_s*' ..
2671 '6 DEBUG line 3-3 varcount 1\_s*' ..
2672 '7 PUSHNR 1\_s*' ..
2673 '8 DROP\_s*' ..
2674
2675 'silent elseif !b\_s*' ..
2676 '9 JUMP -> 20\_s*' ..
2677 '10 CMDMOD silent\_s*' ..
2678 '11 DEBUG line 4-4 varcount 1\_s*' ..
2679 '12 LOAD $0\_s*' ..
2680 '13 INVERT -1 (!val)\_s*' ..
2681 '14 CMDMOD_REV\_s*' ..
2682 '15 JUMP_IF_FALSE -> 20\_s*' ..
2683
2684 'eval 2 + 0\_s*' ..
2685 '16 DEBUG line 5-5 varcount 1\_s*' ..
2686 '17 PUSHNR 2\_s*' ..
2687 '18 DROP\_s*' ..
2688
2689 'endif\_s*' ..
2690 '19 DEBUG line 6-6 varcount 1\_s*' ..
2691 '20 RETURN void*',
2692 res)
2693enddef
2694
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002695def s:DebugFor()
2696 echo "hello"
2697 for a in [0]
2698 echo a
2699 endfor
2700enddef
2701
2702def Test_debug_for()
2703 var res = execute('disass debug s:DebugFor')
2704 assert_match('<SNR>\d*_DebugFor\_s*' ..
2705 'echo "hello"\_s*' ..
2706 '0 DEBUG line 1-1 varcount 0\_s*' ..
2707 '1 PUSHS "hello"\_s*' ..
2708 '2 ECHO 1\_s*' ..
2709
2710 'for a in \[0\]\_s*' ..
2711 '3 DEBUG line 2-2 varcount 0\_s*' ..
2712 '4 STORE -1 in $0\_s*' ..
2713 '5 PUSHNR 0\_s*' ..
2714 '6 NEWLIST size 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002715 '7 DEBUG line 2-2 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002716 '8 FOR $0 -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002717 '9 STORE $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002718
2719 'echo a\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002720 '10 DEBUG line 3-3 varcount 3\_s*' ..
2721 '11 LOAD $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002722 '12 ECHO 1\_s*' ..
2723
2724 'endfor\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002725 '13 DEBUG line 4-4 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002726 '14 JUMP -> 7\_s*' ..
2727 '15 DROP\_s*' ..
2728 '16 RETURN void*',
2729 res)
2730enddef
2731
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002732def s:TryCatch()
2733 try
2734 echo "try"
2735 catch /error/
2736 echo "caught"
2737 endtry
2738enddef
2739
2740def Test_debug_try_catch()
2741 var res = execute('disass debug s:TryCatch')
2742 assert_match('<SNR>\d*_TryCatch\_s*' ..
2743 'try\_s*' ..
2744 '0 DEBUG line 1-1 varcount 0\_s*' ..
2745 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2746 'echo "try"\_s*' ..
2747 '2 DEBUG line 2-2 varcount 0\_s*' ..
2748 '3 PUSHS "try"\_s*' ..
2749 '4 ECHO 1\_s*' ..
2750 'catch /error/\_s*' ..
2751 '5 DEBUG line 3-3 varcount 0\_s*' ..
2752 '6 JUMP -> 17\_s*' ..
2753 '7 DEBUG line 4-3 varcount 0\_s*' ..
2754 '8 PUSH v:exception\_s*' ..
2755 '9 PUSHS "error"\_s*' ..
2756 '10 COMPARESTRING =\~\_s*' ..
2757 '11 JUMP_IF_FALSE -> 17\_s*' ..
2758 '12 CATCH\_s*' ..
2759 'echo "caught"\_s*' ..
2760 '13 DEBUG line 4-4 varcount 0\_s*' ..
2761 '14 PUSHS "caught"\_s*' ..
2762 '15 ECHO 1\_s*' ..
2763 'endtry\_s*' ..
2764 '16 DEBUG line 5-5 varcount 0\_s*' ..
2765 '17 ENDTRY\_s*' ..
2766 '\d\+ RETURN void',
2767 res)
2768enddef
2769
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002770func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002771 echo 'legacy'
2772endfunc
2773
2774def s:UseMember()
2775 var d = {func: Legacy}
2776 var v = d.func()
2777enddef
2778
2779def Test_disassemble_dict_stack()
2780 var res = execute('disass s:UseMember')
2781 assert_match('<SNR>\d*_UseMember\_s*' ..
2782 'var d = {func: Legacy}\_s*' ..
2783 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002784 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002785 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002786 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002787 '\d STORE $0\_s*' ..
2788
2789 'var v = d.func()\_s*' ..
2790 '\d LOAD $0\_s*' ..
2791 '\d MEMBER func\_s*' ..
2792 '\d PCALL top (argc 0)\_s*' ..
2793 '\d PCALL end\_s*' ..
2794 '\d CLEARDICT\_s*' ..
2795 '\d\+ STORE $1\_s*' ..
2796 '\d\+ RETURN void*',
2797 res)
2798enddef
2799
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002800def s:RetLegacy(): string
2801 legacy return "yes"
2802enddef
2803
2804def Test_disassemble_return_legacy()
2805 var res = execute('disass s:RetLegacy')
2806 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2807 'legacy return "yes"\_s*' ..
2808 '\d CMDMOD legacy\_s*' ..
2809 '\d EVAL legacy "yes"\_s*' ..
2810 '\d CHECKTYPE string stack\[-1]\_s*' ..
2811 '\d CMDMOD_REV\_s*' ..
2812 '\d RETURN',
2813 res)
2814enddef
2815
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002816def s:EchoMessages()
2817 echohl ErrorMsg | echom v:exception | echohl NONE
2818enddef
2819
2820def Test_disassemble_nextcmd()
2821 # splitting commands and removing trailing blanks should not change the line
2822 var res = execute('disass s:EchoMessages')
2823 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2824 'echohl ErrorMsg | echom v:exception | echohl NONE',
2825 res)
2826enddef
2827
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002828def Test_disassemble_after_reload()
2829 var lines =<< trim END
2830 vim9script
2831 if exists('g:ThisFunc')
2832 finish
2833 endif
2834 var name: any
2835 def g:ThisFunc(): number
2836 g:name = name
2837 return 0
2838 enddef
2839 def g:ThatFunc(): number
2840 name = g:name
2841 return 0
2842 enddef
2843 END
2844 lines->writefile('Xreload.vim')
2845
2846 source Xreload.vim
2847 g:ThisFunc()
2848 g:ThatFunc()
2849
2850 source Xreload.vim
2851 var res = execute('disass g:ThisFunc')
2852 assert_match('ThisFunc\_s*' ..
2853 'g:name = name\_s*' ..
2854 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2855 '\d STOREG g:name\_s*' ..
2856 'return 0\_s*' ..
2857 '\d PUSHNR 0\_s*' ..
2858 '\d RETURN\_s*',
2859 res)
2860
2861 res = execute('disass g:ThatFunc')
2862 assert_match('ThatFunc\_s*' ..
2863 'name = g:name\_s*' ..
2864 '\d LOADG g:name\_s*' ..
2865 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2866 'return 0\_s*' ..
2867 '\d PUSHNR 0\_s*' ..
2868 '\d RETURN\_s*',
2869 res)
2870
2871 delete('Xreload.vim')
2872 delfunc g:ThisFunc
2873 delfunc g:ThatFunc
2874enddef
2875
LemonBoy2eaef102022-05-06 13:14:50 +01002876def s:MakeString(x: number): string
2877 return $"x={x} x^2={x * x}"
2878enddef
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002879
LemonBoy2eaef102022-05-06 13:14:50 +01002880def Test_disassemble_string_interp()
2881 var instr = execute('disassemble s:MakeString')
2882 assert_match('MakeString\_s*' ..
2883 'return $"x={x} x^2={x \* x}"\_s*' ..
2884 '0 PUSHS "x="\_s*' ..
2885 '1 LOAD arg\[-1\]\_s*' ..
2886 '2 2STRING stack\[-1\]\_s*' ..
2887 '3 PUSHS " x^2="\_s*' ..
2888 '4 LOAD arg\[-1\]\_s*' ..
2889 '5 LOAD arg\[-1\]\_s*' ..
2890 '6 OPNR \*\_s*' ..
2891 '7 2STRING stack\[-1\]\_s*' ..
2892 '8 CONCAT size 4\_s*' ..
2893 '9 RETURN\_s*',
2894 instr)
2895enddef
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002896
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01002897def BitShift()
2898 var a = 1 << 2
2899 var b = 8 >> 1
2900 var c = a << b
2901 var d = b << a
2902enddef
2903
2904def Test_disassemble_bitshift()
2905 var instr = execute('disassemble BitShift')
2906 assert_match('BitShift\_s*' ..
2907 'var a = 1 << 2\_s*' ..
2908 '0 STORE 4 in $0\_s*' ..
2909 'var b = 8 >> 1\_s*' ..
2910 '1 STORE 4 in $1\_s*' ..
2911 'var c = a << b\_s*' ..
2912 '2 LOAD $0\_s*' ..
2913 '3 LOAD $1\_s*' ..
2914 '4 OPNR <<\_s*' ..
2915 '5 STORE $2\_s*' ..
2916 'var d = b << a\_s*' ..
2917 '6 LOAD $1\_s*' ..
2918 '7 LOAD $0\_s*' ..
2919 '8 OPNR <<\_s*' ..
2920 '9 STORE $3\_s*' ..
2921 '10 RETURN void', instr)
2922enddef
2923
Bram Moolenaar1d84f762022-09-03 21:35:53 +01002924def s:OneDefer()
2925 defer delete("file")
2926enddef
2927
2928def Test_disassemble_defer()
2929 var instr = execute('disassemble s:OneDefer')
2930 assert_match('OneDefer\_s*' ..
2931 'defer delete("file")\_s*' ..
2932 '\d PUSHFUNC "delete"\_s*' ..
2933 '\d PUSHS "file"\_s*' ..
2934 '\d DEFER 1 args\_s*' ..
2935 '\d RETURN\_s*',
2936 instr)
2937enddef
2938
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002939" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker