blob: c918bf6b1269e614c89b6346cddee6cb7ccab5b4 [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
491 enddef
492
493 def Test_disassemble_assign_null()
494 var res = execute('disass s:StoreNull')
495 assert_match('<SNR>\d*_StoreNull\_s*' ..
496 'var ss = null_string\_s*' ..
497 '\d\+ PUSHS "\[NULL\]"\_s*' ..
498 '\d\+ STORE $\d\_s*' ..
499
500 'var bb = null_blob\_s*' ..
501 '\d\+ PUSHBLOB 0z\_s*' ..
502 '\d\+ STORE $\d\_s*' ..
503
504 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100505 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000506 '\d\+ STORE $\d\_s*' ..
507
508 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100509 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000510 '\d\+ STORE $\d\_s*' ..
511
512 'var Ff = null_function\_s*' ..
513 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
514 '\d\+ STORE $\d\_s*' ..
515
516 'var Pp = null_partial\_s*' ..
517 '\d\+ NEWPARTIAL\_s*' ..
518 '\d\+ STORE $\d\_s*' ..
519
520 'var jj = null_job\_s*' ..
521 '\d\+ PUSHJOB "no process"\_s*' ..
522 '\d\+ STORE $\d\_s*' ..
523
524 'var cc = null_channel\_s*' ..
525 '\d\+ PUSHCHANNEL 0\_s*' ..
526 '\d\+ STORE $\d\_s*' ..
527
528 '\d\+ RETURN void',
529 res)
530 enddef
531endif
532
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100533def s:ScriptFuncStoreIndex()
534 var d = {dd: {}}
535 d.dd[0] = 0
536enddef
537
538def Test_disassemble_store_index()
539 var res = execute('disass s:ScriptFuncStoreIndex')
540 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
541 'var d = {dd: {}}\_s*' ..
542 '\d PUSHS "dd"\_s*' ..
543 '\d NEWDICT size 0\_s*' ..
544 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000545 '\d SETTYPE dict<dict<unknown>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100546 '\d STORE $0\_s*' ..
547 'd.dd\[0\] = 0\_s*' ..
548 '\d PUSHNR 0\_s*' ..
549 '\d PUSHNR 0\_s*' ..
550 '\d LOAD $0\_s*' ..
551 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200552 '\d\+ USEDICT\_s*' ..
553 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200554 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100555 res)
556enddef
557
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200558def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200559 var x: string
560 var y: string
561 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200562 [x, y; l] = g:stringlist
563enddef
564
565def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200566 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200567 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200568 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200569 '\d PUSHS "\[NULL\]"\_s*' ..
570 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200571 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200572 '\d PUSHS "\[NULL\]"\_s*' ..
573 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200574 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200575 '\d NEWLIST size 0\_s*' ..
576 '\d STORE $2\_s*' ..
577 '\[x, y; l\] = g:stringlist\_s*' ..
578 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200579 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200580 '\d CHECKLEN >= 2\_s*' ..
581 '\d\+ ITEM 0\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100582 '\d\+ CHECKTYPE string stack\[-1\] var 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200583 '\d\+ STORE $0\_s*' ..
584 '\d\+ ITEM 1\_s*' ..
Bram Moolenaarbd3a9d22022-05-17 16:12:39 +0100585 '\d\+ CHECKTYPE string stack\[-1\] var 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200586 '\d\+ STORE $1\_s*' ..
587 '\d\+ SLICE 2\_s*' ..
588 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200589 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200590 res)
591enddef
592
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200593def s:ListAssignWithOp()
594 var a = 2
595 var b = 3
596 [a, b] += [4, 5]
597enddef
598
599def Test_disassemble_list_assign_with_op()
600 var res = execute('disass s:ListAssignWithOp')
601 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
602 'var a = 2\_s*' ..
603 '\d STORE 2 in $0\_s*' ..
604 'var b = 3\_s*' ..
605 '\d STORE 3 in $1\_s*' ..
606 '\[a, b\] += \[4, 5\]\_s*' ..
607 '\d\+ PUSHNR 4\_s*' ..
608 '\d\+ PUSHNR 5\_s*' ..
609 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200610 '\d\+ LOAD $0\_s*' ..
611 '\d\+ ITEM 0 with op\_s*' ..
612 '\d\+ OPNR +\_s*' ..
613 '\d\+ STORE $0\_s*' ..
614 '\d\+ LOAD $1\_s*' ..
615 '\d\+ ITEM 1 with op\_s*' ..
616 '\d\+ OPNR +\_s*' ..
617 '\d\+ STORE $1\_s*' ..
618 '\d\+ DROP\_s*' ..
619 '\d\+ RETURN void',
620 res)
621enddef
622
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200623def s:ListAdd()
624 var l: list<number> = []
625 add(l, 123)
626 add(l, g:aNumber)
627enddef
628
629def Test_disassemble_list_add()
630 var res = execute('disass s:ListAdd')
631 assert_match('<SNR>\d*_ListAdd\_s*' ..
632 'var l: list<number> = []\_s*' ..
633 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100634 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200635 '\d STORE $0\_s*' ..
636 'add(l, 123)\_s*' ..
637 '\d LOAD $0\_s*' ..
638 '\d PUSHNR 123\_s*' ..
639 '\d LISTAPPEND\_s*' ..
640 '\d DROP\_s*' ..
641 'add(l, g:aNumber)\_s*' ..
642 '\d LOAD $0\_s*' ..
643 '\d\+ LOADG g:aNumber\_s*' ..
644 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
645 '\d\+ LISTAPPEND\_s*' ..
646 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200647 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200648 res)
649enddef
650
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200651def s:BlobAdd()
652 var b: blob = 0z
653 add(b, 123)
654 add(b, g:aNumber)
655enddef
656
657def Test_disassemble_blob_add()
658 var res = execute('disass s:BlobAdd')
659 assert_match('<SNR>\d*_BlobAdd\_s*' ..
660 'var b: blob = 0z\_s*' ..
661 '\d PUSHBLOB 0z\_s*' ..
662 '\d STORE $0\_s*' ..
663 'add(b, 123)\_s*' ..
664 '\d LOAD $0\_s*' ..
665 '\d PUSHNR 123\_s*' ..
666 '\d BLOBAPPEND\_s*' ..
667 '\d DROP\_s*' ..
668 'add(b, g:aNumber)\_s*' ..
669 '\d LOAD $0\_s*' ..
670 '\d\+ LOADG g:aNumber\_s*' ..
671 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
672 '\d\+ BLOBAPPEND\_s*' ..
673 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200674 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200675 res)
676enddef
677
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200678def s:BlobIndexSlice()
679 var b: blob = 0z112233
680 echo b[1]
681 echo b[1 : 2]
682enddef
683
684def Test_disassemble_blob_index_slice()
685 var res = execute('disass s:BlobIndexSlice')
686 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
687 'var b: blob = 0z112233\_s*' ..
688 '\d PUSHBLOB 0z112233\_s*' ..
689 '\d STORE $0\_s*' ..
690 'echo b\[1\]\_s*' ..
691 '\d LOAD $0\_s*' ..
692 '\d PUSHNR 1\_s*' ..
693 '\d BLOBINDEX\_s*' ..
694 '\d ECHO 1\_s*' ..
695 'echo b\[1 : 2\]\_s*' ..
696 '\d LOAD $0\_s*' ..
697 '\d PUSHNR 1\_s*' ..
698 '\d\+ PUSHNR 2\_s*' ..
699 '\d\+ BLOBSLICE\_s*' ..
700 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200701 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200702 res)
703enddef
704
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200705def s:ScriptFuncUnlet()
706 g:somevar = "value"
707 unlet g:somevar
708 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200709 unlet $SOMEVAR
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100710
711 var l = [1, 2, 3]
712 unlet l[2]
713 unlet l[0 : 1]
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200714enddef
715
716def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200717 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200718 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
719 'g:somevar = "value"\_s*' ..
720 '\d PUSHS "value"\_s*' ..
721 '\d STOREG g:somevar\_s*' ..
722 'unlet g:somevar\_s*' ..
723 '\d UNLET g:somevar\_s*' ..
724 'unlet! g:somevar\_s*' ..
725 '\d UNLET! g:somevar\_s*' ..
726 'unlet $SOMEVAR\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100727 '\d UNLETENV $SOMEVAR\_s*' ..
728
729 'var l = \[1, 2, 3]\_s*' ..
730 '\d\+ PUSHNR 1\_s*' ..
731 '\d\+ PUSHNR 2\_s*' ..
732 '\d\+ PUSHNR 3\_s*' ..
733 '\d\+ NEWLIST size 3\_s*' ..
734 '\d\+ SETTYPE list<number>\_s*' ..
735 '\d\+ STORE $0\_s*' ..
736
737 'unlet l\[2]\_s*' ..
738 '\d\+ PUSHNR 2\_s*' ..
739 '\d\+ LOAD $0\_s*' ..
740 '\d\+ UNLETINDEX\_s*' ..
741
742 'unlet l\[0 : 1]\_s*' ..
743 '\d\+ PUSHNR 0\_s*' ..
744 '\d\+ PUSHNR 1\_s*' ..
745 '\d\+ LOAD $0\_s*' ..
746 '\d\+ UNLETRANGE\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200747 res)
748enddef
749
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200750def s:LockLocal()
751 var d = {a: 1}
752 lockvar d.a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100753 const nr = 22
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200754enddef
755
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000756def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200757 var res = execute('disass s:LockLocal')
758 assert_match('<SNR>\d*_LockLocal\_s*' ..
759 'var d = {a: 1}\_s*' ..
760 '\d PUSHS "a"\_s*' ..
761 '\d PUSHNR 1\_s*' ..
762 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000763 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200764 '\d STORE $0\_s*' ..
765 'lockvar d.a\_s*' ..
766 '\d LOAD $0\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100767 '\d LOCKUNLOCK lockvar 2 d.a\_s*' ..
768
769 'const nr = 22\_s*' ..
770 '\d\+ PUSHNR 22\_s*' ..
771 '\d\+ LOCKCONST\_s*' ..
772 '\d\+ STORE $1',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200773 res)
774enddef
775
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100776def s:ScriptFuncTry()
777 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200778 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100779 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200780 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100781 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200782 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100783 endtry
784enddef
785
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100786def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200787 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200788 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
789 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100790 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200791 'echo "yes"\_s*' ..
792 '\d PUSHS "yes"\_s*' ..
793 '\d ECHO 1\_s*' ..
794 'catch /fail/\_s*' ..
795 '\d JUMP -> \d\+\_s*' ..
796 '\d PUSH v:exception\_s*' ..
797 '\d PUSHS "fail"\_s*' ..
798 '\d COMPARESTRING =\~\_s*' ..
799 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
800 '\d CATCH\_s*' ..
801 'echo "no"\_s*' ..
802 '\d\+ PUSHS "no"\_s*' ..
803 '\d\+ ECHO 1\_s*' ..
804 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100805 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200806 'throw "end"\_s*' ..
807 '\d\+ PUSHS "end"\_s*' ..
808 '\d\+ THROW\_s*' ..
809 'endtry\_s*' ..
810 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200811 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100812enddef
813
814def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200815 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100816 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100817enddef
818
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100819def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200820 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200821 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 '\d PUSHNR 1\_s*' ..
824 '\d PUSHS "two"\_s*' ..
825 '\d PUSHNR 333\_s*' ..
826 '\d NEWLIST size 3\_s*' ..
827 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100828 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200829 '\d PUSHS "one"\_s*' ..
830 '\d PUSHNR 1\_s*' ..
831 '\d PUSHS "two"\_s*' ..
832 '\d PUSHS "val"\_s*' ..
833 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200834 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100835enddef
836
Bram Moolenaar62aec932022-01-29 21:45:34 +0000837def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100838 echo arg
839enddef
840
Bram Moolenaar62aec932022-01-29 21:45:34 +0000841func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100842 echo 'nothing'
843endfunc
844
Bram Moolenaar62aec932022-01-29 21:45:34 +0000845func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100846 echo a:arg
847endfunc
848
849def s:ScriptFuncCall(): string
850 changenr()
851 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000852 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100853 FuncWithArg(343)
854 ScriptFuncNew()
855 s:ScriptFuncNew()
856 UserFunc()
857 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200858 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100859 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200860 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100861 FuncRefWithArg("bar")
862 return "yes"
863enddef
864
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100865def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200866 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200867 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
868 'changenr()\_s*' ..
869 '\d BCALL changenr(argc 0)\_s*' ..
870 '\d DROP\_s*' ..
871 'char2nr("abc")\_s*' ..
872 '\d PUSHS "abc"\_s*' ..
873 '\d BCALL char2nr(argc 1)\_s*' ..
874 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000875 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200876 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
877 '\d DROP\_s*' ..
878 'FuncWithArg(343)\_s*' ..
879 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000880 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200881 '\d\+ DROP\_s*' ..
882 'ScriptFuncNew()\_s*' ..
883 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
884 '\d\+ DROP\_s*' ..
885 's:ScriptFuncNew()\_s*' ..
886 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
887 '\d\+ DROP\_s*' ..
888 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000889 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200890 '\d\+ DROP\_s*' ..
891 'UserFuncWithArg("foo")\_s*' ..
892 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000893 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200894 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200895 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200896 '\d\+ PUSHS "UserFunc"\_s*' ..
897 '\d\+ BCALL function(argc 1)\_s*' ..
898 '\d\+ STORE $0\_s*' ..
899 'FuncRef()\_s*' ..
900 '\d\+ LOAD $\d\_s*' ..
901 '\d\+ PCALL (argc 0)\_s*' ..
902 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200903 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200904 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
905 '\d\+ BCALL function(argc 1)\_s*' ..
906 '\d\+ STORE $1\_s*' ..
907 'FuncRefWithArg("bar")\_s*' ..
908 '\d\+ PUSHS "bar"\_s*' ..
909 '\d\+ LOAD $\d\_s*' ..
910 '\d\+ PCALL (argc 1)\_s*' ..
911 '\d\+ DROP\_s*' ..
912 'return "yes"\_s*' ..
913 '\d\+ PUSHS "yes"\_s*' ..
914 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200915 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100916enddef
917
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200918
919def s:CreateRefs()
920 var local = 'a'
921 def Append(arg: string)
922 local ..= arg
923 enddef
924 g:Append = Append
925 def Get(): string
926 return local
927 enddef
928 g:Get = Get
929enddef
930
931def Test_disassemble_closure()
932 CreateRefs()
933 var res = execute('disass g:Append')
934 assert_match('<lambda>\d\_s*' ..
935 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100936 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200937 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100938 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100939 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200940 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200941 res)
942
943 res = execute('disass g:Get')
944 assert_match('<lambda>\d\_s*' ..
945 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100946 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200947 '\d RETURN',
948 res)
949
950 unlet g:Append
951 unlet g:Get
952enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200953
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100954def s:ClosureArg(arg: string)
955 var Ref = () => arg .. "x"
956enddef
957
958def Test_disassemble_closure_arg()
959 var res = execute('disass s:ClosureArg')
960 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
961 'var Ref = () => arg .. "x"\_s*' ..
962 '\d FUNCREF <lambda>\d\+',
963 res)
964 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
965 assert_match('<lambda>\d\+\_s*' ..
966 'return arg .. "x"\_s*' ..
967 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
968 '\d PUSHS "x"\_s*' ..
969 '\d CONCAT size 2\_s*' ..
970 '\d RETURN',
971 lres)
972enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100973
Bram Moolenaar8abb5842022-09-17 12:39:58 +0100974def s:ClosureInLoop()
975 for i in range(5)
976 var ii = i
977 continue
978 break
979 if g:val
980 return
981 endif
982 g:Ref = () => ii
983 continue
984 break
985 if g:val
986 return
987 endif
988 endfor
989enddef
990
991" Mainly check that ENDLOOP is only produced after a closure was created.
992def Test_disassemble_closure_in_loop()
993 var res = execute('disass s:ClosureInLoop')
994 assert_match('<SNR>\d\+_ClosureInLoop\_s*' ..
995 'for i in range(5)\_s*' ..
996 '\d\+ STORE -1 in $0\_s*' ..
997 '\d\+ PUSHNR 5\_s*' ..
998 '\d\+ BCALL range(argc 1)\_s*' ..
999 '\d\+ FOR $0 -> \d\+\_s*' ..
1000 '\d\+ STORE $2\_s*' ..
1001
1002 'var ii = i\_s*' ..
1003 '\d\+ LOAD $2\_s*' ..
1004 '\d\+ STORE $3\_s*' ..
1005
1006 'continue\_s*' ..
1007 '\d\+ JUMP -> \d\+\_s*' ..
1008
1009 'break\_s*' ..
1010 '\d\+ JUMP -> \d\+\_s*' ..
1011
1012 'if g:val\_s*' ..
1013 '\d\+ LOADG g:val\_s*' ..
1014 '\d\+ COND2BOOL\_s*' ..
1015 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1016
1017 ' return\_s*' ..
1018 '\d\+ PUSHNR 0\_s*' ..
1019 '\d\+ RETURN\_s*' ..
1020
1021 'endif\_s*' ..
1022 'g:Ref = () => ii\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001023 '\d\+ FUNCREF <lambda>4 vars $3-$3\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001024 '\d\+ STOREG g:Ref\_s*' ..
1025
1026 'continue\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001027 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001028 '\d\+ JUMP -> \d\+\_s*' ..
1029
1030 'break\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001031 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001032 '\d\+ JUMP -> \d\+\_s*' ..
1033
1034 'if g:val\_s*' ..
1035 '\d\+ LOADG g:val\_s*' ..
1036 '\d\+ COND2BOOL\_s*' ..
1037 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1038
1039 ' return\_s*' ..
1040 '\d\+ PUSHNR 0\_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\+ RETURN\_s*' ..
1043
1044 'endif\_s*' ..
1045 'endfor\_s*' ..
Bram Moolenaarcc341812022-09-19 15:54:34 +01001046 '\d\+ ENDLOOP ref $1 save $3-$3 depth 0\_s*' ..
Bram Moolenaar8abb5842022-09-17 12:39:58 +01001047 '\d\+ JUMP -> \d\+\_s*' ..
1048 '\d\+ DROP\_s*' ..
1049 '\d\+ RETURN void',
1050 res)
1051enddef
1052
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001053def EchoArg(arg: string): string
1054 return arg
1055enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +00001056def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001057 return function('EchoArg')
1058enddef
1059def s:ScriptPCall()
1060 RefThis()("text")
1061enddef
1062
1063def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +02001064 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001065 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
1066 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +00001067 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001068 '\d PUSHS "text"\_s*' ..
1069 '\d PCALL top (argc 1)\_s*' ..
1070 '\d PCALL end\_s*' ..
1071 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001072 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001073 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +02001074enddef
1075
1076
Bram Moolenaara26b9702020-04-18 19:53:28 +02001077def s:FuncWithForwardCall(): string
1078 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001079enddef
1080
1081def DefinedLater(arg: string): string
1082 return arg
1083enddef
1084
1085def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001086 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001087 assert_match('FuncWithForwardCall\_s*' ..
1088 'return g:DefinedLater("yes")\_s*' ..
1089 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001090 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001091 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001092 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001093
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001094 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001095 assert_equal('yes', FuncWithForwardCall())
1096
Bram Moolenaara26b9702020-04-18 19:53:28 +02001097 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001098 assert_match('FuncWithForwardCall\_s*' ..
1099 'return g:DefinedLater("yes")\_s*' ..
1100 '\d PUSHS "yes"\_s*' ..
1101 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001102 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001103 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001104enddef
1105
1106
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001107def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001108 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001109enddef
1110
1111def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +02001112 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001113 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001114 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001115 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001116 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001117 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001118 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001119 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
1120 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001121 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001122 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001123 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001124 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001125 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001126 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001127 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001128 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001129enddef
1130
1131
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001132def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001133 if has("eval")
1134 echo "yes"
1135 else
1136 echo "no"
1137 endif
1138enddef
1139
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001140def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001141 if has("nothing")
1142 echo "yes"
1143 else
1144 echo "no"
1145 endif
1146enddef
1147
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001148def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001149 if has("nothing")
1150 echo "nothing"
1151 elseif has("something")
1152 echo "something"
1153 elseif has("eval")
1154 echo "eval"
1155 elseif has("less")
1156 echo "less"
1157 endif
1158enddef
1159
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001160def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001161 if has("gui_running")
1162 echo "yes"
1163 else
1164 echo "no"
1165 endif
1166enddef
1167
LemonBoy58f331a2022-04-02 21:59:06 +01001168def s:LenConstant(): number
1169 return len("foo") + len("fighters")
1170enddef
1171
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001172def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001173 var instr = execute('disassemble LenConstant')
1174 assert_match('LenConstant\_s*' ..
1175 'return len("foo") + len("fighters")\_s*' ..
1176 '\d PUSHNR 11\_s*',
1177 instr)
1178 assert_notmatch('BCALL len', instr)
1179
Bram Moolenaard2c61702020-09-06 15:58:36 +02001180 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001181 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001182 assert_match('HasEval\_s*' ..
1183 'if has("eval")\_s*' ..
1184 'echo "yes"\_s*' ..
1185 '\d PUSHS "yes"\_s*' ..
1186 '\d ECHO 1\_s*' ..
1187 'else\_s*' ..
1188 'echo "no"\_s*' ..
1189 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001190 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001191 assert_notmatch('JUMP', instr)
1192
Bram Moolenaard2c61702020-09-06 15:58:36 +02001193 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001194 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001195 assert_match('HasNothing\_s*' ..
1196 'if has("nothing")\_s*' ..
1197 'echo "yes"\_s*' ..
1198 'else\_s*' ..
1199 'echo "no"\_s*' ..
1200 '\d PUSHS "no"\_s*' ..
1201 '\d ECHO 1\_s*' ..
1202 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001203 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001204 assert_notmatch('PUSHS "yes"', instr)
1205 assert_notmatch('JUMP', instr)
1206
Bram Moolenaard2c61702020-09-06 15:58:36 +02001207 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001208 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001209 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001210 'if has("nothing")\_s*' ..
1211 'echo "nothing"\_s*' ..
1212 'elseif has("something")\_s*' ..
1213 'echo "something"\_s*' ..
1214 'elseif has("eval")\_s*' ..
1215 'echo "eval"\_s*' ..
1216 '\d PUSHS "eval"\_s*' ..
1217 '\d ECHO 1\_s*' ..
1218 'elseif has("less").*' ..
1219 'echo "less"\_s*' ..
1220 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001221 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001222 assert_notmatch('PUSHS "nothing"', instr)
1223 assert_notmatch('PUSHS "something"', instr)
1224 assert_notmatch('PUSHS "less"', instr)
1225 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001226
1227 var result: string
1228 var instr_expected: string
1229 if has('gui')
1230 if has('gui_running')
1231 # GUI already running, always returns "yes"
1232 result = "\nyes"
1233 instr_expected = 'HasGuiRunning.*' ..
1234 'if has("gui_running")\_s*' ..
1235 ' echo "yes"\_s*' ..
1236 '\d PUSHS "yes"\_s*' ..
1237 '\d ECHO 1\_s*' ..
1238 'else\_s*' ..
1239 ' echo "no"\_s*' ..
1240 'endif'
1241 else
1242 result = "\nno"
1243 if has('unix')
1244 # GUI not running but can start later, call has()
1245 instr_expected = 'HasGuiRunning.*' ..
1246 'if has("gui_running")\_s*' ..
1247 '\d PUSHS "gui_running"\_s*' ..
1248 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001249 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001250 '\d JUMP_IF_FALSE -> \d\_s*' ..
1251 ' echo "yes"\_s*' ..
1252 '\d PUSHS "yes"\_s*' ..
1253 '\d ECHO 1\_s*' ..
1254 'else\_s*' ..
1255 '\d JUMP -> \d\_s*' ..
1256 ' echo "no"\_s*' ..
1257 '\d PUSHS "no"\_s*' ..
1258 '\d ECHO 1\_s*' ..
1259 'endif'
1260 else
1261 # GUI not running, always return "no"
1262 instr_expected = 'HasGuiRunning.*' ..
1263 'if has("gui_running")\_s*' ..
1264 ' echo "yes"\_s*' ..
1265 'else\_s*' ..
1266 ' echo "no"\_s*' ..
1267 '\d PUSHS "no"\_s*' ..
1268 '\d ECHO 1\_s*' ..
1269 'endif'
1270 endif
1271 endif
1272 else
1273 # GUI not supported, always return "no"
1274 result = "\nno"
1275 instr_expected = 'HasGuiRunning.*' ..
1276 'if has("gui_running")\_s*' ..
1277 ' echo "yes"\_s*' ..
1278 'else\_s*' ..
1279 ' echo "no"\_s*' ..
1280 '\d PUSHS "no"\_s*' ..
1281 '\d ECHO 1\_s*' ..
1282 'endif'
1283 endif
1284
1285 assert_equal(result, execute('HasGuiRunning()'))
1286 instr = execute('disassemble HasGuiRunning')
1287 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001288enddef
1289
Bram Moolenaarefd88552020-06-18 20:50:10 +02001290def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001291 if 1 < 0
1292 return "maybe"
1293 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001294 if g:cond
1295 return "yes"
1296 else
1297 return "no"
1298 endif
1299enddef
1300
1301def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001302 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001303 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001304 'if 1 < 0\_s*' ..
1305 ' return "maybe"\_s*' ..
1306 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001307 'if g:cond\_s*' ..
1308 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001309 '1 COND2BOOL\_s*' ..
1310 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001311 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001312 '3 PUSHS "yes"\_s*' ..
1313 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001314 'else\_s*' ..
1315 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001316 '5 PUSHS "no"\_s*' ..
1317 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001318 instr)
1319enddef
1320
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001321def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001322 var Funky1: func
1323 var Funky2: func = function("len")
1324 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001325enddef
1326
1327def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001328 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001329 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001330 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001331 '0 PUSHFUNC "\[none]"\_s*' ..
1332 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001333 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001334 '2 PUSHS "len"\_s*' ..
1335 '3 BCALL function(argc 1)\_s*' ..
1336 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001337 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001338 '\d PUSHS "UserFunc"\_s*' ..
1339 '\d BCALL funcref(argc 1)\_s*' ..
1340 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001341 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001342 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001343enddef
1344
1345if has('channel')
1346 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001347 var job1: job
1348 var job2: job = job_start("donothing")
1349 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001350 enddef
1351endif
1352
1353def Test_disassemble_channel()
1354 CheckFeature channel
1355
Bram Moolenaarac564082020-09-27 19:05:33 +02001356 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001357 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001358 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001359 '\d PUSHJOB "no process"\_s*' ..
1360 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001361 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001362 '\d PUSHS "donothing"\_s*' ..
1363 '\d BCALL job_start(argc 1)\_s*' ..
1364 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001365 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001366 '\d PUSHCHANNEL 0\_s*' ..
1367 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001368 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001369 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001370enddef
1371
Bram Moolenaar62aec932022-01-29 21:45:34 +00001372def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001373 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001374 return F("x")
1375enddef
1376
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001377def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001378 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001379 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001380 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001381 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001382 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001383 '\d STORE $0\_s*' ..
1384 'return F("x")\_s*' ..
1385 '\d PUSHS "x"\_s*' ..
1386 '\d LOAD $0\_s*' ..
1387 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001388 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001389 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001390
Bram Moolenaarac564082020-09-27 19:05:33 +02001391 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001392 instr = execute('disassemble ' .. name)
1393 assert_match('<lambda>\d\+\_s*' ..
1394 'return "X" .. a .. "X"\_s*' ..
1395 '\d PUSHS "X"\_s*' ..
1396 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001397 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001398 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001399 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001400 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001401 '\d RETURN',
1402 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001403enddef
1404
Bram Moolenaar62aec932022-01-29 21:45:34 +00001405def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001406 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001407 return Ref(g:value)
1408enddef
1409
1410def Test_disassemble_lambda_with_type()
1411 g:value = 5
1412 assert_equal(15, LambdaWithType())
1413 var instr = execute('disassemble LambdaWithType')
1414 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001415 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001416 '\d FUNCREF <lambda>\d\+\_s*' ..
1417 '\d STORE $0\_s*' ..
1418 'return Ref(g:value)\_s*' ..
1419 '\d LOADG g:value\_s*' ..
1420 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001421 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001422 '\d PCALL (argc 1)\_s*' ..
1423 '\d RETURN',
1424 instr)
1425enddef
1426
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001427def NestedOuter()
1428 def g:Inner()
1429 echomsg "inner"
1430 enddef
1431enddef
1432
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001433def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001434 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001435 assert_match('NestedOuter\_s*' ..
1436 'def g:Inner()\_s*' ..
1437 'echomsg "inner"\_s*' ..
1438 'enddef\_s*' ..
1439 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001440 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001441 instr)
1442enddef
1443
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001444def NestedDefList()
1445 def
1446 def Info
1447 def /Info
1448 def /Info/
1449enddef
1450
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001451def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001452 var instr = execute('disassemble NestedDefList')
1453 assert_match('NestedDefList\_s*' ..
1454 'def\_s*' ..
1455 '\d DEF \_s*' ..
1456 'def Info\_s*' ..
1457 '\d DEF Info\_s*' ..
1458 'def /Info\_s*' ..
1459 '\d DEF /Info\_s*' ..
1460 'def /Info/\_s*' ..
1461 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001462 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001463 instr)
1464enddef
1465
Bram Moolenaar62aec932022-01-29 21:45:34 +00001466def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001467 if arg == 1 && arg != 2 || arg == 4
1468 return 'yes'
1469 endif
1470 return 'no'
1471enddef
1472
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001473def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001474 assert_equal("yes", AndOr(1))
1475 assert_equal("no", AndOr(2))
1476 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001477 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001478 assert_match('AndOr\_s*' ..
1479 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1480 '\d LOAD arg\[-1]\_s*' ..
1481 '\d PUSHNR 1\_s*' ..
1482 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001483 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001484 '\d LOAD arg\[-1]\_s*' ..
1485 '\d PUSHNR 2\_s*' ..
1486 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001487 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001488 '\d LOAD arg\[-1]\_s*' ..
1489 '\d\+ PUSHNR 4\_s*' ..
1490 '\d\+ COMPAREANY ==\_s*' ..
1491 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001492 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001493enddef
1494
Bram Moolenaar62aec932022-01-29 21:45:34 +00001495def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001496 if true && arg
1497 return "yes"
1498 endif
1499 if false && arg
1500 return "never"
1501 endif
1502 return "no"
1503enddef
1504
1505def Test_disassemble_and_constant()
1506 assert_equal("yes", AndConstant(1))
1507 assert_equal("no", AndConstant(false))
1508 var instr = execute('disassemble AndConstant')
1509 assert_match('AndConstant\_s*' ..
1510 'if true && arg\_s*' ..
1511 '0 LOAD arg\[-1\]\_s*' ..
1512 '1 COND2BOOL\_s*' ..
1513 '2 JUMP_IF_FALSE -> 5\_s*' ..
1514 'return "yes"\_s*' ..
1515 '3 PUSHS "yes"\_s*' ..
1516 '4 RETURN\_s*' ..
1517 'endif\_s*' ..
1518 'if false && arg\_s*' ..
1519 'return "never"\_s*' ..
1520 'endif\_s*' ..
1521 'return "no"\_s*' ..
1522 '5 PUSHS "no"\_s*' ..
1523 '6 RETURN',
1524 instr)
1525enddef
1526
Bram Moolenaar62aec932022-01-29 21:45:34 +00001527def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001528 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001529 for i in range(3)
1530 res->add(i)
1531 endfor
1532 return res
1533enddef
1534
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001535def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001536 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001537 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001538 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001539 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001540 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001541 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001542 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001543
Bram Moolenaarcb790402020-05-15 20:53:00 +02001544 'for i in range(3)\_s*' ..
1545 '\d STORE -1 in $1\_s*' ..
1546 '\d PUSHNR 3\_s*' ..
1547 '\d BCALL range(argc 1)\_s*' ..
1548 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001549 '\d STORE $3\_s*' ..
1550
Bram Moolenaarcb790402020-05-15 20:53:00 +02001551 'res->add(i)\_s*' ..
1552 '\d LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001553 '\d LOAD $3\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001554 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001555 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001556
Bram Moolenaarcb790402020-05-15 20:53:00 +02001557 'endfor\_s*' ..
1558 '\d\+ JUMP -> \d\+\_s*' ..
1559 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001560 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001561enddef
1562
Bram Moolenaar62aec932022-01-29 21:45:34 +00001563def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001564 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001565 for str in eval('["one", "two"]')
1566 res ..= str
1567 endfor
1568 return res
1569enddef
1570
1571def Test_disassemble_for_loop_eval()
1572 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001573 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001574 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001575 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001576 '\d PUSHS ""\_s*' ..
1577 '\d STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001578
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001579 'for str in eval(''\["one", "two"\]'')\_s*' ..
1580 '\d STORE -1 in $1\_s*' ..
1581 '\d PUSHS "\["one", "two"\]"\_s*' ..
1582 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001583 '\d FOR $1 -> \d\+\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001584 '\d STORE $3\_s*' ..
1585
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001586 'res ..= str\_s*' ..
1587 '\d\+ LOAD $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001588 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001589 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001590 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001591 '\d\+ STORE $0\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001592
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001593 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001594 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001595 '\d\+ DROP\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001596
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001597 'return res\_s*' ..
1598 '\d\+ LOAD $0\_s*' ..
1599 '\d\+ RETURN',
1600 instr)
1601enddef
1602
Bram Moolenaar62aec932022-01-29 21:45:34 +00001603def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001604 for [x1, x2] in [[1, 2], [3, 4]]
1605 echo x1 x2
1606 endfor
1607enddef
1608
1609def Test_disassemble_for_loop_unpack()
1610 var instr = execute('disassemble ForLoopUnpack')
1611 assert_match('ForLoopUnpack\_s*' ..
1612 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1613 '\d\+ STORE -1 in $0\_s*' ..
1614 '\d\+ PUSHNR 1\_s*' ..
1615 '\d\+ PUSHNR 2\_s*' ..
1616 '\d\+ NEWLIST size 2\_s*' ..
1617 '\d\+ PUSHNR 3\_s*' ..
1618 '\d\+ PUSHNR 4\_s*' ..
1619 '\d\+ NEWLIST size 2\_s*' ..
1620 '\d\+ NEWLIST size 2\_s*' ..
1621 '\d\+ FOR $0 -> 16\_s*' ..
1622 '\d\+ UNPACK 2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001623 '\d\+ STORE $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001624 '\d\+ STORE $3\_s*' ..
1625
Bram Moolenaar792f7862020-11-23 08:31:18 +01001626 'echo x1 x2\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001627 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001628 '\d\+ LOAD $3\_s*' ..
Bram Moolenaar792f7862020-11-23 08:31:18 +01001629 '\d\+ ECHO 2\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001630
Bram Moolenaar792f7862020-11-23 08:31:18 +01001631 'endfor\_s*' ..
1632 '\d\+ JUMP -> 8\_s*' ..
1633 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001634 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001635 instr)
1636enddef
1637
Bram Moolenaar62aec932022-01-29 21:45:34 +00001638def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001639 for nr in [1, 2]
1640 try
1641 echo "ok"
1642 try
1643 echo "deeper"
1644 catch
1645 continue
1646 endtry
1647 catch
1648 echo "not ok"
1649 endtry
1650 endfor
1651enddef
1652
1653def Test_disassemble_for_loop_continue()
1654 var instr = execute('disassemble ForLoopContinue')
1655 assert_match('ForLoopContinue\_s*' ..
1656 'for nr in \[1, 2]\_s*' ..
1657 '0 STORE -1 in $0\_s*' ..
1658 '1 PUSHNR 1\_s*' ..
1659 '2 PUSHNR 2\_s*' ..
1660 '3 NEWLIST size 2\_s*' ..
1661 '4 FOR $0 -> 22\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001662 '5 STORE $2\_s*' ..
1663
Bram Moolenaarc150c092021-02-13 15:02:46 +01001664 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001665 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001666
Bram Moolenaarc150c092021-02-13 15:02:46 +01001667 'echo "ok"\_s*' ..
1668 '7 PUSHS "ok"\_s*' ..
1669 '8 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001670
Bram Moolenaarc150c092021-02-13 15:02:46 +01001671 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001672 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001673
Bram Moolenaarc150c092021-02-13 15:02:46 +01001674 'echo "deeper"\_s*' ..
1675 '10 PUSHS "deeper"\_s*' ..
1676 '11 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001677
Bram Moolenaarc150c092021-02-13 15:02:46 +01001678 'catch\_s*' ..
1679 '12 JUMP -> 15\_s*' ..
1680 '13 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001681
Bram Moolenaarc150c092021-02-13 15:02:46 +01001682 'continue\_s*' ..
1683 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001684
Bram Moolenaarc150c092021-02-13 15:02:46 +01001685 'endtry\_s*' ..
1686 '15 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001687
Bram Moolenaarc150c092021-02-13 15:02:46 +01001688 'catch\_s*' ..
1689 '16 JUMP -> 20\_s*' ..
1690 '17 CATCH\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001691
Bram Moolenaarc150c092021-02-13 15:02:46 +01001692 'echo "not ok"\_s*' ..
1693 '18 PUSHS "not ok"\_s*' ..
1694 '19 ECHO 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001695
Bram Moolenaarc150c092021-02-13 15:02:46 +01001696 'endtry\_s*' ..
1697 '20 ENDTRY\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01001698
Bram Moolenaarc150c092021-02-13 15:02:46 +01001699 'endfor\_s*' ..
1700 '21 JUMP -> 4\_s*' ..
1701 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001702 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001703 instr)
1704enddef
1705
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001706let g:number = 42
1707
Bram Moolenaar62aec932022-01-29 21:45:34 +00001708def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001709 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001710enddef
1711
1712def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001713 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001714 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001715 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001716 '\d PUSHNR 23\_s*' ..
1717 '\d LOADG g:number\_s*' ..
1718 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1719 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001720 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001721 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001722 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001723 instr)
1724enddef
1725
Bram Moolenaar62aec932022-01-29 21:45:34 +00001726def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001727 var nr = 3
1728 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001729 nrres = nr - 7
1730 nrres = nr * 7
1731 nrres = nr / 7
1732 nrres = nr % 7
1733
Bram Moolenaarac564082020-09-27 19:05:33 +02001734 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001735 anyres = g:number - 7
1736 anyres = g:number * 7
1737 anyres = g:number / 7
1738 anyres = g:number % 7
1739
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001740 var fl = 3.0
1741 var flres = fl + 7.0
1742 flres = fl - 7.0
1743 flres = fl * 7.0
1744 flres = fl / 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001745enddef
1746
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001747def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001748 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001749 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001750 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001751 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001752 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001753 '\d LOAD $0.*' ..
1754 '\d PUSHNR 7.*' ..
1755 '\d OPNR +.*' ..
1756 '\d STORE $1.*' ..
1757 'nrres = nr - 7.*' ..
1758 '\d OPNR -.*' ..
1759 'nrres = nr \* 7.*' ..
1760 '\d OPNR \*.*' ..
1761 'nrres = nr / 7.*' ..
1762 '\d OPNR /.*' ..
1763 'nrres = nr % 7.*' ..
1764 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001765 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001766 '\d LOADG g:number.*' ..
1767 '\d PUSHNR 7.*' ..
1768 '\d OPANY +.*' ..
1769 '\d STORE $2.*' ..
1770 'anyres = g:number - 7.*' ..
1771 '\d OPANY -.*' ..
1772 'anyres = g:number \* 7.*' ..
1773 '\d OPANY \*.*' ..
1774 'anyres = g:number / 7.*' ..
1775 '\d OPANY /.*' ..
1776 'anyres = g:number % 7.*' ..
1777 '\d OPANY %.*',
1778 instr)
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01001779 assert_match('Computing.*' ..
1780 'var fl = 3.0.*' ..
1781 '\d PUSHF 3.0.*' ..
1782 '\d STORE $3.*' ..
1783 'var flres = fl + 7.0.*' ..
1784 '\d LOAD $3.*' ..
1785 '\d PUSHF 7.0.*' ..
1786 '\d OPFLOAT +.*' ..
1787 '\d STORE $4.*' ..
1788 'flres = fl - 7.0.*' ..
1789 '\d OPFLOAT -.*' ..
1790 'flres = fl \* 7.0.*' ..
1791 '\d OPFLOAT \*.*' ..
1792 'flres = fl / 7.0.*' ..
1793 '\d OPFLOAT /.*',
1794 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001795enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001796
Bram Moolenaar62aec932022-01-29 21:45:34 +00001797def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001798 var reslist = [1, 2] + [3, 4]
1799 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001800enddef
1801
1802def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001803 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001804 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001806 '\d PUSHNR 1.*' ..
1807 '\d PUSHNR 2.*' ..
1808 '\d NEWLIST size 2.*' ..
1809 '\d PUSHNR 3.*' ..
1810 '\d PUSHNR 4.*' ..
1811 '\d NEWLIST size 2.*' ..
1812 '\d ADDLIST.*' ..
1813 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001814 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001815 '\d PUSHBLOB 0z1122.*' ..
1816 '\d PUSHBLOB 0z3344.*' ..
1817 '\d ADDBLOB.*' ..
1818 '\d STORE $.*',
1819 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001820enddef
1821
1822let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001823def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001824 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001825 return res
1826enddef
1827
1828def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001829 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001830 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001831 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001832 '\d LOADG g:aa.*' ..
1833 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001834 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001835 '\d CONCAT.*' ..
1836 '\d STORE $.*',
1837 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001838 assert_equal('aabb', ConcatString())
1839enddef
1840
Bram Moolenaar62aec932022-01-29 21:45:34 +00001841def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001842 var s = "abcd"
1843 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001844 return res
1845enddef
1846
1847def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001848 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001849 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001850 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001851 '\d PUSHS "abcd"\_s*' ..
1852 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001853 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001854 '\d LOAD $0\_s*' ..
1855 '\d PUSHNR 1\_s*' ..
1856 '\d STRINDEX\_s*' ..
1857 '\d STORE $1\_s*',
1858 instr)
1859 assert_equal('b', StringIndex())
1860enddef
1861
Bram Moolenaar62aec932022-01-29 21:45:34 +00001862def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001863 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001864 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001865 return res
1866enddef
1867
1868def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001869 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001870 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001871 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001872 '\d PUSHS "abcd"\_s*' ..
1873 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001874 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001875 '\d LOAD $0\_s*' ..
1876 '\d PUSHNR 1\_s*' ..
1877 '\d PUSHNR 8\_s*' ..
1878 '\d STRSLICE\_s*' ..
1879 '\d STORE $1\_s*',
1880 instr)
1881 assert_equal('bcd', StringSlice())
1882enddef
1883
Bram Moolenaar62aec932022-01-29 21:45:34 +00001884def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001885 var l = [1, 2, 3]
1886 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001887 return res
1888enddef
1889
1890def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001891 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001892 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001893 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001894 '\d PUSHNR 1\_s*' ..
1895 '\d PUSHNR 2\_s*' ..
1896 '\d PUSHNR 3\_s*' ..
1897 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001898 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001899 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001900 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001901 '\d LOAD $0\_s*' ..
1902 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001903 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001904 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001905 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001906 assert_equal(2, ListIndex())
1907enddef
1908
Bram Moolenaar62aec932022-01-29 21:45:34 +00001909def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001910 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001911 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001912 return res
1913enddef
1914
1915def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001916 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001917 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001918 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001919 '\d PUSHNR 1\_s*' ..
1920 '\d PUSHNR 2\_s*' ..
1921 '\d PUSHNR 3\_s*' ..
1922 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001923 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001924 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001925 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001926 '\d LOAD $0\_s*' ..
1927 '\d PUSHNR 1\_s*' ..
1928 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001929 '\d\+ LISTSLICE\_s*' ..
1930 '\d\+ SETTYPE list<number>\_s*' ..
1931 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001932 instr)
1933 assert_equal([2, 3], ListSlice())
1934enddef
1935
Bram Moolenaar62aec932022-01-29 21:45:34 +00001936def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001937 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001938 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001939 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001940 return res
1941enddef
1942
1943def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001944 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001945 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001946 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001947 '\d PUSHS "item"\_s*' ..
1948 '\d PUSHNR 1\_s*' ..
1949 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001950 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001951 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001952 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001953 '\d\+ LOAD $0\_s*' ..
1954 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001955 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001956 '\d\+ STORE $1\_s*' ..
1957 'res = d\["item"\]\_s*' ..
1958 '\d\+ LOAD $0\_s*' ..
1959 '\d\+ PUSHS "item"\_s*' ..
1960 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001961 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001962 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001963 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001964 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001965enddef
1966
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001967let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001968def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001969 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001970 return res
1971enddef
1972
1973def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001974 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001975 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001976 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001977 '\d LOADG g:somelist\_s*' ..
1978 '\d PUSHNR 2\_s*' ..
1979 '\d ANYINDEX\_s*' ..
1980 '\d STORE $0\_s*' ..
1981 'return res\_s*' ..
1982 '\d LOAD $0\_s*' ..
1983 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1984 '\d RETURN',
1985 instr)
1986 assert_equal(3, AnyIndex())
1987enddef
1988
Bram Moolenaar62aec932022-01-29 21:45:34 +00001989def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001990 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001991 return res
1992enddef
1993
1994def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001995 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001996 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001997 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001998 '\d LOADG g:somelist\_s*' ..
1999 '\d PUSHNR 1\_s*' ..
2000 '\d PUSHNR 3\_s*' ..
2001 '\d ANYSLICE\_s*' ..
2002 '\d STORE $0\_s*' ..
2003 'return res\_s*' ..
2004 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02002005 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02002006 '\d RETURN',
2007 instr)
2008 assert_equal([2, 3, 4], AnySlice())
2009enddef
2010
Bram Moolenaar62aec932022-01-29 21:45:34 +00002011def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002012 g:nr = 9
2013 var plus = +g:nr
2014 var minus = -g:nr
2015 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002016enddef
2017
2018def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02002019 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002020 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002021 'g:nr = 9\_s*' ..
2022 '\d PUSHNR 9\_s*' ..
2023 '\d STOREG g:nr\_s*' ..
2024 'var plus = +g:nr\_s*' ..
2025 '\d LOADG g:nr\_s*' ..
2026 '\d CHECKTYPE number stack\[-1\]\_s*' ..
2027 '\d STORE $0\_s*' ..
2028 'var minus = -g:nr\_s*' ..
2029 '\d LOADG g:nr\_s*' ..
2030 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002031 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02002032 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002033 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002034 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002035enddef
2036
Bram Moolenaar62aec932022-01-29 21:45:34 +00002037def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02002038 var flag = true
2039 var invert = !flag
2040 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002041 return res
2042enddef
2043
2044def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002045 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002046 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002047 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01002048 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002049 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002050 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002051 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02002052 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002053 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002054 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002055 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02002056 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002057 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002058 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02002059 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01002060enddef
2061
Bram Moolenaar62aec932022-01-29 21:45:34 +00002062def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002063 var one = 1
2064 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002065 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002066 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002067 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002068enddef
2069
2070def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02002071 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002072 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002073 'var one = 1\_s*' ..
2074 '0 STORE 1 in $0\_s*' ..
2075 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002076 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02002077 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00002078 '1 LOAD $0\_s*' ..
2079 '2 COND2BOOL\_s*' ..
2080 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
2081 '4 LOAD $1\_s*' ..
2082 '5 COND2BOOL\_s*' ..
2083 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
2084 '7 LOAD $0\_s*' ..
2085 '8 COND2BOOL\_s*' ..
2086 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02002087 'return name\_s*' ..
Bram Moolenaar94722c52023-01-28 19:19:03 +00002088 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01002089 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02002090 instr)
2091 assert_equal(true, InvertBool())
2092enddef
2093
Bram Moolenaar62aec932022-01-29 21:45:34 +00002094def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00002095 var t: number
2096 t = 1
2097 t = 0
2098enddef
2099
2100def Test_disassemble_auto_init()
2101 var instr = execute('disassemble AutoInit')
2102 assert_match('AutoInit\_s*' ..
2103 'var t: number\_s*' ..
2104 't = 1\_s*' ..
2105 '\d STORE 1 in $0\_s*' ..
2106 't = 0\_s*' ..
2107 '\d STORE 0 in $0\_s*' ..
2108 '\d\+ RETURN void',
2109 instr)
2110enddef
2111
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002112def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02002113 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02002114 ['true == isFalse', 'COMPAREBOOL =='],
2115 ['true != isFalse', 'COMPAREBOOL !='],
2116 ['v:none == isNull', 'COMPARESPECIAL =='],
2117 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00002118 ['"text" == isNull', 'COMPARENULL =='],
2119 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002120
Bram Moolenaara5565e42020-05-09 15:44:01 +02002121 ['111 == aNumber', 'COMPARENR =='],
2122 ['111 != aNumber', 'COMPARENR !='],
2123 ['111 > aNumber', 'COMPARENR >'],
2124 ['111 < aNumber', 'COMPARENR <'],
2125 ['111 >= aNumber', 'COMPARENR >='],
2126 ['111 <= aNumber', 'COMPARENR <='],
2127 ['111 =~ aNumber', 'COMPARENR =\~'],
2128 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002129
Bram Moolenaara5565e42020-05-09 15:44:01 +02002130 ['"xx" != aString', 'COMPARESTRING !='],
2131 ['"xx" > aString', 'COMPARESTRING >'],
2132 ['"xx" < aString', 'COMPARESTRING <'],
2133 ['"xx" >= aString', 'COMPARESTRING >='],
2134 ['"xx" <= aString', 'COMPARESTRING <='],
2135 ['"xx" =~ aString', 'COMPARESTRING =\~'],
2136 ['"xx" !~ aString', 'COMPARESTRING !\~'],
2137 ['"xx" is aString', 'COMPARESTRING is'],
2138 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002139
Bram Moolenaara5565e42020-05-09 15:44:01 +02002140 ['0z11 == aBlob', 'COMPAREBLOB =='],
2141 ['0z11 != aBlob', 'COMPAREBLOB !='],
2142 ['0z11 is aBlob', 'COMPAREBLOB is'],
2143 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002144
Bram Moolenaara5565e42020-05-09 15:44:01 +02002145 ['[1, 2] == aList', 'COMPARELIST =='],
2146 ['[1, 2] != aList', 'COMPARELIST !='],
2147 ['[1, 2] is aList', 'COMPARELIST is'],
2148 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002149
Bram Moolenaare0de1712020-12-02 17:36:54 +01002150 ['{a: 1} == aDict', 'COMPAREDICT =='],
2151 ['{a: 1} != aDict', 'COMPAREDICT !='],
2152 ['{a: 1} is aDict', 'COMPAREDICT is'],
2153 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002154
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002155 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2156 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2157 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2158 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002159
2160 ['77 == g:xx', 'COMPAREANY =='],
2161 ['77 != g:xx', 'COMPAREANY !='],
2162 ['77 > g:xx', 'COMPAREANY >'],
2163 ['77 < g:xx', 'COMPAREANY <'],
2164 ['77 >= g:xx', 'COMPAREANY >='],
2165 ['77 <= g:xx', 'COMPAREANY <='],
2166 ['77 =~ g:xx', 'COMPAREANY =\~'],
2167 ['77 !~ g:xx', 'COMPAREANY !\~'],
2168 ['77 is g:xx', 'COMPAREANY is'],
2169 ['77 isnot g:xx', 'COMPAREANY isnot'],
2170 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002171 var floatDecl = ''
Bram Moolenaar73e28dc2022-09-17 21:08:33 +01002172 cases->extend([
2173 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2174 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2175 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2176 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2177 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2178 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2179 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2180 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
2181 ])
2182 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002183
Bram Moolenaarac564082020-09-27 19:05:33 +02002184 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002185 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002186 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002187 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002188 ' var isFalse = false',
2189 ' var isNull = v:null',
2190 ' var aNumber = 222',
2191 ' var aString = "yy"',
2192 ' var aBlob = 0z22',
2193 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002194 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002195 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002196 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002197 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002198 ' endif',
2199 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002200 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002201 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002202 assert_match('TestCase' .. nr .. '.*' ..
2203 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2204 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002205 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002206 '\d ' .. case[1] .. '.*' ..
2207 '\d JUMP_IF_FALSE -> \d\+.*',
2208 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002209
2210 nr += 1
2211 endfor
2212
Bram Moolenaar22da5592020-03-19 14:52:20 +01002213 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002214enddef
2215
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002216def s:FalsyOp()
2217 echo g:flag ?? "yes"
2218 echo [] ?? "empty list"
2219 echo "" ?? "empty string"
2220enddef
2221
Dominique Pelle81b573d2022-03-22 21:14:55 +00002222def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002223 var res = execute('disass s:FalsyOp')
2224 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2225 'echo g:flag ?? "yes"\_s*' ..
2226 '0 LOADG g:flag\_s*' ..
2227 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2228 '2 PUSHS "yes"\_s*' ..
2229 '3 ECHO 1\_s*' ..
2230 'echo \[\] ?? "empty list"\_s*' ..
2231 '4 NEWLIST size 0\_s*' ..
2232 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2233 '6 PUSHS "empty list"\_s*' ..
2234 '7 ECHO 1\_s*' ..
2235 'echo "" ?? "empty string"\_s*' ..
2236 '\d\+ PUSHS "empty string"\_s*' ..
2237 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002238 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002239 res)
2240enddef
2241
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002242def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002243 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002244 ['"xx" == "yy"', false],
2245 ['"aa" == "aa"', true],
2246 ['has("eval") ? true : false', true],
2247 ['has("asdf") ? true : false', false],
2248 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002249
Bram Moolenaarac564082020-09-27 19:05:33 +02002250 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002251 for case in cases
2252 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002253 ' if ' .. case[0],
Bram Moolenaar2984ed32022-08-20 14:51:17 +01002254 ' echo 42',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002255 ' endif',
2256 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002257 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002258 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002259 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002260 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002261 assert_match('TestCase' .. nr .. '.*' ..
2262 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2263 '\d PUSHNR 42.*' ..
2264 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002265 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002266 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002267 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002268 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002269 assert_match('TestCase' .. nr .. '.*' ..
2270 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2271 'echo 42[ \n]*' ..
2272 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002273 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002274 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002275 endif
2276
2277 nr += 1
2278 endfor
2279
2280 delete('Xdisassemble')
2281enddef
2282
Bram Moolenaarad39c092020-02-26 18:23:43 +01002283def s:Execute()
2284 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002285 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002286 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002287 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002288 execute 'help ' .. tag
2289enddef
2290
2291def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002292 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002293 assert_match('\<SNR>\d*_Execute\_s*' ..
2294 "execute 'help vim9.txt'\\_s*" ..
2295 '\d PUSHS "help vim9.txt"\_s*' ..
2296 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002297 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002298 '\d PUSHS "help vim9.txt"\_s*' ..
2299 '\d STORE $0\_s*' ..
2300 'execute cmd\_s*' ..
2301 '\d LOAD $0\_s*' ..
2302 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002303 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002304 '\d PUSHS "vim9.txt"\_s*' ..
2305 '\d STORE $1\_s*' ..
2306 "execute 'help ' .. tag\\_s*" ..
2307 '\d\+ PUSHS "help "\_s*' ..
2308 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002309 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002310 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002311 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002312 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002313enddef
2314
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002315def s:OnlyRange()
2316 :$
2317 :123
2318 :'m
2319enddef
2320
2321def Test_disassemble_range_only()
2322 var res = execute('disass s:OnlyRange')
2323 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2324 ':$\_s*' ..
2325 '\d EXECRANGE $\_s*' ..
2326 ':123\_s*' ..
2327 '\d EXECRANGE 123\_s*' ..
2328 ':''m\_s*' ..
2329 '\d EXECRANGE ''m\_s*' ..
2330 '\d\+ RETURN void',
2331 res)
2332enddef
2333
Bram Moolenaarf6ced982022-04-28 12:00:49 +01002334def s:StoreRange()
2335 var l = [1, 2]
2336 l[0 : 1] = [7, 8]
2337enddef
2338
2339def Test_disassemble_store_range()
2340 var res = execute('disass s:StoreRange')
2341 assert_match('\<SNR>\d*_StoreRange\_s*' ..
2342 'var l = \[1, 2]\_s*' ..
2343 '\d PUSHNR 1\_s*' ..
2344 '\d PUSHNR 2\_s*' ..
2345 '\d NEWLIST size 2\_s*' ..
2346 '\d SETTYPE list<number>\_s*' ..
2347 '\d STORE $0\_s*' ..
2348
2349 'l\[0 : 1] = \[7, 8]\_s*' ..
2350 '\d\+ PUSHNR 7\_s*' ..
2351 '\d\+ PUSHNR 8\_s*' ..
2352 '\d\+ NEWLIST size 2\_s*' ..
2353 '\d\+ PUSHNR 0\_s*' ..
2354 '\d\+ PUSHNR 1\_s*' ..
2355 '\d\+ LOAD $0\_s*' ..
2356 '\d\+ STORERANGE\_s*' ..
2357 '\d\+ RETURN void',
2358 res)
2359enddef
2360
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002361def s:Echomsg()
2362 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002363 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002364 echoerr 'went' .. 'wrong'
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002365 var local = 'window'
2366 echowin 'in' local
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01002367 :5echowin 'five'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002368enddef
2369
2370def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002371 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002372 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2373 "echomsg 'some' 'message'\\_s*" ..
2374 '\d PUSHS "some"\_s*' ..
2375 '\d PUSHS "message"\_s*' ..
2376 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002377 "echoconsole 'nothing'\\_s*" ..
2378 '\d PUSHS "nothing"\_s*' ..
2379 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002380 "echoerr 'went' .. 'wrong'\\_s*" ..
2381 '\d PUSHS "wentwrong"\_s*' ..
2382 '\d ECHOERR 1\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002383 "var local = 'window'\\_s*" ..
2384 '\d\+ PUSHS "window"\_s*' ..
2385 '\d\+ STORE $0\_s*' ..
2386 "echowin 'in' local\\_s*" ..
2387 '\d\+ PUSHS "in"\_s*' ..
2388 '\d\+ LOAD $0\_s*' ..
2389 '\d\+ ECHOWINDOW 2\_s*' ..
Bram Moolenaarbdc09a12022-10-07 14:31:45 +01002390 ":5echowin 'five'\\_s*" ..
2391 '\d\+ PUSHS "five"\_s*' ..
2392 '\d\+ ECHOWINDOW 1 (5 sec)\_s*' ..
Bram Moolenaar7d7ad7b2022-09-01 16:00:53 +01002393 '\d\+ RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002394 res)
2395enddef
2396
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002397def SomeStringArg(arg: string)
2398 echo arg
2399enddef
2400
2401def SomeAnyArg(arg: any)
2402 echo arg
2403enddef
2404
2405def SomeStringArgAndReturn(arg: string): string
2406 return arg
2407enddef
2408
2409def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002410 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002411 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2412 '\d *echo arg.*' ..
2413 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002414 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002415
Bram Moolenaarac564082020-09-27 19:05:33 +02002416 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002417 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2418 '\d *echo arg\_s*' ..
2419 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002420 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002421
Bram Moolenaarac564082020-09-27 19:05:33 +02002422 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002423 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2424 '\d *return arg\_s*' ..
2425 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002426 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002427enddef
2428
Bram Moolenaar09689a02020-05-09 22:50:08 +02002429def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002430 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002431 vim9script
2432 def FuncOne(): string
2433 return FuncTwo()
2434 enddef
2435 def FuncTwo(): string
2436 return 'two'
2437 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002438 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002439 END
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002440 writefile(lines, 'Xdisassemble', 'D')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002441 source Xdisassemble
2442
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002443 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002444 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2445 'return FuncTwo()\_s*' ..
2446 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002447 '\d RETURN',
2448 g:res_FuncOne)
2449
Bram Moolenaar09689a02020-05-09 22:50:08 +02002450 unlet g:res_FuncOne
2451enddef
2452
Bram Moolenaar61a89812020-05-07 16:58:17 +02002453def s:ConcatStrings(): string
2454 return 'one' .. 'two' .. 'three'
2455enddef
2456
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002457def s:ComputeConst(): number
2458 return 2 + 3 * 4 / 6 + 7
2459enddef
2460
Bram Moolenaar1c747212020-05-09 18:28:34 +02002461def s:ComputeConstParen(): number
2462 return ((2 + 4) * (8 / 2)) / (3 + 4)
2463enddef
2464
Bram Moolenaar61a89812020-05-07 16:58:17 +02002465def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002466 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002467 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2468 "return 'one' .. 'two' .. 'three'\\_s*" ..
2469 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002470 '\d RETURN',
2471 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002472
2473 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002474 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2475 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2476 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002477 '\d RETURN',
2478 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002479
2480 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002481 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2482 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2483 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002484 '\d RETURN',
2485 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002486enddef
2487
Bram Moolenaar389df252020-07-09 21:20:47 +02002488def s:CallAppend()
2489 eval "some text"->append(2)
2490enddef
2491
2492def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002493 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002494 assert_match('<SNR>\d*_CallAppend\_s*' ..
2495 'eval "some text"->append(2)\_s*' ..
2496 '\d PUSHS "some text"\_s*' ..
2497 '\d PUSHNR 2\_s*' ..
2498 '\d SHUFFLE 2 up 1\_s*' ..
2499 '\d BCALL append(argc 2)\_s*' ..
2500 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002501 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002502 res)
2503enddef
2504
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002505
2506def s:SilentMessage()
2507 silent echomsg "text"
2508 silent! echoerr "error"
2509enddef
2510
2511def Test_silent()
2512 var res = execute('disass s:SilentMessage')
2513 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2514 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002515 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002516 '\d PUSHS "text"\_s*' ..
2517 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002518 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002519 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002520 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002521 '\d PUSHS "error"\_s*' ..
2522 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002523 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002524 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002525 res)
2526enddef
2527
2528def s:SilentIf()
2529 silent if 4 == g:five
2530 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002531 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002532enddef
2533
2534def Test_silent_if()
2535 var res = execute('disass s:SilentIf')
2536 assert_match('<SNR>\d*_SilentIf\_s*' ..
2537 'silent if 4 == g:five\_s*' ..
2538 '\d\+ CMDMOD silent\_s*' ..
2539 '\d\+ PUSHNR 4\_s*' ..
2540 '\d\+ LOADG g:five\_s*' ..
2541 '\d\+ COMPAREANY ==\_s*' ..
2542 '\d\+ CMDMOD_REV\_s*' ..
2543 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2544 'silent elseif 4 == g:five\_s*' ..
2545 '\d\+ JUMP -> \d\+\_s*' ..
2546 '\d\+ CMDMOD silent\_s*' ..
2547 '\d\+ PUSHNR 4\_s*' ..
2548 '\d\+ LOADG g:five\_s*' ..
2549 '\d\+ COMPAREANY ==\_s*' ..
2550 '\d\+ CMDMOD_REV\_s*' ..
2551 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002552 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002553 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002554 res)
2555enddef
2556
2557def s:SilentFor()
2558 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002559 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002560enddef
2561
2562def Test_silent_for()
2563 var res = execute('disass s:SilentFor')
2564 assert_match('<SNR>\d*_SilentFor\_s*' ..
2565 'silent for i in \[0\]\_s*' ..
2566 '\d CMDMOD silent\_s*' ..
2567 '\d STORE -1 in $0\_s*' ..
2568 '\d PUSHNR 0\_s*' ..
2569 '\d NEWLIST size 1\_s*' ..
2570 '\d CMDMOD_REV\_s*' ..
2571 '5 FOR $0 -> 8\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002572 '\d STORE $2\_s*' ..
2573
Bram Moolenaarfa984412021-03-25 22:15:28 +01002574 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002575 '\d JUMP -> 5\_s*' ..
2576 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002577 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002578 res)
2579enddef
2580
2581def s:SilentWhile()
2582 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002583 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002584enddef
2585
2586def Test_silent_while()
2587 var res = execute('disass s:SilentWhile')
2588 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2589 'silent while g:not\_s*' ..
2590 '0 CMDMOD silent\_s*' ..
2591 '\d LOADG g:not\_s*' ..
2592 '\d COND2BOOL\_s*' ..
2593 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002594 '\d WHILE $0 -> 6\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002595
Bram Moolenaarfa984412021-03-25 22:15:28 +01002596 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002597 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002598 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002599 res)
2600enddef
2601
2602def s:SilentReturn(): string
2603 silent return "done"
2604enddef
2605
2606def Test_silent_return()
2607 var res = execute('disass s:SilentReturn')
2608 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2609 'silent return "done"\_s*' ..
2610 '\d CMDMOD silent\_s*' ..
2611 '\d PUSHS "done"\_s*' ..
2612 '\d CMDMOD_REV\_s*' ..
2613 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002614 res)
2615enddef
2616
Bram Moolenaarb2049902021-01-24 12:53:53 +01002617def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002618 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002619 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002620 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002621 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002622 return "done"
2623enddef
2624
2625def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002626 if !has('profile')
2627 MissingFeature 'profile'
2628 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002629 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002630 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002631 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002632 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002633 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002634 '\d PUSHS "profiled"\_s*' ..
2635 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002636 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002637 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002638 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002639 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002640 '\d PUSHS "some text"\_s*' ..
2641 '\d STORE $0\_s*' ..
2642 'return "done"\_s*' ..
2643 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002644 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002645 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002646 '\d\+ RETURN\_s*' ..
2647 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002648 res)
2649enddef
2650
Bram Moolenaare99d4222021-06-13 14:01:26 +02002651def Test_debugged()
2652 var res = execute('disass debug s:Profiled')
2653 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002654 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002655 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002656 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002657 '\d PUSHS "profiled"\_s*' ..
2658 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002659 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002660 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002661 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002662 '\d PUSHS "some text"\_s*' ..
2663 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002664 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002665 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002666 '\d PUSHS "done"\_s*' ..
2667 '\d RETURN\_s*',
2668 res)
2669enddef
2670
Bram Moolenaar90770b72021-11-30 20:57:38 +00002671def s:ElseifConstant()
2672 if g:value
2673 echo "one"
2674 elseif true
2675 echo "true"
2676 elseif false
2677 echo "false"
2678 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002679 if 0
2680 echo "yes"
2681 elseif 0
2682 echo "no"
2683 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002684enddef
2685
2686def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002687 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002688 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2689 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002690 '0 DEBUG line 1-1 varcount 0\_s*' ..
2691 '1 LOADG g:value\_s*' ..
2692 '2 COND2BOOL\_s*' ..
2693 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002694 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002695 '4 DEBUG line 2-2 varcount 0\_s*' ..
2696 '5 PUSHS "one"\_s*' ..
2697 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002698 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002699 '7 JUMP -> 12\_s*' ..
2700 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002701 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002702 '9 DEBUG line 4-4 varcount 0\_s*' ..
2703 '10 PUSHS "true"\_s*' ..
2704 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002705 'elseif false\_s*' ..
2706 'echo "false"\_s*' ..
2707 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002708 'if 0\_s*' ..
2709 '12 DEBUG line 8-8 varcount 0\_s*' ..
2710 'echo "yes"\_s*' ..
2711 'elseif 0\_s*' ..
2712 '13 DEBUG line 11-10 varcount 0\_s*' ..
2713 'echo "no"\_s*' ..
2714 'endif\_s*' ..
2715 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002716 res)
2717enddef
2718
Bram Moolenaar093165c2021-08-22 13:35:31 +02002719def s:DebugElseif()
2720 var b = false
2721 if b
2722 eval 1 + 0
2723 silent elseif !b
2724 eval 2 + 0
2725 endif
2726enddef
2727
2728def Test_debug_elseif()
2729 var res = execute('disass debug s:DebugElseif')
2730 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2731 'var b = false\_s*' ..
2732 '0 DEBUG line 1-1 varcount 0\_s*' ..
2733 '1 PUSH false\_s*' ..
2734 '2 STORE $0\_s*' ..
2735
2736 'if b\_s*' ..
2737 '3 DEBUG line 2-2 varcount 1\_s*' ..
2738 '4 LOAD $0\_s*' ..
2739 '5 JUMP_IF_FALSE -> 10\_s*' ..
2740
2741 'eval 1 + 0\_s*' ..
2742 '6 DEBUG line 3-3 varcount 1\_s*' ..
2743 '7 PUSHNR 1\_s*' ..
2744 '8 DROP\_s*' ..
2745
2746 'silent elseif !b\_s*' ..
2747 '9 JUMP -> 20\_s*' ..
2748 '10 CMDMOD silent\_s*' ..
2749 '11 DEBUG line 4-4 varcount 1\_s*' ..
2750 '12 LOAD $0\_s*' ..
2751 '13 INVERT -1 (!val)\_s*' ..
2752 '14 CMDMOD_REV\_s*' ..
2753 '15 JUMP_IF_FALSE -> 20\_s*' ..
2754
2755 'eval 2 + 0\_s*' ..
2756 '16 DEBUG line 5-5 varcount 1\_s*' ..
2757 '17 PUSHNR 2\_s*' ..
2758 '18 DROP\_s*' ..
2759
2760 'endif\_s*' ..
2761 '19 DEBUG line 6-6 varcount 1\_s*' ..
2762 '20 RETURN void*',
2763 res)
2764enddef
2765
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002766def s:DebugFor()
2767 echo "hello"
2768 for a in [0]
2769 echo a
2770 endfor
2771enddef
2772
2773def Test_debug_for()
2774 var res = execute('disass debug s:DebugFor')
2775 assert_match('<SNR>\d*_DebugFor\_s*' ..
2776 'echo "hello"\_s*' ..
2777 '0 DEBUG line 1-1 varcount 0\_s*' ..
2778 '1 PUSHS "hello"\_s*' ..
2779 '2 ECHO 1\_s*' ..
2780
2781 'for a in \[0\]\_s*' ..
2782 '3 DEBUG line 2-2 varcount 0\_s*' ..
2783 '4 STORE -1 in $0\_s*' ..
2784 '5 PUSHNR 0\_s*' ..
2785 '6 NEWLIST size 1\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002786 '7 DEBUG line 2-2 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002787 '8 FOR $0 -> 15\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002788 '9 STORE $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002789
2790 'echo a\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002791 '10 DEBUG line 3-3 varcount 3\_s*' ..
2792 '11 LOAD $2\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002793 '12 ECHO 1\_s*' ..
2794
2795 'endfor\_s*' ..
Bram Moolenaarb46c0832022-09-15 17:19:37 +01002796 '13 DEBUG line 4-4 varcount 3\_s*' ..
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002797 '14 JUMP -> 7\_s*' ..
2798 '15 DROP\_s*' ..
2799 '16 RETURN void*',
2800 res)
2801enddef
2802
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002803def s:TryCatch()
2804 try
2805 echo "try"
2806 catch /error/
2807 echo "caught"
2808 endtry
2809enddef
2810
2811def Test_debug_try_catch()
2812 var res = execute('disass debug s:TryCatch')
2813 assert_match('<SNR>\d*_TryCatch\_s*' ..
2814 'try\_s*' ..
2815 '0 DEBUG line 1-1 varcount 0\_s*' ..
2816 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2817 'echo "try"\_s*' ..
2818 '2 DEBUG line 2-2 varcount 0\_s*' ..
2819 '3 PUSHS "try"\_s*' ..
2820 '4 ECHO 1\_s*' ..
2821 'catch /error/\_s*' ..
2822 '5 DEBUG line 3-3 varcount 0\_s*' ..
2823 '6 JUMP -> 17\_s*' ..
2824 '7 DEBUG line 4-3 varcount 0\_s*' ..
2825 '8 PUSH v:exception\_s*' ..
2826 '9 PUSHS "error"\_s*' ..
2827 '10 COMPARESTRING =\~\_s*' ..
2828 '11 JUMP_IF_FALSE -> 17\_s*' ..
2829 '12 CATCH\_s*' ..
2830 'echo "caught"\_s*' ..
2831 '13 DEBUG line 4-4 varcount 0\_s*' ..
2832 '14 PUSHS "caught"\_s*' ..
2833 '15 ECHO 1\_s*' ..
2834 'endtry\_s*' ..
2835 '16 DEBUG line 5-5 varcount 0\_s*' ..
2836 '17 ENDTRY\_s*' ..
2837 '\d\+ RETURN void',
2838 res)
2839enddef
2840
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002841func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002842 echo 'legacy'
2843endfunc
2844
2845def s:UseMember()
2846 var d = {func: Legacy}
2847 var v = d.func()
2848enddef
2849
2850def Test_disassemble_dict_stack()
2851 var res = execute('disass s:UseMember')
2852 assert_match('<SNR>\d*_UseMember\_s*' ..
2853 'var d = {func: Legacy}\_s*' ..
2854 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002855 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002856 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002857 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002858 '\d STORE $0\_s*' ..
2859
2860 'var v = d.func()\_s*' ..
2861 '\d LOAD $0\_s*' ..
2862 '\d MEMBER func\_s*' ..
2863 '\d PCALL top (argc 0)\_s*' ..
2864 '\d PCALL end\_s*' ..
2865 '\d CLEARDICT\_s*' ..
2866 '\d\+ STORE $1\_s*' ..
2867 '\d\+ RETURN void*',
2868 res)
2869enddef
2870
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002871def s:RetLegacy(): string
2872 legacy return "yes"
2873enddef
2874
2875def Test_disassemble_return_legacy()
2876 var res = execute('disass s:RetLegacy')
2877 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2878 'legacy return "yes"\_s*' ..
2879 '\d CMDMOD legacy\_s*' ..
2880 '\d EVAL legacy "yes"\_s*' ..
2881 '\d CHECKTYPE string stack\[-1]\_s*' ..
2882 '\d CMDMOD_REV\_s*' ..
2883 '\d RETURN',
2884 res)
2885enddef
2886
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002887def s:EchoMessages()
2888 echohl ErrorMsg | echom v:exception | echohl NONE
2889enddef
2890
2891def Test_disassemble_nextcmd()
2892 # splitting commands and removing trailing blanks should not change the line
2893 var res = execute('disass s:EchoMessages')
2894 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2895 'echohl ErrorMsg | echom v:exception | echohl NONE',
2896 res)
2897enddef
2898
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002899def Test_disassemble_after_reload()
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002900 var lines =<< trim END
2901 vim9script
2902 if exists('g:ThisFunc')
2903 finish
2904 endif
2905 var name: any
2906 def g:ThisFunc(): number
2907 g:name = name
2908 return 0
2909 enddef
2910 def g:ThatFunc(): number
2911 name = g:name
2912 return 0
2913 enddef
2914 END
2915 lines->writefile('Xreload.vim', 'D')
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002916
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002917 source Xreload.vim
2918 g:ThisFunc()
2919 g:ThatFunc()
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002920
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002921 source Xreload.vim
2922 var res = execute('disass g:ThisFunc')
2923 assert_match('ThisFunc\_s*' ..
2924 'g:name = name\_s*' ..
2925 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2926 '\d STOREG g:name\_s*' ..
2927 'return 0\_s*' ..
2928 '\d PUSHNR 0\_s*' ..
2929 '\d RETURN\_s*',
2930 res)
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002931
Bram Moolenaar0e9bdad2022-10-15 20:06:33 +01002932 res = execute('disass g:ThatFunc')
2933 assert_match('ThatFunc\_s*' ..
2934 'name = g:name\_s*' ..
2935 '\d LOADG g:name\_s*' ..
2936 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_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 delfunc g:ThisFunc
2943 delfunc g:ThatFunc
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002944enddef
2945
LemonBoy2eaef102022-05-06 13:14:50 +01002946def s:MakeString(x: number): string
2947 return $"x={x} x^2={x * x}"
2948enddef
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002949
LemonBoy2eaef102022-05-06 13:14:50 +01002950def Test_disassemble_string_interp()
2951 var instr = execute('disassemble s:MakeString')
2952 assert_match('MakeString\_s*' ..
2953 'return $"x={x} x^2={x \* x}"\_s*' ..
2954 '0 PUSHS "x="\_s*' ..
2955 '1 LOAD arg\[-1\]\_s*' ..
2956 '2 2STRING stack\[-1\]\_s*' ..
2957 '3 PUSHS " x^2="\_s*' ..
2958 '4 LOAD arg\[-1\]\_s*' ..
2959 '5 LOAD arg\[-1\]\_s*' ..
2960 '6 OPNR \*\_s*' ..
2961 '7 2STRING stack\[-1\]\_s*' ..
2962 '8 CONCAT size 4\_s*' ..
2963 '9 RETURN\_s*',
2964 instr)
2965enddef
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002966
Yegappan Lakshmanana061f342022-05-22 19:13:49 +01002967def BitShift()
2968 var a = 1 << 2
2969 var b = 8 >> 1
2970 var c = a << b
2971 var d = b << a
2972enddef
2973
2974def Test_disassemble_bitshift()
2975 var instr = execute('disassemble BitShift')
2976 assert_match('BitShift\_s*' ..
2977 'var a = 1 << 2\_s*' ..
2978 '0 STORE 4 in $0\_s*' ..
2979 'var b = 8 >> 1\_s*' ..
2980 '1 STORE 4 in $1\_s*' ..
2981 'var c = a << b\_s*' ..
2982 '2 LOAD $0\_s*' ..
2983 '3 LOAD $1\_s*' ..
2984 '4 OPNR <<\_s*' ..
2985 '5 STORE $2\_s*' ..
2986 'var d = b << a\_s*' ..
2987 '6 LOAD $1\_s*' ..
2988 '7 LOAD $0\_s*' ..
2989 '8 OPNR <<\_s*' ..
2990 '9 STORE $3\_s*' ..
2991 '10 RETURN void', instr)
2992enddef
2993
Bram Moolenaar1d84f762022-09-03 21:35:53 +01002994def s:OneDefer()
2995 defer delete("file")
2996enddef
2997
2998def Test_disassemble_defer()
2999 var instr = execute('disassemble s:OneDefer')
3000 assert_match('OneDefer\_s*' ..
3001 'defer delete("file")\_s*' ..
3002 '\d PUSHFUNC "delete"\_s*' ..
3003 '\d PUSHS "file"\_s*' ..
3004 '\d DEFER 1 args\_s*' ..
3005 '\d RETURN\_s*',
3006 instr)
3007enddef
3008
Bram Moolenaar38f1ab32023-02-21 20:09:46 +00003009def Test_disassemble_class_function()
3010 var lines =<< trim END
3011 vim9script
3012
3013 class Cl
3014 static def Fc(): string
3015 return "x"
3016 enddef
3017 endclass
3018
3019 g:instr = execute('disassemble Cl.Fc')
3020 END
3021 v9.CheckScriptSuccess(lines)
3022 assert_match('Fc\_s*' ..
3023 'return "x"\_s*' ..
3024 '\d PUSHS "x"\_s*' ..
3025 '\d RETURN\_s*',
3026 g:instr)
3027
3028 lines =<< trim END
3029 vim9script
3030
3031 class Cl
3032 def Fo(): string
3033 return "y"
3034 enddef
3035 endclass
3036
3037 g:instr = execute('disassemble Cl.Fo')
3038 END
3039 v9.CheckScriptSuccess(lines)
3040 assert_match('Fo\_s*' ..
3041 'return "y"\_s*' ..
3042 '\d PUSHS "y"\_s*' ..
3043 '\d RETURN\_s*',
3044 g:instr)
3045
3046 unlet g:instr
3047enddef
3048
Yegappan Lakshmanan28a60f82023-09-05 20:42:18 +02003049" Disassemble instructions for using an interface with static and regular member
3050" variables.
3051def Test_disassemble_interface_static_member()
3052 var lines =<< trim END
3053 vim9script
3054 interface I
3055 public static s_var: number
3056 public this.o_var: number
3057 public static s_var2: number
3058 public this.o_var2: number
3059 endinterface
3060
3061 class C implements I
3062 public static s_var: number
3063 public this.o_var: number
3064 public static s_var2: number
3065 public this.o_var2: number
3066 endclass
3067
3068 def F1(i: I)
3069 var x: number
3070 x = i.s_var
3071 x = i.o_var
3072 x = i.s_var2
3073 x = i.o_var2
3074 enddef
3075
3076 def F2(o: C)
3077 var x: number
3078 x = o.s_var
3079 x = o.o_var
3080 x = o.s_var2
3081 x = o.o_var2
3082 enddef
3083
3084 g:instr1 = execute('disassemble F1')
3085 g:instr2 = execute('disassemble F2')
3086 END
3087 v9.CheckScriptSuccess(lines)
3088 assert_match('<SNR>\d*_F1\_s*' ..
3089 'var x: number\_s*' ..
3090 'x = i.s_var\_s*' ..
3091 '0 LOAD arg\[-1\]\_s*' ..
3092 '1 ITF_MEMBER 0 on I \[STATIC\]\_s*' ..
3093 '2 STORE $0\_s*' ..
3094 'x = i.o_var\_s*' ..
3095 '3 LOAD arg\[-1\]\_s*' ..
3096 '4 ITF_MEMBER 0 on I\_s*' ..
3097 '5 STORE $0\_s*' ..
3098 'x = i.s_var2\_s*' ..
3099 '6 LOAD arg\[-1\]\_s*' ..
3100 '7 ITF_MEMBER 1 on I \[STATIC\]\_s*' ..
3101 '8 STORE $0\_s*' ..
3102 'x = i.o_var2\_s*' ..
3103 '9 LOAD arg\[-1\]\_s*' ..
3104 '10 ITF_MEMBER 1 on I\_s*' ..
3105 '11 STORE $0\_s*' ..
3106 '12 RETURN void\_s*',
3107 g:instr1)
3108 assert_match('<SNR>\d*_F2\_s*' ..
3109 'var x: number\_s*' ..
3110 'x = o.s_var\_s*' ..
3111 '0 LOAD arg\[-1\]\_s*' ..
3112 '1 OBJ_MEMBER 0 \[STATIC\]\_s*' ..
3113 '2 STORE $0\_s*' ..
3114 'x = o.o_var\_s*' ..
3115 '3 LOAD arg\[-1\]\_s*' ..
3116 '4 OBJ_MEMBER 0\_s*' ..
3117 '5 STORE $0\_s*' ..
3118 'x = o.s_var2\_s*' ..
3119 '6 LOAD arg\[-1\]\_s*' ..
3120 '7 OBJ_MEMBER 1 \[STATIC\]\_s*' ..
3121 ' 8 STORE $0\_s*' ..
3122 'x = o.o_var2\_s*' ..
3123 '9 LOAD arg\[-1\]\_s*' ..
3124 '10 OBJ_MEMBER 1\_s*' ..
3125 '11 STORE $0\_s*' ..
3126 '12 RETURN void',
3127 g:instr2)
3128
3129 unlet g:instr1
3130 unlet g:instr2
3131enddef
3132
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01003133" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker