blob: b4e25c39aa20845d54430a7da4225ac02468600b [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 Moolenaar73e28dc2022-09-17 21:08:33 +0100312 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100313enddef
314
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100315def Test_disassemble_push()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100316 mkdir('Xdisdir/autoload', 'pR')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000317 var save_rtp = &rtp
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100318 exe 'set rtp^=' .. getcwd() .. '/Xdisdir'
Bram Moolenaar06b77222022-01-25 15:51:56 +0000319
320 var lines =<< trim END
321 vim9script
322 END
Bram Moolenaar3b0d70f2022-08-29 22:31:20 +0100323 writefile(lines, 'Xdisdir/autoload/autoscript.vim')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000324
325 lines =<< trim END
326 vim9script
327 import autoload 'autoscript.vim'
328
Bram Moolenaara749a422022-02-12 19:52:25 +0000329 def AutoloadFunc()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000330 &operatorfunc = autoscript.Opfunc
331 enddef
332
Bram Moolenaara749a422022-02-12 19:52:25 +0000333 var res = execute('disass AutoloadFunc')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000334 assert_match('<SNR>\d*_AutoloadFunc.*' ..
335 '&operatorfunc = autoscript.Opfunc\_s*' ..
336 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
337 '1 STOREFUNCOPT &operatorfunc\_s*' ..
338 '2 RETURN void',
339 res)
340 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000341 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000342
Bram Moolenaar06b77222022-01-25 15:51:56 +0000343 &rtp = save_rtp
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100344enddef
345
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100346def Test_disassemble_import_autoload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +0100347 writefile(['vim9script'], 'XimportAL.vim', 'D')
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100348
349 var lines =<< trim END
350 vim9script
351 import autoload './XimportAL.vim'
352
353 def AutoloadFunc()
354 echo XimportAL.SomeFunc()
355 echo XimportAL.someVar
356 XimportAL.someVar = "yes"
357 enddef
358
359 var res = execute('disass AutoloadFunc')
360 assert_match('<SNR>\d*_AutoloadFunc.*' ..
361 'echo XimportAL.SomeFunc()\_s*' ..
Bram Moolenaar17125182022-03-30 21:57:50 +0100362 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100363 '\d PUSHFUNC "<80><fd>R\d\+_SomeFunc"\_s*' ..
364 '\d PCALL top (argc 0)\_s*' ..
365 '\d PCALL end\_s*' ..
366 '\d ECHO 1\_s*' ..
367
368 'echo XimportAL.someVar\_s*' ..
369 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
370 '\d LOADEXPORT s:someVar from .*/testdir/XimportAL.vim\_s*' ..
371 '\d ECHO 1\_s*' ..
372
373 'XimportAL.someVar = "yes"\_s*' ..
374 '\d\+ PUSHS "yes"\_s*' ..
375 '\d\+ SOURCE .*/testdir/XimportAL.vim\_s*' ..
376 '\d\+ STOREEXPORT someVar in .*/testdir/XimportAL.vim\_s*' ..
377
378 '\d\+ RETURN void',
379 res)
380 END
381 v9.CheckScriptSuccess(lines)
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100382enddef
383
Ernie Rael3f821d62024-04-24 20:07:50 +0200384def Test_disassemble_import_autoload_autoload()
385 mkdir('Xauto_auto/autoload', 'pR')
386 var lines =<< trim END
387 vim9script
388 export const val = 11
389 END
390 writefile(lines, 'Xauto_auto/autoload/Xauto_vars_f1.vim')
391
392 lines =<< trim END
393 vim9script
394
395 import autoload './Xauto_auto/autoload/Xauto_vars_f1.vim' as f1
396 def F()
397 f1.val = 13
398 enddef
399 var res = execute('disass F')
400
401 assert_match('<SNR>\d*_F.*' ..
402 'f1.val = 13\_s*' ..
403 '\d PUSHNR 13\_s*' ..
404 '\d SOURCE .*/Xauto_auto/autoload/Xauto_vars_f1.vim\_s*' ..
405 '\d STOREEXPORT val in .*/Xauto_auto/autoload/Xauto_vars_f1.vim\_s*' ..
406 '\d RETURN void',
407 res)
408 END
409 v9.CheckScriptSuccess(lines)
410enddef
411
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100412def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200413 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100414 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200415 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100416 localstr = 'xyz'
417 v:char = 'abc'
418 s:scriptvar = 'sv'
419 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100420 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200421 b:buffervar = 'bv'
422 w:windowvar = 'wv'
423 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100424 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000425 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100426 $ENVVAR = 'ev'
427 @z = 'rv'
428enddef
429
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100430def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200432 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200433 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200434 'localnr = 2.*' ..
435 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200436 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200437 'localstr = ''xyz''.*' ..
438 ' STORE $1.*' ..
439 'v:char = ''abc''.*' ..
440 'STOREV v:char.*' ..
441 's:scriptvar = ''sv''.*' ..
442 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
443 'g:globalvar = ''gv''.*' ..
444 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100445 'g:auto#var = ''av''.*' ..
446 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200447 'b:buffervar = ''bv''.*' ..
448 ' STOREB b:buffervar.*' ..
449 'w:windowvar = ''wv''.*' ..
450 ' STOREW w:windowvar.*' ..
451 't:tabpagevar = ''tv''.*' ..
452 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000453 '&tabstop = 8\_s*' ..
454 '\d\+ PUSHNR 8\_s*' ..
455 '\d\+ STOREOPT &tabstop\_s*' ..
456 '&opfunc = (t) => len(t)\_s*' ..
457 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
458 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
459 '$ENVVAR = ''ev''\_s*' ..
460 '\d\+ PUSHS "ev"\_s*' ..
461 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200462 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000463 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200464 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100465enddef
466
Bram Moolenaarcb790402020-05-15 20:53:00 +0200467def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200468 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200469 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200470 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200471 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200472 var localblob: blob = 0z1122
473 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200474enddef
475
476def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200477 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200478 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200479 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200480 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100481 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200482 '\d STORE $0\_s*' ..
483 'locallist\[0\] = 123\_s*' ..
484 '\d PUSHNR 123\_s*' ..
485 '\d PUSHNR 0\_s*' ..
486 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200487 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200488 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200489 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100490 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200491 '\d STORE $1\_s*' ..
492 'localdict\["a"\] = 456\_s*' ..
493 '\d\+ PUSHNR 456\_s*' ..
494 '\d\+ PUSHS "a"\_s*' ..
495 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200496 '\d\+ STOREINDEX dict\_s*' ..
497 'var localblob: blob = 0z1122\_s*' ..
498 '\d\+ PUSHBLOB 0z1122\_s*' ..
499 '\d\+ STORE $2\_s*' ..
500 'localblob\[1\] = 33\_s*' ..
501 '\d\+ PUSHNR 33\_s*' ..
502 '\d\+ PUSHNR 1\_s*' ..
503 '\d\+ LOAD $2\_s*' ..
504 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200505 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200506 res)
507enddef
508
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000509if has('job')
510 def s:StoreNull()
511 var ss = null_string
512 var bb = null_blob
513 var dd = null_dict
514 var ll = null_list
515 var Ff = null_function
516 var Pp = null_partial
517 var jj = null_job
518 var cc = null_channel
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +0200519 var oo = null_object
520 var nc = null_class
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000521 enddef
522
523 def Test_disassemble_assign_null()
524 var res = execute('disass s:StoreNull')
525 assert_match('<SNR>\d*_StoreNull\_s*' ..
526 'var ss = null_string\_s*' ..
527 '\d\+ PUSHS "\[NULL\]"\_s*' ..
528 '\d\+ STORE $\d\_s*' ..
529
530 'var bb = null_blob\_s*' ..
531 '\d\+ PUSHBLOB 0z\_s*' ..
532 '\d\+ STORE $\d\_s*' ..
533
534 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100535 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000536 '\d\+ STORE $\d\_s*' ..
537
538 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100539 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000540 '\d\+ STORE $\d\_s*' ..
541
542 'var Ff = null_function\_s*' ..
543 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
544 '\d\+ STORE $\d\_s*' ..
545
546 'var Pp = null_partial\_s*' ..
547 '\d\+ NEWPARTIAL\_s*' ..
548 '\d\+ STORE $\d\_s*' ..
549
550 'var jj = null_job\_s*' ..
551 '\d\+ PUSHJOB "no process"\_s*' ..
552 '\d\+ STORE $\d\_s*' ..
553
554 'var cc = null_channel\_s*' ..
555 '\d\+ PUSHCHANNEL 0\_s*' ..
556 '\d\+ STORE $\d\_s*' ..
557
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +0200558 'var oo = null_object\_s*' ..
559 '\d\+ PUSHOBJ null\_s*' ..
560 '\d\+ STORE $\d\_s*' ..
561
562 'var nc = null_class\_s*' ..
563 '\d\+ PUSHCLASS null\_s*' ..
564 '\d\+ STORE $\d\_s*' ..
565
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000566 '\d\+ RETURN void',
567 res)
568 enddef
569endif
570
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100571def s:ScriptFuncStoreIndex()
572 var d = {dd: {}}
573 d.dd[0] = 0
574enddef
575
576def Test_disassemble_store_index()
577 var res = execute('disass s:ScriptFuncStoreIndex')
578 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
579 'var d = {dd: {}}\_s*' ..
580 '\d PUSHS "dd"\_s*' ..
581 '\d NEWDICT size 0\_s*' ..
582 '\d NEWDICT size 1\_s*' ..
Yegappan Lakshmanan66897192023-12-05 15:51:50 +0100583 '\d SETTYPE dict<dict<any>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100584 '\d STORE $0\_s*' ..
585 'd.dd\[0\] = 0\_s*' ..
586 '\d PUSHNR 0\_s*' ..
587 '\d PUSHNR 0\_s*' ..
588 '\d LOAD $0\_s*' ..
589 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200590 '\d\+ USEDICT\_s*' ..
591 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200592 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100593 res)
594enddef
595
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200596def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200597 var x: string
598 var y: string
599 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200600 [x, y; l] = g:stringlist
601enddef
602
603def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200604 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200605 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200606 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200607 '\d PUSHS "\[NULL\]"\_s*' ..
608 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200609 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200610 '\d PUSHS "\[NULL\]"\_s*' ..
611 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200612 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200613 '\d NEWLIST size 0\_s*' ..
614 '\d STORE $2\_s*' ..
615 '\[x, y; l\] = g:stringlist\_s*' ..
616 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200617 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200618 '\d CHECKLEN >= 2\_s*' ..
619 '\d\+ ITEM 0\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100620 '\d\+ CHECKTYPE string stack\[-1\] var 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200621 '\d\+ STORE $0\_s*' ..
622 '\d\+ ITEM 1\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100623 '\d\+ CHECKTYPE string stack\[-1\] var 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200624 '\d\+ STORE $1\_s*' ..
625 '\d\+ SLICE 2\_s*' ..
626 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200627 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200628 res)
629enddef
630
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200631def s:ListAssignWithOp()
632 var a = 2
633 var b = 3
634 [a, b] += [4, 5]
635enddef
636
637def Test_disassemble_list_assign_with_op()
638 var res = execute('disass s:ListAssignWithOp')
639 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
640 'var a = 2\_s*' ..
641 '\d STORE 2 in $0\_s*' ..
642 'var b = 3\_s*' ..
643 '\d STORE 3 in $1\_s*' ..
644 '\[a, b\] += \[4, 5\]\_s*' ..
645 '\d\+ PUSHNR 4\_s*' ..
646 '\d\+ PUSHNR 5\_s*' ..
647 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200648 '\d\+ LOAD $0\_s*' ..
649 '\d\+ ITEM 0 with op\_s*' ..
650 '\d\+ OPNR +\_s*' ..
651 '\d\+ STORE $0\_s*' ..
652 '\d\+ LOAD $1\_s*' ..
653 '\d\+ ITEM 1 with op\_s*' ..
654 '\d\+ OPNR +\_s*' ..
655 '\d\+ STORE $1\_s*' ..
656 '\d\+ DROP\_s*' ..
657 '\d\+ RETURN void',
658 res)
659enddef
660
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200661def s:ListAdd()
662 var l: list<number> = []
663 add(l, 123)
664 add(l, g:aNumber)
665enddef
666
667def Test_disassemble_list_add()
668 var res = execute('disass s:ListAdd')
669 assert_match('<SNR>\d*_ListAdd\_s*' ..
670 'var l: list<number> = []\_s*' ..
671 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100672 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200673 '\d STORE $0\_s*' ..
674 'add(l, 123)\_s*' ..
675 '\d LOAD $0\_s*' ..
676 '\d PUSHNR 123\_s*' ..
677 '\d LISTAPPEND\_s*' ..
678 '\d DROP\_s*' ..
679 'add(l, g:aNumber)\_s*' ..
680 '\d LOAD $0\_s*' ..
681 '\d\+ LOADG g:aNumber\_s*' ..
682 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
683 '\d\+ LISTAPPEND\_s*' ..
684 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200685 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200686 res)
687enddef
688
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200689def s:BlobAdd()
690 var b: blob = 0z
691 add(b, 123)
692 add(b, g:aNumber)
693enddef
694
695def Test_disassemble_blob_add()
696 var res = execute('disass s:BlobAdd')
697 assert_match('<SNR>\d*_BlobAdd\_s*' ..
698 'var b: blob = 0z\_s*' ..
699 '\d PUSHBLOB 0z\_s*' ..
700 '\d STORE $0\_s*' ..
701 'add(b, 123)\_s*' ..
702 '\d LOAD $0\_s*' ..
703 '\d PUSHNR 123\_s*' ..
704 '\d BLOBAPPEND\_s*' ..
705 '\d DROP\_s*' ..
706 'add(b, g:aNumber)\_s*' ..
707 '\d LOAD $0\_s*' ..
708 '\d\+ LOADG g:aNumber\_s*' ..
709 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
710 '\d\+ BLOBAPPEND\_s*' ..
711 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200712 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200713 res)
714enddef
715
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200716def s:BlobIndexSlice()
717 var b: blob = 0z112233
718 echo b[1]
719 echo b[1 : 2]
720enddef
721
722def Test_disassemble_blob_index_slice()
723 var res = execute('disass s:BlobIndexSlice')
724 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
725 'var b: blob = 0z112233\_s*' ..
726 '\d PUSHBLOB 0z112233\_s*' ..
727 '\d STORE $0\_s*' ..
728 'echo b\[1\]\_s*' ..
729 '\d LOAD $0\_s*' ..
730 '\d PUSHNR 1\_s*' ..
731 '\d BLOBINDEX\_s*' ..
732 '\d ECHO 1\_s*' ..
733 'echo b\[1 : 2\]\_s*' ..
734 '\d LOAD $0\_s*' ..
735 '\d PUSHNR 1\_s*' ..
736 '\d\+ PUSHNR 2\_s*' ..
737 '\d\+ BLOBSLICE\_s*' ..
738 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200739 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200740 res)
741enddef
742
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200743def s:ScriptFuncUnlet()
744 g:somevar = "value"
745 unlet g:somevar
746 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200747 unlet $SOMEVAR
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100748
749 var l = [1, 2, 3]
750 unlet l[2]
751 unlet l[0 : 1]
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200752enddef
753
754def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200755 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200756 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
757 'g:somevar = "value"\_s*' ..
758 '\d PUSHS "value"\_s*' ..
759 '\d STOREG g:somevar\_s*' ..
760 'unlet g:somevar\_s*' ..
761 '\d UNLET g:somevar\_s*' ..
762 'unlet! g:somevar\_s*' ..
763 '\d UNLET! g:somevar\_s*' ..
764 'unlet $SOMEVAR\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100765 '\d UNLETENV $SOMEVAR\_s*' ..
766
767 'var l = \[1, 2, 3]\_s*' ..
768 '\d\+ PUSHNR 1\_s*' ..
769 '\d\+ PUSHNR 2\_s*' ..
770 '\d\+ PUSHNR 3\_s*' ..
771 '\d\+ NEWLIST size 3\_s*' ..
772 '\d\+ SETTYPE list<number>\_s*' ..
773 '\d\+ STORE $0\_s*' ..
774
775 'unlet l\[2]\_s*' ..
776 '\d\+ PUSHNR 2\_s*' ..
777 '\d\+ LOAD $0\_s*' ..
778 '\d\+ UNLETINDEX\_s*' ..
779
780 'unlet l\[0 : 1]\_s*' ..
781 '\d\+ PUSHNR 0\_s*' ..
782 '\d\+ PUSHNR 1\_s*' ..
783 '\d\+ LOAD $0\_s*' ..
784 '\d\+ UNLETRANGE\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200785 res)
786enddef
787
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200788def s:LockLocal()
789 var d = {a: 1}
790 lockvar d.a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100791 const nr = 22
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200792enddef
793
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000794def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200795 var res = execute('disass s:LockLocal')
796 assert_match('<SNR>\d*_LockLocal\_s*' ..
797 'var d = {a: 1}\_s*' ..
798 '\d PUSHS "a"\_s*' ..
799 '\d PUSHNR 1\_s*' ..
800 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000801 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200802 '\d STORE $0\_s*' ..
803 'lockvar d.a\_s*' ..
804 '\d LOAD $0\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100805 '\d LOCKUNLOCK lockvar 2 d.a\_s*' ..
806
807 'const nr = 22\_s*' ..
808 '\d\+ PUSHNR 22\_s*' ..
809 '\d\+ LOCKCONST\_s*' ..
810 '\d\+ STORE $1',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200811 res)
812enddef
813
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100814def s:ScriptFuncTry()
815 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200816 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100817 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200818 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100819 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200820 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100821 endtry
822enddef
823
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100824def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200825 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200826 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
827 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100828 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200829 'echo "yes"\_s*' ..
830 '\d PUSHS "yes"\_s*' ..
831 '\d ECHO 1\_s*' ..
832 'catch /fail/\_s*' ..
833 '\d JUMP -> \d\+\_s*' ..
834 '\d PUSH v:exception\_s*' ..
835 '\d PUSHS "fail"\_s*' ..
836 '\d COMPARESTRING =\~\_s*' ..
837 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
838 '\d CATCH\_s*' ..
839 'echo "no"\_s*' ..
840 '\d\+ PUSHS "no"\_s*' ..
841 '\d\+ ECHO 1\_s*' ..
842 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100843 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200844 'throw "end"\_s*' ..
845 '\d\+ PUSHS "end"\_s*' ..
846 '\d\+ THROW\_s*' ..
847 'endtry\_s*' ..
848 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200849 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100850enddef
851
852def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200853 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100854 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100855enddef
856
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100857def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200858 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200859 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200860 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200861 '\d PUSHNR 1\_s*' ..
862 '\d PUSHS "two"\_s*' ..
863 '\d PUSHNR 333\_s*' ..
864 '\d NEWLIST size 3\_s*' ..
865 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100866 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200867 '\d PUSHS "one"\_s*' ..
868 '\d PUSHNR 1\_s*' ..
869 '\d PUSHS "two"\_s*' ..
870 '\d PUSHS "val"\_s*' ..
871 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200872 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100873enddef
874
Bram Moolenaar62aec932022-01-29 21:45:34 +0000875def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100876 echo arg
877enddef
878
Bram Moolenaar62aec932022-01-29 21:45:34 +0000879func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100880 echo 'nothing'
881endfunc
882
Bram Moolenaar62aec932022-01-29 21:45:34 +0000883func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100884 echo a:arg
885endfunc
886
887def s:ScriptFuncCall(): string
888 changenr()
889 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000890 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100891 FuncWithArg(343)
892 ScriptFuncNew()
893 s:ScriptFuncNew()
894 UserFunc()
895 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200896 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100897 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200898 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100899 FuncRefWithArg("bar")
900 return "yes"
901enddef
902
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100903def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200904 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200905 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
906 'changenr()\_s*' ..
907 '\d BCALL changenr(argc 0)\_s*' ..
908 '\d DROP\_s*' ..
909 'char2nr("abc")\_s*' ..
910 '\d PUSHS "abc"\_s*' ..
911 '\d BCALL char2nr(argc 1)\_s*' ..
912 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000913 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200914 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
915 '\d DROP\_s*' ..
916 'FuncWithArg(343)\_s*' ..
917 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000918 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200919 '\d\+ DROP\_s*' ..
920 'ScriptFuncNew()\_s*' ..
921 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
922 '\d\+ DROP\_s*' ..
923 's:ScriptFuncNew()\_s*' ..
924 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
925 '\d\+ DROP\_s*' ..
926 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000927 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200928 '\d\+ DROP\_s*' ..
929 'UserFuncWithArg("foo")\_s*' ..
930 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000931 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200932 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200933 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200934 '\d\+ PUSHS "UserFunc"\_s*' ..
935 '\d\+ BCALL function(argc 1)\_s*' ..
936 '\d\+ STORE $0\_s*' ..
937 'FuncRef()\_s*' ..
938 '\d\+ LOAD $\d\_s*' ..
939 '\d\+ PCALL (argc 0)\_s*' ..
940 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200941 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200942 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
943 '\d\+ BCALL function(argc 1)\_s*' ..
944 '\d\+ STORE $1\_s*' ..
945 'FuncRefWithArg("bar")\_s*' ..
946 '\d\+ PUSHS "bar"\_s*' ..
947 '\d\+ LOAD $\d\_s*' ..
948 '\d\+ PCALL (argc 1)\_s*' ..
949 '\d\+ DROP\_s*' ..
950 'return "yes"\_s*' ..
951 '\d\+ PUSHS "yes"\_s*' ..
952 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200953 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100954enddef
955
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200956
957def s:CreateRefs()
958 var local = 'a'
959 def Append(arg: string)
960 local ..= arg
961 enddef
962 g:Append = Append
963 def Get(): string
964 return local
965 enddef
966 g:Get = Get
967enddef
968
969def Test_disassemble_closure()
970 CreateRefs()
971 var res = execute('disass g:Append')
972 assert_match('<lambda>\d\_s*' ..
973 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100974 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200975 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100976 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100977 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200978 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200979 res)
980
981 res = execute('disass g:Get')
982 assert_match('<lambda>\d\_s*' ..
983 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100984 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200985 '\d RETURN',
986 res)
987
988 unlet g:Append
989 unlet g:Get
990enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200991
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100992def s:ClosureArg(arg: string)
993 var Ref = () => arg .. "x"
994enddef
995
996def Test_disassemble_closure_arg()
997 var res = execute('disass s:ClosureArg')
998 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
999 'var Ref = () => arg .. "x"\_s*' ..
1000 '\d FUNCREF <lambda>\d\+',
1001 res)
1002 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
1003 assert_match('<lambda>\d\+\_s*' ..
1004 'return arg .. "x"\_s*' ..
1005 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
1006 '\d PUSHS "x"\_s*' ..
1007 '\d CONCAT size 2\_s*' ..
1008 '\d RETURN',
1009 lres)
1010enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001011
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001012def s:ClosureInLoop()
1013 for i in range(5)
1014 var ii = i
1015 continue
1016 break
1017 if g:val
1018 return
1019 endif
1020 g:Ref = () => ii
1021 continue
1022 break
1023 if g:val
1024 return
1025 endif
1026 endfor
1027enddef
1028
1029" Mainly check that ENDLOOP is only produced after a closure was created.
1030def Test_disassemble_closure_in_loop()
1031 var res = execute('disass s:ClosureInLoop')
1032 assert_match('<SNR>\d\+_ClosureInLoop\_s*' ..
1033 'for i in range(5)\_s*' ..
1034 '\d\+ STORE -1 in $0\_s*' ..
1035 '\d\+ PUSHNR 5\_s*' ..
1036 '\d\+ BCALL range(argc 1)\_s*' ..
1037 '\d\+ FOR $0 -> \d\+\_s*' ..
1038 '\d\+ STORE $2\_s*' ..
1039
1040 'var ii = i\_s*' ..
1041 '\d\+ LOAD $2\_s*' ..
1042 '\d\+ STORE $3\_s*' ..
1043
1044 'continue\_s*' ..
1045 '\d\+ JUMP -> \d\+\_s*' ..
1046
1047 'break\_s*' ..
1048 '\d\+ JUMP -> \d\+\_s*' ..
1049
1050 'if g:val\_s*' ..
1051 '\d\+ LOADG g:val\_s*' ..
1052 '\d\+ COND2BOOL\_s*' ..
1053 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1054
1055 ' return\_s*' ..
1056 '\d\+ PUSHNR 0\_s*' ..
1057 '\d\+ RETURN\_s*' ..
1058
1059 'endif\_s*' ..
1060 'g:Ref = () => ii\_s*' ..
Julio B1fa22e32024-04-18 22:05:12 +02001061 '\d\+ FUNCREF <lambda>\d\+ vars $3-$3\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001062 '\d\+ STOREG g:Ref\_s*' ..
1063
1064 'continue\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001065 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001066 '\d\+ JUMP -> \d\+\_s*' ..
1067
1068 'break\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001069 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001070 '\d\+ JUMP -> \d\+\_s*' ..
1071
1072 'if g:val\_s*' ..
1073 '\d\+ LOADG g:val\_s*' ..
1074 '\d\+ COND2BOOL\_s*' ..
1075 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1076
1077 ' return\_s*' ..
1078 '\d\+ PUSHNR 0\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001079 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001080 '\d\+ RETURN\_s*' ..
1081
1082 'endif\_s*' ..
1083 'endfor\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001084 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001085 '\d\+ JUMP -> \d\+\_s*' ..
1086 '\d\+ DROP\_s*' ..
1087 '\d\+ RETURN void',
1088 res)
1089enddef
1090
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001091def EchoArg(arg: string): string
1092 return arg
1093enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001094def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001095 return function('EchoArg')
1096enddef
1097def s:ScriptPCall()
1098 RefThis()("text")
1099enddef
1100
1101def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +02001102 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001103 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
1104 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +00001105 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001106 '\d PUSHS "text"\_s*' ..
1107 '\d PCALL top (argc 1)\_s*' ..
1108 '\d PCALL end\_s*' ..
1109 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001110 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001111 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001112enddef
1113
1114
Bram Moolenaara26b9702020-04-18 19:53:28 +02001115def s:FuncWithForwardCall(): string
1116 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001117enddef
1118
1119def DefinedLater(arg: string): string
1120 return arg
1121enddef
1122
1123def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001124 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001125 assert_match('FuncWithForwardCall\_s*' ..
1126 'return g:DefinedLater("yes")\_s*' ..
1127 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001128 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001129 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001130 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001131
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001132 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001133 assert_equal('yes', FuncWithForwardCall())
1134
Bram Moolenaara26b9702020-04-18 19:53:28 +02001135 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001136 assert_match('FuncWithForwardCall\_s*' ..
1137 'return g:DefinedLater("yes")\_s*' ..
1138 '\d PUSHS "yes"\_s*' ..
1139 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001140 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001141 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001142enddef
1143
1144
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001145def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001146 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001147enddef
1148
1149def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +02001150 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001151 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001152 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001153 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001154 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001155 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001156 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001157 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
1158 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001159 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001160 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001161 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001162 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001163 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001164 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001165 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001166 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001167enddef
1168
1169
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001170def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001171 if has("eval")
1172 echo "yes"
1173 else
1174 echo "no"
1175 endif
1176enddef
1177
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001178def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001179 if has("nothing")
1180 echo "yes"
1181 else
1182 echo "no"
1183 endif
1184enddef
1185
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001186def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001187 if has("nothing")
1188 echo "nothing"
1189 elseif has("something")
1190 echo "something"
1191 elseif has("eval")
1192 echo "eval"
1193 elseif has("less")
1194 echo "less"
1195 endif
1196enddef
1197
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001198def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001199 if has("gui_running")
1200 echo "yes"
1201 else
1202 echo "no"
1203 endif
1204enddef
1205
LemonBoy58f331a2022-04-02 21:59:06 +01001206def s:LenConstant(): number
1207 return len("foo") + len("fighters")
1208enddef
1209
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001210def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001211 var instr = execute('disassemble LenConstant')
1212 assert_match('LenConstant\_s*' ..
1213 'return len("foo") + len("fighters")\_s*' ..
1214 '\d PUSHNR 11\_s*',
1215 instr)
1216 assert_notmatch('BCALL len', instr)
1217
Bram Moolenaard2c61702020-09-06 15:58:36 +02001218 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001219 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001220 assert_match('HasEval\_s*' ..
1221 'if has("eval")\_s*' ..
1222 'echo "yes"\_s*' ..
1223 '\d PUSHS "yes"\_s*' ..
1224 '\d ECHO 1\_s*' ..
1225 'else\_s*' ..
1226 'echo "no"\_s*' ..
1227 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001228 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001229 assert_notmatch('JUMP', instr)
1230
Bram Moolenaard2c61702020-09-06 15:58:36 +02001231 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001232 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001233 assert_match('HasNothing\_s*' ..
1234 'if has("nothing")\_s*' ..
1235 'echo "yes"\_s*' ..
1236 'else\_s*' ..
1237 'echo "no"\_s*' ..
1238 '\d PUSHS "no"\_s*' ..
1239 '\d ECHO 1\_s*' ..
1240 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001241 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001242 assert_notmatch('PUSHS "yes"', instr)
1243 assert_notmatch('JUMP', instr)
1244
Bram Moolenaard2c61702020-09-06 15:58:36 +02001245 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001246 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001247 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001248 'if has("nothing")\_s*' ..
1249 'echo "nothing"\_s*' ..
1250 'elseif has("something")\_s*' ..
1251 'echo "something"\_s*' ..
1252 'elseif has("eval")\_s*' ..
1253 'echo "eval"\_s*' ..
1254 '\d PUSHS "eval"\_s*' ..
1255 '\d ECHO 1\_s*' ..
1256 'elseif has("less").*' ..
1257 'echo "less"\_s*' ..
1258 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001259 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001260 assert_notmatch('PUSHS "nothing"', instr)
1261 assert_notmatch('PUSHS "something"', instr)
1262 assert_notmatch('PUSHS "less"', instr)
1263 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001264
1265 var result: string
1266 var instr_expected: string
1267 if has('gui')
1268 if has('gui_running')
1269 # GUI already running, always returns "yes"
1270 result = "\nyes"
1271 instr_expected = 'HasGuiRunning.*' ..
1272 'if has("gui_running")\_s*' ..
1273 ' echo "yes"\_s*' ..
1274 '\d PUSHS "yes"\_s*' ..
1275 '\d ECHO 1\_s*' ..
1276 'else\_s*' ..
1277 ' echo "no"\_s*' ..
1278 'endif'
1279 else
1280 result = "\nno"
1281 if has('unix')
1282 # GUI not running but can start later, call has()
1283 instr_expected = 'HasGuiRunning.*' ..
1284 'if has("gui_running")\_s*' ..
1285 '\d PUSHS "gui_running"\_s*' ..
1286 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001287 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001288 '\d JUMP_IF_FALSE -> \d\_s*' ..
1289 ' echo "yes"\_s*' ..
1290 '\d PUSHS "yes"\_s*' ..
1291 '\d ECHO 1\_s*' ..
1292 'else\_s*' ..
1293 '\d JUMP -> \d\_s*' ..
1294 ' echo "no"\_s*' ..
1295 '\d PUSHS "no"\_s*' ..
1296 '\d ECHO 1\_s*' ..
1297 'endif'
1298 else
1299 # GUI not running, always return "no"
1300 instr_expected = 'HasGuiRunning.*' ..
1301 'if has("gui_running")\_s*' ..
1302 ' echo "yes"\_s*' ..
1303 'else\_s*' ..
1304 ' echo "no"\_s*' ..
1305 '\d PUSHS "no"\_s*' ..
1306 '\d ECHO 1\_s*' ..
1307 'endif'
1308 endif
1309 endif
1310 else
1311 # GUI not supported, always return "no"
1312 result = "\nno"
1313 instr_expected = 'HasGuiRunning.*' ..
1314 'if has("gui_running")\_s*' ..
1315 ' echo "yes"\_s*' ..
1316 'else\_s*' ..
1317 ' echo "no"\_s*' ..
1318 '\d PUSHS "no"\_s*' ..
1319 '\d ECHO 1\_s*' ..
1320 'endif'
1321 endif
1322
1323 assert_equal(result, execute('HasGuiRunning()'))
1324 instr = execute('disassemble HasGuiRunning')
1325 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001326enddef
1327
Bram Moolenaarefd88552020-06-18 20:50:10 +02001328def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001329 if 1 < 0
1330 return "maybe"
1331 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001332 if g:cond
1333 return "yes"
1334 else
1335 return "no"
1336 endif
1337enddef
1338
1339def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001340 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001341 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001342 'if 1 < 0\_s*' ..
1343 ' return "maybe"\_s*' ..
1344 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001345 'if g:cond\_s*' ..
1346 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001347 '1 COND2BOOL\_s*' ..
1348 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001349 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001350 '3 PUSHS "yes"\_s*' ..
1351 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001352 'else\_s*' ..
1353 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001354 '5 PUSHS "no"\_s*' ..
1355 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001356 instr)
1357enddef
1358
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001359def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 var Funky1: func
1361 var Funky2: func = function("len")
1362 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001363enddef
1364
1365def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001367 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001368 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001369 '0 PUSHFUNC "\[none]"\_s*' ..
1370 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001371 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001372 '2 PUSHS "len"\_s*' ..
1373 '3 BCALL function(argc 1)\_s*' ..
1374 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001375 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001376 '\d PUSHS "UserFunc"\_s*' ..
1377 '\d BCALL funcref(argc 1)\_s*' ..
1378 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001379 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001380 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001381enddef
1382
1383if has('channel')
1384 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001385 var job1: job
1386 var job2: job = job_start("donothing")
1387 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001388 enddef
1389endif
1390
1391def Test_disassemble_channel()
1392 CheckFeature channel
1393
Bram Moolenaarac564082020-09-27 19:05:33 +02001394 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001395 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001396 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001397 '\d PUSHJOB "no process"\_s*' ..
1398 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001399 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001400 '\d PUSHS "donothing"\_s*' ..
1401 '\d BCALL job_start(argc 1)\_s*' ..
1402 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001404 '\d PUSHCHANNEL 0\_s*' ..
1405 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001406 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001407 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001408enddef
1409
Bram Moolenaar62aec932022-01-29 21:45:34 +00001410def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001411 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001412 return F("x")
1413enddef
1414
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001415def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001416 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001417 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001418 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001419 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001420 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001421 '\d STORE $0\_s*' ..
1422 'return F("x")\_s*' ..
1423 '\d PUSHS "x"\_s*' ..
1424 '\d LOAD $0\_s*' ..
1425 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001426 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001427 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001428
Bram Moolenaarac564082020-09-27 19:05:33 +02001429 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001430 instr = execute('disassemble ' .. name)
1431 assert_match('<lambda>\d\+\_s*' ..
1432 'return "X" .. a .. "X"\_s*' ..
1433 '\d PUSHS "X"\_s*' ..
1434 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001435 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001436 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001437 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001438 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001439 '\d RETURN',
1440 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001441enddef
1442
Bram Moolenaar62aec932022-01-29 21:45:34 +00001443def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001444 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001445 return Ref(g:value)
1446enddef
1447
1448def Test_disassemble_lambda_with_type()
1449 g:value = 5
1450 assert_equal(15, LambdaWithType())
1451 var instr = execute('disassemble LambdaWithType')
1452 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001453 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001454 '\d FUNCREF <lambda>\d\+\_s*' ..
1455 '\d STORE $0\_s*' ..
1456 'return Ref(g:value)\_s*' ..
1457 '\d LOADG g:value\_s*' ..
1458 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001459 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001460 '\d PCALL (argc 1)\_s*' ..
1461 '\d RETURN',
1462 instr)
1463enddef
1464
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001465def NestedOuter()
1466 def g:Inner()
1467 echomsg "inner"
1468 enddef
1469enddef
1470
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001471def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001472 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001473 assert_match('NestedOuter\_s*' ..
1474 'def g:Inner()\_s*' ..
1475 'echomsg "inner"\_s*' ..
1476 'enddef\_s*' ..
1477 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001478 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001479 instr)
1480enddef
1481
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001482def NestedDefList()
1483 def
1484 def Info
1485 def /Info
1486 def /Info/
1487enddef
1488
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001489def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001490 var instr = execute('disassemble NestedDefList')
1491 assert_match('NestedDefList\_s*' ..
1492 'def\_s*' ..
1493 '\d DEF \_s*' ..
1494 'def Info\_s*' ..
1495 '\d DEF Info\_s*' ..
1496 'def /Info\_s*' ..
1497 '\d DEF /Info\_s*' ..
1498 'def /Info/\_s*' ..
1499 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001500 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001501 instr)
1502enddef
1503
Bram Moolenaar62aec932022-01-29 21:45:34 +00001504def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001505 if arg == 1 && arg != 2 || arg == 4
1506 return 'yes'
1507 endif
1508 return 'no'
1509enddef
1510
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001511def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001512 assert_equal("yes", AndOr(1))
1513 assert_equal("no", AndOr(2))
1514 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001515 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001516 assert_match('AndOr\_s*' ..
1517 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1518 '\d LOAD arg\[-1]\_s*' ..
1519 '\d PUSHNR 1\_s*' ..
1520 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001521 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001522 '\d LOAD arg\[-1]\_s*' ..
1523 '\d PUSHNR 2\_s*' ..
1524 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001525 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001526 '\d LOAD arg\[-1]\_s*' ..
1527 '\d\+ PUSHNR 4\_s*' ..
1528 '\d\+ COMPAREANY ==\_s*' ..
1529 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001530 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001531enddef
1532
Bram Moolenaar62aec932022-01-29 21:45:34 +00001533def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001534 if true && arg
1535 return "yes"
1536 endif
1537 if false && arg
1538 return "never"
1539 endif
1540 return "no"
1541enddef
1542
1543def Test_disassemble_and_constant()
1544 assert_equal("yes", AndConstant(1))
1545 assert_equal("no", AndConstant(false))
1546 var instr = execute('disassemble AndConstant')
1547 assert_match('AndConstant\_s*' ..
1548 'if true && arg\_s*' ..
1549 '0 LOAD arg\[-1\]\_s*' ..
1550 '1 COND2BOOL\_s*' ..
1551 '2 JUMP_IF_FALSE -> 5\_s*' ..
1552 'return "yes"\_s*' ..
1553 '3 PUSHS "yes"\_s*' ..
1554 '4 RETURN\_s*' ..
1555 'endif\_s*' ..
1556 'if false && arg\_s*' ..
1557 'return "never"\_s*' ..
1558 'endif\_s*' ..
1559 'return "no"\_s*' ..
1560 '5 PUSHS "no"\_s*' ..
1561 '6 RETURN',
1562 instr)
1563enddef
1564
Bram Moolenaar62aec932022-01-29 21:45:34 +00001565def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001566 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001567 for i in range(3)
1568 res->add(i)
1569 endfor
1570 return res
1571enddef
1572
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001573def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001574 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001575 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001576 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001577 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001578 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001579 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001580 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001581
Bram Moolenaarcb790402020-05-15 20:53:00 +02001582 'for i in range(3)\_s*' ..
1583 '\d STORE -1 in $1\_s*' ..
1584 '\d PUSHNR 3\_s*' ..
1585 '\d BCALL range(argc 1)\_s*' ..
1586 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001587 '\d STORE $3\_s*' ..
1588
Bram Moolenaarcb790402020-05-15 20:53:00 +02001589 'res->add(i)\_s*' ..
1590 '\d LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001591 '\d LOAD $3\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001592 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001593 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001594
Bram Moolenaarcb790402020-05-15 20:53:00 +02001595 'endfor\_s*' ..
1596 '\d\+ JUMP -> \d\+\_s*' ..
1597 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001598 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001599enddef
1600
Bram Moolenaar62aec932022-01-29 21:45:34 +00001601def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001602 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001603 for str in eval('["one", "two"]')
1604 res ..= str
1605 endfor
1606 return res
1607enddef
1608
1609def Test_disassemble_for_loop_eval()
1610 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001611 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001612 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001613 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001614 '\d PUSHS ""\_s*' ..
1615 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001616
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001617 'for str in eval(''\["one", "two"\]'')\_s*' ..
1618 '\d STORE -1 in $1\_s*' ..
1619 '\d PUSHS "\["one", "two"\]"\_s*' ..
1620 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001621 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001622 '\d STORE $3\_s*' ..
1623
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001624 'res ..= str\_s*' ..
1625 '\d\+ LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001626 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001627 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001628 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001629 '\d\+ STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001630
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001631 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001632 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001633 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001634
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001635 'return res\_s*' ..
1636 '\d\+ LOAD $0\_s*' ..
1637 '\d\+ RETURN',
1638 instr)
1639enddef
1640
Bram Moolenaar62aec932022-01-29 21:45:34 +00001641def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001642 for [x1, x2] in [[1, 2], [3, 4]]
1643 echo x1 x2
1644 endfor
1645enddef
1646
1647def Test_disassemble_for_loop_unpack()
1648 var instr = execute('disassemble ForLoopUnpack')
1649 assert_match('ForLoopUnpack\_s*' ..
1650 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1651 '\d\+ STORE -1 in $0\_s*' ..
1652 '\d\+ PUSHNR 1\_s*' ..
1653 '\d\+ PUSHNR 2\_s*' ..
1654 '\d\+ NEWLIST size 2\_s*' ..
1655 '\d\+ PUSHNR 3\_s*' ..
1656 '\d\+ PUSHNR 4\_s*' ..
1657 '\d\+ NEWLIST size 2\_s*' ..
1658 '\d\+ NEWLIST size 2\_s*' ..
1659 '\d\+ FOR $0 -> 16\_s*' ..
1660 '\d\+ UNPACK 2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001661 '\d\+ STORE $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001662 '\d\+ STORE $3\_s*' ..
1663
Bram Moolenaar792f7862020-11-23 08:31:18 +01001664 'echo x1 x2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001665 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001666 '\d\+ LOAD $3\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001667 '\d\+ ECHO 2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001668
Bram Moolenaar792f7862020-11-23 08:31:18 +01001669 'endfor\_s*' ..
1670 '\d\+ JUMP -> 8\_s*' ..
1671 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001672 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001673 instr)
1674enddef
1675
Bram Moolenaar62aec932022-01-29 21:45:34 +00001676def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001677 for nr in [1, 2]
1678 try
1679 echo "ok"
1680 try
1681 echo "deeper"
1682 catch
1683 continue
1684 endtry
1685 catch
1686 echo "not ok"
1687 endtry
1688 endfor
1689enddef
1690
1691def Test_disassemble_for_loop_continue()
1692 var instr = execute('disassemble ForLoopContinue')
1693 assert_match('ForLoopContinue\_s*' ..
1694 'for nr in \[1, 2]\_s*' ..
1695 '0 STORE -1 in $0\_s*' ..
1696 '1 PUSHNR 1\_s*' ..
1697 '2 PUSHNR 2\_s*' ..
1698 '3 NEWLIST size 2\_s*' ..
1699 '4 FOR $0 -> 22\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001700 '5 STORE $2\_s*' ..
1701
Bram Moolenaarc150c092021-02-13 15:02:46 +01001702 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001703 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001704
Bram Moolenaarc150c092021-02-13 15:02:46 +01001705 'echo "ok"\_s*' ..
1706 '7 PUSHS "ok"\_s*' ..
1707 '8 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001708
Bram Moolenaarc150c092021-02-13 15:02:46 +01001709 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001710 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001711
Bram Moolenaarc150c092021-02-13 15:02:46 +01001712 'echo "deeper"\_s*' ..
1713 '10 PUSHS "deeper"\_s*' ..
1714 '11 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001715
Bram Moolenaarc150c092021-02-13 15:02:46 +01001716 'catch\_s*' ..
1717 '12 JUMP -> 15\_s*' ..
1718 '13 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001719
Bram Moolenaarc150c092021-02-13 15:02:46 +01001720 'continue\_s*' ..
1721 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001722
Bram Moolenaarc150c092021-02-13 15:02:46 +01001723 'endtry\_s*' ..
1724 '15 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001725
Bram Moolenaarc150c092021-02-13 15:02:46 +01001726 'catch\_s*' ..
1727 '16 JUMP -> 20\_s*' ..
1728 '17 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001729
Bram Moolenaarc150c092021-02-13 15:02:46 +01001730 'echo "not ok"\_s*' ..
1731 '18 PUSHS "not ok"\_s*' ..
1732 '19 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001733
Bram Moolenaarc150c092021-02-13 15:02:46 +01001734 'endtry\_s*' ..
1735 '20 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001736
Bram Moolenaarc150c092021-02-13 15:02:46 +01001737 'endfor\_s*' ..
1738 '21 JUMP -> 4\_s*' ..
1739 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001740 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001741 instr)
1742enddef
1743
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001744let g:number = 42
1745
Bram Moolenaar62aec932022-01-29 21:45:34 +00001746def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001747 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001748enddef
1749
1750def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001751 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001752 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001753 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001754 '\d PUSHNR 23\_s*' ..
1755 '\d LOADG g:number\_s*' ..
1756 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1757 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001758 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001759 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001760 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001761 instr)
1762enddef
1763
LemonBoy50d48542024-07-04 17:03:17 +02001764def Test_disassemble_object_cast()
1765 # Downcasting.
1766 var lines =<< trim END
1767 vim9script
1768 class A
1769 endclass
1770 class B extends A
1771 var mylen: number
1772 endclass
1773 def F(o: A): number
1774 return (<B>o).mylen
1775 enddef
1776
1777 g:instr = execute('disassemble F')
1778 END
1779 v9.CheckScriptSuccess(lines)
1780 assert_match('\<SNR>\d*_F\_s*' ..
1781 'return (<B>o).mylen\_s*' ..
1782 '0 LOAD arg\[-1\]\_s*' ..
1783 '1 CHECKTYPE object<B> stack\[-1\]\_s*' ..
1784 '2 OBJ_MEMBER 0\_s*' ..
1785 '3 RETURN\_s*',
1786 g:instr)
1787
1788 # Upcasting.
1789 lines =<< trim END
1790 vim9script
1791 class A
1792 var mylen: number
1793 endclass
1794 class B extends A
1795 endclass
1796 def F(o: B): number
1797 return (<A>o).mylen
1798 enddef
1799
1800 g:instr = execute('disassemble F')
1801 END
1802 v9.CheckScriptSuccess(lines)
1803 assert_match('\<SNR>\d*_F\_s*' ..
1804 'return (<A>o).mylen\_s*' ..
1805 '0 LOAD arg\[-1\]\_s*' ..
1806 '1 OBJ_MEMBER 0\_s*' ..
1807 '2 RETURN\_s*',
1808 g:instr)
1809
1810 # Casting, type is not statically known.
1811 lines =<< trim END
1812 vim9script
1813 class A
1814 endclass
1815 class B extends A
1816 endclass
1817 def F(o: any): any
1818 return <A>o
1819 enddef
1820
1821 g:instr = execute('disassemble F')
1822 END
1823 v9.CheckScriptSuccess(lines)
1824 assert_match('\<SNR>\d*_F\_s*' ..
1825 'return <A>o\_s*' ..
1826 '0 LOAD arg\[-1\]\_s*' ..
1827 '1 CHECKTYPE object<A> stack\[-1\]\_s*' ..
1828 '2 RETURN\_s*',
1829 g:instr)
1830enddef
1831
Bram Moolenaar62aec932022-01-29 21:45:34 +00001832def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001833 var nr = 3
1834 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001835 nrres = nr - 7
1836 nrres = nr * 7
1837 nrres = nr / 7
1838 nrres = nr % 7
1839
Bram Moolenaarac564082020-09-27 19:05:33 +02001840 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001841 anyres = g:number - 7
1842 anyres = g:number * 7
1843 anyres = g:number / 7
1844 anyres = g:number % 7
1845
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001846 var fl = 3.0
1847 var flres = fl + 7.0
1848 flres = fl - 7.0
1849 flres = fl * 7.0
1850 flres = fl / 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001851enddef
1852
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001853def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001854 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001855 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001856 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001857 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001858 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001859 '\d LOAD $0.*' ..
1860 '\d PUSHNR 7.*' ..
1861 '\d OPNR +.*' ..
1862 '\d STORE $1.*' ..
1863 'nrres = nr - 7.*' ..
1864 '\d OPNR -.*' ..
1865 'nrres = nr \* 7.*' ..
1866 '\d OPNR \*.*' ..
1867 'nrres = nr / 7.*' ..
1868 '\d OPNR /.*' ..
1869 'nrres = nr % 7.*' ..
1870 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001871 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001872 '\d LOADG g:number.*' ..
1873 '\d PUSHNR 7.*' ..
1874 '\d OPANY +.*' ..
1875 '\d STORE $2.*' ..
1876 'anyres = g:number - 7.*' ..
1877 '\d OPANY -.*' ..
1878 'anyres = g:number \* 7.*' ..
1879 '\d OPANY \*.*' ..
1880 'anyres = g:number / 7.*' ..
1881 '\d OPANY /.*' ..
1882 'anyres = g:number % 7.*' ..
1883 '\d OPANY %.*',
1884 instr)
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001885 assert_match('Computing.*' ..
1886 'var fl = 3.0.*' ..
1887 '\d PUSHF 3.0.*' ..
1888 '\d STORE $3.*' ..
1889 'var flres = fl + 7.0.*' ..
1890 '\d LOAD $3.*' ..
1891 '\d PUSHF 7.0.*' ..
1892 '\d OPFLOAT +.*' ..
1893 '\d STORE $4.*' ..
1894 'flres = fl - 7.0.*' ..
1895 '\d OPFLOAT -.*' ..
1896 'flres = fl \* 7.0.*' ..
1897 '\d OPFLOAT \*.*' ..
1898 'flres = fl / 7.0.*' ..
1899 '\d OPFLOAT /.*',
1900 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001901enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001902
Bram Moolenaar62aec932022-01-29 21:45:34 +00001903def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001904 var reslist = [1, 2] + [3, 4]
1905 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001906enddef
1907
1908def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001909 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001910 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001911 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001912 '\d PUSHNR 1.*' ..
1913 '\d PUSHNR 2.*' ..
1914 '\d NEWLIST size 2.*' ..
1915 '\d PUSHNR 3.*' ..
1916 '\d PUSHNR 4.*' ..
1917 '\d NEWLIST size 2.*' ..
1918 '\d ADDLIST.*' ..
1919 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001920 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001921 '\d PUSHBLOB 0z1122.*' ..
1922 '\d PUSHBLOB 0z3344.*' ..
1923 '\d ADDBLOB.*' ..
1924 '\d STORE $.*',
1925 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001926enddef
1927
1928let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001929def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001930 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001931 return res
1932enddef
1933
1934def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001935 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001936 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001937 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001938 '\d LOADG g:aa.*' ..
1939 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001940 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001941 '\d CONCAT.*' ..
1942 '\d STORE $.*',
1943 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001944 assert_equal('aabb', ConcatString())
1945enddef
1946
Bram Moolenaar62aec932022-01-29 21:45:34 +00001947def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001948 var s = "abcd"
1949 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001950 return res
1951enddef
1952
1953def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001954 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001955 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001956 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001957 '\d PUSHS "abcd"\_s*' ..
1958 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001959 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001960 '\d LOAD $0\_s*' ..
1961 '\d PUSHNR 1\_s*' ..
1962 '\d STRINDEX\_s*' ..
1963 '\d STORE $1\_s*',
1964 instr)
1965 assert_equal('b', StringIndex())
1966enddef
1967
Bram Moolenaar62aec932022-01-29 21:45:34 +00001968def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001969 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001970 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001971 return res
1972enddef
1973
1974def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001975 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001976 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001977 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001978 '\d PUSHS "abcd"\_s*' ..
1979 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001980 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001981 '\d LOAD $0\_s*' ..
1982 '\d PUSHNR 1\_s*' ..
1983 '\d PUSHNR 8\_s*' ..
1984 '\d STRSLICE\_s*' ..
1985 '\d STORE $1\_s*',
1986 instr)
1987 assert_equal('bcd', StringSlice())
1988enddef
1989
Bram Moolenaar62aec932022-01-29 21:45:34 +00001990def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001991 var l = [1, 2, 3]
1992 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001993 return res
1994enddef
1995
1996def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001997 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001998 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001999 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002000 '\d PUSHNR 1\_s*' ..
2001 '\d PUSHNR 2\_s*' ..
2002 '\d PUSHNR 3\_s*' ..
2003 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002004 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002005 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002006 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002007 '\d LOAD $0\_s*' ..
2008 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02002009 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002010 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002011 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002012 assert_equal(2, ListIndex())
2013enddef
2014
Bram Moolenaar62aec932022-01-29 21:45:34 +00002015def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02002016 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01002017 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02002018 return res
2019enddef
2020
2021def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02002022 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02002023 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002024 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02002025 '\d PUSHNR 1\_s*' ..
2026 '\d PUSHNR 2\_s*' ..
2027 '\d PUSHNR 3\_s*' ..
2028 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002029 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02002030 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01002031 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02002032 '\d LOAD $0\_s*' ..
2033 '\d PUSHNR 1\_s*' ..
2034 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002035 '\d\+ LISTSLICE\_s*' ..
2036 '\d\+ SETTYPE list<number>\_s*' ..
2037 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02002038 instr)
2039 assert_equal([2, 3], ListSlice())
2040enddef
2041
Bram Moolenaar62aec932022-01-29 21:45:34 +00002042def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01002043 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02002044 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002045 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002046 return res
2047enddef
2048
2049def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02002050 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002051 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01002052 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002053 '\d PUSHS "item"\_s*' ..
2054 '\d PUSHNR 1\_s*' ..
2055 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002056 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002057 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002058 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002059 '\d\+ LOAD $0\_s*' ..
2060 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002061 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002062 '\d\+ STORE $1\_s*' ..
2063 'res = d\["item"\]\_s*' ..
2064 '\d\+ LOAD $0\_s*' ..
2065 '\d\+ PUSHS "item"\_s*' ..
2066 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002067 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002068 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002069 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002070 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002071enddef
2072
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002073let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00002074def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02002075 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002076 return res
2077enddef
2078
2079def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02002080 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002081 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002082 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002083 '\d LOADG g:somelist\_s*' ..
2084 '\d PUSHNR 2\_s*' ..
2085 '\d ANYINDEX\_s*' ..
2086 '\d STORE $0\_s*' ..
2087 'return res\_s*' ..
2088 '\d LOAD $0\_s*' ..
2089 '\d CHECKTYPE number stack\[-1\]\_s*' ..
2090 '\d RETURN',
2091 instr)
2092 assert_equal(3, AnyIndex())
2093enddef
2094
Bram Moolenaar62aec932022-01-29 21:45:34 +00002095def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01002096 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002097 return res
2098enddef
2099
2100def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02002101 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002102 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01002103 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002104 '\d LOADG g:somelist\_s*' ..
2105 '\d PUSHNR 1\_s*' ..
2106 '\d PUSHNR 3\_s*' ..
2107 '\d ANYSLICE\_s*' ..
2108 '\d STORE $0\_s*' ..
2109 'return res\_s*' ..
2110 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02002111 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002112 '\d RETURN',
2113 instr)
2114 assert_equal([2, 3, 4], AnySlice())
2115enddef
2116
Bram Moolenaar62aec932022-01-29 21:45:34 +00002117def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002118 g:nr = 9
2119 var plus = +g:nr
2120 var minus = -g:nr
2121 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002122enddef
2123
2124def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02002125 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002126 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002127 'g:nr = 9\_s*' ..
2128 '\d PUSHNR 9\_s*' ..
2129 '\d STOREG g:nr\_s*' ..
2130 'var plus = +g:nr\_s*' ..
2131 '\d LOADG g:nr\_s*' ..
2132 '\d CHECKTYPE number stack\[-1\]\_s*' ..
2133 '\d STORE $0\_s*' ..
2134 'var minus = -g:nr\_s*' ..
2135 '\d LOADG g:nr\_s*' ..
2136 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002137 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002138 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002139 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002140 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002141enddef
2142
Bram Moolenaar62aec932022-01-29 21:45:34 +00002143def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02002144 var flag = true
2145 var invert = !flag
2146 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002147 return res
2148enddef
2149
2150def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002151 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002152 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002153 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01002154 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002155 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002156 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002157 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02002158 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002159 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002160 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002161 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02002162 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002163 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002164 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002165 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002166enddef
2167
Bram Moolenaar62aec932022-01-29 21:45:34 +00002168def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002169 var one = 1
2170 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002171 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002172 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002173 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002174enddef
2175
2176def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002177 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002178 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002179 'var one = 1\_s*' ..
2180 '0 STORE 1 in $0\_s*' ..
2181 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002182 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002183 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002184 '1 LOAD $0\_s*' ..
2185 '2 COND2BOOL\_s*' ..
2186 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
2187 '4 LOAD $1\_s*' ..
2188 '5 COND2BOOL\_s*' ..
2189 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
2190 '7 LOAD $0\_s*' ..
2191 '8 COND2BOOL\_s*' ..
2192 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002193 'return name\_s*' ..
Bram Moolenaar94722c52023-01-28 19:19:03 +00002194 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01002195 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002196 instr)
2197 assert_equal(true, InvertBool())
2198enddef
2199
Bram Moolenaar62aec932022-01-29 21:45:34 +00002200def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00002201 var t: number
2202 t = 1
2203 t = 0
2204enddef
2205
2206def Test_disassemble_auto_init()
2207 var instr = execute('disassemble AutoInit')
2208 assert_match('AutoInit\_s*' ..
2209 'var t: number\_s*' ..
2210 't = 1\_s*' ..
2211 '\d STORE 1 in $0\_s*' ..
2212 't = 0\_s*' ..
2213 '\d STORE 0 in $0\_s*' ..
2214 '\d\+ RETURN void',
2215 instr)
2216enddef
2217
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002218def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02002219 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02002220 ['true == isFalse', 'COMPAREBOOL =='],
2221 ['true != isFalse', 'COMPAREBOOL !='],
2222 ['v:none == isNull', 'COMPARESPECIAL =='],
2223 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00002224 ['"text" == isNull', 'COMPARENULL =='],
2225 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002226
Bram Moolenaara5565e42020-05-09 15:44:01 +02002227 ['111 == aNumber', 'COMPARENR =='],
2228 ['111 != aNumber', 'COMPARENR !='],
2229 ['111 > aNumber', 'COMPARENR >'],
2230 ['111 < aNumber', 'COMPARENR <'],
2231 ['111 >= aNumber', 'COMPARENR >='],
2232 ['111 <= aNumber', 'COMPARENR <='],
2233 ['111 =~ aNumber', 'COMPARENR =\~'],
2234 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002235
Bram Moolenaara5565e42020-05-09 15:44:01 +02002236 ['"xx" != aString', 'COMPARESTRING !='],
2237 ['"xx" > aString', 'COMPARESTRING >'],
2238 ['"xx" < aString', 'COMPARESTRING <'],
2239 ['"xx" >= aString', 'COMPARESTRING >='],
2240 ['"xx" <= aString', 'COMPARESTRING <='],
2241 ['"xx" =~ aString', 'COMPARESTRING =\~'],
2242 ['"xx" !~ aString', 'COMPARESTRING !\~'],
2243 ['"xx" is aString', 'COMPARESTRING is'],
2244 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002245
Bram Moolenaara5565e42020-05-09 15:44:01 +02002246 ['0z11 == aBlob', 'COMPAREBLOB =='],
2247 ['0z11 != aBlob', 'COMPAREBLOB !='],
2248 ['0z11 is aBlob', 'COMPAREBLOB is'],
2249 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002250
Bram Moolenaara5565e42020-05-09 15:44:01 +02002251 ['[1, 2] == aList', 'COMPARELIST =='],
2252 ['[1, 2] != aList', 'COMPARELIST !='],
2253 ['[1, 2] is aList', 'COMPARELIST is'],
2254 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002255
Bram Moolenaare0de1712020-12-02 17:36:54 +01002256 ['{a: 1} == aDict', 'COMPAREDICT =='],
2257 ['{a: 1} != aDict', 'COMPAREDICT !='],
2258 ['{a: 1} is aDict', 'COMPAREDICT is'],
2259 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002260
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002261 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2262 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2263 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2264 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002265
2266 ['77 == g:xx', 'COMPAREANY =='],
2267 ['77 != g:xx', 'COMPAREANY !='],
2268 ['77 > g:xx', 'COMPAREANY >'],
2269 ['77 < g:xx', 'COMPAREANY <'],
2270 ['77 >= g:xx', 'COMPAREANY >='],
2271 ['77 <= g:xx', 'COMPAREANY <='],
2272 ['77 =~ g:xx', 'COMPAREANY =\~'],
2273 ['77 !~ g:xx', 'COMPAREANY !\~'],
2274 ['77 is g:xx', 'COMPAREANY is'],
2275 ['77 isnot g:xx', 'COMPAREANY isnot'],
2276 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002277 var floatDecl = ''
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01002278 cases->extend([
2279 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2280 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2281 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2282 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2283 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2284 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2285 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2286 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
2287 ])
2288 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002289
Bram Moolenaarac564082020-09-27 19:05:33 +02002290 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002291 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002292 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002293 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002294 ' var isFalse = false',
2295 ' var isNull = v:null',
2296 ' var aNumber = 222',
2297 ' var aString = "yy"',
2298 ' var aBlob = 0z22',
2299 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002300 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002301 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002302 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002303 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002304 ' endif',
2305 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002306 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002307 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002308 assert_match('TestCase' .. nr .. '.*' ..
2309 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2310 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002311 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002312 '\d ' .. case[1] .. '.*' ..
2313 '\d JUMP_IF_FALSE -> \d\+.*',
2314 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002315
2316 nr += 1
2317 endfor
2318
Bram Moolenaar22da5592020-03-19 14:52:20 +01002319 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002320enddef
2321
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002322def s:FalsyOp()
2323 echo g:flag ?? "yes"
2324 echo [] ?? "empty list"
2325 echo "" ?? "empty string"
2326enddef
2327
Dominique Pelle81b573d2022-03-22 21:14:55 +00002328def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002329 var res = execute('disass s:FalsyOp')
2330 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2331 'echo g:flag ?? "yes"\_s*' ..
2332 '0 LOADG g:flag\_s*' ..
2333 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2334 '2 PUSHS "yes"\_s*' ..
2335 '3 ECHO 1\_s*' ..
2336 'echo \[\] ?? "empty list"\_s*' ..
2337 '4 NEWLIST size 0\_s*' ..
2338 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2339 '6 PUSHS "empty list"\_s*' ..
2340 '7 ECHO 1\_s*' ..
2341 'echo "" ?? "empty string"\_s*' ..
2342 '\d\+ PUSHS "empty string"\_s*' ..
2343 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002344 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002345 res)
2346enddef
2347
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002348def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002349 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002350 ['"xx" == "yy"', false],
2351 ['"aa" == "aa"', true],
2352 ['has("eval") ? true : false', true],
2353 ['has("asdf") ? true : false', false],
2354 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002355
Bram Moolenaarac564082020-09-27 19:05:33 +02002356 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002357 for case in cases
2358 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002359 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002360 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002361 ' endif',
2362 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002363 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002364 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002365 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002366 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002367 assert_match('TestCase' .. nr .. '.*' ..
2368 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2369 '\d PUSHNR 42.*' ..
2370 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002371 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002372 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002373 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002374 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002375 assert_match('TestCase' .. nr .. '.*' ..
2376 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2377 'echo 42[ \n]*' ..
2378 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002379 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002380 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002381 endif
2382
2383 nr += 1
2384 endfor
2385
2386 delete('Xdisassemble')
2387enddef
2388
Bram Moolenaarad39c092020-02-26 18:23:43 +01002389def s:Execute()
2390 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002391 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002392 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002393 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002394 execute 'help ' .. tag
2395enddef
2396
2397def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002398 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002399 assert_match('\<SNR>\d*_Execute\_s*' ..
2400 "execute 'help vim9.txt'\\_s*" ..
2401 '\d PUSHS "help vim9.txt"\_s*' ..
2402 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002403 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002404 '\d PUSHS "help vim9.txt"\_s*' ..
2405 '\d STORE $0\_s*' ..
2406 'execute cmd\_s*' ..
2407 '\d LOAD $0\_s*' ..
2408 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002409 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002410 '\d PUSHS "vim9.txt"\_s*' ..
2411 '\d STORE $1\_s*' ..
2412 "execute 'help ' .. tag\\_s*" ..
2413 '\d\+ PUSHS "help "\_s*' ..
2414 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002415 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002416 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002417 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002418 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002419enddef
2420
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002421def s:OnlyRange()
2422 :$
2423 :123
2424 :'m
2425enddef
2426
2427def Test_disassemble_range_only()
2428 var res = execute('disass s:OnlyRange')
2429 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2430 ':$\_s*' ..
2431 '\d EXECRANGE $\_s*' ..
2432 ':123\_s*' ..
2433 '\d EXECRANGE 123\_s*' ..
2434 ':''m\_s*' ..
2435 '\d EXECRANGE ''m\_s*' ..
2436 '\d\+ RETURN void',
2437 res)
2438enddef
2439
Bram Moolenaarf6ced982022-04-28 12:00:49 +01002440def s:StoreRange()
2441 var l = [1, 2]
2442 l[0 : 1] = [7, 8]
2443enddef
2444
2445def Test_disassemble_store_range()
2446 var res = execute('disass s:StoreRange')
2447 assert_match('\<SNR>\d*_StoreRange\_s*' ..
2448 'var l = \[1, 2]\_s*' ..
2449 '\d PUSHNR 1\_s*' ..
2450 '\d PUSHNR 2\_s*' ..
2451 '\d NEWLIST size 2\_s*' ..
2452 '\d SETTYPE list<number>\_s*' ..
2453 '\d STORE $0\_s*' ..
2454
2455 'l\[0 : 1] = \[7, 8]\_s*' ..
2456 '\d\+ PUSHNR 7\_s*' ..
2457 '\d\+ PUSHNR 8\_s*' ..
2458 '\d\+ NEWLIST size 2\_s*' ..
2459 '\d\+ PUSHNR 0\_s*' ..
2460 '\d\+ PUSHNR 1\_s*' ..
2461 '\d\+ LOAD $0\_s*' ..
2462 '\d\+ STORERANGE\_s*' ..
2463 '\d\+ RETURN void',
2464 res)
2465enddef
2466
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002467def s:Echomsg()
2468 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002469 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002470 echoerr 'went' .. 'wrong'
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002471 var local = 'window'
2472 echowin 'in' local
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01002473 :5echowin 'five'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002474enddef
2475
2476def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002477 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002478 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2479 "echomsg 'some' 'message'\\_s*" ..
2480 '\d PUSHS "some"\_s*' ..
2481 '\d PUSHS "message"\_s*' ..
2482 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002483 "echoconsole 'nothing'\\_s*" ..
2484 '\d PUSHS "nothing"\_s*' ..
2485 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002486 "echoerr 'went' .. 'wrong'\\_s*" ..
2487 '\d PUSHS "wentwrong"\_s*' ..
2488 '\d ECHOERR 1\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002489 "var local = 'window'\\_s*" ..
2490 '\d\+ PUSHS "window"\_s*' ..
2491 '\d\+ STORE $0\_s*' ..
2492 "echowin 'in' local\\_s*" ..
2493 '\d\+ PUSHS "in"\_s*' ..
2494 '\d\+ LOAD $0\_s*' ..
2495 '\d\+ ECHOWINDOW 2\_s*' ..
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01002496 ":5echowin 'five'\\_s*" ..
2497 '\d\+ PUSHS "five"\_s*' ..
2498 '\d\+ ECHOWINDOW 1 (5 sec)\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002499 '\d\+ RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002500 res)
2501enddef
2502
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002503def SomeStringArg(arg: string)
2504 echo arg
2505enddef
2506
2507def SomeAnyArg(arg: any)
2508 echo arg
2509enddef
2510
2511def SomeStringArgAndReturn(arg: string): string
2512 return arg
2513enddef
2514
2515def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002516 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002517 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2518 '\d *echo arg.*' ..
2519 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002520 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002521
Bram Moolenaarac564082020-09-27 19:05:33 +02002522 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002523 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2524 '\d *echo arg\_s*' ..
2525 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002526 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002527
Bram Moolenaarac564082020-09-27 19:05:33 +02002528 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002529 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2530 '\d *return arg\_s*' ..
2531 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002532 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002533enddef
2534
Bram Moolenaar09689a02020-05-09 22:50:08 +02002535def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002536 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002537 vim9script
2538 def FuncOne(): string
2539 return FuncTwo()
2540 enddef
2541 def FuncTwo(): string
2542 return 'two'
2543 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002544 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002545 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002546 writefile(lines, 'Xdisassemble', 'D')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002547 source Xdisassemble
2548
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002549 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002550 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2551 'return FuncTwo()\_s*' ..
2552 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002553 '\d RETURN',
2554 g:res_FuncOne)
2555
Bram Moolenaar09689a02020-05-09 22:50:08 +02002556 unlet g:res_FuncOne
2557enddef
2558
Bram Moolenaar61a89812020-05-07 16:58:17 +02002559def s:ConcatStrings(): string
2560 return 'one' .. 'two' .. 'three'
2561enddef
2562
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002563def s:ComputeConst(): number
2564 return 2 + 3 * 4 / 6 + 7
2565enddef
2566
Bram Moolenaar1c747212020-05-09 18:28:34 +02002567def s:ComputeConstParen(): number
2568 return ((2 + 4) * (8 / 2)) / (3 + 4)
2569enddef
2570
Bram Moolenaar61a89812020-05-07 16:58:17 +02002571def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002572 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002573 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2574 "return 'one' .. 'two' .. 'three'\\_s*" ..
2575 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002576 '\d RETURN',
2577 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002578
2579 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002580 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2581 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2582 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002583 '\d RETURN',
2584 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002585
2586 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002587 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2588 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2589 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002590 '\d RETURN',
2591 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002592enddef
2593
Bram Moolenaar389df252020-07-09 21:20:47 +02002594def s:CallAppend()
2595 eval "some text"->append(2)
2596enddef
2597
2598def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002599 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002600 assert_match('<SNR>\d*_CallAppend\_s*' ..
2601 'eval "some text"->append(2)\_s*' ..
2602 '\d PUSHS "some text"\_s*' ..
2603 '\d PUSHNR 2\_s*' ..
2604 '\d SHUFFLE 2 up 1\_s*' ..
2605 '\d BCALL append(argc 2)\_s*' ..
2606 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002607 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002608 res)
2609enddef
2610
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002611
2612def s:SilentMessage()
2613 silent echomsg "text"
2614 silent! echoerr "error"
2615enddef
2616
2617def Test_silent()
2618 var res = execute('disass s:SilentMessage')
2619 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2620 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002621 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002622 '\d PUSHS "text"\_s*' ..
2623 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002624 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002625 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002626 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002627 '\d PUSHS "error"\_s*' ..
2628 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002629 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002630 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002631 res)
2632enddef
2633
2634def s:SilentIf()
2635 silent if 4 == g:five
2636 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002637 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002638enddef
2639
2640def Test_silent_if()
2641 var res = execute('disass s:SilentIf')
2642 assert_match('<SNR>\d*_SilentIf\_s*' ..
2643 'silent if 4 == g:five\_s*' ..
2644 '\d\+ CMDMOD silent\_s*' ..
2645 '\d\+ PUSHNR 4\_s*' ..
2646 '\d\+ LOADG g:five\_s*' ..
2647 '\d\+ COMPAREANY ==\_s*' ..
2648 '\d\+ CMDMOD_REV\_s*' ..
2649 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2650 'silent elseif 4 == g:five\_s*' ..
2651 '\d\+ JUMP -> \d\+\_s*' ..
2652 '\d\+ CMDMOD silent\_s*' ..
2653 '\d\+ PUSHNR 4\_s*' ..
2654 '\d\+ LOADG g:five\_s*' ..
2655 '\d\+ COMPAREANY ==\_s*' ..
2656 '\d\+ CMDMOD_REV\_s*' ..
2657 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002658 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002659 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002660 res)
2661enddef
2662
2663def s:SilentFor()
2664 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002665 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002666enddef
2667
2668def Test_silent_for()
2669 var res = execute('disass s:SilentFor')
2670 assert_match('<SNR>\d*_SilentFor\_s*' ..
2671 'silent for i in \[0\]\_s*' ..
2672 '\d CMDMOD silent\_s*' ..
2673 '\d STORE -1 in $0\_s*' ..
2674 '\d PUSHNR 0\_s*' ..
2675 '\d NEWLIST size 1\_s*' ..
2676 '\d CMDMOD_REV\_s*' ..
2677 '5 FOR $0 -> 8\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002678 '\d STORE $2\_s*' ..
2679
Bram Moolenaarfa984412021-03-25 22:15:28 +01002680 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002681 '\d JUMP -> 5\_s*' ..
2682 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002683 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002684 res)
2685enddef
2686
2687def s:SilentWhile()
2688 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002689 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002690enddef
2691
2692def Test_silent_while()
2693 var res = execute('disass s:SilentWhile')
2694 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2695 'silent while g:not\_s*' ..
2696 '0 CMDMOD silent\_s*' ..
2697 '\d LOADG g:not\_s*' ..
2698 '\d COND2BOOL\_s*' ..
2699 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002700 '\d WHILE $0 -> 6\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002701
Bram Moolenaarfa984412021-03-25 22:15:28 +01002702 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002703 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002704 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002705 res)
2706enddef
2707
2708def s:SilentReturn(): string
2709 silent return "done"
2710enddef
2711
2712def Test_silent_return()
2713 var res = execute('disass s:SilentReturn')
2714 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2715 'silent return "done"\_s*' ..
2716 '\d CMDMOD silent\_s*' ..
2717 '\d PUSHS "done"\_s*' ..
2718 '\d CMDMOD_REV\_s*' ..
2719 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002720 res)
2721enddef
2722
Bram Moolenaarb2049902021-01-24 12:53:53 +01002723def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002724 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002725 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002726 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002727 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002728 return "done"
2729enddef
2730
2731def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002732 if !has('profile')
2733 MissingFeature 'profile'
2734 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002735 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002736 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002737 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002738 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002739 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002740 '\d PUSHS "profiled"\_s*' ..
2741 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002742 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002743 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002744 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002745 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002746 '\d PUSHS "some text"\_s*' ..
2747 '\d STORE $0\_s*' ..
2748 'return "done"\_s*' ..
2749 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002750 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002751 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002752 '\d\+ RETURN\_s*' ..
2753 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002754 res)
2755enddef
2756
Bram Moolenaare99d4222021-06-13 14:01:26 +02002757def Test_debugged()
2758 var res = execute('disass debug s:Profiled')
2759 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002760 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002761 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002762 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002763 '\d PUSHS "profiled"\_s*' ..
2764 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002765 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002766 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002767 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002768 '\d PUSHS "some text"\_s*' ..
2769 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002770 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002771 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002772 '\d PUSHS "done"\_s*' ..
2773 '\d RETURN\_s*',
2774 res)
2775enddef
2776
Bram Moolenaar90770b72021-11-30 20:57:38 +00002777def s:ElseifConstant()
2778 if g:value
2779 echo "one"
2780 elseif true
2781 echo "true"
2782 elseif false
2783 echo "false"
2784 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002785 if 0
2786 echo "yes"
2787 elseif 0
2788 echo "no"
2789 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002790enddef
2791
2792def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002793 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002794 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2795 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002796 '0 DEBUG line 1-1 varcount 0\_s*' ..
2797 '1 LOADG g:value\_s*' ..
2798 '2 COND2BOOL\_s*' ..
2799 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002800 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002801 '4 DEBUG line 2-2 varcount 0\_s*' ..
2802 '5 PUSHS "one"\_s*' ..
2803 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002804 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002805 '7 JUMP -> 12\_s*' ..
2806 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002807 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002808 '9 DEBUG line 4-4 varcount 0\_s*' ..
2809 '10 PUSHS "true"\_s*' ..
2810 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002811 'elseif false\_s*' ..
2812 'echo "false"\_s*' ..
2813 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002814 'if 0\_s*' ..
2815 '12 DEBUG line 8-8 varcount 0\_s*' ..
2816 'echo "yes"\_s*' ..
2817 'elseif 0\_s*' ..
2818 '13 DEBUG line 11-10 varcount 0\_s*' ..
2819 'echo "no"\_s*' ..
2820 'endif\_s*' ..
2821 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002822 res)
2823enddef
2824
Bram Moolenaar093165c2021-08-22 13:35:31 +02002825def s:DebugElseif()
2826 var b = false
2827 if b
2828 eval 1 + 0
2829 silent elseif !b
2830 eval 2 + 0
2831 endif
2832enddef
2833
2834def Test_debug_elseif()
2835 var res = execute('disass debug s:DebugElseif')
2836 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2837 'var b = false\_s*' ..
2838 '0 DEBUG line 1-1 varcount 0\_s*' ..
2839 '1 PUSH false\_s*' ..
2840 '2 STORE $0\_s*' ..
2841
2842 'if b\_s*' ..
2843 '3 DEBUG line 2-2 varcount 1\_s*' ..
2844 '4 LOAD $0\_s*' ..
2845 '5 JUMP_IF_FALSE -> 10\_s*' ..
2846
2847 'eval 1 + 0\_s*' ..
2848 '6 DEBUG line 3-3 varcount 1\_s*' ..
2849 '7 PUSHNR 1\_s*' ..
2850 '8 DROP\_s*' ..
2851
2852 'silent elseif !b\_s*' ..
2853 '9 JUMP -> 20\_s*' ..
2854 '10 CMDMOD silent\_s*' ..
2855 '11 DEBUG line 4-4 varcount 1\_s*' ..
2856 '12 LOAD $0\_s*' ..
2857 '13 INVERT -1 (!val)\_s*' ..
2858 '14 CMDMOD_REV\_s*' ..
2859 '15 JUMP_IF_FALSE -> 20\_s*' ..
2860
2861 'eval 2 + 0\_s*' ..
2862 '16 DEBUG line 5-5 varcount 1\_s*' ..
2863 '17 PUSHNR 2\_s*' ..
2864 '18 DROP\_s*' ..
2865
2866 'endif\_s*' ..
2867 '19 DEBUG line 6-6 varcount 1\_s*' ..
2868 '20 RETURN void*',
2869 res)
2870enddef
2871
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002872def s:DebugFor()
2873 echo "hello"
2874 for a in [0]
2875 echo a
2876 endfor
2877enddef
2878
2879def Test_debug_for()
2880 var res = execute('disass debug s:DebugFor')
2881 assert_match('<SNR>\d*_DebugFor\_s*' ..
2882 'echo "hello"\_s*' ..
2883 '0 DEBUG line 1-1 varcount 0\_s*' ..
2884 '1 PUSHS "hello"\_s*' ..
2885 '2 ECHO 1\_s*' ..
2886
2887 'for a in \[0\]\_s*' ..
2888 '3 DEBUG line 2-2 varcount 0\_s*' ..
2889 '4 STORE -1 in $0\_s*' ..
2890 '5 PUSHNR 0\_s*' ..
2891 '6 NEWLIST size 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002892 '7 DEBUG line 2-2 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002893 '8 FOR $0 -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002894 '9 STORE $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002895
2896 'echo a\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002897 '10 DEBUG line 3-3 varcount 3\_s*' ..
2898 '11 LOAD $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002899 '12 ECHO 1\_s*' ..
2900
2901 'endfor\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002902 '13 DEBUG line 4-4 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002903 '14 JUMP -> 7\_s*' ..
2904 '15 DROP\_s*' ..
2905 '16 RETURN void*',
2906 res)
2907enddef
2908
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002909def s:TryCatch()
2910 try
2911 echo "try"
2912 catch /error/
2913 echo "caught"
2914 endtry
2915enddef
2916
2917def Test_debug_try_catch()
2918 var res = execute('disass debug s:TryCatch')
2919 assert_match('<SNR>\d*_TryCatch\_s*' ..
2920 'try\_s*' ..
2921 '0 DEBUG line 1-1 varcount 0\_s*' ..
2922 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2923 'echo "try"\_s*' ..
2924 '2 DEBUG line 2-2 varcount 0\_s*' ..
2925 '3 PUSHS "try"\_s*' ..
2926 '4 ECHO 1\_s*' ..
2927 'catch /error/\_s*' ..
2928 '5 DEBUG line 3-3 varcount 0\_s*' ..
2929 '6 JUMP -> 17\_s*' ..
2930 '7 DEBUG line 4-3 varcount 0\_s*' ..
2931 '8 PUSH v:exception\_s*' ..
2932 '9 PUSHS "error"\_s*' ..
2933 '10 COMPARESTRING =\~\_s*' ..
2934 '11 JUMP_IF_FALSE -> 17\_s*' ..
2935 '12 CATCH\_s*' ..
2936 'echo "caught"\_s*' ..
2937 '13 DEBUG line 4-4 varcount 0\_s*' ..
2938 '14 PUSHS "caught"\_s*' ..
2939 '15 ECHO 1\_s*' ..
2940 'endtry\_s*' ..
2941 '16 DEBUG line 5-5 varcount 0\_s*' ..
2942 '17 ENDTRY\_s*' ..
2943 '\d\+ RETURN void',
2944 res)
2945enddef
2946
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002947func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002948 echo 'legacy'
2949endfunc
2950
2951def s:UseMember()
2952 var d = {func: Legacy}
2953 var v = d.func()
2954enddef
2955
2956def Test_disassemble_dict_stack()
2957 var res = execute('disass s:UseMember')
2958 assert_match('<SNR>\d*_UseMember\_s*' ..
2959 'var d = {func: Legacy}\_s*' ..
2960 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002961 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002962 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002963 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002964 '\d STORE $0\_s*' ..
2965
2966 'var v = d.func()\_s*' ..
2967 '\d LOAD $0\_s*' ..
2968 '\d MEMBER func\_s*' ..
2969 '\d PCALL top (argc 0)\_s*' ..
2970 '\d PCALL end\_s*' ..
2971 '\d CLEARDICT\_s*' ..
2972 '\d\+ STORE $1\_s*' ..
2973 '\d\+ RETURN void*',
2974 res)
2975enddef
2976
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002977def s:RetLegacy(): string
2978 legacy return "yes"
2979enddef
2980
2981def Test_disassemble_return_legacy()
2982 var res = execute('disass s:RetLegacy')
2983 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2984 'legacy return "yes"\_s*' ..
2985 '\d CMDMOD legacy\_s*' ..
2986 '\d EVAL legacy "yes"\_s*' ..
2987 '\d CHECKTYPE string stack\[-1]\_s*' ..
2988 '\d CMDMOD_REV\_s*' ..
2989 '\d RETURN',
2990 res)
2991enddef
2992
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002993def s:EchoMessages()
2994 echohl ErrorMsg | echom v:exception | echohl NONE
2995enddef
2996
2997def Test_disassemble_nextcmd()
2998 # splitting commands and removing trailing blanks should not change the line
2999 var res = execute('disass s:EchoMessages')
3000 assert_match('<SNR>\d*_EchoMessages\_s*' ..
3001 'echohl ErrorMsg | echom v:exception | echohl NONE',
3002 res)
3003enddef
3004
Bram Moolenaar6db660b2021-08-01 14:08:54 +02003005def Test_disassemble_after_reload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003006 var lines =<< trim END
3007 vim9script
3008 if exists('g:ThisFunc')
3009 finish
3010 endif
3011 var name: any
3012 def g:ThisFunc(): number
3013 g:name = name
3014 return 0
3015 enddef
3016 def g:ThatFunc(): number
3017 name = g:name
3018 return 0
3019 enddef
3020 END
3021 lines->writefile('Xreload.vim', 'D')
Bram Moolenaar6db660b2021-08-01 14:08:54 +02003022
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003023 source Xreload.vim
3024 g:ThisFunc()
3025 g:ThatFunc()
Bram Moolenaar6db660b2021-08-01 14:08:54 +02003026
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003027 source Xreload.vim
3028 var res = execute('disass g:ThisFunc')
3029 assert_match('ThisFunc\_s*' ..
3030 'g:name = name\_s*' ..
3031 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
3032 '\d STOREG g:name\_s*' ..
3033 'return 0\_s*' ..
3034 '\d PUSHNR 0\_s*' ..
3035 '\d RETURN\_s*',
3036 res)
Bram Moolenaar6db660b2021-08-01 14:08:54 +02003037
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003038 res = execute('disass g:ThatFunc')
3039 assert_match('ThatFunc\_s*' ..
3040 'name = g:name\_s*' ..
3041 '\d LOADG g:name\_s*' ..
3042 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
3043 'return 0\_s*' ..
3044 '\d PUSHNR 0\_s*' ..
3045 '\d RETURN\_s*',
3046 res)
Bram Moolenaar6db660b2021-08-01 14:08:54 +02003047
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01003048 delfunc g:ThisFunc
3049 delfunc g:ThatFunc
Bram Moolenaar6db660b2021-08-01 14:08:54 +02003050enddef
3051
LemonBoy2eaef102022-05-06 13:14:50 +01003052def s:MakeString(x: number): string
3053 return $"x={x} x^2={x * x}"
3054enddef
Bram Moolenaar7cd24222021-01-12 18:58:39 +01003055
LemonBoy2eaef102022-05-06 13:14:50 +01003056def Test_disassemble_string_interp()
3057 var instr = execute('disassemble s:MakeString')
3058 assert_match('MakeString\_s*' ..
3059 'return $"x={x} x^2={x \* x}"\_s*' ..
3060 '0 PUSHS "x="\_s*' ..
3061 '1 LOAD arg\[-1\]\_s*' ..
3062 '2 2STRING stack\[-1\]\_s*' ..
3063 '3 PUSHS " x^2="\_s*' ..
3064 '4 LOAD arg\[-1\]\_s*' ..
3065 '5 LOAD arg\[-1\]\_s*' ..
3066 '6 OPNR \*\_s*' ..
3067 '7 2STRING stack\[-1\]\_s*' ..
3068 '8 CONCAT size 4\_s*' ..
3069 '9 RETURN\_s*',
3070 instr)
3071enddef
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02003072
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01003073def BitShift()
3074 var a = 1 << 2
3075 var b = 8 >> 1
3076 var c = a << b
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003077 var d = b >> a
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01003078enddef
3079
3080def Test_disassemble_bitshift()
3081 var instr = execute('disassemble BitShift')
3082 assert_match('BitShift\_s*' ..
3083 'var a = 1 << 2\_s*' ..
3084 '0 STORE 4 in $0\_s*' ..
3085 'var b = 8 >> 1\_s*' ..
3086 '1 STORE 4 in $1\_s*' ..
3087 'var c = a << b\_s*' ..
3088 '2 LOAD $0\_s*' ..
3089 '3 LOAD $1\_s*' ..
3090 '4 OPNR <<\_s*' ..
3091 '5 STORE $2\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003092 'var d = b >> a\_s*' ..
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01003093 '6 LOAD $1\_s*' ..
3094 '7 LOAD $0\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003095 '8 OPNR >>\_s*' ..
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01003096 '9 STORE $3\_s*' ..
3097 '10 RETURN void', instr)
3098enddef
3099
Bram Moolenaar1d84f762022-09-03 21:35:53 +01003100def s:OneDefer()
3101 defer delete("file")
3102enddef
3103
3104def Test_disassemble_defer()
3105 var instr = execute('disassemble s:OneDefer')
3106 assert_match('OneDefer\_s*' ..
3107 'defer delete("file")\_s*' ..
3108 '\d PUSHFUNC "delete"\_s*' ..
3109 '\d PUSHS "file"\_s*' ..
3110 '\d DEFER 1 args\_s*' ..
3111 '\d RETURN\_s*',
3112 instr)
3113enddef
3114
Bram Moolenaar38f1ab32023-02-21 20:09:46 +00003115def Test_disassemble_class_function()
3116 var lines =<< trim END
3117 vim9script
3118
3119 class Cl
3120 static def Fc(): string
3121 return "x"
3122 enddef
3123 endclass
3124
3125 g:instr = execute('disassemble Cl.Fc')
3126 END
3127 v9.CheckScriptSuccess(lines)
3128 assert_match('Fc\_s*' ..
3129 'return "x"\_s*' ..
3130 '\d PUSHS "x"\_s*' ..
3131 '\d RETURN\_s*',
3132 g:instr)
3133
3134 lines =<< trim END
3135 vim9script
3136
3137 class Cl
3138 def Fo(): string
3139 return "y"
3140 enddef
3141 endclass
3142
3143 g:instr = execute('disassemble Cl.Fo')
3144 END
3145 v9.CheckScriptSuccess(lines)
3146 assert_match('Fo\_s*' ..
3147 'return "y"\_s*' ..
3148 '\d PUSHS "y"\_s*' ..
3149 '\d RETURN\_s*',
3150 g:instr)
3151
3152 unlet g:instr
3153enddef
3154
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003155" Disassemble instructions for using an interface with static and regular member
3156" variables.
3157def Test_disassemble_interface_static_member()
3158 var lines =<< trim END
3159 vim9script
3160 interface I
Doug Kearns74da0ee2023-12-14 20:26:26 +01003161 var o_var: number
3162 var o_var2: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003163 endinterface
3164
3165 class C implements I
Doug Kearns74da0ee2023-12-14 20:26:26 +01003166 public static var s_var: number
3167 var o_var: number
3168 public static var s_var2: number
3169 var o_var2: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003170 endclass
3171
3172 def F1(i: I)
3173 var x: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003174 x = i.o_var
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003175 x = i.o_var2
3176 enddef
3177
3178 def F2(o: C)
3179 var x: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003180 x = o.o_var
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003181 x = o.o_var2
3182 enddef
3183
3184 g:instr1 = execute('disassemble F1')
3185 g:instr2 = execute('disassemble F2')
3186 END
3187 v9.CheckScriptSuccess(lines)
3188 assert_match('<SNR>\d*_F1\_s*' ..
3189 'var x: number\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003190 'x = i.o_var\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003191 '0 LOAD arg\[-1\]\_s*' ..
3192 '1 ITF_MEMBER 0 on I\_s*' ..
3193 '2 STORE $0\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003194 'x = i.o_var2\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003195 '3 LOAD arg\[-1\]\_s*' ..
3196 '4 ITF_MEMBER 1 on I\_s*' ..
3197 '5 STORE $0\_s*' ..
3198 '6 RETURN void\_s*',
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003199 g:instr1)
3200 assert_match('<SNR>\d*_F2\_s*' ..
3201 'var x: number\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003202 'x = o.o_var\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003203 '0 LOAD arg\[-1\]\_s*' ..
3204 '1 OBJ_MEMBER 0\_s*' ..
3205 '2 STORE $0\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003206 'x = o.o_var2\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003207 '3 LOAD arg\[-1\]\_s*' ..
3208 '4 OBJ_MEMBER 1\_s*' ..
3209 '5 STORE $0\_s*' ..
3210 '6 RETURN void',
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003211 g:instr2)
3212
3213 unlet g:instr1
3214 unlet g:instr2
3215enddef
3216
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003217" Disassemble instructions for loading and storing class variables
3218def Test_disassemble_class_variable()
3219 var lines =<< trim END
3220 vim9script
3221
3222 class A
Doug Kearns74da0ee2023-12-14 20:26:26 +01003223 public static var val = 10
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003224 def Foo(): number
3225 val = 20
3226 return val
3227 enddef
3228 endclass
3229
3230 g:instr = execute('disassemble A.Foo')
3231 END
3232 v9.CheckScriptSuccess(lines)
3233 assert_match('Foo\_s*' ..
3234 'val = 20\_s*' ..
3235 '0 PUSHNR 20\_s*' ..
3236 '1 STORE CLASSMEMBER A.val\_s*' ..
3237 'return val\_s*' ..
3238 '2 LOAD CLASSMEMBER A.val\_s*' ..
3239 '3 RETURN', g:instr)
3240
3241 unlet g:instr
3242enddef
3243
3244" Disassemble instructions for METHODCALL
3245def Test_disassemble_methodcall()
3246 var lines =<< trim END
3247 vim9script
3248 interface A
3249 def Foo()
3250 endinterface
3251 def Bar(a: A)
3252 a.Foo()
3253 enddef
3254 g:instr = execute('disassemble Bar')
3255 END
3256 v9.CheckScriptSuccess(lines)
3257 assert_match('<SNR>\d*_Bar\_s*' ..
3258 'a.Foo()\_s*' ..
3259 '0 LOAD arg\[-1\]\_s*' ..
3260 '1 METHODCALL A.Foo(argc 0)\_s*' ..
3261 '2 DROP\_s*' ..
3262 '3 RETURN void', g:instr)
3263
3264 unlet g:instr
3265enddef
3266
3267" Disassemble instructions for ISN_JUMP_IF_ARG_NOT_SET
3268def Test_disassemble_ifargnotset()
3269 var lines =<< trim END
3270 vim9script
3271 class A
Doug Kearns74da0ee2023-12-14 20:26:26 +01003272 var val: number = 10
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003273 endclass
3274 g:instr = execute('disassemble A.new')
3275 END
3276 v9.CheckScriptSuccess(lines)
3277 assert_match('new\_s*' ..
3278 '0 NEW A size \d\+\_s*' ..
3279 '1 PUSHNR 10\_s*' ..
3280 '2 STORE_THIS 0\_s*' ..
3281 'ifargisset 0 this.val = val\_s*' ..
3282 '3 JUMP_IF_ARG_NOT_SET arg\[-1\] -> 8\_s*' ..
3283 '4 LOAD arg\[-1\]\_s*' ..
3284 '5 PUSHNR 0\_s*' ..
3285 '6 LOAD $0\_s*' ..
3286 '7 STOREINDEX object\_s*' ..
3287 '8 RETURN object', g:instr)
3288
3289 unlet g:instr
3290enddef
3291
Ernie Raele75fde62023-12-21 17:18:54 +01003292" Disassemble instructions for ISN_COMPAREOBJECT
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003293def Test_disassemble_compare_class_object()
3294 var lines =<< trim END
3295 vim9script
3296 class A
3297 endclass
3298 class B
3299 endclass
3300 def Foo(a: A, b: B)
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003301 if a == b
3302 endif
3303 enddef
3304 g:instr = execute('disassemble Foo')
3305 END
3306 v9.CheckScriptSuccess(lines)
3307 assert_match('<SNR>\d*_Foo\_s*' ..
Ernie Raele75fde62023-12-21 17:18:54 +01003308 'if a == b\_s*' ..
3309 '0 LOAD arg\[-2\]\_s*' ..
3310 '1 LOAD arg\[-1\]\_s*' ..
3311 '2 COMPAREOBJECT ==\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003312 '3 JUMP_IF_FALSE -> 4\_s*' ..
3313 'endif\_s*' ..
Ernie Raele75fde62023-12-21 17:18:54 +01003314 '4 RETURN void', g:instr)
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003315 unlet g:instr
3316enddef
3317
3318" Disassemble instructions for ISN_CHECKTYPE with a float|number
3319def Test_checktype_float()
3320 var lines =<< trim END
3321 vim9script
3322 def Foo()
3323 var f: float = 0.0
3324 var a: any
3325 f += a
3326 enddef
3327 g:instr = execute('disassemble Foo')
3328 END
3329 v9.CheckScriptSuccess(lines)
3330 assert_match('<SNR>\d*_Foo\_s*' ..
3331 'var f: float = 0.0\_s*' ..
3332 '0 PUSHF 0.0\_s*' ..
3333 '1 STORE $0\_s*' ..
3334 'var a: any\_s*' ..
3335 'f += a\_s*' ..
3336 '2 LOAD $0\_s*' ..
3337 '3 LOAD $1\_s*' ..
3338 '4 CHECKTYPE float|number stack\[-1\]\_s*' ..
3339 '5 OPANY +\_s*' ..
3340 '6 STORE $0\_s*' ..
3341 '7 RETURN void', g:instr)
3342 unlet g:instr
3343enddef
3344
3345" Disassemble instructions for ISN_FUNCREF with a class
3346def Test_funcref_with_class()
3347 var lines =<< trim END
3348 vim9script
3349 class A
3350 def Foo()
3351 enddef
3352 endclass
3353 class B extends A
3354 def Foo()
3355 enddef
3356 endclass
3357 def Bar(a: A)
3358 defer a.Foo()
3359 enddef
3360 g:instr = execute('disassemble Bar')
3361 END
3362 v9.CheckScriptSuccess(lines)
3363 assert_match('<SNR>\d*_Bar\_s*' ..
3364 'defer a.Foo()\_s*' ..
3365 '0 LOAD arg\[-1\]\_s*' ..
3366 '1 FUNCREF A.Foo\_s*' ..
Yegappan Lakshmananf3eac692023-10-17 11:00:45 +02003367 '2 DEFER 0 args\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003368 '3 RETURN void', g:instr)
3369 unlet g:instr
3370enddef
3371
Yegappan Lakshmanand3eae7b2024-03-03 16:26:58 +01003372" Disassemble instructions for calls to a string() function in an object
3373def Test_disassemble_object_string()
3374 var lines =<< trim END
3375 vim9script
3376 class A
3377 def string(): string
3378 return 'A'
3379 enddef
3380 endclass
3381 def Bar()
3382 var a = A.new()
3383 var s = string(a)
3384 s = string(A)
3385 enddef
3386 g:instr = execute('disassemble Bar')
3387 END
3388 v9.CheckScriptSuccess(lines)
3389 assert_match('<SNR>\d*_Bar\_s*' ..
3390 'var a = A.new()\_s*' ..
3391 '0 DCALL new(argc 0)\_s*' ..
3392 '1 STORE $0\_s*' ..
3393 'var s = string(a)\_s*' ..
3394 '2 LOAD $0\_s*' ..
3395 '3 METHODCALL A.string(argc 0)\_s*' ..
3396 '4 STORE $1\_s*' ..
3397 's = string(A)\_s*' ..
3398 '5 LOADSCRIPT A-0 from .*\_s*' ..
3399 '6 BCALL string(argc 1)\_s*' ..
3400 '7 STORE $1\_s*' ..
3401 '8 RETURN void', g:instr)
3402 unlet g:instr
3403
3404 # Use the default string() function for a class
3405 lines =<< trim END
3406 vim9script
3407 class A
3408 endclass
3409 def Bar()
3410 var a = A.new()
3411 var s = string(a)
3412 s = string(A)
3413 enddef
3414 g:instr = execute('disassemble Bar')
3415 END
3416 v9.CheckScriptSuccess(lines)
3417 assert_match('<SNR>\d*_Bar\_s*' ..
3418 'var a = A.new()\_s*' ..
3419 '0 DCALL new(argc 0)\_s*' ..
3420 '1 STORE $0\_s*' ..
3421 'var s = string(a)\_s*' ..
3422 '2 LOAD $0\_s*' ..
3423 '3 BCALL string(argc 1)\_s*' ..
3424 '4 STORE $1\_s*' ..
3425 's = string(A)\_s*' ..
3426 '5 LOADSCRIPT A-0 from .*\_s*' ..
3427 '6 BCALL string(argc 1)\_s*' ..
3428 '7 STORE $1\_s*' ..
3429 '8 RETURN void', g:instr)
3430 unlet g:instr
3431enddef
3432
3433" Disassemble instructions for calls to a empty() function in an object
3434def Test_disassemble_object_empty()
3435 var lines =<< trim END
3436 vim9script
3437 class A
3438 def empty(): bool
3439 return true
3440 enddef
3441 endclass
3442 def Bar()
3443 var a = A.new()
3444 var s = empty(a)
3445 enddef
3446 g:instr = execute('disassemble Bar')
3447 END
3448 v9.CheckScriptSuccess(lines)
3449 assert_match('<SNR>\d*_Bar\_s*' ..
3450 'var a = A.new()\_s*' ..
3451 '0 DCALL new(argc 0)\_s*' ..
3452 '1 STORE $0\_s*' ..
3453 'var s = empty(a)\_s*' ..
3454 '2 LOAD $0\_s*' ..
3455 '3 METHODCALL A.empty(argc 0)\_s*' ..
3456 '4 STORE $1\_s*' ..
3457 '5 RETURN void', g:instr)
3458 unlet g:instr
3459
3460 # Use the default empty() function for a class
3461 lines =<< trim END
3462 vim9script
3463 class A
3464 endclass
3465 def Bar()
3466 var a = A.new()
3467 var s = empty(a)
3468 enddef
3469 g:instr = execute('disassemble Bar')
3470 END
3471 v9.CheckScriptSuccess(lines)
3472 assert_match('<SNR>\d*_Bar\_s*' ..
3473 'var a = A.new()\_s*' ..
3474 '0 DCALL new(argc 0)\_s*' ..
3475 '1 STORE $0\_s*' ..
3476 'var s = empty(a)\_s*' ..
3477 '2 LOAD $0\_s*' ..
3478 '3 BCALL empty(argc 1)\_s*' ..
3479 '4 STORE $1\_s*' ..
3480 '5 RETURN void', g:instr)
3481 unlet g:instr
3482enddef
3483
3484" Disassemble instructions for calls to a len() function in an object
3485def Test_disassemble_object_len()
3486 var lines =<< trim END
3487 vim9script
3488 class A
3489 def len(): number
3490 return 10
3491 enddef
3492 endclass
3493 def Bar()
3494 var a = A.new()
3495 var s = len(a)
3496 enddef
3497 g:instr = execute('disassemble Bar')
3498 END
3499 v9.CheckScriptSuccess(lines)
3500 assert_match('<SNR>\d*_Bar\_s*' ..
3501 'var a = A.new()\_s*' ..
3502 '0 DCALL new(argc 0)\_s*' ..
3503 '1 STORE $0\_s*' ..
3504 'var s = len(a)\_s*' ..
3505 '2 LOAD $0\_s*' ..
3506 '3 METHODCALL A.len(argc 0)\_s*' ..
3507 '4 STORE $1\_s*' ..
3508 '5 RETURN void', g:instr)
3509 unlet g:instr
3510
3511 # Use the default len() function for a class
3512 lines =<< trim END
3513 vim9script
3514 class A
3515 endclass
3516 def Bar()
3517 var a = A.new()
3518 var s = len(a)
3519 enddef
3520 g:instr = execute('disassemble Bar')
3521 END
3522 v9.CheckScriptSuccess(lines)
3523 assert_match('<SNR>\d*_Bar\_s*' ..
3524 'var a = A.new()\_s*' ..
3525 '0 DCALL new(argc 0)\_s*' ..
3526 '1 STORE $0\_s*' ..
3527 'var s = len(a)\_s*' ..
3528 '2 LOAD $0\_s*' ..
3529 '3 BCALL len(argc 1)\_s*' ..
3530 '4 STORE $1\_s*' ..
3531 '5 RETURN void', g:instr)
3532 unlet g:instr
3533enddef
3534
Yegappan Lakshmanand990bf02024-03-22 19:56:17 +01003535" Disassemble instructions for using a compound operator in a closure
3536def Test_disassemble_compound_op_in_closure()
3537 var lines =<< trim END
3538 vim9script
3539 class A
3540 var foo: number = 1
3541 def Foo(): func
3542 var Fn = () => {
3543 this.foo += 1
3544 }
3545 return Fn
3546 enddef
3547 endclass
3548 var a = A.new()
3549 var Lambda = a.Foo()
3550 var num = matchstr(string(Lambda), '\d\+')
3551 g:instr = execute($'disassemble <lambda>{num}')
3552 END
3553 v9.CheckScriptSuccess(lines)
3554 assert_match('<lambda>\d\+\_s*' ..
3555 'this.foo += 1\_s*' ..
3556 '0 LOADOUTER level 0 $0\_s*' ..
3557 '1 OBJ_MEMBER 0\_s*' ..
3558 '2 PUSHNR 1\_s*' ..
3559 '3 OPNR +\_s*' ..
3560 '4 PUSHNR 0\_s*' ..
3561 '5 LOADOUTER level 0 $0\_s*' ..
3562 '6 STOREINDEX object\_s*' ..
3563 '7 RETURN void', g:instr)
3564 unlet g:instr
3565enddef
3566
LemonBoyf4af3312024-07-04 13:43:12 +02003567def Test_disassemble_member_initializer()
3568 var lines =<< trim END
3569 vim9script
3570 class A
3571 var l: list<string> = []
3572 var d: dict<string> = {}
3573 endclass
3574 g:instr = execute('disassemble A.new')
3575 END
3576 v9.CheckScriptSuccess(lines)
3577 # Ensure SETTYPE is emitted and that matches the declared type.
3578 assert_match('new\_s*' ..
3579 '0 NEW A size \d\+\_s*' ..
3580 '1 NEWLIST size 0\_s*' ..
3581 '2 SETTYPE list<string>\_s*' ..
3582 '3 STORE_THIS 0\_s*' ..
3583 '4 NEWDICT size 0\_s*' ..
3584 '5 SETTYPE dict<string>\_s*' ..
3585 '6 STORE_THIS 1', g:instr)
3586 unlet g:instr
3587enddef
3588
Yegappan Lakshmananc10342d2025-01-11 09:39:01 +01003589" Disassemble the code generated for accessing a interface member variable
3590def Test_disassemble_interface_variable_access()
3591 var lines =<< trim END
3592 vim9script
3593 interface IX
3594 var F: func(): string
3595 endinterface
3596
3597 def Foo(ix: IX): string
3598 return ix.F()
3599 enddef
3600
3601 g:instr = execute('disassemble Foo')
3602 END
3603 v9.CheckScriptSuccess(lines)
3604 assert_match('<SNR>\d\+_Foo\_s*' ..
3605 'return ix.F()\_s*' ..
3606 '0 LOAD arg\[-1\]\_s*' ..
3607 '1 ITF_MEMBER 0 on IX\_s*' ..
3608 '2 PCALL top (argc 0)\_s*' ..
3609 '3 PCALL end\_s*' ..
3610 '4 RETURN', g:instr)
3611 unlet g:instr
3612enddef
3613
Yegappan Lakshmanan6289f912025-01-14 17:13:36 +01003614" Disassemble the code generated for accessing a script-local funcref
3615def Test_disassemble_using_script_local_funcref()
3616 var lines =<< trim END
3617 vim9script
3618 def Noop()
3619 enddef
3620 export var Setup = Noop
3621 export def Run()
3622 Setup()
3623 enddef
3624 g:instr = execute('disassemble Run')
3625 END
3626 v9.CheckScriptSuccess(lines)
3627 assert_match('<SNR>\d\+_Run\_s*' ..
3628 'Setup()\_s*' ..
3629 '0 LOADSCRIPT Setup-0 from .*\_s*' ..
3630 '1 PCALL (argc 0)\_s*' ..
3631 '2 DROP\_s*' ..
3632 '3 RETURN void\_s*', g:instr)
3633 unlet g:instr
3634enddef
3635
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01003636" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker