blob: 1a192cc09242b568faea3e8646e506cad52662ce [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
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100384def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200385 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100386 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200387 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100388 localstr = 'xyz'
389 v:char = 'abc'
390 s:scriptvar = 'sv'
391 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100392 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200393 b:buffervar = 'bv'
394 w:windowvar = 'wv'
395 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100396 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000397 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100398 $ENVVAR = 'ev'
399 @z = 'rv'
400enddef
401
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100402def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200403 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200404 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200405 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200406 'localnr = 2.*' ..
407 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200408 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200409 'localstr = ''xyz''.*' ..
410 ' STORE $1.*' ..
411 'v:char = ''abc''.*' ..
412 'STOREV v:char.*' ..
413 's:scriptvar = ''sv''.*' ..
414 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
415 'g:globalvar = ''gv''.*' ..
416 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100417 'g:auto#var = ''av''.*' ..
418 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200419 'b:buffervar = ''bv''.*' ..
420 ' STOREB b:buffervar.*' ..
421 'w:windowvar = ''wv''.*' ..
422 ' STOREW w:windowvar.*' ..
423 't:tabpagevar = ''tv''.*' ..
424 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000425 '&tabstop = 8\_s*' ..
426 '\d\+ PUSHNR 8\_s*' ..
427 '\d\+ STOREOPT &tabstop\_s*' ..
428 '&opfunc = (t) => len(t)\_s*' ..
429 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
430 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
431 '$ENVVAR = ''ev''\_s*' ..
432 '\d\+ PUSHS "ev"\_s*' ..
433 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200434 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000435 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200436 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100437enddef
438
Bram Moolenaarcb790402020-05-15 20:53:00 +0200439def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200440 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200441 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200442 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200443 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200444 var localblob: blob = 0z1122
445 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200446enddef
447
448def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200449 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200450 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200451 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200452 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100453 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200454 '\d STORE $0\_s*' ..
455 'locallist\[0\] = 123\_s*' ..
456 '\d PUSHNR 123\_s*' ..
457 '\d PUSHNR 0\_s*' ..
458 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200459 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200460 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200461 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100462 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200463 '\d STORE $1\_s*' ..
464 'localdict\["a"\] = 456\_s*' ..
465 '\d\+ PUSHNR 456\_s*' ..
466 '\d\+ PUSHS "a"\_s*' ..
467 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200468 '\d\+ STOREINDEX dict\_s*' ..
469 'var localblob: blob = 0z1122\_s*' ..
470 '\d\+ PUSHBLOB 0z1122\_s*' ..
471 '\d\+ STORE $2\_s*' ..
472 'localblob\[1\] = 33\_s*' ..
473 '\d\+ PUSHNR 33\_s*' ..
474 '\d\+ PUSHNR 1\_s*' ..
475 '\d\+ LOAD $2\_s*' ..
476 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200477 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200478 res)
479enddef
480
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000481if has('job')
482 def s:StoreNull()
483 var ss = null_string
484 var bb = null_blob
485 var dd = null_dict
486 var ll = null_list
487 var Ff = null_function
488 var Pp = null_partial
489 var jj = null_job
490 var cc = null_channel
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +0200491 var oo = null_object
492 var nc = null_class
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000493 enddef
494
495 def Test_disassemble_assign_null()
496 var res = execute('disass s:StoreNull')
497 assert_match('<SNR>\d*_StoreNull\_s*' ..
498 'var ss = null_string\_s*' ..
499 '\d\+ PUSHS "\[NULL\]"\_s*' ..
500 '\d\+ STORE $\d\_s*' ..
501
502 'var bb = null_blob\_s*' ..
503 '\d\+ PUSHBLOB 0z\_s*' ..
504 '\d\+ STORE $\d\_s*' ..
505
506 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100507 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000508 '\d\+ STORE $\d\_s*' ..
509
510 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100511 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000512 '\d\+ STORE $\d\_s*' ..
513
514 'var Ff = null_function\_s*' ..
515 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
516 '\d\+ STORE $\d\_s*' ..
517
518 'var Pp = null_partial\_s*' ..
519 '\d\+ NEWPARTIAL\_s*' ..
520 '\d\+ STORE $\d\_s*' ..
521
522 'var jj = null_job\_s*' ..
523 '\d\+ PUSHJOB "no process"\_s*' ..
524 '\d\+ STORE $\d\_s*' ..
525
526 'var cc = null_channel\_s*' ..
527 '\d\+ PUSHCHANNEL 0\_s*' ..
528 '\d\+ STORE $\d\_s*' ..
529
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +0200530 'var oo = null_object\_s*' ..
531 '\d\+ PUSHOBJ null\_s*' ..
532 '\d\+ STORE $\d\_s*' ..
533
534 'var nc = null_class\_s*' ..
535 '\d\+ PUSHCLASS null\_s*' ..
536 '\d\+ STORE $\d\_s*' ..
537
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000538 '\d\+ RETURN void',
539 res)
540 enddef
541endif
542
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100543def s:ScriptFuncStoreIndex()
544 var d = {dd: {}}
545 d.dd[0] = 0
546enddef
547
548def Test_disassemble_store_index()
549 var res = execute('disass s:ScriptFuncStoreIndex')
550 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
551 'var d = {dd: {}}\_s*' ..
552 '\d PUSHS "dd"\_s*' ..
553 '\d NEWDICT size 0\_s*' ..
554 '\d NEWDICT size 1\_s*' ..
Yegappan Lakshmanan66897192023-12-05 15:51:50 +0100555 '\d SETTYPE dict<dict<any>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100556 '\d STORE $0\_s*' ..
557 'd.dd\[0\] = 0\_s*' ..
558 '\d PUSHNR 0\_s*' ..
559 '\d PUSHNR 0\_s*' ..
560 '\d LOAD $0\_s*' ..
561 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200562 '\d\+ USEDICT\_s*' ..
563 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200564 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100565 res)
566enddef
567
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200568def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200569 var x: string
570 var y: string
571 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200572 [x, y; l] = g:stringlist
573enddef
574
575def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200576 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200577 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200578 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200579 '\d PUSHS "\[NULL\]"\_s*' ..
580 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200581 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200582 '\d PUSHS "\[NULL\]"\_s*' ..
583 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200584 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200585 '\d NEWLIST size 0\_s*' ..
586 '\d STORE $2\_s*' ..
587 '\[x, y; l\] = g:stringlist\_s*' ..
588 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200589 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200590 '\d CHECKLEN >= 2\_s*' ..
591 '\d\+ ITEM 0\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100592 '\d\+ CHECKTYPE string stack\[-1\] var 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200593 '\d\+ STORE $0\_s*' ..
594 '\d\+ ITEM 1\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100595 '\d\+ CHECKTYPE string stack\[-1\] var 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200596 '\d\+ STORE $1\_s*' ..
597 '\d\+ SLICE 2\_s*' ..
598 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200599 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200600 res)
601enddef
602
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200603def s:ListAssignWithOp()
604 var a = 2
605 var b = 3
606 [a, b] += [4, 5]
607enddef
608
609def Test_disassemble_list_assign_with_op()
610 var res = execute('disass s:ListAssignWithOp')
611 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
612 'var a = 2\_s*' ..
613 '\d STORE 2 in $0\_s*' ..
614 'var b = 3\_s*' ..
615 '\d STORE 3 in $1\_s*' ..
616 '\[a, b\] += \[4, 5\]\_s*' ..
617 '\d\+ PUSHNR 4\_s*' ..
618 '\d\+ PUSHNR 5\_s*' ..
619 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200620 '\d\+ LOAD $0\_s*' ..
621 '\d\+ ITEM 0 with op\_s*' ..
622 '\d\+ OPNR +\_s*' ..
623 '\d\+ STORE $0\_s*' ..
624 '\d\+ LOAD $1\_s*' ..
625 '\d\+ ITEM 1 with op\_s*' ..
626 '\d\+ OPNR +\_s*' ..
627 '\d\+ STORE $1\_s*' ..
628 '\d\+ DROP\_s*' ..
629 '\d\+ RETURN void',
630 res)
631enddef
632
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200633def s:ListAdd()
634 var l: list<number> = []
635 add(l, 123)
636 add(l, g:aNumber)
637enddef
638
639def Test_disassemble_list_add()
640 var res = execute('disass s:ListAdd')
641 assert_match('<SNR>\d*_ListAdd\_s*' ..
642 'var l: list<number> = []\_s*' ..
643 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100644 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200645 '\d STORE $0\_s*' ..
646 'add(l, 123)\_s*' ..
647 '\d LOAD $0\_s*' ..
648 '\d PUSHNR 123\_s*' ..
649 '\d LISTAPPEND\_s*' ..
650 '\d DROP\_s*' ..
651 'add(l, g:aNumber)\_s*' ..
652 '\d LOAD $0\_s*' ..
653 '\d\+ LOADG g:aNumber\_s*' ..
654 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
655 '\d\+ LISTAPPEND\_s*' ..
656 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200657 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200658 res)
659enddef
660
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200661def s:BlobAdd()
662 var b: blob = 0z
663 add(b, 123)
664 add(b, g:aNumber)
665enddef
666
667def Test_disassemble_blob_add()
668 var res = execute('disass s:BlobAdd')
669 assert_match('<SNR>\d*_BlobAdd\_s*' ..
670 'var b: blob = 0z\_s*' ..
671 '\d PUSHBLOB 0z\_s*' ..
672 '\d STORE $0\_s*' ..
673 'add(b, 123)\_s*' ..
674 '\d LOAD $0\_s*' ..
675 '\d PUSHNR 123\_s*' ..
676 '\d BLOBAPPEND\_s*' ..
677 '\d DROP\_s*' ..
678 'add(b, g:aNumber)\_s*' ..
679 '\d LOAD $0\_s*' ..
680 '\d\+ LOADG g:aNumber\_s*' ..
681 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
682 '\d\+ BLOBAPPEND\_s*' ..
683 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200684 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200685 res)
686enddef
687
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200688def s:BlobIndexSlice()
689 var b: blob = 0z112233
690 echo b[1]
691 echo b[1 : 2]
692enddef
693
694def Test_disassemble_blob_index_slice()
695 var res = execute('disass s:BlobIndexSlice')
696 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
697 'var b: blob = 0z112233\_s*' ..
698 '\d PUSHBLOB 0z112233\_s*' ..
699 '\d STORE $0\_s*' ..
700 'echo b\[1\]\_s*' ..
701 '\d LOAD $0\_s*' ..
702 '\d PUSHNR 1\_s*' ..
703 '\d BLOBINDEX\_s*' ..
704 '\d ECHO 1\_s*' ..
705 'echo b\[1 : 2\]\_s*' ..
706 '\d LOAD $0\_s*' ..
707 '\d PUSHNR 1\_s*' ..
708 '\d\+ PUSHNR 2\_s*' ..
709 '\d\+ BLOBSLICE\_s*' ..
710 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200711 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200712 res)
713enddef
714
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200715def s:ScriptFuncUnlet()
716 g:somevar = "value"
717 unlet g:somevar
718 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200719 unlet $SOMEVAR
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100720
721 var l = [1, 2, 3]
722 unlet l[2]
723 unlet l[0 : 1]
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200724enddef
725
726def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200727 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200728 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
729 'g:somevar = "value"\_s*' ..
730 '\d PUSHS "value"\_s*' ..
731 '\d STOREG g:somevar\_s*' ..
732 'unlet g:somevar\_s*' ..
733 '\d UNLET g:somevar\_s*' ..
734 'unlet! g:somevar\_s*' ..
735 '\d UNLET! g:somevar\_s*' ..
736 'unlet $SOMEVAR\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100737 '\d UNLETENV $SOMEVAR\_s*' ..
738
739 'var l = \[1, 2, 3]\_s*' ..
740 '\d\+ PUSHNR 1\_s*' ..
741 '\d\+ PUSHNR 2\_s*' ..
742 '\d\+ PUSHNR 3\_s*' ..
743 '\d\+ NEWLIST size 3\_s*' ..
744 '\d\+ SETTYPE list<number>\_s*' ..
745 '\d\+ STORE $0\_s*' ..
746
747 'unlet l\[2]\_s*' ..
748 '\d\+ PUSHNR 2\_s*' ..
749 '\d\+ LOAD $0\_s*' ..
750 '\d\+ UNLETINDEX\_s*' ..
751
752 'unlet l\[0 : 1]\_s*' ..
753 '\d\+ PUSHNR 0\_s*' ..
754 '\d\+ PUSHNR 1\_s*' ..
755 '\d\+ LOAD $0\_s*' ..
756 '\d\+ UNLETRANGE\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200757 res)
758enddef
759
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200760def s:LockLocal()
761 var d = {a: 1}
762 lockvar d.a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100763 const nr = 22
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200764enddef
765
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000766def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200767 var res = execute('disass s:LockLocal')
768 assert_match('<SNR>\d*_LockLocal\_s*' ..
769 'var d = {a: 1}\_s*' ..
770 '\d PUSHS "a"\_s*' ..
771 '\d PUSHNR 1\_s*' ..
772 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000773 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200774 '\d STORE $0\_s*' ..
775 'lockvar d.a\_s*' ..
776 '\d LOAD $0\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100777 '\d LOCKUNLOCK lockvar 2 d.a\_s*' ..
778
779 'const nr = 22\_s*' ..
780 '\d\+ PUSHNR 22\_s*' ..
781 '\d\+ LOCKCONST\_s*' ..
782 '\d\+ STORE $1',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200783 res)
784enddef
785
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100786def s:ScriptFuncTry()
787 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200788 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100789 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200790 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100791 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200792 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100793 endtry
794enddef
795
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100796def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200797 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200798 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
799 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100800 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200801 'echo "yes"\_s*' ..
802 '\d PUSHS "yes"\_s*' ..
803 '\d ECHO 1\_s*' ..
804 'catch /fail/\_s*' ..
805 '\d JUMP -> \d\+\_s*' ..
806 '\d PUSH v:exception\_s*' ..
807 '\d PUSHS "fail"\_s*' ..
808 '\d COMPARESTRING =\~\_s*' ..
809 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
810 '\d CATCH\_s*' ..
811 'echo "no"\_s*' ..
812 '\d\+ PUSHS "no"\_s*' ..
813 '\d\+ ECHO 1\_s*' ..
814 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100815 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200816 'throw "end"\_s*' ..
817 '\d\+ PUSHS "end"\_s*' ..
818 '\d\+ THROW\_s*' ..
819 'endtry\_s*' ..
820 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200821 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100822enddef
823
824def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200825 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100826 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100827enddef
828
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100829def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200830 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200831 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200832 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200833 '\d PUSHNR 1\_s*' ..
834 '\d PUSHS "two"\_s*' ..
835 '\d PUSHNR 333\_s*' ..
836 '\d NEWLIST size 3\_s*' ..
837 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100838 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200839 '\d PUSHS "one"\_s*' ..
840 '\d PUSHNR 1\_s*' ..
841 '\d PUSHS "two"\_s*' ..
842 '\d PUSHS "val"\_s*' ..
843 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200844 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100845enddef
846
Bram Moolenaar62aec932022-01-29 21:45:34 +0000847def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100848 echo arg
849enddef
850
Bram Moolenaar62aec932022-01-29 21:45:34 +0000851func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100852 echo 'nothing'
853endfunc
854
Bram Moolenaar62aec932022-01-29 21:45:34 +0000855func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100856 echo a:arg
857endfunc
858
859def s:ScriptFuncCall(): string
860 changenr()
861 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000862 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100863 FuncWithArg(343)
864 ScriptFuncNew()
865 s:ScriptFuncNew()
866 UserFunc()
867 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200868 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100869 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200870 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100871 FuncRefWithArg("bar")
872 return "yes"
873enddef
874
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100875def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200876 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200877 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
878 'changenr()\_s*' ..
879 '\d BCALL changenr(argc 0)\_s*' ..
880 '\d DROP\_s*' ..
881 'char2nr("abc")\_s*' ..
882 '\d PUSHS "abc"\_s*' ..
883 '\d BCALL char2nr(argc 1)\_s*' ..
884 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000885 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200886 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
887 '\d DROP\_s*' ..
888 'FuncWithArg(343)\_s*' ..
889 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000890 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200891 '\d\+ DROP\_s*' ..
892 'ScriptFuncNew()\_s*' ..
893 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
894 '\d\+ DROP\_s*' ..
895 's:ScriptFuncNew()\_s*' ..
896 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
897 '\d\+ DROP\_s*' ..
898 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000899 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200900 '\d\+ DROP\_s*' ..
901 'UserFuncWithArg("foo")\_s*' ..
902 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000903 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200904 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200905 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200906 '\d\+ PUSHS "UserFunc"\_s*' ..
907 '\d\+ BCALL function(argc 1)\_s*' ..
908 '\d\+ STORE $0\_s*' ..
909 'FuncRef()\_s*' ..
910 '\d\+ LOAD $\d\_s*' ..
911 '\d\+ PCALL (argc 0)\_s*' ..
912 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200913 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200914 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
915 '\d\+ BCALL function(argc 1)\_s*' ..
916 '\d\+ STORE $1\_s*' ..
917 'FuncRefWithArg("bar")\_s*' ..
918 '\d\+ PUSHS "bar"\_s*' ..
919 '\d\+ LOAD $\d\_s*' ..
920 '\d\+ PCALL (argc 1)\_s*' ..
921 '\d\+ DROP\_s*' ..
922 'return "yes"\_s*' ..
923 '\d\+ PUSHS "yes"\_s*' ..
924 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200925 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100926enddef
927
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200928
929def s:CreateRefs()
930 var local = 'a'
931 def Append(arg: string)
932 local ..= arg
933 enddef
934 g:Append = Append
935 def Get(): string
936 return local
937 enddef
938 g:Get = Get
939enddef
940
941def Test_disassemble_closure()
942 CreateRefs()
943 var res = execute('disass g:Append')
944 assert_match('<lambda>\d\_s*' ..
945 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100946 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200947 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100948 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100949 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200950 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200951 res)
952
953 res = execute('disass g:Get')
954 assert_match('<lambda>\d\_s*' ..
955 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100956 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200957 '\d RETURN',
958 res)
959
960 unlet g:Append
961 unlet g:Get
962enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200963
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100964def s:ClosureArg(arg: string)
965 var Ref = () => arg .. "x"
966enddef
967
968def Test_disassemble_closure_arg()
969 var res = execute('disass s:ClosureArg')
970 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
971 'var Ref = () => arg .. "x"\_s*' ..
972 '\d FUNCREF <lambda>\d\+',
973 res)
974 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
975 assert_match('<lambda>\d\+\_s*' ..
976 'return arg .. "x"\_s*' ..
977 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
978 '\d PUSHS "x"\_s*' ..
979 '\d CONCAT size 2\_s*' ..
980 '\d RETURN',
981 lres)
982enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100983
Bram Moolenaar8abb5842022-09-17 12:39:58 +0100984def s:ClosureInLoop()
985 for i in range(5)
986 var ii = i
987 continue
988 break
989 if g:val
990 return
991 endif
992 g:Ref = () => ii
993 continue
994 break
995 if g:val
996 return
997 endif
998 endfor
999enddef
1000
1001" Mainly check that ENDLOOP is only produced after a closure was created.
1002def Test_disassemble_closure_in_loop()
1003 var res = execute('disass s:ClosureInLoop')
1004 assert_match('<SNR>\d\+_ClosureInLoop\_s*' ..
1005 'for i in range(5)\_s*' ..
1006 '\d\+ STORE -1 in $0\_s*' ..
1007 '\d\+ PUSHNR 5\_s*' ..
1008 '\d\+ BCALL range(argc 1)\_s*' ..
1009 '\d\+ FOR $0 -> \d\+\_s*' ..
1010 '\d\+ STORE $2\_s*' ..
1011
1012 'var ii = i\_s*' ..
1013 '\d\+ LOAD $2\_s*' ..
1014 '\d\+ STORE $3\_s*' ..
1015
1016 'continue\_s*' ..
1017 '\d\+ JUMP -> \d\+\_s*' ..
1018
1019 'break\_s*' ..
1020 '\d\+ JUMP -> \d\+\_s*' ..
1021
1022 'if g:val\_s*' ..
1023 '\d\+ LOADG g:val\_s*' ..
1024 '\d\+ COND2BOOL\_s*' ..
1025 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1026
1027 ' return\_s*' ..
1028 '\d\+ PUSHNR 0\_s*' ..
1029 '\d\+ RETURN\_s*' ..
1030
1031 'endif\_s*' ..
1032 'g:Ref = () => ii\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001033 '\d\+ FUNCREF <lambda>4 vars $3-$3\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001034 '\d\+ STOREG g:Ref\_s*' ..
1035
1036 'continue\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001037 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001038 '\d\+ JUMP -> \d\+\_s*' ..
1039
1040 'break\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001041 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001042 '\d\+ JUMP -> \d\+\_s*' ..
1043
1044 'if g:val\_s*' ..
1045 '\d\+ LOADG g:val\_s*' ..
1046 '\d\+ COND2BOOL\_s*' ..
1047 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1048
1049 ' return\_s*' ..
1050 '\d\+ PUSHNR 0\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001051 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001052 '\d\+ RETURN\_s*' ..
1053
1054 'endif\_s*' ..
1055 'endfor\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001056 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001057 '\d\+ JUMP -> \d\+\_s*' ..
1058 '\d\+ DROP\_s*' ..
1059 '\d\+ RETURN void',
1060 res)
1061enddef
1062
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001063def EchoArg(arg: string): string
1064 return arg
1065enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001066def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001067 return function('EchoArg')
1068enddef
1069def s:ScriptPCall()
1070 RefThis()("text")
1071enddef
1072
1073def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +02001074 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001075 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
1076 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +00001077 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001078 '\d PUSHS "text"\_s*' ..
1079 '\d PCALL top (argc 1)\_s*' ..
1080 '\d PCALL end\_s*' ..
1081 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001082 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001083 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001084enddef
1085
1086
Bram Moolenaara26b9702020-04-18 19:53:28 +02001087def s:FuncWithForwardCall(): string
1088 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001089enddef
1090
1091def DefinedLater(arg: string): string
1092 return arg
1093enddef
1094
1095def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001096 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001097 assert_match('FuncWithForwardCall\_s*' ..
1098 'return g:DefinedLater("yes")\_s*' ..
1099 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001100 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001101 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001102 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001103
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001104 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001105 assert_equal('yes', FuncWithForwardCall())
1106
Bram Moolenaara26b9702020-04-18 19:53:28 +02001107 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001108 assert_match('FuncWithForwardCall\_s*' ..
1109 'return g:DefinedLater("yes")\_s*' ..
1110 '\d PUSHS "yes"\_s*' ..
1111 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001112 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001113 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001114enddef
1115
1116
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001117def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001118 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001119enddef
1120
1121def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +02001122 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001123 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001124 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001125 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001126 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001127 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001128 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001129 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
1130 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001131 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001132 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001133 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001134 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001135 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001136 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001137 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001138 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001139enddef
1140
1141
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001142def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001143 if has("eval")
1144 echo "yes"
1145 else
1146 echo "no"
1147 endif
1148enddef
1149
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001150def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001151 if has("nothing")
1152 echo "yes"
1153 else
1154 echo "no"
1155 endif
1156enddef
1157
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001158def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001159 if has("nothing")
1160 echo "nothing"
1161 elseif has("something")
1162 echo "something"
1163 elseif has("eval")
1164 echo "eval"
1165 elseif has("less")
1166 echo "less"
1167 endif
1168enddef
1169
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001170def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001171 if has("gui_running")
1172 echo "yes"
1173 else
1174 echo "no"
1175 endif
1176enddef
1177
LemonBoy58f331a2022-04-02 21:59:06 +01001178def s:LenConstant(): number
1179 return len("foo") + len("fighters")
1180enddef
1181
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001182def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001183 var instr = execute('disassemble LenConstant')
1184 assert_match('LenConstant\_s*' ..
1185 'return len("foo") + len("fighters")\_s*' ..
1186 '\d PUSHNR 11\_s*',
1187 instr)
1188 assert_notmatch('BCALL len', instr)
1189
Bram Moolenaard2c61702020-09-06 15:58:36 +02001190 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001191 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001192 assert_match('HasEval\_s*' ..
1193 'if has("eval")\_s*' ..
1194 'echo "yes"\_s*' ..
1195 '\d PUSHS "yes"\_s*' ..
1196 '\d ECHO 1\_s*' ..
1197 'else\_s*' ..
1198 'echo "no"\_s*' ..
1199 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001200 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001201 assert_notmatch('JUMP', instr)
1202
Bram Moolenaard2c61702020-09-06 15:58:36 +02001203 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001204 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001205 assert_match('HasNothing\_s*' ..
1206 'if has("nothing")\_s*' ..
1207 'echo "yes"\_s*' ..
1208 'else\_s*' ..
1209 'echo "no"\_s*' ..
1210 '\d PUSHS "no"\_s*' ..
1211 '\d ECHO 1\_s*' ..
1212 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001213 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001214 assert_notmatch('PUSHS "yes"', instr)
1215 assert_notmatch('JUMP', instr)
1216
Bram Moolenaard2c61702020-09-06 15:58:36 +02001217 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001218 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001219 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001220 'if has("nothing")\_s*' ..
1221 'echo "nothing"\_s*' ..
1222 'elseif has("something")\_s*' ..
1223 'echo "something"\_s*' ..
1224 'elseif has("eval")\_s*' ..
1225 'echo "eval"\_s*' ..
1226 '\d PUSHS "eval"\_s*' ..
1227 '\d ECHO 1\_s*' ..
1228 'elseif has("less").*' ..
1229 'echo "less"\_s*' ..
1230 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001231 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001232 assert_notmatch('PUSHS "nothing"', instr)
1233 assert_notmatch('PUSHS "something"', instr)
1234 assert_notmatch('PUSHS "less"', instr)
1235 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001236
1237 var result: string
1238 var instr_expected: string
1239 if has('gui')
1240 if has('gui_running')
1241 # GUI already running, always returns "yes"
1242 result = "\nyes"
1243 instr_expected = 'HasGuiRunning.*' ..
1244 'if has("gui_running")\_s*' ..
1245 ' echo "yes"\_s*' ..
1246 '\d PUSHS "yes"\_s*' ..
1247 '\d ECHO 1\_s*' ..
1248 'else\_s*' ..
1249 ' echo "no"\_s*' ..
1250 'endif'
1251 else
1252 result = "\nno"
1253 if has('unix')
1254 # GUI not running but can start later, call has()
1255 instr_expected = 'HasGuiRunning.*' ..
1256 'if has("gui_running")\_s*' ..
1257 '\d PUSHS "gui_running"\_s*' ..
1258 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001259 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001260 '\d JUMP_IF_FALSE -> \d\_s*' ..
1261 ' echo "yes"\_s*' ..
1262 '\d PUSHS "yes"\_s*' ..
1263 '\d ECHO 1\_s*' ..
1264 'else\_s*' ..
1265 '\d JUMP -> \d\_s*' ..
1266 ' echo "no"\_s*' ..
1267 '\d PUSHS "no"\_s*' ..
1268 '\d ECHO 1\_s*' ..
1269 'endif'
1270 else
1271 # GUI not running, always return "no"
1272 instr_expected = 'HasGuiRunning.*' ..
1273 'if has("gui_running")\_s*' ..
1274 ' echo "yes"\_s*' ..
1275 'else\_s*' ..
1276 ' echo "no"\_s*' ..
1277 '\d PUSHS "no"\_s*' ..
1278 '\d ECHO 1\_s*' ..
1279 'endif'
1280 endif
1281 endif
1282 else
1283 # GUI not supported, always return "no"
1284 result = "\nno"
1285 instr_expected = 'HasGuiRunning.*' ..
1286 'if has("gui_running")\_s*' ..
1287 ' echo "yes"\_s*' ..
1288 'else\_s*' ..
1289 ' echo "no"\_s*' ..
1290 '\d PUSHS "no"\_s*' ..
1291 '\d ECHO 1\_s*' ..
1292 'endif'
1293 endif
1294
1295 assert_equal(result, execute('HasGuiRunning()'))
1296 instr = execute('disassemble HasGuiRunning')
1297 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001298enddef
1299
Bram Moolenaarefd88552020-06-18 20:50:10 +02001300def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001301 if 1 < 0
1302 return "maybe"
1303 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001304 if g:cond
1305 return "yes"
1306 else
1307 return "no"
1308 endif
1309enddef
1310
1311def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001312 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001313 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001314 'if 1 < 0\_s*' ..
1315 ' return "maybe"\_s*' ..
1316 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001317 'if g:cond\_s*' ..
1318 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001319 '1 COND2BOOL\_s*' ..
1320 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001321 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001322 '3 PUSHS "yes"\_s*' ..
1323 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001324 'else\_s*' ..
1325 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001326 '5 PUSHS "no"\_s*' ..
1327 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001328 instr)
1329enddef
1330
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001331def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001332 var Funky1: func
1333 var Funky2: func = function("len")
1334 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001335enddef
1336
1337def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001338 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001339 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001340 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001341 '0 PUSHFUNC "\[none]"\_s*' ..
1342 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001343 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001344 '2 PUSHS "len"\_s*' ..
1345 '3 BCALL function(argc 1)\_s*' ..
1346 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001347 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001348 '\d PUSHS "UserFunc"\_s*' ..
1349 '\d BCALL funcref(argc 1)\_s*' ..
1350 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001351 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001352 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001353enddef
1354
1355if has('channel')
1356 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001357 var job1: job
1358 var job2: job = job_start("donothing")
1359 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001360 enddef
1361endif
1362
1363def Test_disassemble_channel()
1364 CheckFeature channel
1365
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001367 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001368 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001369 '\d PUSHJOB "no process"\_s*' ..
1370 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001371 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001372 '\d PUSHS "donothing"\_s*' ..
1373 '\d BCALL job_start(argc 1)\_s*' ..
1374 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001375 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001376 '\d PUSHCHANNEL 0\_s*' ..
1377 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001378 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001379 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001380enddef
1381
Bram Moolenaar62aec932022-01-29 21:45:34 +00001382def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001383 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001384 return F("x")
1385enddef
1386
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001387def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001388 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001389 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001390 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001391 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001392 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001393 '\d STORE $0\_s*' ..
1394 'return F("x")\_s*' ..
1395 '\d PUSHS "x"\_s*' ..
1396 '\d LOAD $0\_s*' ..
1397 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001398 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001399 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001400
Bram Moolenaarac564082020-09-27 19:05:33 +02001401 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001402 instr = execute('disassemble ' .. name)
1403 assert_match('<lambda>\d\+\_s*' ..
1404 'return "X" .. a .. "X"\_s*' ..
1405 '\d PUSHS "X"\_s*' ..
1406 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001407 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001408 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001409 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001410 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001411 '\d RETURN',
1412 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001413enddef
1414
Bram Moolenaar62aec932022-01-29 21:45:34 +00001415def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001416 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001417 return Ref(g:value)
1418enddef
1419
1420def Test_disassemble_lambda_with_type()
1421 g:value = 5
1422 assert_equal(15, LambdaWithType())
1423 var instr = execute('disassemble LambdaWithType')
1424 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001425 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001426 '\d FUNCREF <lambda>\d\+\_s*' ..
1427 '\d STORE $0\_s*' ..
1428 'return Ref(g:value)\_s*' ..
1429 '\d LOADG g:value\_s*' ..
1430 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001431 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001432 '\d PCALL (argc 1)\_s*' ..
1433 '\d RETURN',
1434 instr)
1435enddef
1436
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001437def NestedOuter()
1438 def g:Inner()
1439 echomsg "inner"
1440 enddef
1441enddef
1442
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001443def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001444 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001445 assert_match('NestedOuter\_s*' ..
1446 'def g:Inner()\_s*' ..
1447 'echomsg "inner"\_s*' ..
1448 'enddef\_s*' ..
1449 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001450 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001451 instr)
1452enddef
1453
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001454def NestedDefList()
1455 def
1456 def Info
1457 def /Info
1458 def /Info/
1459enddef
1460
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001461def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001462 var instr = execute('disassemble NestedDefList')
1463 assert_match('NestedDefList\_s*' ..
1464 'def\_s*' ..
1465 '\d DEF \_s*' ..
1466 'def Info\_s*' ..
1467 '\d DEF Info\_s*' ..
1468 'def /Info\_s*' ..
1469 '\d DEF /Info\_s*' ..
1470 'def /Info/\_s*' ..
1471 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001472 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001473 instr)
1474enddef
1475
Bram Moolenaar62aec932022-01-29 21:45:34 +00001476def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001477 if arg == 1 && arg != 2 || arg == 4
1478 return 'yes'
1479 endif
1480 return 'no'
1481enddef
1482
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001483def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001484 assert_equal("yes", AndOr(1))
1485 assert_equal("no", AndOr(2))
1486 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001487 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001488 assert_match('AndOr\_s*' ..
1489 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1490 '\d LOAD arg\[-1]\_s*' ..
1491 '\d PUSHNR 1\_s*' ..
1492 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001493 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001494 '\d LOAD arg\[-1]\_s*' ..
1495 '\d PUSHNR 2\_s*' ..
1496 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001497 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001498 '\d LOAD arg\[-1]\_s*' ..
1499 '\d\+ PUSHNR 4\_s*' ..
1500 '\d\+ COMPAREANY ==\_s*' ..
1501 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001502 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001503enddef
1504
Bram Moolenaar62aec932022-01-29 21:45:34 +00001505def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001506 if true && arg
1507 return "yes"
1508 endif
1509 if false && arg
1510 return "never"
1511 endif
1512 return "no"
1513enddef
1514
1515def Test_disassemble_and_constant()
1516 assert_equal("yes", AndConstant(1))
1517 assert_equal("no", AndConstant(false))
1518 var instr = execute('disassemble AndConstant')
1519 assert_match('AndConstant\_s*' ..
1520 'if true && arg\_s*' ..
1521 '0 LOAD arg\[-1\]\_s*' ..
1522 '1 COND2BOOL\_s*' ..
1523 '2 JUMP_IF_FALSE -> 5\_s*' ..
1524 'return "yes"\_s*' ..
1525 '3 PUSHS "yes"\_s*' ..
1526 '4 RETURN\_s*' ..
1527 'endif\_s*' ..
1528 'if false && arg\_s*' ..
1529 'return "never"\_s*' ..
1530 'endif\_s*' ..
1531 'return "no"\_s*' ..
1532 '5 PUSHS "no"\_s*' ..
1533 '6 RETURN',
1534 instr)
1535enddef
1536
Bram Moolenaar62aec932022-01-29 21:45:34 +00001537def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001538 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001539 for i in range(3)
1540 res->add(i)
1541 endfor
1542 return res
1543enddef
1544
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001545def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001546 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001547 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001548 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001549 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001550 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001551 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001552 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001553
Bram Moolenaarcb790402020-05-15 20:53:00 +02001554 'for i in range(3)\_s*' ..
1555 '\d STORE -1 in $1\_s*' ..
1556 '\d PUSHNR 3\_s*' ..
1557 '\d BCALL range(argc 1)\_s*' ..
1558 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001559 '\d STORE $3\_s*' ..
1560
Bram Moolenaarcb790402020-05-15 20:53:00 +02001561 'res->add(i)\_s*' ..
1562 '\d LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001563 '\d LOAD $3\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001564 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001565 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001566
Bram Moolenaarcb790402020-05-15 20:53:00 +02001567 'endfor\_s*' ..
1568 '\d\+ JUMP -> \d\+\_s*' ..
1569 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001570 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001571enddef
1572
Bram Moolenaar62aec932022-01-29 21:45:34 +00001573def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001574 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001575 for str in eval('["one", "two"]')
1576 res ..= str
1577 endfor
1578 return res
1579enddef
1580
1581def Test_disassemble_for_loop_eval()
1582 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001583 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001584 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001585 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001586 '\d PUSHS ""\_s*' ..
1587 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001588
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001589 'for str in eval(''\["one", "two"\]'')\_s*' ..
1590 '\d STORE -1 in $1\_s*' ..
1591 '\d PUSHS "\["one", "two"\]"\_s*' ..
1592 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001593 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001594 '\d STORE $3\_s*' ..
1595
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001596 'res ..= str\_s*' ..
1597 '\d\+ LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001598 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001599 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001600 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001601 '\d\+ STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001602
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001603 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001604 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001605 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001606
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001607 'return res\_s*' ..
1608 '\d\+ LOAD $0\_s*' ..
1609 '\d\+ RETURN',
1610 instr)
1611enddef
1612
Bram Moolenaar62aec932022-01-29 21:45:34 +00001613def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001614 for [x1, x2] in [[1, 2], [3, 4]]
1615 echo x1 x2
1616 endfor
1617enddef
1618
1619def Test_disassemble_for_loop_unpack()
1620 var instr = execute('disassemble ForLoopUnpack')
1621 assert_match('ForLoopUnpack\_s*' ..
1622 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1623 '\d\+ STORE -1 in $0\_s*' ..
1624 '\d\+ PUSHNR 1\_s*' ..
1625 '\d\+ PUSHNR 2\_s*' ..
1626 '\d\+ NEWLIST size 2\_s*' ..
1627 '\d\+ PUSHNR 3\_s*' ..
1628 '\d\+ PUSHNR 4\_s*' ..
1629 '\d\+ NEWLIST size 2\_s*' ..
1630 '\d\+ NEWLIST size 2\_s*' ..
1631 '\d\+ FOR $0 -> 16\_s*' ..
1632 '\d\+ UNPACK 2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001633 '\d\+ STORE $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001634 '\d\+ STORE $3\_s*' ..
1635
Bram Moolenaar792f7862020-11-23 08:31:18 +01001636 'echo x1 x2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001637 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001638 '\d\+ LOAD $3\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001639 '\d\+ ECHO 2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001640
Bram Moolenaar792f7862020-11-23 08:31:18 +01001641 'endfor\_s*' ..
1642 '\d\+ JUMP -> 8\_s*' ..
1643 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001644 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001645 instr)
1646enddef
1647
Bram Moolenaar62aec932022-01-29 21:45:34 +00001648def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001649 for nr in [1, 2]
1650 try
1651 echo "ok"
1652 try
1653 echo "deeper"
1654 catch
1655 continue
1656 endtry
1657 catch
1658 echo "not ok"
1659 endtry
1660 endfor
1661enddef
1662
1663def Test_disassemble_for_loop_continue()
1664 var instr = execute('disassemble ForLoopContinue')
1665 assert_match('ForLoopContinue\_s*' ..
1666 'for nr in \[1, 2]\_s*' ..
1667 '0 STORE -1 in $0\_s*' ..
1668 '1 PUSHNR 1\_s*' ..
1669 '2 PUSHNR 2\_s*' ..
1670 '3 NEWLIST size 2\_s*' ..
1671 '4 FOR $0 -> 22\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001672 '5 STORE $2\_s*' ..
1673
Bram Moolenaarc150c092021-02-13 15:02:46 +01001674 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001675 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001676
Bram Moolenaarc150c092021-02-13 15:02:46 +01001677 'echo "ok"\_s*' ..
1678 '7 PUSHS "ok"\_s*' ..
1679 '8 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001680
Bram Moolenaarc150c092021-02-13 15:02:46 +01001681 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001682 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001683
Bram Moolenaarc150c092021-02-13 15:02:46 +01001684 'echo "deeper"\_s*' ..
1685 '10 PUSHS "deeper"\_s*' ..
1686 '11 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001687
Bram Moolenaarc150c092021-02-13 15:02:46 +01001688 'catch\_s*' ..
1689 '12 JUMP -> 15\_s*' ..
1690 '13 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001691
Bram Moolenaarc150c092021-02-13 15:02:46 +01001692 'continue\_s*' ..
1693 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001694
Bram Moolenaarc150c092021-02-13 15:02:46 +01001695 'endtry\_s*' ..
1696 '15 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001697
Bram Moolenaarc150c092021-02-13 15:02:46 +01001698 'catch\_s*' ..
1699 '16 JUMP -> 20\_s*' ..
1700 '17 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001701
Bram Moolenaarc150c092021-02-13 15:02:46 +01001702 'echo "not ok"\_s*' ..
1703 '18 PUSHS "not ok"\_s*' ..
1704 '19 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001705
Bram Moolenaarc150c092021-02-13 15:02:46 +01001706 'endtry\_s*' ..
1707 '20 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001708
Bram Moolenaarc150c092021-02-13 15:02:46 +01001709 'endfor\_s*' ..
1710 '21 JUMP -> 4\_s*' ..
1711 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001712 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001713 instr)
1714enddef
1715
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001716let g:number = 42
1717
Bram Moolenaar62aec932022-01-29 21:45:34 +00001718def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001719 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001720enddef
1721
1722def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001723 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001724 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001725 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001726 '\d PUSHNR 23\_s*' ..
1727 '\d LOADG g:number\_s*' ..
1728 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1729 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001730 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001731 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001732 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001733 instr)
1734enddef
1735
Bram Moolenaar62aec932022-01-29 21:45:34 +00001736def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001737 var nr = 3
1738 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001739 nrres = nr - 7
1740 nrres = nr * 7
1741 nrres = nr / 7
1742 nrres = nr % 7
1743
Bram Moolenaarac564082020-09-27 19:05:33 +02001744 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001745 anyres = g:number - 7
1746 anyres = g:number * 7
1747 anyres = g:number / 7
1748 anyres = g:number % 7
1749
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001750 var fl = 3.0
1751 var flres = fl + 7.0
1752 flres = fl - 7.0
1753 flres = fl * 7.0
1754 flres = fl / 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001755enddef
1756
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001757def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001758 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001759 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001760 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001761 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001762 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001763 '\d LOAD $0.*' ..
1764 '\d PUSHNR 7.*' ..
1765 '\d OPNR +.*' ..
1766 '\d STORE $1.*' ..
1767 'nrres = nr - 7.*' ..
1768 '\d OPNR -.*' ..
1769 'nrres = nr \* 7.*' ..
1770 '\d OPNR \*.*' ..
1771 'nrres = nr / 7.*' ..
1772 '\d OPNR /.*' ..
1773 'nrres = nr % 7.*' ..
1774 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001775 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001776 '\d LOADG g:number.*' ..
1777 '\d PUSHNR 7.*' ..
1778 '\d OPANY +.*' ..
1779 '\d STORE $2.*' ..
1780 'anyres = g:number - 7.*' ..
1781 '\d OPANY -.*' ..
1782 'anyres = g:number \* 7.*' ..
1783 '\d OPANY \*.*' ..
1784 'anyres = g:number / 7.*' ..
1785 '\d OPANY /.*' ..
1786 'anyres = g:number % 7.*' ..
1787 '\d OPANY %.*',
1788 instr)
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001789 assert_match('Computing.*' ..
1790 'var fl = 3.0.*' ..
1791 '\d PUSHF 3.0.*' ..
1792 '\d STORE $3.*' ..
1793 'var flres = fl + 7.0.*' ..
1794 '\d LOAD $3.*' ..
1795 '\d PUSHF 7.0.*' ..
1796 '\d OPFLOAT +.*' ..
1797 '\d STORE $4.*' ..
1798 'flres = fl - 7.0.*' ..
1799 '\d OPFLOAT -.*' ..
1800 'flres = fl \* 7.0.*' ..
1801 '\d OPFLOAT \*.*' ..
1802 'flres = fl / 7.0.*' ..
1803 '\d OPFLOAT /.*',
1804 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001805enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001806
Bram Moolenaar62aec932022-01-29 21:45:34 +00001807def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001808 var reslist = [1, 2] + [3, 4]
1809 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001810enddef
1811
1812def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001813 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001814 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001815 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001816 '\d PUSHNR 1.*' ..
1817 '\d PUSHNR 2.*' ..
1818 '\d NEWLIST size 2.*' ..
1819 '\d PUSHNR 3.*' ..
1820 '\d PUSHNR 4.*' ..
1821 '\d NEWLIST size 2.*' ..
1822 '\d ADDLIST.*' ..
1823 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001824 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001825 '\d PUSHBLOB 0z1122.*' ..
1826 '\d PUSHBLOB 0z3344.*' ..
1827 '\d ADDBLOB.*' ..
1828 '\d STORE $.*',
1829 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001830enddef
1831
1832let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001833def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001834 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001835 return res
1836enddef
1837
1838def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001839 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001840 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001841 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001842 '\d LOADG g:aa.*' ..
1843 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001844 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001845 '\d CONCAT.*' ..
1846 '\d STORE $.*',
1847 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001848 assert_equal('aabb', ConcatString())
1849enddef
1850
Bram Moolenaar62aec932022-01-29 21:45:34 +00001851def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001852 var s = "abcd"
1853 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001854 return res
1855enddef
1856
1857def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001858 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001859 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001860 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001861 '\d PUSHS "abcd"\_s*' ..
1862 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001863 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001864 '\d LOAD $0\_s*' ..
1865 '\d PUSHNR 1\_s*' ..
1866 '\d STRINDEX\_s*' ..
1867 '\d STORE $1\_s*',
1868 instr)
1869 assert_equal('b', StringIndex())
1870enddef
1871
Bram Moolenaar62aec932022-01-29 21:45:34 +00001872def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001873 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001874 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001875 return res
1876enddef
1877
1878def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001879 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001880 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001881 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001882 '\d PUSHS "abcd"\_s*' ..
1883 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001884 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001885 '\d LOAD $0\_s*' ..
1886 '\d PUSHNR 1\_s*' ..
1887 '\d PUSHNR 8\_s*' ..
1888 '\d STRSLICE\_s*' ..
1889 '\d STORE $1\_s*',
1890 instr)
1891 assert_equal('bcd', StringSlice())
1892enddef
1893
Bram Moolenaar62aec932022-01-29 21:45:34 +00001894def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001895 var l = [1, 2, 3]
1896 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001897 return res
1898enddef
1899
1900def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001901 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001902 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001903 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001904 '\d PUSHNR 1\_s*' ..
1905 '\d PUSHNR 2\_s*' ..
1906 '\d PUSHNR 3\_s*' ..
1907 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001908 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001909 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001910 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001911 '\d LOAD $0\_s*' ..
1912 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001913 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001914 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001915 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001916 assert_equal(2, ListIndex())
1917enddef
1918
Bram Moolenaar62aec932022-01-29 21:45:34 +00001919def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001920 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001921 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001922 return res
1923enddef
1924
1925def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001926 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001927 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001928 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001929 '\d PUSHNR 1\_s*' ..
1930 '\d PUSHNR 2\_s*' ..
1931 '\d PUSHNR 3\_s*' ..
1932 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001933 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001934 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001935 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001936 '\d LOAD $0\_s*' ..
1937 '\d PUSHNR 1\_s*' ..
1938 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001939 '\d\+ LISTSLICE\_s*' ..
1940 '\d\+ SETTYPE list<number>\_s*' ..
1941 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001942 instr)
1943 assert_equal([2, 3], ListSlice())
1944enddef
1945
Bram Moolenaar62aec932022-01-29 21:45:34 +00001946def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001947 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001948 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001949 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001950 return res
1951enddef
1952
1953def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001954 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001955 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001956 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001957 '\d PUSHS "item"\_s*' ..
1958 '\d PUSHNR 1\_s*' ..
1959 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001960 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001961 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001962 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001963 '\d\+ LOAD $0\_s*' ..
1964 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001965 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001966 '\d\+ STORE $1\_s*' ..
1967 'res = d\["item"\]\_s*' ..
1968 '\d\+ LOAD $0\_s*' ..
1969 '\d\+ PUSHS "item"\_s*' ..
1970 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001971 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001972 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001973 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001974 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001975enddef
1976
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001977let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001978def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001979 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001980 return res
1981enddef
1982
1983def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001984 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001985 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001986 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001987 '\d LOADG g:somelist\_s*' ..
1988 '\d PUSHNR 2\_s*' ..
1989 '\d ANYINDEX\_s*' ..
1990 '\d STORE $0\_s*' ..
1991 'return res\_s*' ..
1992 '\d LOAD $0\_s*' ..
1993 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1994 '\d RETURN',
1995 instr)
1996 assert_equal(3, AnyIndex())
1997enddef
1998
Bram Moolenaar62aec932022-01-29 21:45:34 +00001999def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01002000 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002001 return res
2002enddef
2003
2004def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02002005 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002006 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01002007 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002008 '\d LOADG g:somelist\_s*' ..
2009 '\d PUSHNR 1\_s*' ..
2010 '\d PUSHNR 3\_s*' ..
2011 '\d ANYSLICE\_s*' ..
2012 '\d STORE $0\_s*' ..
2013 'return res\_s*' ..
2014 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02002015 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002016 '\d RETURN',
2017 instr)
2018 assert_equal([2, 3, 4], AnySlice())
2019enddef
2020
Bram Moolenaar62aec932022-01-29 21:45:34 +00002021def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002022 g:nr = 9
2023 var plus = +g:nr
2024 var minus = -g:nr
2025 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002026enddef
2027
2028def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02002029 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002030 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002031 'g:nr = 9\_s*' ..
2032 '\d PUSHNR 9\_s*' ..
2033 '\d STOREG g:nr\_s*' ..
2034 'var plus = +g:nr\_s*' ..
2035 '\d LOADG g:nr\_s*' ..
2036 '\d CHECKTYPE number stack\[-1\]\_s*' ..
2037 '\d STORE $0\_s*' ..
2038 'var minus = -g:nr\_s*' ..
2039 '\d LOADG g:nr\_s*' ..
2040 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002041 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002042 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002043 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002044 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002045enddef
2046
Bram Moolenaar62aec932022-01-29 21:45:34 +00002047def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02002048 var flag = true
2049 var invert = !flag
2050 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002051 return res
2052enddef
2053
2054def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002055 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002056 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002057 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01002058 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002059 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002060 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002061 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02002062 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002063 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002064 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002065 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02002066 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002067 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002068 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002069 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002070enddef
2071
Bram Moolenaar62aec932022-01-29 21:45:34 +00002072def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002073 var one = 1
2074 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002075 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002076 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002077 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002078enddef
2079
2080def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002081 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002082 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002083 'var one = 1\_s*' ..
2084 '0 STORE 1 in $0\_s*' ..
2085 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002086 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002087 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002088 '1 LOAD $0\_s*' ..
2089 '2 COND2BOOL\_s*' ..
2090 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
2091 '4 LOAD $1\_s*' ..
2092 '5 COND2BOOL\_s*' ..
2093 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
2094 '7 LOAD $0\_s*' ..
2095 '8 COND2BOOL\_s*' ..
2096 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002097 'return name\_s*' ..
Bram Moolenaar94722c52023-01-28 19:19:03 +00002098 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01002099 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002100 instr)
2101 assert_equal(true, InvertBool())
2102enddef
2103
Bram Moolenaar62aec932022-01-29 21:45:34 +00002104def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00002105 var t: number
2106 t = 1
2107 t = 0
2108enddef
2109
2110def Test_disassemble_auto_init()
2111 var instr = execute('disassemble AutoInit')
2112 assert_match('AutoInit\_s*' ..
2113 'var t: number\_s*' ..
2114 't = 1\_s*' ..
2115 '\d STORE 1 in $0\_s*' ..
2116 't = 0\_s*' ..
2117 '\d STORE 0 in $0\_s*' ..
2118 '\d\+ RETURN void',
2119 instr)
2120enddef
2121
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002122def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02002123 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02002124 ['true == isFalse', 'COMPAREBOOL =='],
2125 ['true != isFalse', 'COMPAREBOOL !='],
2126 ['v:none == isNull', 'COMPARESPECIAL =='],
2127 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00002128 ['"text" == isNull', 'COMPARENULL =='],
2129 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002130
Bram Moolenaara5565e42020-05-09 15:44:01 +02002131 ['111 == aNumber', 'COMPARENR =='],
2132 ['111 != aNumber', 'COMPARENR !='],
2133 ['111 > aNumber', 'COMPARENR >'],
2134 ['111 < aNumber', 'COMPARENR <'],
2135 ['111 >= aNumber', 'COMPARENR >='],
2136 ['111 <= aNumber', 'COMPARENR <='],
2137 ['111 =~ aNumber', 'COMPARENR =\~'],
2138 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002139
Bram Moolenaara5565e42020-05-09 15:44:01 +02002140 ['"xx" != aString', 'COMPARESTRING !='],
2141 ['"xx" > aString', 'COMPARESTRING >'],
2142 ['"xx" < aString', 'COMPARESTRING <'],
2143 ['"xx" >= aString', 'COMPARESTRING >='],
2144 ['"xx" <= aString', 'COMPARESTRING <='],
2145 ['"xx" =~ aString', 'COMPARESTRING =\~'],
2146 ['"xx" !~ aString', 'COMPARESTRING !\~'],
2147 ['"xx" is aString', 'COMPARESTRING is'],
2148 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002149
Bram Moolenaara5565e42020-05-09 15:44:01 +02002150 ['0z11 == aBlob', 'COMPAREBLOB =='],
2151 ['0z11 != aBlob', 'COMPAREBLOB !='],
2152 ['0z11 is aBlob', 'COMPAREBLOB is'],
2153 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002154
Bram Moolenaara5565e42020-05-09 15:44:01 +02002155 ['[1, 2] == aList', 'COMPARELIST =='],
2156 ['[1, 2] != aList', 'COMPARELIST !='],
2157 ['[1, 2] is aList', 'COMPARELIST is'],
2158 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002159
Bram Moolenaare0de1712020-12-02 17:36:54 +01002160 ['{a: 1} == aDict', 'COMPAREDICT =='],
2161 ['{a: 1} != aDict', 'COMPAREDICT !='],
2162 ['{a: 1} is aDict', 'COMPAREDICT is'],
2163 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002164
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002165 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2166 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2167 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2168 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002169
2170 ['77 == g:xx', 'COMPAREANY =='],
2171 ['77 != g:xx', 'COMPAREANY !='],
2172 ['77 > g:xx', 'COMPAREANY >'],
2173 ['77 < g:xx', 'COMPAREANY <'],
2174 ['77 >= g:xx', 'COMPAREANY >='],
2175 ['77 <= g:xx', 'COMPAREANY <='],
2176 ['77 =~ g:xx', 'COMPAREANY =\~'],
2177 ['77 !~ g:xx', 'COMPAREANY !\~'],
2178 ['77 is g:xx', 'COMPAREANY is'],
2179 ['77 isnot g:xx', 'COMPAREANY isnot'],
2180 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002181 var floatDecl = ''
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01002182 cases->extend([
2183 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2184 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2185 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2186 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2187 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2188 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2189 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2190 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
2191 ])
2192 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002193
Bram Moolenaarac564082020-09-27 19:05:33 +02002194 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002195 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002196 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002197 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002198 ' var isFalse = false',
2199 ' var isNull = v:null',
2200 ' var aNumber = 222',
2201 ' var aString = "yy"',
2202 ' var aBlob = 0z22',
2203 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002204 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002205 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002206 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002207 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002208 ' endif',
2209 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002210 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002211 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002212 assert_match('TestCase' .. nr .. '.*' ..
2213 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2214 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002215 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002216 '\d ' .. case[1] .. '.*' ..
2217 '\d JUMP_IF_FALSE -> \d\+.*',
2218 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002219
2220 nr += 1
2221 endfor
2222
Bram Moolenaar22da5592020-03-19 14:52:20 +01002223 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002224enddef
2225
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002226def s:FalsyOp()
2227 echo g:flag ?? "yes"
2228 echo [] ?? "empty list"
2229 echo "" ?? "empty string"
2230enddef
2231
Dominique Pelle81b573d2022-03-22 21:14:55 +00002232def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002233 var res = execute('disass s:FalsyOp')
2234 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2235 'echo g:flag ?? "yes"\_s*' ..
2236 '0 LOADG g:flag\_s*' ..
2237 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2238 '2 PUSHS "yes"\_s*' ..
2239 '3 ECHO 1\_s*' ..
2240 'echo \[\] ?? "empty list"\_s*' ..
2241 '4 NEWLIST size 0\_s*' ..
2242 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2243 '6 PUSHS "empty list"\_s*' ..
2244 '7 ECHO 1\_s*' ..
2245 'echo "" ?? "empty string"\_s*' ..
2246 '\d\+ PUSHS "empty string"\_s*' ..
2247 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002248 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002249 res)
2250enddef
2251
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002252def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002253 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002254 ['"xx" == "yy"', false],
2255 ['"aa" == "aa"', true],
2256 ['has("eval") ? true : false', true],
2257 ['has("asdf") ? true : false', false],
2258 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002259
Bram Moolenaarac564082020-09-27 19:05:33 +02002260 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002261 for case in cases
2262 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002263 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002264 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002265 ' endif',
2266 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002267 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002268 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002269 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002270 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002271 assert_match('TestCase' .. nr .. '.*' ..
2272 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2273 '\d PUSHNR 42.*' ..
2274 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002275 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002276 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002277 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002278 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002279 assert_match('TestCase' .. nr .. '.*' ..
2280 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2281 'echo 42[ \n]*' ..
2282 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002283 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002284 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002285 endif
2286
2287 nr += 1
2288 endfor
2289
2290 delete('Xdisassemble')
2291enddef
2292
Bram Moolenaarad39c092020-02-26 18:23:43 +01002293def s:Execute()
2294 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002295 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002296 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002297 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002298 execute 'help ' .. tag
2299enddef
2300
2301def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002302 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002303 assert_match('\<SNR>\d*_Execute\_s*' ..
2304 "execute 'help vim9.txt'\\_s*" ..
2305 '\d PUSHS "help vim9.txt"\_s*' ..
2306 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002307 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002308 '\d PUSHS "help vim9.txt"\_s*' ..
2309 '\d STORE $0\_s*' ..
2310 'execute cmd\_s*' ..
2311 '\d LOAD $0\_s*' ..
2312 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002313 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002314 '\d PUSHS "vim9.txt"\_s*' ..
2315 '\d STORE $1\_s*' ..
2316 "execute 'help ' .. tag\\_s*" ..
2317 '\d\+ PUSHS "help "\_s*' ..
2318 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002319 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002320 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002321 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002322 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002323enddef
2324
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002325def s:OnlyRange()
2326 :$
2327 :123
2328 :'m
2329enddef
2330
2331def Test_disassemble_range_only()
2332 var res = execute('disass s:OnlyRange')
2333 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2334 ':$\_s*' ..
2335 '\d EXECRANGE $\_s*' ..
2336 ':123\_s*' ..
2337 '\d EXECRANGE 123\_s*' ..
2338 ':''m\_s*' ..
2339 '\d EXECRANGE ''m\_s*' ..
2340 '\d\+ RETURN void',
2341 res)
2342enddef
2343
Bram Moolenaarf6ced982022-04-28 12:00:49 +01002344def s:StoreRange()
2345 var l = [1, 2]
2346 l[0 : 1] = [7, 8]
2347enddef
2348
2349def Test_disassemble_store_range()
2350 var res = execute('disass s:StoreRange')
2351 assert_match('\<SNR>\d*_StoreRange\_s*' ..
2352 'var l = \[1, 2]\_s*' ..
2353 '\d PUSHNR 1\_s*' ..
2354 '\d PUSHNR 2\_s*' ..
2355 '\d NEWLIST size 2\_s*' ..
2356 '\d SETTYPE list<number>\_s*' ..
2357 '\d STORE $0\_s*' ..
2358
2359 'l\[0 : 1] = \[7, 8]\_s*' ..
2360 '\d\+ PUSHNR 7\_s*' ..
2361 '\d\+ PUSHNR 8\_s*' ..
2362 '\d\+ NEWLIST size 2\_s*' ..
2363 '\d\+ PUSHNR 0\_s*' ..
2364 '\d\+ PUSHNR 1\_s*' ..
2365 '\d\+ LOAD $0\_s*' ..
2366 '\d\+ STORERANGE\_s*' ..
2367 '\d\+ RETURN void',
2368 res)
2369enddef
2370
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002371def s:Echomsg()
2372 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002373 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002374 echoerr 'went' .. 'wrong'
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002375 var local = 'window'
2376 echowin 'in' local
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01002377 :5echowin 'five'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002378enddef
2379
2380def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002381 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002382 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2383 "echomsg 'some' 'message'\\_s*" ..
2384 '\d PUSHS "some"\_s*' ..
2385 '\d PUSHS "message"\_s*' ..
2386 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002387 "echoconsole 'nothing'\\_s*" ..
2388 '\d PUSHS "nothing"\_s*' ..
2389 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002390 "echoerr 'went' .. 'wrong'\\_s*" ..
2391 '\d PUSHS "wentwrong"\_s*' ..
2392 '\d ECHOERR 1\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002393 "var local = 'window'\\_s*" ..
2394 '\d\+ PUSHS "window"\_s*' ..
2395 '\d\+ STORE $0\_s*' ..
2396 "echowin 'in' local\\_s*" ..
2397 '\d\+ PUSHS "in"\_s*' ..
2398 '\d\+ LOAD $0\_s*' ..
2399 '\d\+ ECHOWINDOW 2\_s*' ..
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01002400 ":5echowin 'five'\\_s*" ..
2401 '\d\+ PUSHS "five"\_s*' ..
2402 '\d\+ ECHOWINDOW 1 (5 sec)\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002403 '\d\+ RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002404 res)
2405enddef
2406
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002407def SomeStringArg(arg: string)
2408 echo arg
2409enddef
2410
2411def SomeAnyArg(arg: any)
2412 echo arg
2413enddef
2414
2415def SomeStringArgAndReturn(arg: string): string
2416 return arg
2417enddef
2418
2419def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002420 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002421 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2422 '\d *echo arg.*' ..
2423 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002424 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002425
Bram Moolenaarac564082020-09-27 19:05:33 +02002426 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002427 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2428 '\d *echo arg\_s*' ..
2429 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002430 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002431
Bram Moolenaarac564082020-09-27 19:05:33 +02002432 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002433 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2434 '\d *return arg\_s*' ..
2435 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002436 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002437enddef
2438
Bram Moolenaar09689a02020-05-09 22:50:08 +02002439def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002440 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002441 vim9script
2442 def FuncOne(): string
2443 return FuncTwo()
2444 enddef
2445 def FuncTwo(): string
2446 return 'two'
2447 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002448 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002449 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002450 writefile(lines, 'Xdisassemble', 'D')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002451 source Xdisassemble
2452
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002453 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002454 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2455 'return FuncTwo()\_s*' ..
2456 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002457 '\d RETURN',
2458 g:res_FuncOne)
2459
Bram Moolenaar09689a02020-05-09 22:50:08 +02002460 unlet g:res_FuncOne
2461enddef
2462
Bram Moolenaar61a89812020-05-07 16:58:17 +02002463def s:ConcatStrings(): string
2464 return 'one' .. 'two' .. 'three'
2465enddef
2466
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002467def s:ComputeConst(): number
2468 return 2 + 3 * 4 / 6 + 7
2469enddef
2470
Bram Moolenaar1c747212020-05-09 18:28:34 +02002471def s:ComputeConstParen(): number
2472 return ((2 + 4) * (8 / 2)) / (3 + 4)
2473enddef
2474
Bram Moolenaar61a89812020-05-07 16:58:17 +02002475def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002476 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002477 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2478 "return 'one' .. 'two' .. 'three'\\_s*" ..
2479 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002480 '\d RETURN',
2481 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002482
2483 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002484 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2485 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2486 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002487 '\d RETURN',
2488 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002489
2490 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002491 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2492 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2493 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002494 '\d RETURN',
2495 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002496enddef
2497
Bram Moolenaar389df252020-07-09 21:20:47 +02002498def s:CallAppend()
2499 eval "some text"->append(2)
2500enddef
2501
2502def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002503 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002504 assert_match('<SNR>\d*_CallAppend\_s*' ..
2505 'eval "some text"->append(2)\_s*' ..
2506 '\d PUSHS "some text"\_s*' ..
2507 '\d PUSHNR 2\_s*' ..
2508 '\d SHUFFLE 2 up 1\_s*' ..
2509 '\d BCALL append(argc 2)\_s*' ..
2510 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002511 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002512 res)
2513enddef
2514
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002515
2516def s:SilentMessage()
2517 silent echomsg "text"
2518 silent! echoerr "error"
2519enddef
2520
2521def Test_silent()
2522 var res = execute('disass s:SilentMessage')
2523 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2524 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002525 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002526 '\d PUSHS "text"\_s*' ..
2527 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002528 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002529 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002530 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002531 '\d PUSHS "error"\_s*' ..
2532 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002533 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002534 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002535 res)
2536enddef
2537
2538def s:SilentIf()
2539 silent if 4 == g:five
2540 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002541 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002542enddef
2543
2544def Test_silent_if()
2545 var res = execute('disass s:SilentIf')
2546 assert_match('<SNR>\d*_SilentIf\_s*' ..
2547 'silent if 4 == g:five\_s*' ..
2548 '\d\+ CMDMOD silent\_s*' ..
2549 '\d\+ PUSHNR 4\_s*' ..
2550 '\d\+ LOADG g:five\_s*' ..
2551 '\d\+ COMPAREANY ==\_s*' ..
2552 '\d\+ CMDMOD_REV\_s*' ..
2553 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2554 'silent elseif 4 == g:five\_s*' ..
2555 '\d\+ JUMP -> \d\+\_s*' ..
2556 '\d\+ CMDMOD silent\_s*' ..
2557 '\d\+ PUSHNR 4\_s*' ..
2558 '\d\+ LOADG g:five\_s*' ..
2559 '\d\+ COMPAREANY ==\_s*' ..
2560 '\d\+ CMDMOD_REV\_s*' ..
2561 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002562 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002563 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002564 res)
2565enddef
2566
2567def s:SilentFor()
2568 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002569 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002570enddef
2571
2572def Test_silent_for()
2573 var res = execute('disass s:SilentFor')
2574 assert_match('<SNR>\d*_SilentFor\_s*' ..
2575 'silent for i in \[0\]\_s*' ..
2576 '\d CMDMOD silent\_s*' ..
2577 '\d STORE -1 in $0\_s*' ..
2578 '\d PUSHNR 0\_s*' ..
2579 '\d NEWLIST size 1\_s*' ..
2580 '\d CMDMOD_REV\_s*' ..
2581 '5 FOR $0 -> 8\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002582 '\d STORE $2\_s*' ..
2583
Bram Moolenaarfa984412021-03-25 22:15:28 +01002584 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002585 '\d JUMP -> 5\_s*' ..
2586 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002587 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002588 res)
2589enddef
2590
2591def s:SilentWhile()
2592 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002593 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002594enddef
2595
2596def Test_silent_while()
2597 var res = execute('disass s:SilentWhile')
2598 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2599 'silent while g:not\_s*' ..
2600 '0 CMDMOD silent\_s*' ..
2601 '\d LOADG g:not\_s*' ..
2602 '\d COND2BOOL\_s*' ..
2603 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002604 '\d WHILE $0 -> 6\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002605
Bram Moolenaarfa984412021-03-25 22:15:28 +01002606 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002607 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002608 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002609 res)
2610enddef
2611
2612def s:SilentReturn(): string
2613 silent return "done"
2614enddef
2615
2616def Test_silent_return()
2617 var res = execute('disass s:SilentReturn')
2618 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2619 'silent return "done"\_s*' ..
2620 '\d CMDMOD silent\_s*' ..
2621 '\d PUSHS "done"\_s*' ..
2622 '\d CMDMOD_REV\_s*' ..
2623 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002624 res)
2625enddef
2626
Bram Moolenaarb2049902021-01-24 12:53:53 +01002627def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002628 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002629 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002630 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002631 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002632 return "done"
2633enddef
2634
2635def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002636 if !has('profile')
2637 MissingFeature 'profile'
2638 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002639 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002640 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002641 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002642 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002643 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002644 '\d PUSHS "profiled"\_s*' ..
2645 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002646 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002647 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002648 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002649 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002650 '\d PUSHS "some text"\_s*' ..
2651 '\d STORE $0\_s*' ..
2652 'return "done"\_s*' ..
2653 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002654 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002655 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002656 '\d\+ RETURN\_s*' ..
2657 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002658 res)
2659enddef
2660
Bram Moolenaare99d4222021-06-13 14:01:26 +02002661def Test_debugged()
2662 var res = execute('disass debug s:Profiled')
2663 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002664 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002665 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002666 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002667 '\d PUSHS "profiled"\_s*' ..
2668 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002669 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002670 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002671 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002672 '\d PUSHS "some text"\_s*' ..
2673 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002674 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002675 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002676 '\d PUSHS "done"\_s*' ..
2677 '\d RETURN\_s*',
2678 res)
2679enddef
2680
Bram Moolenaar90770b72021-11-30 20:57:38 +00002681def s:ElseifConstant()
2682 if g:value
2683 echo "one"
2684 elseif true
2685 echo "true"
2686 elseif false
2687 echo "false"
2688 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002689 if 0
2690 echo "yes"
2691 elseif 0
2692 echo "no"
2693 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002694enddef
2695
2696def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002697 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002698 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2699 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002700 '0 DEBUG line 1-1 varcount 0\_s*' ..
2701 '1 LOADG g:value\_s*' ..
2702 '2 COND2BOOL\_s*' ..
2703 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002704 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002705 '4 DEBUG line 2-2 varcount 0\_s*' ..
2706 '5 PUSHS "one"\_s*' ..
2707 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002708 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002709 '7 JUMP -> 12\_s*' ..
2710 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002711 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002712 '9 DEBUG line 4-4 varcount 0\_s*' ..
2713 '10 PUSHS "true"\_s*' ..
2714 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002715 'elseif false\_s*' ..
2716 'echo "false"\_s*' ..
2717 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002718 'if 0\_s*' ..
2719 '12 DEBUG line 8-8 varcount 0\_s*' ..
2720 'echo "yes"\_s*' ..
2721 'elseif 0\_s*' ..
2722 '13 DEBUG line 11-10 varcount 0\_s*' ..
2723 'echo "no"\_s*' ..
2724 'endif\_s*' ..
2725 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002726 res)
2727enddef
2728
Bram Moolenaar093165c2021-08-22 13:35:31 +02002729def s:DebugElseif()
2730 var b = false
2731 if b
2732 eval 1 + 0
2733 silent elseif !b
2734 eval 2 + 0
2735 endif
2736enddef
2737
2738def Test_debug_elseif()
2739 var res = execute('disass debug s:DebugElseif')
2740 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2741 'var b = false\_s*' ..
2742 '0 DEBUG line 1-1 varcount 0\_s*' ..
2743 '1 PUSH false\_s*' ..
2744 '2 STORE $0\_s*' ..
2745
2746 'if b\_s*' ..
2747 '3 DEBUG line 2-2 varcount 1\_s*' ..
2748 '4 LOAD $0\_s*' ..
2749 '5 JUMP_IF_FALSE -> 10\_s*' ..
2750
2751 'eval 1 + 0\_s*' ..
2752 '6 DEBUG line 3-3 varcount 1\_s*' ..
2753 '7 PUSHNR 1\_s*' ..
2754 '8 DROP\_s*' ..
2755
2756 'silent elseif !b\_s*' ..
2757 '9 JUMP -> 20\_s*' ..
2758 '10 CMDMOD silent\_s*' ..
2759 '11 DEBUG line 4-4 varcount 1\_s*' ..
2760 '12 LOAD $0\_s*' ..
2761 '13 INVERT -1 (!val)\_s*' ..
2762 '14 CMDMOD_REV\_s*' ..
2763 '15 JUMP_IF_FALSE -> 20\_s*' ..
2764
2765 'eval 2 + 0\_s*' ..
2766 '16 DEBUG line 5-5 varcount 1\_s*' ..
2767 '17 PUSHNR 2\_s*' ..
2768 '18 DROP\_s*' ..
2769
2770 'endif\_s*' ..
2771 '19 DEBUG line 6-6 varcount 1\_s*' ..
2772 '20 RETURN void*',
2773 res)
2774enddef
2775
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002776def s:DebugFor()
2777 echo "hello"
2778 for a in [0]
2779 echo a
2780 endfor
2781enddef
2782
2783def Test_debug_for()
2784 var res = execute('disass debug s:DebugFor')
2785 assert_match('<SNR>\d*_DebugFor\_s*' ..
2786 'echo "hello"\_s*' ..
2787 '0 DEBUG line 1-1 varcount 0\_s*' ..
2788 '1 PUSHS "hello"\_s*' ..
2789 '2 ECHO 1\_s*' ..
2790
2791 'for a in \[0\]\_s*' ..
2792 '3 DEBUG line 2-2 varcount 0\_s*' ..
2793 '4 STORE -1 in $0\_s*' ..
2794 '5 PUSHNR 0\_s*' ..
2795 '6 NEWLIST size 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002796 '7 DEBUG line 2-2 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002797 '8 FOR $0 -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002798 '9 STORE $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002799
2800 'echo a\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002801 '10 DEBUG line 3-3 varcount 3\_s*' ..
2802 '11 LOAD $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002803 '12 ECHO 1\_s*' ..
2804
2805 'endfor\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002806 '13 DEBUG line 4-4 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002807 '14 JUMP -> 7\_s*' ..
2808 '15 DROP\_s*' ..
2809 '16 RETURN void*',
2810 res)
2811enddef
2812
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002813def s:TryCatch()
2814 try
2815 echo "try"
2816 catch /error/
2817 echo "caught"
2818 endtry
2819enddef
2820
2821def Test_debug_try_catch()
2822 var res = execute('disass debug s:TryCatch')
2823 assert_match('<SNR>\d*_TryCatch\_s*' ..
2824 'try\_s*' ..
2825 '0 DEBUG line 1-1 varcount 0\_s*' ..
2826 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2827 'echo "try"\_s*' ..
2828 '2 DEBUG line 2-2 varcount 0\_s*' ..
2829 '3 PUSHS "try"\_s*' ..
2830 '4 ECHO 1\_s*' ..
2831 'catch /error/\_s*' ..
2832 '5 DEBUG line 3-3 varcount 0\_s*' ..
2833 '6 JUMP -> 17\_s*' ..
2834 '7 DEBUG line 4-3 varcount 0\_s*' ..
2835 '8 PUSH v:exception\_s*' ..
2836 '9 PUSHS "error"\_s*' ..
2837 '10 COMPARESTRING =\~\_s*' ..
2838 '11 JUMP_IF_FALSE -> 17\_s*' ..
2839 '12 CATCH\_s*' ..
2840 'echo "caught"\_s*' ..
2841 '13 DEBUG line 4-4 varcount 0\_s*' ..
2842 '14 PUSHS "caught"\_s*' ..
2843 '15 ECHO 1\_s*' ..
2844 'endtry\_s*' ..
2845 '16 DEBUG line 5-5 varcount 0\_s*' ..
2846 '17 ENDTRY\_s*' ..
2847 '\d\+ RETURN void',
2848 res)
2849enddef
2850
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002851func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002852 echo 'legacy'
2853endfunc
2854
2855def s:UseMember()
2856 var d = {func: Legacy}
2857 var v = d.func()
2858enddef
2859
2860def Test_disassemble_dict_stack()
2861 var res = execute('disass s:UseMember')
2862 assert_match('<SNR>\d*_UseMember\_s*' ..
2863 'var d = {func: Legacy}\_s*' ..
2864 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002865 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002866 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002867 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002868 '\d STORE $0\_s*' ..
2869
2870 'var v = d.func()\_s*' ..
2871 '\d LOAD $0\_s*' ..
2872 '\d MEMBER func\_s*' ..
2873 '\d PCALL top (argc 0)\_s*' ..
2874 '\d PCALL end\_s*' ..
2875 '\d CLEARDICT\_s*' ..
2876 '\d\+ STORE $1\_s*' ..
2877 '\d\+ RETURN void*',
2878 res)
2879enddef
2880
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002881def s:RetLegacy(): string
2882 legacy return "yes"
2883enddef
2884
2885def Test_disassemble_return_legacy()
2886 var res = execute('disass s:RetLegacy')
2887 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2888 'legacy return "yes"\_s*' ..
2889 '\d CMDMOD legacy\_s*' ..
2890 '\d EVAL legacy "yes"\_s*' ..
2891 '\d CHECKTYPE string stack\[-1]\_s*' ..
2892 '\d CMDMOD_REV\_s*' ..
2893 '\d RETURN',
2894 res)
2895enddef
2896
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002897def s:EchoMessages()
2898 echohl ErrorMsg | echom v:exception | echohl NONE
2899enddef
2900
2901def Test_disassemble_nextcmd()
2902 # splitting commands and removing trailing blanks should not change the line
2903 var res = execute('disass s:EchoMessages')
2904 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2905 'echohl ErrorMsg | echom v:exception | echohl NONE',
2906 res)
2907enddef
2908
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002909def Test_disassemble_after_reload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002910 var lines =<< trim END
2911 vim9script
2912 if exists('g:ThisFunc')
2913 finish
2914 endif
2915 var name: any
2916 def g:ThisFunc(): number
2917 g:name = name
2918 return 0
2919 enddef
2920 def g:ThatFunc(): number
2921 name = g:name
2922 return 0
2923 enddef
2924 END
2925 lines->writefile('Xreload.vim', 'D')
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002926
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002927 source Xreload.vim
2928 g:ThisFunc()
2929 g:ThatFunc()
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002930
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002931 source Xreload.vim
2932 var res = execute('disass g:ThisFunc')
2933 assert_match('ThisFunc\_s*' ..
2934 'g:name = name\_s*' ..
2935 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2936 '\d STOREG g:name\_s*' ..
2937 'return 0\_s*' ..
2938 '\d PUSHNR 0\_s*' ..
2939 '\d RETURN\_s*',
2940 res)
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002941
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002942 res = execute('disass g:ThatFunc')
2943 assert_match('ThatFunc\_s*' ..
2944 'name = g:name\_s*' ..
2945 '\d LOADG g:name\_s*' ..
2946 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2947 'return 0\_s*' ..
2948 '\d PUSHNR 0\_s*' ..
2949 '\d RETURN\_s*',
2950 res)
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002951
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002952 delfunc g:ThisFunc
2953 delfunc g:ThatFunc
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002954enddef
2955
LemonBoy2eaef102022-05-06 13:14:50 +01002956def s:MakeString(x: number): string
2957 return $"x={x} x^2={x * x}"
2958enddef
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002959
LemonBoy2eaef102022-05-06 13:14:50 +01002960def Test_disassemble_string_interp()
2961 var instr = execute('disassemble s:MakeString')
2962 assert_match('MakeString\_s*' ..
2963 'return $"x={x} x^2={x \* x}"\_s*' ..
2964 '0 PUSHS "x="\_s*' ..
2965 '1 LOAD arg\[-1\]\_s*' ..
2966 '2 2STRING stack\[-1\]\_s*' ..
2967 '3 PUSHS " x^2="\_s*' ..
2968 '4 LOAD arg\[-1\]\_s*' ..
2969 '5 LOAD arg\[-1\]\_s*' ..
2970 '6 OPNR \*\_s*' ..
2971 '7 2STRING stack\[-1\]\_s*' ..
2972 '8 CONCAT size 4\_s*' ..
2973 '9 RETURN\_s*',
2974 instr)
2975enddef
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002976
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01002977def BitShift()
2978 var a = 1 << 2
2979 var b = 8 >> 1
2980 var c = a << b
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02002981 var d = b >> a
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01002982enddef
2983
2984def Test_disassemble_bitshift()
2985 var instr = execute('disassemble BitShift')
2986 assert_match('BitShift\_s*' ..
2987 'var a = 1 << 2\_s*' ..
2988 '0 STORE 4 in $0\_s*' ..
2989 'var b = 8 >> 1\_s*' ..
2990 '1 STORE 4 in $1\_s*' ..
2991 'var c = a << b\_s*' ..
2992 '2 LOAD $0\_s*' ..
2993 '3 LOAD $1\_s*' ..
2994 '4 OPNR <<\_s*' ..
2995 '5 STORE $2\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02002996 'var d = b >> a\_s*' ..
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01002997 '6 LOAD $1\_s*' ..
2998 '7 LOAD $0\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02002999 '8 OPNR >>\_s*' ..
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01003000 '9 STORE $3\_s*' ..
3001 '10 RETURN void', instr)
3002enddef
3003
Bram Moolenaar1d84f762022-09-03 21:35:53 +01003004def s:OneDefer()
3005 defer delete("file")
3006enddef
3007
3008def Test_disassemble_defer()
3009 var instr = execute('disassemble s:OneDefer')
3010 assert_match('OneDefer\_s*' ..
3011 'defer delete("file")\_s*' ..
3012 '\d PUSHFUNC "delete"\_s*' ..
3013 '\d PUSHS "file"\_s*' ..
3014 '\d DEFER 1 args\_s*' ..
3015 '\d RETURN\_s*',
3016 instr)
3017enddef
3018
Bram Moolenaar38f1ab32023-02-21 20:09:46 +00003019def Test_disassemble_class_function()
3020 var lines =<< trim END
3021 vim9script
3022
3023 class Cl
3024 static def Fc(): string
3025 return "x"
3026 enddef
3027 endclass
3028
3029 g:instr = execute('disassemble Cl.Fc')
3030 END
3031 v9.CheckScriptSuccess(lines)
3032 assert_match('Fc\_s*' ..
3033 'return "x"\_s*' ..
3034 '\d PUSHS "x"\_s*' ..
3035 '\d RETURN\_s*',
3036 g:instr)
3037
3038 lines =<< trim END
3039 vim9script
3040
3041 class Cl
3042 def Fo(): string
3043 return "y"
3044 enddef
3045 endclass
3046
3047 g:instr = execute('disassemble Cl.Fo')
3048 END
3049 v9.CheckScriptSuccess(lines)
3050 assert_match('Fo\_s*' ..
3051 'return "y"\_s*' ..
3052 '\d PUSHS "y"\_s*' ..
3053 '\d RETURN\_s*',
3054 g:instr)
3055
3056 unlet g:instr
3057enddef
3058
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003059" Disassemble instructions for using an interface with static and regular member
3060" variables.
3061def Test_disassemble_interface_static_member()
3062 var lines =<< trim END
3063 vim9script
3064 interface I
Doug Kearns74da0ee2023-12-14 20:26:26 +01003065 var o_var: number
3066 var o_var2: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003067 endinterface
3068
3069 class C implements I
Doug Kearns74da0ee2023-12-14 20:26:26 +01003070 public static var s_var: number
3071 var o_var: number
3072 public static var s_var2: number
3073 var o_var2: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003074 endclass
3075
3076 def F1(i: I)
3077 var x: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003078 x = i.o_var
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003079 x = i.o_var2
3080 enddef
3081
3082 def F2(o: C)
3083 var x: number
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003084 x = o.o_var
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003085 x = o.o_var2
3086 enddef
3087
3088 g:instr1 = execute('disassemble F1')
3089 g:instr2 = execute('disassemble F2')
3090 END
3091 v9.CheckScriptSuccess(lines)
3092 assert_match('<SNR>\d*_F1\_s*' ..
3093 'var x: number\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003094 'x = i.o_var\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003095 '0 LOAD arg\[-1\]\_s*' ..
3096 '1 ITF_MEMBER 0 on I\_s*' ..
3097 '2 STORE $0\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003098 'x = i.o_var2\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003099 '3 LOAD arg\[-1\]\_s*' ..
3100 '4 ITF_MEMBER 1 on I\_s*' ..
3101 '5 STORE $0\_s*' ..
3102 '6 RETURN void\_s*',
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003103 g:instr1)
3104 assert_match('<SNR>\d*_F2\_s*' ..
3105 'var x: number\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003106 'x = o.o_var\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003107 '0 LOAD arg\[-1\]\_s*' ..
3108 '1 OBJ_MEMBER 0\_s*' ..
3109 '2 STORE $0\_s*' ..
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003110 'x = o.o_var2\_s*' ..
Yegappan Lakshmanan04054052023-09-10 18:12:56 +02003111 '3 LOAD arg\[-1\]\_s*' ..
3112 '4 OBJ_MEMBER 1\_s*' ..
3113 '5 STORE $0\_s*' ..
3114 '6 RETURN void',
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003115 g:instr2)
3116
3117 unlet g:instr1
3118 unlet g:instr2
3119enddef
3120
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003121" Disassemble instructions for loading and storing class variables
3122def Test_disassemble_class_variable()
3123 var lines =<< trim END
3124 vim9script
3125
3126 class A
Doug Kearns74da0ee2023-12-14 20:26:26 +01003127 public static var val = 10
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003128 def Foo(): number
3129 val = 20
3130 return val
3131 enddef
3132 endclass
3133
3134 g:instr = execute('disassemble A.Foo')
3135 END
3136 v9.CheckScriptSuccess(lines)
3137 assert_match('Foo\_s*' ..
3138 'val = 20\_s*' ..
3139 '0 PUSHNR 20\_s*' ..
3140 '1 STORE CLASSMEMBER A.val\_s*' ..
3141 'return val\_s*' ..
3142 '2 LOAD CLASSMEMBER A.val\_s*' ..
3143 '3 RETURN', g:instr)
3144
3145 unlet g:instr
3146enddef
3147
3148" Disassemble instructions for METHODCALL
3149def Test_disassemble_methodcall()
3150 var lines =<< trim END
3151 vim9script
3152 interface A
3153 def Foo()
3154 endinterface
3155 def Bar(a: A)
3156 a.Foo()
3157 enddef
3158 g:instr = execute('disassemble Bar')
3159 END
3160 v9.CheckScriptSuccess(lines)
3161 assert_match('<SNR>\d*_Bar\_s*' ..
3162 'a.Foo()\_s*' ..
3163 '0 LOAD arg\[-1\]\_s*' ..
3164 '1 METHODCALL A.Foo(argc 0)\_s*' ..
3165 '2 DROP\_s*' ..
3166 '3 RETURN void', g:instr)
3167
3168 unlet g:instr
3169enddef
3170
3171" Disassemble instructions for ISN_JUMP_IF_ARG_NOT_SET
3172def Test_disassemble_ifargnotset()
3173 var lines =<< trim END
3174 vim9script
3175 class A
Doug Kearns74da0ee2023-12-14 20:26:26 +01003176 var val: number = 10
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003177 endclass
3178 g:instr = execute('disassemble A.new')
3179 END
3180 v9.CheckScriptSuccess(lines)
3181 assert_match('new\_s*' ..
3182 '0 NEW A size \d\+\_s*' ..
3183 '1 PUSHNR 10\_s*' ..
3184 '2 STORE_THIS 0\_s*' ..
3185 'ifargisset 0 this.val = val\_s*' ..
3186 '3 JUMP_IF_ARG_NOT_SET arg\[-1\] -> 8\_s*' ..
3187 '4 LOAD arg\[-1\]\_s*' ..
3188 '5 PUSHNR 0\_s*' ..
3189 '6 LOAD $0\_s*' ..
3190 '7 STOREINDEX object\_s*' ..
3191 '8 RETURN object', g:instr)
3192
3193 unlet g:instr
3194enddef
3195
Ernie Raele75fde62023-12-21 17:18:54 +01003196" Disassemble instructions for ISN_COMPAREOBJECT
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003197def Test_disassemble_compare_class_object()
3198 var lines =<< trim END
3199 vim9script
3200 class A
3201 endclass
3202 class B
3203 endclass
3204 def Foo(a: A, b: B)
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003205 if a == b
3206 endif
3207 enddef
3208 g:instr = execute('disassemble Foo')
3209 END
3210 v9.CheckScriptSuccess(lines)
3211 assert_match('<SNR>\d*_Foo\_s*' ..
Ernie Raele75fde62023-12-21 17:18:54 +01003212 'if a == b\_s*' ..
3213 '0 LOAD arg\[-2\]\_s*' ..
3214 '1 LOAD arg\[-1\]\_s*' ..
3215 '2 COMPAREOBJECT ==\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003216 '3 JUMP_IF_FALSE -> 4\_s*' ..
3217 'endif\_s*' ..
Ernie Raele75fde62023-12-21 17:18:54 +01003218 '4 RETURN void', g:instr)
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003219 unlet g:instr
3220enddef
3221
3222" Disassemble instructions for ISN_CHECKTYPE with a float|number
3223def Test_checktype_float()
3224 var lines =<< trim END
3225 vim9script
3226 def Foo()
3227 var f: float = 0.0
3228 var a: any
3229 f += a
3230 enddef
3231 g:instr = execute('disassemble Foo')
3232 END
3233 v9.CheckScriptSuccess(lines)
3234 assert_match('<SNR>\d*_Foo\_s*' ..
3235 'var f: float = 0.0\_s*' ..
3236 '0 PUSHF 0.0\_s*' ..
3237 '1 STORE $0\_s*' ..
3238 'var a: any\_s*' ..
3239 'f += a\_s*' ..
3240 '2 LOAD $0\_s*' ..
3241 '3 LOAD $1\_s*' ..
3242 '4 CHECKTYPE float|number stack\[-1\]\_s*' ..
3243 '5 OPANY +\_s*' ..
3244 '6 STORE $0\_s*' ..
3245 '7 RETURN void', g:instr)
3246 unlet g:instr
3247enddef
3248
3249" Disassemble instructions for ISN_FUNCREF with a class
3250def Test_funcref_with_class()
3251 var lines =<< trim END
3252 vim9script
3253 class A
3254 def Foo()
3255 enddef
3256 endclass
3257 class B extends A
3258 def Foo()
3259 enddef
3260 endclass
3261 def Bar(a: A)
3262 defer a.Foo()
3263 enddef
3264 g:instr = execute('disassemble Bar')
3265 END
3266 v9.CheckScriptSuccess(lines)
3267 assert_match('<SNR>\d*_Bar\_s*' ..
3268 'defer a.Foo()\_s*' ..
3269 '0 LOAD arg\[-1\]\_s*' ..
3270 '1 FUNCREF A.Foo\_s*' ..
Yegappan Lakshmananf3eac692023-10-17 11:00:45 +02003271 '2 DEFER 0 args\_s*' ..
Yegappan Lakshmananf4ee1cb2023-10-09 17:57:27 +02003272 '3 RETURN void', g:instr)
3273 unlet g:instr
3274enddef
3275
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01003276" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker