blob: 363d731a41d3fa4af17c81b0519d379adaab3376 [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00004import './vim9.vim' as v9
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01005
Bram Moolenaar62aec932022-01-29 21:45:34 +00006func s:NotCompiled()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01007 echo "not"
8endfunc
9
10let s:scriptvar = 4
11let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020012let b:buffervar = 'b'
13let w:windowvar = 'w'
14let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010015
16def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020017 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010018 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010019 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010020 echo arg
21 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020022 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010023 echo v:version
24 echo s:scriptvar
25 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020026 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010027 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020028 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020029 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020030 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020031 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020032 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020033 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010034 echo &tabstop
35 echo $ENVVAR
36 echo @z
37enddef
38
Bram Moolenaarf2460a32020-02-07 22:09:54 +010039def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010040 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020041 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010042 assert_fails('disass', 'E471:')
43 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020044 assert_fails('disass 234', 'E129:')
45 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010046
Bram Moolenaarac564082020-09-27 19:05:33 +020047 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020048 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010049 'buffers\_s*' ..
50 '\d\+ EXEC \+buffers\_s*' ..
51 'echo\_s*' ..
52 'echo arg\_s*' ..
53 '\d\+ LOAD arg\[-1\]\_s*' ..
54 '\d\+ ECHO 1\_s*' ..
55 'echo local\_s*' ..
56 '\d\+ LOAD $0\_s*' ..
57 '\d\+ ECHO 1\_s*' ..
58 'echo &lines\_s*' ..
59 '\d\+ LOADOPT &lines\_s*' ..
60 '\d\+ ECHO 1\_s*' ..
61 'echo v:version\_s*' ..
62 '\d\+ LOADV v:version\_s*' ..
63 '\d\+ ECHO 1\_s*' ..
64 'echo s:scriptvar\_s*' ..
65 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
66 '\d\+ ECHO 1\_s*' ..
67 'echo g:globalvar\_s*' ..
68 '\d\+ LOADG g:globalvar\_s*' ..
69 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020070 'echo get(g:, "global")\_s*' ..
71 '\d\+ LOAD g:\_s*' ..
72 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010073 '\d\+ BCALL get(argc 2)\_s*' ..
74 '\d\+ ECHO 1\_s*' ..
75 'echo g:auto#var\_s*' ..
76 '\d\+ LOADAUTO g:auto#var\_s*' ..
77 '\d\+ ECHO 1\_s*' ..
78 'echo b:buffervar\_s*' ..
79 '\d\+ LOADB b:buffervar\_s*' ..
80 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020081 'echo get(b:, "buffer")\_s*' ..
82 '\d\+ LOAD b:\_s*' ..
83 '\d\+ PUSHS "buffer"\_s*' ..
84 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020085 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020086 'echo get(w:, "window")\_s*' ..
87 '\d\+ LOAD w:\_s*' ..
88 '\d\+ PUSHS "window"\_s*' ..
89 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020090 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020091 'echo get(t:, "tab")\_s*' ..
92 '\d\+ LOAD t:\_s*' ..
93 '\d\+ PUSHS "tab"\_s*' ..
94 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020095 ' LOADENV $ENVVAR.*' ..
96 ' LOADREG @z.*',
97 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010098enddef
99
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200100def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200101 var filename = "file"
102 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200103 edit the`=filename``=filenr`.txt
104enddef
105
106def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200107 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200108 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200109 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200110 '\d PUSHS "file"\_s*' ..
111 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200112 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200113 '\d STORE 123 in $1\_s*' ..
114 ' edit the`=filename``=filenr`.txt\_s*' ..
115 '\d PUSHS "edit the"\_s*' ..
116 '\d LOAD $0\_s*' ..
117 '\d LOAD $1\_s*' ..
118 '\d 2STRING stack\[-1\]\_s*' ..
119 '\d\+ PUSHS ".txt"\_s*' ..
120 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200121 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200122 res)
123enddef
124
Bram Moolenaar20677332021-06-06 17:02:53 +0200125if has('python3')
126 def s:PyHeredoc()
127 python3 << EOF
128 print('hello')
129EOF
130 enddef
131
132 def Test_disassemble_python_heredoc()
133 var res = execute('disass s:PyHeredoc')
134 assert_match('<SNR>\d*_PyHeredoc.*' ..
135 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
136 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200137 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200138 res)
139 enddef
140endif
141
Bram Moolenaar4c137212021-04-19 16:48:48 +0200142def s:Substitute()
143 var expr = "abc"
144 :%s/a/\=expr/&g#c
145enddef
146
147def Test_disassemble_substitute()
148 var res = execute('disass s:Substitute')
149 assert_match('<SNR>\d*_Substitute.*' ..
150 ' var expr = "abc"\_s*' ..
151 '\d PUSHS "abc"\_s*' ..
152 '\d STORE $0\_s*' ..
153 ' :%s/a/\\=expr/&g#c\_s*' ..
154 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
155 ' 0 LOAD $0\_s*' ..
156 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200157 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200158 res)
159enddef
160
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200161
162def s:SearchPair()
163 var col = 8
164 searchpair("{", "", "}", "", "col('.') > col")
165enddef
166
167def Test_disassemble_seachpair()
168 var res = execute('disass s:SearchPair')
169 assert_match('<SNR>\d*_SearchPair.*' ..
170 ' var col = 8\_s*' ..
171 '\d STORE 8 in $0\_s*' ..
172 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
173 '\d PUSHS "{"\_s*' ..
174 '\d PUSHS ""\_s*' ..
175 '\d PUSHS "}"\_s*' ..
176 '\d PUSHS ""\_s*' ..
177 '\d INSTR\_s*' ..
178 ' 0 PUSHS "."\_s*' ..
179 ' 1 BCALL col(argc 1)\_s*' ..
180 ' 2 LOAD $0\_s*' ..
181 ' 3 COMPARENR >\_s*' ..
182 ' -------------\_s*' ..
183 '\d BCALL searchpair(argc 5)\_s*' ..
184 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200185 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200186 res)
187enddef
188
189
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200190def s:RedirVar()
191 var result: string
192 redir =>> result
193 echo "text"
194 redir END
195enddef
196
197def Test_disassemble_redir_var()
198 var res = execute('disass s:RedirVar')
199 assert_match('<SNR>\d*_RedirVar.*' ..
200 ' var result: string\_s*' ..
201 '\d PUSHS "\[NULL\]"\_s*' ..
202 '\d STORE $0\_s*' ..
203 ' redir =>> result\_s*' ..
204 '\d REDIR\_s*' ..
205 ' echo "text"\_s*' ..
206 '\d PUSHS "text"\_s*' ..
207 '\d ECHO 1\_s*' ..
208 ' redir END\_s*' ..
209 '\d LOAD $0\_s*' ..
210 '\d REDIR END\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100211 '\d CONCAT size 2\_s*' ..
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200212 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200213 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200214 res)
215enddef
216
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200217def s:Cexpr()
218 var errors = "list of errors"
219 cexpr errors
220enddef
221
222def Test_disassemble_cexpr()
223 var res = execute('disass s:Cexpr')
224 assert_match('<SNR>\d*_Cexpr.*' ..
225 ' var errors = "list of errors"\_s*' ..
226 '\d PUSHS "list of errors"\_s*' ..
227 '\d STORE $0\_s*' ..
228 ' cexpr errors\_s*' ..
229 '\d CEXPR pre cexpr\_s*' ..
230 '\d LOAD $0\_s*' ..
231 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200232 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200233 res)
234enddef
235
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200236def s:YankRange()
237 norm! m[jjm]
238 :'[,']yank
239enddef
240
241def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200242 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200243 assert_match('<SNR>\d*_YankRange.*' ..
244 ' norm! m\[jjm\]\_s*' ..
245 '\d EXEC norm! m\[jjm\]\_s*' ..
246 ' :''\[,''\]yank\_s*' ..
247 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200248 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200249 res)
250enddef
251
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200252def s:PutExpr()
253 :3put ="text"
254enddef
255
256def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200257 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200258 assert_match('<SNR>\d*_PutExpr.*' ..
259 ' :3put ="text"\_s*' ..
260 '\d PUSHS "text"\_s*' ..
261 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200262 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200263 res)
264enddef
265
Bram Moolenaar08597872020-12-10 19:43:40 +0100266def s:PutRange()
267 :$-2put a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100268 :$-3put! b
Bram Moolenaar08597872020-12-10 19:43:40 +0100269enddef
270
271def Test_disassemble_put_range()
272 var res = execute('disass s:PutRange')
273 assert_match('<SNR>\d*_PutRange.*' ..
274 ' :$-2put a\_s*' ..
275 '\d RANGE $-2\_s*' ..
276 '\d PUT a range\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100277
278 ' :$-3put! b\_s*' ..
279 '\d RANGE $-3\_s*' ..
280 '\d PUT b above range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200281 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100282 res)
283enddef
284
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100285def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200286 var localbool = true
287 var localspec = v:none
288 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100289 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200290 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100291 endif
292enddef
293
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100294def Test_disassemble_push()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000295 mkdir('Xdir/autoload', 'p')
296 var save_rtp = &rtp
297 exe 'set rtp^=' .. getcwd() .. '/Xdir'
298
299 var lines =<< trim END
300 vim9script
301 END
302 writefile(lines, 'Xdir/autoload/autoscript.vim')
303
304 lines =<< trim END
305 vim9script
306 import autoload 'autoscript.vim'
307
Bram Moolenaara749a422022-02-12 19:52:25 +0000308 def AutoloadFunc()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000309 &operatorfunc = autoscript.Opfunc
310 enddef
311
Bram Moolenaara749a422022-02-12 19:52:25 +0000312 var res = execute('disass AutoloadFunc')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000313 assert_match('<SNR>\d*_AutoloadFunc.*' ..
314 '&operatorfunc = autoscript.Opfunc\_s*' ..
315 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
316 '1 STOREFUNCOPT &operatorfunc\_s*' ..
317 '2 RETURN void',
318 res)
319 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000320 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000321
322 delete('Xdir', 'rf')
323 &rtp = save_rtp
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100324enddef
325
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100326def Test_disassemble_import_autoload()
327 writefile(['vim9script'], 'XimportAL.vim')
328
329 var lines =<< trim END
330 vim9script
331 import autoload './XimportAL.vim'
332
333 def AutoloadFunc()
334 echo XimportAL.SomeFunc()
335 echo XimportAL.someVar
336 XimportAL.someVar = "yes"
337 enddef
338
339 var res = execute('disass AutoloadFunc')
340 assert_match('<SNR>\d*_AutoloadFunc.*' ..
341 'echo XimportAL.SomeFunc()\_s*' ..
Bram Moolenaar17125182022-03-30 21:57:50 +0100342 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100343 '\d PUSHFUNC "<80><fd>R\d\+_SomeFunc"\_s*' ..
344 '\d PCALL top (argc 0)\_s*' ..
345 '\d PCALL end\_s*' ..
346 '\d ECHO 1\_s*' ..
347
348 'echo XimportAL.someVar\_s*' ..
349 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
350 '\d LOADEXPORT s:someVar from .*/testdir/XimportAL.vim\_s*' ..
351 '\d ECHO 1\_s*' ..
352
353 'XimportAL.someVar = "yes"\_s*' ..
354 '\d\+ PUSHS "yes"\_s*' ..
355 '\d\+ SOURCE .*/testdir/XimportAL.vim\_s*' ..
356 '\d\+ STOREEXPORT someVar in .*/testdir/XimportAL.vim\_s*' ..
357
358 '\d\+ RETURN void',
359 res)
360 END
361 v9.CheckScriptSuccess(lines)
362
363 delete('XimportAL.vim')
364enddef
365
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100366def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200367 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100368 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200369 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100370 localstr = 'xyz'
371 v:char = 'abc'
372 s:scriptvar = 'sv'
373 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100374 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200375 b:buffervar = 'bv'
376 w:windowvar = 'wv'
377 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100378 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000379 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100380 $ENVVAR = 'ev'
381 @z = 'rv'
382enddef
383
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100384def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200385 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200386 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200387 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200388 'localnr = 2.*' ..
389 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200390 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200391 'localstr = ''xyz''.*' ..
392 ' STORE $1.*' ..
393 'v:char = ''abc''.*' ..
394 'STOREV v:char.*' ..
395 's:scriptvar = ''sv''.*' ..
396 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
397 'g:globalvar = ''gv''.*' ..
398 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100399 'g:auto#var = ''av''.*' ..
400 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200401 'b:buffervar = ''bv''.*' ..
402 ' STOREB b:buffervar.*' ..
403 'w:windowvar = ''wv''.*' ..
404 ' STOREW w:windowvar.*' ..
405 't:tabpagevar = ''tv''.*' ..
406 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000407 '&tabstop = 8\_s*' ..
408 '\d\+ PUSHNR 8\_s*' ..
409 '\d\+ STOREOPT &tabstop\_s*' ..
410 '&opfunc = (t) => len(t)\_s*' ..
411 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
412 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
413 '$ENVVAR = ''ev''\_s*' ..
414 '\d\+ PUSHS "ev"\_s*' ..
415 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200416 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000417 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200418 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100419enddef
420
Bram Moolenaarcb790402020-05-15 20:53:00 +0200421def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200422 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200423 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200424 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200425 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200426 var localblob: blob = 0z1122
427 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200428enddef
429
430def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200432 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200433 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200434 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100435 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200436 '\d STORE $0\_s*' ..
437 'locallist\[0\] = 123\_s*' ..
438 '\d PUSHNR 123\_s*' ..
439 '\d PUSHNR 0\_s*' ..
440 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200441 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200442 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200443 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100444 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200445 '\d STORE $1\_s*' ..
446 'localdict\["a"\] = 456\_s*' ..
447 '\d\+ PUSHNR 456\_s*' ..
448 '\d\+ PUSHS "a"\_s*' ..
449 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200450 '\d\+ STOREINDEX dict\_s*' ..
451 'var localblob: blob = 0z1122\_s*' ..
452 '\d\+ PUSHBLOB 0z1122\_s*' ..
453 '\d\+ STORE $2\_s*' ..
454 'localblob\[1\] = 33\_s*' ..
455 '\d\+ PUSHNR 33\_s*' ..
456 '\d\+ PUSHNR 1\_s*' ..
457 '\d\+ LOAD $2\_s*' ..
458 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200459 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200460 res)
461enddef
462
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000463if has('job')
464 def s:StoreNull()
465 var ss = null_string
466 var bb = null_blob
467 var dd = null_dict
468 var ll = null_list
469 var Ff = null_function
470 var Pp = null_partial
471 var jj = null_job
472 var cc = null_channel
473 enddef
474
475 def Test_disassemble_assign_null()
476 var res = execute('disass s:StoreNull')
477 assert_match('<SNR>\d*_StoreNull\_s*' ..
478 'var ss = null_string\_s*' ..
479 '\d\+ PUSHS "\[NULL\]"\_s*' ..
480 '\d\+ STORE $\d\_s*' ..
481
482 'var bb = null_blob\_s*' ..
483 '\d\+ PUSHBLOB 0z\_s*' ..
484 '\d\+ STORE $\d\_s*' ..
485
486 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100487 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000488 '\d\+ STORE $\d\_s*' ..
489
490 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100491 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000492 '\d\+ STORE $\d\_s*' ..
493
494 'var Ff = null_function\_s*' ..
495 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
496 '\d\+ STORE $\d\_s*' ..
497
498 'var Pp = null_partial\_s*' ..
499 '\d\+ NEWPARTIAL\_s*' ..
500 '\d\+ STORE $\d\_s*' ..
501
502 'var jj = null_job\_s*' ..
503 '\d\+ PUSHJOB "no process"\_s*' ..
504 '\d\+ STORE $\d\_s*' ..
505
506 'var cc = null_channel\_s*' ..
507 '\d\+ PUSHCHANNEL 0\_s*' ..
508 '\d\+ STORE $\d\_s*' ..
509
510 '\d\+ RETURN void',
511 res)
512 enddef
513endif
514
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100515def s:ScriptFuncStoreIndex()
516 var d = {dd: {}}
517 d.dd[0] = 0
518enddef
519
520def Test_disassemble_store_index()
521 var res = execute('disass s:ScriptFuncStoreIndex')
522 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
523 'var d = {dd: {}}\_s*' ..
524 '\d PUSHS "dd"\_s*' ..
525 '\d NEWDICT size 0\_s*' ..
526 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000527 '\d SETTYPE dict<dict<unknown>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100528 '\d STORE $0\_s*' ..
529 'd.dd\[0\] = 0\_s*' ..
530 '\d PUSHNR 0\_s*' ..
531 '\d PUSHNR 0\_s*' ..
532 '\d LOAD $0\_s*' ..
533 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200534 '\d\+ USEDICT\_s*' ..
535 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200536 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100537 res)
538enddef
539
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200540def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200541 var x: string
542 var y: string
543 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200544 [x, y; l] = g:stringlist
545enddef
546
547def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200548 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200549 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200550 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200551 '\d PUSHS "\[NULL\]"\_s*' ..
552 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200553 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200554 '\d PUSHS "\[NULL\]"\_s*' ..
555 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200556 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200557 '\d NEWLIST size 0\_s*' ..
558 '\d STORE $2\_s*' ..
559 '\[x, y; l\] = g:stringlist\_s*' ..
560 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200561 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200562 '\d CHECKLEN >= 2\_s*' ..
563 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200564 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200565 '\d\+ STORE $0\_s*' ..
566 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200567 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200568 '\d\+ STORE $1\_s*' ..
569 '\d\+ SLICE 2\_s*' ..
570 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200571 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200572 res)
573enddef
574
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200575def s:ListAssignWithOp()
576 var a = 2
577 var b = 3
578 [a, b] += [4, 5]
579enddef
580
581def Test_disassemble_list_assign_with_op()
582 var res = execute('disass s:ListAssignWithOp')
583 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
584 'var a = 2\_s*' ..
585 '\d STORE 2 in $0\_s*' ..
586 'var b = 3\_s*' ..
587 '\d STORE 3 in $1\_s*' ..
588 '\[a, b\] += \[4, 5\]\_s*' ..
589 '\d\+ PUSHNR 4\_s*' ..
590 '\d\+ PUSHNR 5\_s*' ..
591 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200592 '\d\+ LOAD $0\_s*' ..
593 '\d\+ ITEM 0 with op\_s*' ..
594 '\d\+ OPNR +\_s*' ..
595 '\d\+ STORE $0\_s*' ..
596 '\d\+ LOAD $1\_s*' ..
597 '\d\+ ITEM 1 with op\_s*' ..
598 '\d\+ OPNR +\_s*' ..
599 '\d\+ STORE $1\_s*' ..
600 '\d\+ DROP\_s*' ..
601 '\d\+ RETURN void',
602 res)
603enddef
604
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200605def s:ListAdd()
606 var l: list<number> = []
607 add(l, 123)
608 add(l, g:aNumber)
609enddef
610
611def Test_disassemble_list_add()
612 var res = execute('disass s:ListAdd')
613 assert_match('<SNR>\d*_ListAdd\_s*' ..
614 'var l: list<number> = []\_s*' ..
615 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100616 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200617 '\d STORE $0\_s*' ..
618 'add(l, 123)\_s*' ..
619 '\d LOAD $0\_s*' ..
620 '\d PUSHNR 123\_s*' ..
621 '\d LISTAPPEND\_s*' ..
622 '\d DROP\_s*' ..
623 'add(l, g:aNumber)\_s*' ..
624 '\d LOAD $0\_s*' ..
625 '\d\+ LOADG g:aNumber\_s*' ..
626 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
627 '\d\+ LISTAPPEND\_s*' ..
628 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200629 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200630 res)
631enddef
632
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200633def s:BlobAdd()
634 var b: blob = 0z
635 add(b, 123)
636 add(b, g:aNumber)
637enddef
638
639def Test_disassemble_blob_add()
640 var res = execute('disass s:BlobAdd')
641 assert_match('<SNR>\d*_BlobAdd\_s*' ..
642 'var b: blob = 0z\_s*' ..
643 '\d PUSHBLOB 0z\_s*' ..
644 '\d STORE $0\_s*' ..
645 'add(b, 123)\_s*' ..
646 '\d LOAD $0\_s*' ..
647 '\d PUSHNR 123\_s*' ..
648 '\d BLOBAPPEND\_s*' ..
649 '\d DROP\_s*' ..
650 'add(b, g:aNumber)\_s*' ..
651 '\d LOAD $0\_s*' ..
652 '\d\+ LOADG g:aNumber\_s*' ..
653 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
654 '\d\+ BLOBAPPEND\_s*' ..
655 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200656 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200657 res)
658enddef
659
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200660def s:BlobIndexSlice()
661 var b: blob = 0z112233
662 echo b[1]
663 echo b[1 : 2]
664enddef
665
666def Test_disassemble_blob_index_slice()
667 var res = execute('disass s:BlobIndexSlice')
668 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
669 'var b: blob = 0z112233\_s*' ..
670 '\d PUSHBLOB 0z112233\_s*' ..
671 '\d STORE $0\_s*' ..
672 'echo b\[1\]\_s*' ..
673 '\d LOAD $0\_s*' ..
674 '\d PUSHNR 1\_s*' ..
675 '\d BLOBINDEX\_s*' ..
676 '\d ECHO 1\_s*' ..
677 'echo b\[1 : 2\]\_s*' ..
678 '\d LOAD $0\_s*' ..
679 '\d PUSHNR 1\_s*' ..
680 '\d\+ PUSHNR 2\_s*' ..
681 '\d\+ BLOBSLICE\_s*' ..
682 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200683 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200684 res)
685enddef
686
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200687def s:ScriptFuncUnlet()
688 g:somevar = "value"
689 unlet g:somevar
690 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200691 unlet $SOMEVAR
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100692
693 var l = [1, 2, 3]
694 unlet l[2]
695 unlet l[0 : 1]
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200696enddef
697
698def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200699 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200700 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
701 'g:somevar = "value"\_s*' ..
702 '\d PUSHS "value"\_s*' ..
703 '\d STOREG g:somevar\_s*' ..
704 'unlet g:somevar\_s*' ..
705 '\d UNLET g:somevar\_s*' ..
706 'unlet! g:somevar\_s*' ..
707 '\d UNLET! g:somevar\_s*' ..
708 'unlet $SOMEVAR\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100709 '\d UNLETENV $SOMEVAR\_s*' ..
710
711 'var l = \[1, 2, 3]\_s*' ..
712 '\d\+ PUSHNR 1\_s*' ..
713 '\d\+ PUSHNR 2\_s*' ..
714 '\d\+ PUSHNR 3\_s*' ..
715 '\d\+ NEWLIST size 3\_s*' ..
716 '\d\+ SETTYPE list<number>\_s*' ..
717 '\d\+ STORE $0\_s*' ..
718
719 'unlet l\[2]\_s*' ..
720 '\d\+ PUSHNR 2\_s*' ..
721 '\d\+ LOAD $0\_s*' ..
722 '\d\+ UNLETINDEX\_s*' ..
723
724 'unlet l\[0 : 1]\_s*' ..
725 '\d\+ PUSHNR 0\_s*' ..
726 '\d\+ PUSHNR 1\_s*' ..
727 '\d\+ LOAD $0\_s*' ..
728 '\d\+ UNLETRANGE\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200729 res)
730enddef
731
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200732def s:LockLocal()
733 var d = {a: 1}
734 lockvar d.a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100735 const nr = 22
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200736enddef
737
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000738def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200739 var res = execute('disass s:LockLocal')
740 assert_match('<SNR>\d*_LockLocal\_s*' ..
741 'var d = {a: 1}\_s*' ..
742 '\d PUSHS "a"\_s*' ..
743 '\d PUSHNR 1\_s*' ..
744 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000745 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200746 '\d STORE $0\_s*' ..
747 'lockvar d.a\_s*' ..
748 '\d LOAD $0\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100749 '\d LOCKUNLOCK lockvar 2 d.a\_s*' ..
750
751 'const nr = 22\_s*' ..
752 '\d\+ PUSHNR 22\_s*' ..
753 '\d\+ LOCKCONST\_s*' ..
754 '\d\+ STORE $1',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200755 res)
756enddef
757
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100758def s:ScriptFuncTry()
759 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200760 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100761 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200762 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100763 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200764 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100765 endtry
766enddef
767
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100768def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200769 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200770 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
771 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100772 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200773 'echo "yes"\_s*' ..
774 '\d PUSHS "yes"\_s*' ..
775 '\d ECHO 1\_s*' ..
776 'catch /fail/\_s*' ..
777 '\d JUMP -> \d\+\_s*' ..
778 '\d PUSH v:exception\_s*' ..
779 '\d PUSHS "fail"\_s*' ..
780 '\d COMPARESTRING =\~\_s*' ..
781 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
782 '\d CATCH\_s*' ..
783 'echo "no"\_s*' ..
784 '\d\+ PUSHS "no"\_s*' ..
785 '\d\+ ECHO 1\_s*' ..
786 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100787 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200788 'throw "end"\_s*' ..
789 '\d\+ PUSHS "end"\_s*' ..
790 '\d\+ THROW\_s*' ..
791 'endtry\_s*' ..
792 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200793 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100794enddef
795
796def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200797 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100798 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100799enddef
800
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100801def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200802 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200803 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200804 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200805 '\d PUSHNR 1\_s*' ..
806 '\d PUSHS "two"\_s*' ..
807 '\d PUSHNR 333\_s*' ..
808 '\d NEWLIST size 3\_s*' ..
809 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100810 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200811 '\d PUSHS "one"\_s*' ..
812 '\d PUSHNR 1\_s*' ..
813 '\d PUSHS "two"\_s*' ..
814 '\d PUSHS "val"\_s*' ..
815 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200816 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100817enddef
818
Bram Moolenaar62aec932022-01-29 21:45:34 +0000819def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100820 echo arg
821enddef
822
Bram Moolenaar62aec932022-01-29 21:45:34 +0000823func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100824 echo 'nothing'
825endfunc
826
Bram Moolenaar62aec932022-01-29 21:45:34 +0000827func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100828 echo a:arg
829endfunc
830
831def s:ScriptFuncCall(): string
832 changenr()
833 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000834 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100835 FuncWithArg(343)
836 ScriptFuncNew()
837 s:ScriptFuncNew()
838 UserFunc()
839 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200840 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100841 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200842 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100843 FuncRefWithArg("bar")
844 return "yes"
845enddef
846
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100847def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200848 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200849 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
850 'changenr()\_s*' ..
851 '\d BCALL changenr(argc 0)\_s*' ..
852 '\d DROP\_s*' ..
853 'char2nr("abc")\_s*' ..
854 '\d PUSHS "abc"\_s*' ..
855 '\d BCALL char2nr(argc 1)\_s*' ..
856 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000857 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
859 '\d DROP\_s*' ..
860 'FuncWithArg(343)\_s*' ..
861 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000862 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200863 '\d\+ DROP\_s*' ..
864 'ScriptFuncNew()\_s*' ..
865 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
866 '\d\+ DROP\_s*' ..
867 's:ScriptFuncNew()\_s*' ..
868 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
869 '\d\+ DROP\_s*' ..
870 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000871 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200872 '\d\+ DROP\_s*' ..
873 'UserFuncWithArg("foo")\_s*' ..
874 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000875 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200876 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200877 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200878 '\d\+ PUSHS "UserFunc"\_s*' ..
879 '\d\+ BCALL function(argc 1)\_s*' ..
880 '\d\+ STORE $0\_s*' ..
881 'FuncRef()\_s*' ..
882 '\d\+ LOAD $\d\_s*' ..
883 '\d\+ PCALL (argc 0)\_s*' ..
884 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200885 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200886 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
887 '\d\+ BCALL function(argc 1)\_s*' ..
888 '\d\+ STORE $1\_s*' ..
889 'FuncRefWithArg("bar")\_s*' ..
890 '\d\+ PUSHS "bar"\_s*' ..
891 '\d\+ LOAD $\d\_s*' ..
892 '\d\+ PCALL (argc 1)\_s*' ..
893 '\d\+ DROP\_s*' ..
894 'return "yes"\_s*' ..
895 '\d\+ PUSHS "yes"\_s*' ..
896 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200897 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100898enddef
899
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200900
901def s:CreateRefs()
902 var local = 'a'
903 def Append(arg: string)
904 local ..= arg
905 enddef
906 g:Append = Append
907 def Get(): string
908 return local
909 enddef
910 g:Get = Get
911enddef
912
913def Test_disassemble_closure()
914 CreateRefs()
915 var res = execute('disass g:Append')
916 assert_match('<lambda>\d\_s*' ..
917 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100918 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200919 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100920 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100921 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200922 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200923 res)
924
925 res = execute('disass g:Get')
926 assert_match('<lambda>\d\_s*' ..
927 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100928 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200929 '\d RETURN',
930 res)
931
932 unlet g:Append
933 unlet g:Get
934enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200935
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100936def s:ClosureArg(arg: string)
937 var Ref = () => arg .. "x"
938enddef
939
940def Test_disassemble_closure_arg()
941 var res = execute('disass s:ClosureArg')
942 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
943 'var Ref = () => arg .. "x"\_s*' ..
944 '\d FUNCREF <lambda>\d\+',
945 res)
946 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
947 assert_match('<lambda>\d\+\_s*' ..
948 'return arg .. "x"\_s*' ..
949 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
950 '\d PUSHS "x"\_s*' ..
951 '\d CONCAT size 2\_s*' ..
952 '\d RETURN',
953 lres)
954enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100955
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200956def EchoArg(arg: string): string
957 return arg
958enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +0000959def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200960 return function('EchoArg')
961enddef
962def s:ScriptPCall()
963 RefThis()("text")
964enddef
965
966def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200967 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200968 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
969 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000970 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200971 '\d PUSHS "text"\_s*' ..
972 '\d PCALL top (argc 1)\_s*' ..
973 '\d PCALL end\_s*' ..
974 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200975 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200976 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200977enddef
978
979
Bram Moolenaara26b9702020-04-18 19:53:28 +0200980def s:FuncWithForwardCall(): string
981 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100982enddef
983
984def DefinedLater(arg: string): string
985 return arg
986enddef
987
988def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200989 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200990 assert_match('FuncWithForwardCall\_s*' ..
991 'return g:DefinedLater("yes")\_s*' ..
992 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200993 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200994 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200995 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100996
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200997 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100998 assert_equal('yes', FuncWithForwardCall())
999
Bram Moolenaara26b9702020-04-18 19:53:28 +02001000 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001001 assert_match('FuncWithForwardCall\_s*' ..
1002 'return g:DefinedLater("yes")\_s*' ..
1003 '\d PUSHS "yes"\_s*' ..
1004 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001005 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001006 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001007enddef
1008
1009
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001010def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001011 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001012enddef
1013
1014def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +02001015 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001016 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001017 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001018 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001019 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001020 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001021 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001022 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
1023 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001024 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001025 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001026 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001027 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001028 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001029 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001030 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001031 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001032enddef
1033
1034
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001035def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001036 if has("eval")
1037 echo "yes"
1038 else
1039 echo "no"
1040 endif
1041enddef
1042
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001043def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001044 if has("nothing")
1045 echo "yes"
1046 else
1047 echo "no"
1048 endif
1049enddef
1050
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001051def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001052 if has("nothing")
1053 echo "nothing"
1054 elseif has("something")
1055 echo "something"
1056 elseif has("eval")
1057 echo "eval"
1058 elseif has("less")
1059 echo "less"
1060 endif
1061enddef
1062
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001063def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001064 if has("gui_running")
1065 echo "yes"
1066 else
1067 echo "no"
1068 endif
1069enddef
1070
LemonBoy58f331a2022-04-02 21:59:06 +01001071def s:LenConstant(): number
1072 return len("foo") + len("fighters")
1073enddef
1074
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001075def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001076 var instr = execute('disassemble LenConstant')
1077 assert_match('LenConstant\_s*' ..
1078 'return len("foo") + len("fighters")\_s*' ..
1079 '\d PUSHNR 11\_s*',
1080 instr)
1081 assert_notmatch('BCALL len', instr)
1082
Bram Moolenaard2c61702020-09-06 15:58:36 +02001083 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001084 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001085 assert_match('HasEval\_s*' ..
1086 'if has("eval")\_s*' ..
1087 'echo "yes"\_s*' ..
1088 '\d PUSHS "yes"\_s*' ..
1089 '\d ECHO 1\_s*' ..
1090 'else\_s*' ..
1091 'echo "no"\_s*' ..
1092 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001093 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001094 assert_notmatch('JUMP', instr)
1095
Bram Moolenaard2c61702020-09-06 15:58:36 +02001096 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001097 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001098 assert_match('HasNothing\_s*' ..
1099 'if has("nothing")\_s*' ..
1100 'echo "yes"\_s*' ..
1101 'else\_s*' ..
1102 'echo "no"\_s*' ..
1103 '\d PUSHS "no"\_s*' ..
1104 '\d ECHO 1\_s*' ..
1105 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001106 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001107 assert_notmatch('PUSHS "yes"', instr)
1108 assert_notmatch('JUMP', instr)
1109
Bram Moolenaard2c61702020-09-06 15:58:36 +02001110 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001111 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001112 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001113 'if has("nothing")\_s*' ..
1114 'echo "nothing"\_s*' ..
1115 'elseif has("something")\_s*' ..
1116 'echo "something"\_s*' ..
1117 'elseif has("eval")\_s*' ..
1118 'echo "eval"\_s*' ..
1119 '\d PUSHS "eval"\_s*' ..
1120 '\d ECHO 1\_s*' ..
1121 'elseif has("less").*' ..
1122 'echo "less"\_s*' ..
1123 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001124 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001125 assert_notmatch('PUSHS "nothing"', instr)
1126 assert_notmatch('PUSHS "something"', instr)
1127 assert_notmatch('PUSHS "less"', instr)
1128 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001129
1130 var result: string
1131 var instr_expected: string
1132 if has('gui')
1133 if has('gui_running')
1134 # GUI already running, always returns "yes"
1135 result = "\nyes"
1136 instr_expected = 'HasGuiRunning.*' ..
1137 'if has("gui_running")\_s*' ..
1138 ' echo "yes"\_s*' ..
1139 '\d PUSHS "yes"\_s*' ..
1140 '\d ECHO 1\_s*' ..
1141 'else\_s*' ..
1142 ' echo "no"\_s*' ..
1143 'endif'
1144 else
1145 result = "\nno"
1146 if has('unix')
1147 # GUI not running but can start later, call has()
1148 instr_expected = 'HasGuiRunning.*' ..
1149 'if has("gui_running")\_s*' ..
1150 '\d PUSHS "gui_running"\_s*' ..
1151 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001152 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001153 '\d JUMP_IF_FALSE -> \d\_s*' ..
1154 ' echo "yes"\_s*' ..
1155 '\d PUSHS "yes"\_s*' ..
1156 '\d ECHO 1\_s*' ..
1157 'else\_s*' ..
1158 '\d JUMP -> \d\_s*' ..
1159 ' echo "no"\_s*' ..
1160 '\d PUSHS "no"\_s*' ..
1161 '\d ECHO 1\_s*' ..
1162 'endif'
1163 else
1164 # GUI not running, always return "no"
1165 instr_expected = 'HasGuiRunning.*' ..
1166 'if has("gui_running")\_s*' ..
1167 ' echo "yes"\_s*' ..
1168 'else\_s*' ..
1169 ' echo "no"\_s*' ..
1170 '\d PUSHS "no"\_s*' ..
1171 '\d ECHO 1\_s*' ..
1172 'endif'
1173 endif
1174 endif
1175 else
1176 # GUI not supported, always return "no"
1177 result = "\nno"
1178 instr_expected = 'HasGuiRunning.*' ..
1179 'if has("gui_running")\_s*' ..
1180 ' echo "yes"\_s*' ..
1181 'else\_s*' ..
1182 ' echo "no"\_s*' ..
1183 '\d PUSHS "no"\_s*' ..
1184 '\d ECHO 1\_s*' ..
1185 'endif'
1186 endif
1187
1188 assert_equal(result, execute('HasGuiRunning()'))
1189 instr = execute('disassemble HasGuiRunning')
1190 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001191enddef
1192
Bram Moolenaarefd88552020-06-18 20:50:10 +02001193def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001194 if 1 < 0
1195 return "maybe"
1196 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001197 if g:cond
1198 return "yes"
1199 else
1200 return "no"
1201 endif
1202enddef
1203
1204def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001205 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001206 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001207 'if 1 < 0\_s*' ..
1208 ' return "maybe"\_s*' ..
1209 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001210 'if g:cond\_s*' ..
1211 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001212 '1 COND2BOOL\_s*' ..
1213 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001214 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001215 '3 PUSHS "yes"\_s*' ..
1216 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001217 'else\_s*' ..
1218 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001219 '5 PUSHS "no"\_s*' ..
1220 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001221 instr)
1222enddef
1223
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001224def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001225 var Funky1: func
1226 var Funky2: func = function("len")
1227 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001228enddef
1229
1230def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001231 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001232 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001233 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001234 '0 PUSHFUNC "\[none]"\_s*' ..
1235 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001236 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001237 '2 PUSHS "len"\_s*' ..
1238 '3 BCALL function(argc 1)\_s*' ..
1239 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001240 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001241 '\d PUSHS "UserFunc"\_s*' ..
1242 '\d BCALL funcref(argc 1)\_s*' ..
1243 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001244 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001245 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001246enddef
1247
1248if has('channel')
1249 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001250 var job1: job
1251 var job2: job = job_start("donothing")
1252 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001253 enddef
1254endif
1255
1256def Test_disassemble_channel()
1257 CheckFeature channel
1258
Bram Moolenaarac564082020-09-27 19:05:33 +02001259 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001260 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001261 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001262 '\d PUSHJOB "no process"\_s*' ..
1263 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001264 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001265 '\d PUSHS "donothing"\_s*' ..
1266 '\d BCALL job_start(argc 1)\_s*' ..
1267 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001268 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001269 '\d PUSHCHANNEL 0\_s*' ..
1270 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001271 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001272 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001273enddef
1274
Bram Moolenaar62aec932022-01-29 21:45:34 +00001275def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001276 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001277 return F("x")
1278enddef
1279
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001280def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001281 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001282 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001283 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001284 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001285 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001286 '\d STORE $0\_s*' ..
1287 'return F("x")\_s*' ..
1288 '\d PUSHS "x"\_s*' ..
1289 '\d LOAD $0\_s*' ..
1290 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001291 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001292 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001293
Bram Moolenaarac564082020-09-27 19:05:33 +02001294 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001295 instr = execute('disassemble ' .. name)
1296 assert_match('<lambda>\d\+\_s*' ..
1297 'return "X" .. a .. "X"\_s*' ..
1298 '\d PUSHS "X"\_s*' ..
1299 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001300 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001301 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001302 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001303 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001304 '\d RETURN',
1305 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001306enddef
1307
Bram Moolenaar62aec932022-01-29 21:45:34 +00001308def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001309 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001310 return Ref(g:value)
1311enddef
1312
1313def Test_disassemble_lambda_with_type()
1314 g:value = 5
1315 assert_equal(15, LambdaWithType())
1316 var instr = execute('disassemble LambdaWithType')
1317 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001318 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001319 '\d FUNCREF <lambda>\d\+\_s*' ..
1320 '\d STORE $0\_s*' ..
1321 'return Ref(g:value)\_s*' ..
1322 '\d LOADG g:value\_s*' ..
1323 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001324 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001325 '\d PCALL (argc 1)\_s*' ..
1326 '\d RETURN',
1327 instr)
1328enddef
1329
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001330def NestedOuter()
1331 def g:Inner()
1332 echomsg "inner"
1333 enddef
1334enddef
1335
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001336def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001337 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001338 assert_match('NestedOuter\_s*' ..
1339 'def g:Inner()\_s*' ..
1340 'echomsg "inner"\_s*' ..
1341 'enddef\_s*' ..
1342 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001343 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001344 instr)
1345enddef
1346
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001347def NestedDefList()
1348 def
1349 def Info
1350 def /Info
1351 def /Info/
1352enddef
1353
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001354def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001355 var instr = execute('disassemble NestedDefList')
1356 assert_match('NestedDefList\_s*' ..
1357 'def\_s*' ..
1358 '\d DEF \_s*' ..
1359 'def Info\_s*' ..
1360 '\d DEF Info\_s*' ..
1361 'def /Info\_s*' ..
1362 '\d DEF /Info\_s*' ..
1363 'def /Info/\_s*' ..
1364 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001365 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001366 instr)
1367enddef
1368
Bram Moolenaar62aec932022-01-29 21:45:34 +00001369def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001370 if arg == 1 && arg != 2 || arg == 4
1371 return 'yes'
1372 endif
1373 return 'no'
1374enddef
1375
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001376def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001377 assert_equal("yes", AndOr(1))
1378 assert_equal("no", AndOr(2))
1379 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001380 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001381 assert_match('AndOr\_s*' ..
1382 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1383 '\d LOAD arg\[-1]\_s*' ..
1384 '\d PUSHNR 1\_s*' ..
1385 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001386 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001387 '\d LOAD arg\[-1]\_s*' ..
1388 '\d PUSHNR 2\_s*' ..
1389 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001390 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001391 '\d LOAD arg\[-1]\_s*' ..
1392 '\d\+ PUSHNR 4\_s*' ..
1393 '\d\+ COMPAREANY ==\_s*' ..
1394 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001395 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001396enddef
1397
Bram Moolenaar62aec932022-01-29 21:45:34 +00001398def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001399 if true && arg
1400 return "yes"
1401 endif
1402 if false && arg
1403 return "never"
1404 endif
1405 return "no"
1406enddef
1407
1408def Test_disassemble_and_constant()
1409 assert_equal("yes", AndConstant(1))
1410 assert_equal("no", AndConstant(false))
1411 var instr = execute('disassemble AndConstant')
1412 assert_match('AndConstant\_s*' ..
1413 'if true && arg\_s*' ..
1414 '0 LOAD arg\[-1\]\_s*' ..
1415 '1 COND2BOOL\_s*' ..
1416 '2 JUMP_IF_FALSE -> 5\_s*' ..
1417 'return "yes"\_s*' ..
1418 '3 PUSHS "yes"\_s*' ..
1419 '4 RETURN\_s*' ..
1420 'endif\_s*' ..
1421 'if false && arg\_s*' ..
1422 'return "never"\_s*' ..
1423 'endif\_s*' ..
1424 'return "no"\_s*' ..
1425 '5 PUSHS "no"\_s*' ..
1426 '6 RETURN',
1427 instr)
1428enddef
1429
Bram Moolenaar62aec932022-01-29 21:45:34 +00001430def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001431 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001432 for i in range(3)
1433 res->add(i)
1434 endfor
1435 return res
1436enddef
1437
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001438def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001439 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001441 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001442 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001443 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001444 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001445 '\d STORE $0\_s*' ..
1446 'for i in range(3)\_s*' ..
1447 '\d STORE -1 in $1\_s*' ..
1448 '\d PUSHNR 3\_s*' ..
1449 '\d BCALL range(argc 1)\_s*' ..
1450 '\d FOR $1 -> \d\+\_s*' ..
1451 '\d STORE $2\_s*' ..
1452 'res->add(i)\_s*' ..
1453 '\d LOAD $0\_s*' ..
1454 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001455 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001456 '\d\+ DROP\_s*' ..
1457 'endfor\_s*' ..
1458 '\d\+ JUMP -> \d\+\_s*' ..
1459 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001460 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001461enddef
1462
Bram Moolenaar62aec932022-01-29 21:45:34 +00001463def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001464 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001465 for str in eval('["one", "two"]')
1466 res ..= str
1467 endfor
1468 return res
1469enddef
1470
1471def Test_disassemble_for_loop_eval()
1472 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001473 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001474 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001475 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001476 '\d PUSHS ""\_s*' ..
1477 '\d STORE $0\_s*' ..
1478 'for str in eval(''\["one", "two"\]'')\_s*' ..
1479 '\d STORE -1 in $1\_s*' ..
1480 '\d PUSHS "\["one", "two"\]"\_s*' ..
1481 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001482 '\d FOR $1 -> \d\+\_s*' ..
1483 '\d STORE $2\_s*' ..
1484 'res ..= str\_s*' ..
1485 '\d\+ LOAD $0\_s*' ..
1486 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001487 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001488 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001489 '\d\+ STORE $0\_s*' ..
1490 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001491 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001492 '\d\+ DROP\_s*' ..
1493 'return res\_s*' ..
1494 '\d\+ LOAD $0\_s*' ..
1495 '\d\+ RETURN',
1496 instr)
1497enddef
1498
Bram Moolenaar62aec932022-01-29 21:45:34 +00001499def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001500 for [x1, x2] in [[1, 2], [3, 4]]
1501 echo x1 x2
1502 endfor
1503enddef
1504
1505def Test_disassemble_for_loop_unpack()
1506 var instr = execute('disassemble ForLoopUnpack')
1507 assert_match('ForLoopUnpack\_s*' ..
1508 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1509 '\d\+ STORE -1 in $0\_s*' ..
1510 '\d\+ PUSHNR 1\_s*' ..
1511 '\d\+ PUSHNR 2\_s*' ..
1512 '\d\+ NEWLIST size 2\_s*' ..
1513 '\d\+ PUSHNR 3\_s*' ..
1514 '\d\+ PUSHNR 4\_s*' ..
1515 '\d\+ NEWLIST size 2\_s*' ..
1516 '\d\+ NEWLIST size 2\_s*' ..
1517 '\d\+ FOR $0 -> 16\_s*' ..
1518 '\d\+ UNPACK 2\_s*' ..
1519 '\d\+ STORE $1\_s*' ..
1520 '\d\+ STORE $2\_s*' ..
1521 'echo x1 x2\_s*' ..
1522 '\d\+ LOAD $1\_s*' ..
1523 '\d\+ LOAD $2\_s*' ..
1524 '\d\+ ECHO 2\_s*' ..
1525 'endfor\_s*' ..
1526 '\d\+ JUMP -> 8\_s*' ..
1527 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001528 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001529 instr)
1530enddef
1531
Bram Moolenaar62aec932022-01-29 21:45:34 +00001532def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001533 for nr in [1, 2]
1534 try
1535 echo "ok"
1536 try
1537 echo "deeper"
1538 catch
1539 continue
1540 endtry
1541 catch
1542 echo "not ok"
1543 endtry
1544 endfor
1545enddef
1546
1547def Test_disassemble_for_loop_continue()
1548 var instr = execute('disassemble ForLoopContinue')
1549 assert_match('ForLoopContinue\_s*' ..
1550 'for nr in \[1, 2]\_s*' ..
1551 '0 STORE -1 in $0\_s*' ..
1552 '1 PUSHNR 1\_s*' ..
1553 '2 PUSHNR 2\_s*' ..
1554 '3 NEWLIST size 2\_s*' ..
1555 '4 FOR $0 -> 22\_s*' ..
1556 '5 STORE $1\_s*' ..
1557 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001558 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001559 'echo "ok"\_s*' ..
1560 '7 PUSHS "ok"\_s*' ..
1561 '8 ECHO 1\_s*' ..
1562 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001563 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001564 'echo "deeper"\_s*' ..
1565 '10 PUSHS "deeper"\_s*' ..
1566 '11 ECHO 1\_s*' ..
1567 'catch\_s*' ..
1568 '12 JUMP -> 15\_s*' ..
1569 '13 CATCH\_s*' ..
1570 'continue\_s*' ..
1571 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1572 'endtry\_s*' ..
1573 '15 ENDTRY\_s*' ..
1574 'catch\_s*' ..
1575 '16 JUMP -> 20\_s*' ..
1576 '17 CATCH\_s*' ..
1577 'echo "not ok"\_s*' ..
1578 '18 PUSHS "not ok"\_s*' ..
1579 '19 ECHO 1\_s*' ..
1580 'endtry\_s*' ..
1581 '20 ENDTRY\_s*' ..
1582 'endfor\_s*' ..
1583 '21 JUMP -> 4\_s*' ..
1584 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001585 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001586 instr)
1587enddef
1588
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001589let g:number = 42
1590
Bram Moolenaar62aec932022-01-29 21:45:34 +00001591def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001592 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001593enddef
1594
1595def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001596 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001597 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001598 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001599 '\d PUSHNR 23\_s*' ..
1600 '\d LOADG g:number\_s*' ..
1601 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1602 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001603 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001604 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001605 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001606 instr)
1607enddef
1608
Bram Moolenaar62aec932022-01-29 21:45:34 +00001609def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001610 var nr = 3
1611 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001612 nrres = nr - 7
1613 nrres = nr * 7
1614 nrres = nr / 7
1615 nrres = nr % 7
1616
Bram Moolenaarac564082020-09-27 19:05:33 +02001617 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001618 anyres = g:number - 7
1619 anyres = g:number * 7
1620 anyres = g:number / 7
1621 anyres = g:number % 7
1622
1623 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 var fl = 3.0
1625 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001626 flres = fl - 7.0
1627 flres = fl * 7.0
1628 flres = fl / 7.0
1629 endif
1630enddef
1631
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001632def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001633 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001634 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001635 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001636 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001637 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001638 '\d LOAD $0.*' ..
1639 '\d PUSHNR 7.*' ..
1640 '\d OPNR +.*' ..
1641 '\d STORE $1.*' ..
1642 'nrres = nr - 7.*' ..
1643 '\d OPNR -.*' ..
1644 'nrres = nr \* 7.*' ..
1645 '\d OPNR \*.*' ..
1646 'nrres = nr / 7.*' ..
1647 '\d OPNR /.*' ..
1648 'nrres = nr % 7.*' ..
1649 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001650 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001651 '\d LOADG g:number.*' ..
1652 '\d PUSHNR 7.*' ..
1653 '\d OPANY +.*' ..
1654 '\d STORE $2.*' ..
1655 'anyres = g:number - 7.*' ..
1656 '\d OPANY -.*' ..
1657 'anyres = g:number \* 7.*' ..
1658 '\d OPANY \*.*' ..
1659 'anyres = g:number / 7.*' ..
1660 '\d OPANY /.*' ..
1661 'anyres = g:number % 7.*' ..
1662 '\d OPANY %.*',
1663 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001664 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001665 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001666 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001667 '\d PUSHF 3.0.*' ..
1668 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001669 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001670 '\d LOAD $3.*' ..
1671 '\d PUSHF 7.0.*' ..
1672 '\d OPFLOAT +.*' ..
1673 '\d STORE $4.*' ..
1674 'flres = fl - 7.0.*' ..
1675 '\d OPFLOAT -.*' ..
1676 'flres = fl \* 7.0.*' ..
1677 '\d OPFLOAT \*.*' ..
1678 'flres = fl / 7.0.*' ..
1679 '\d OPFLOAT /.*',
1680 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001681 endif
1682enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001683
Bram Moolenaar62aec932022-01-29 21:45:34 +00001684def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001685 var reslist = [1, 2] + [3, 4]
1686 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001687enddef
1688
1689def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001690 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001691 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001692 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001693 '\d PUSHNR 1.*' ..
1694 '\d PUSHNR 2.*' ..
1695 '\d NEWLIST size 2.*' ..
1696 '\d PUSHNR 3.*' ..
1697 '\d PUSHNR 4.*' ..
1698 '\d NEWLIST size 2.*' ..
1699 '\d ADDLIST.*' ..
1700 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001702 '\d PUSHBLOB 0z1122.*' ..
1703 '\d PUSHBLOB 0z3344.*' ..
1704 '\d ADDBLOB.*' ..
1705 '\d STORE $.*',
1706 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001707enddef
1708
1709let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001710def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001711 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001712 return res
1713enddef
1714
1715def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001717 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001718 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001719 '\d LOADG g:aa.*' ..
1720 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001721 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001722 '\d CONCAT.*' ..
1723 '\d STORE $.*',
1724 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001725 assert_equal('aabb', ConcatString())
1726enddef
1727
Bram Moolenaar62aec932022-01-29 21:45:34 +00001728def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001729 var s = "abcd"
1730 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001731 return res
1732enddef
1733
1734def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001735 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001736 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001737 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001738 '\d PUSHS "abcd"\_s*' ..
1739 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001740 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001741 '\d LOAD $0\_s*' ..
1742 '\d PUSHNR 1\_s*' ..
1743 '\d STRINDEX\_s*' ..
1744 '\d STORE $1\_s*',
1745 instr)
1746 assert_equal('b', StringIndex())
1747enddef
1748
Bram Moolenaar62aec932022-01-29 21:45:34 +00001749def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001750 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001751 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001752 return res
1753enddef
1754
1755def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001756 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001757 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001758 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001759 '\d PUSHS "abcd"\_s*' ..
1760 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001761 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001762 '\d LOAD $0\_s*' ..
1763 '\d PUSHNR 1\_s*' ..
1764 '\d PUSHNR 8\_s*' ..
1765 '\d STRSLICE\_s*' ..
1766 '\d STORE $1\_s*',
1767 instr)
1768 assert_equal('bcd', StringSlice())
1769enddef
1770
Bram Moolenaar62aec932022-01-29 21:45:34 +00001771def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001772 var l = [1, 2, 3]
1773 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001774 return res
1775enddef
1776
1777def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001778 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001779 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001780 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001781 '\d PUSHNR 1\_s*' ..
1782 '\d PUSHNR 2\_s*' ..
1783 '\d PUSHNR 3\_s*' ..
1784 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001785 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001786 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001787 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001788 '\d LOAD $0\_s*' ..
1789 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001790 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001791 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001792 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001793 assert_equal(2, ListIndex())
1794enddef
1795
Bram Moolenaar62aec932022-01-29 21:45:34 +00001796def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001797 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001798 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001799 return res
1800enddef
1801
1802def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001803 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001804 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001806 '\d PUSHNR 1\_s*' ..
1807 '\d PUSHNR 2\_s*' ..
1808 '\d PUSHNR 3\_s*' ..
1809 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001810 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001811 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001812 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001813 '\d LOAD $0\_s*' ..
1814 '\d PUSHNR 1\_s*' ..
1815 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001816 '\d\+ LISTSLICE\_s*' ..
1817 '\d\+ SETTYPE list<number>\_s*' ..
1818 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001819 instr)
1820 assert_equal([2, 3], ListSlice())
1821enddef
1822
Bram Moolenaar62aec932022-01-29 21:45:34 +00001823def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001824 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001825 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001826 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001827 return res
1828enddef
1829
1830def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001831 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001832 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001833 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001834 '\d PUSHS "item"\_s*' ..
1835 '\d PUSHNR 1\_s*' ..
1836 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001837 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001838 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001839 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001840 '\d\+ LOAD $0\_s*' ..
1841 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001842 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001843 '\d\+ STORE $1\_s*' ..
1844 'res = d\["item"\]\_s*' ..
1845 '\d\+ LOAD $0\_s*' ..
1846 '\d\+ PUSHS "item"\_s*' ..
1847 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001848 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001849 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001850 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001851 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001852enddef
1853
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001854let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001855def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001856 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001857 return res
1858enddef
1859
1860def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001861 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001862 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001863 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001864 '\d LOADG g:somelist\_s*' ..
1865 '\d PUSHNR 2\_s*' ..
1866 '\d ANYINDEX\_s*' ..
1867 '\d STORE $0\_s*' ..
1868 'return res\_s*' ..
1869 '\d LOAD $0\_s*' ..
1870 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1871 '\d RETURN',
1872 instr)
1873 assert_equal(3, AnyIndex())
1874enddef
1875
Bram Moolenaar62aec932022-01-29 21:45:34 +00001876def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001877 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001878 return res
1879enddef
1880
1881def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001882 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001883 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001884 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001885 '\d LOADG g:somelist\_s*' ..
1886 '\d PUSHNR 1\_s*' ..
1887 '\d PUSHNR 3\_s*' ..
1888 '\d ANYSLICE\_s*' ..
1889 '\d STORE $0\_s*' ..
1890 'return res\_s*' ..
1891 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001892 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001893 '\d RETURN',
1894 instr)
1895 assert_equal([2, 3, 4], AnySlice())
1896enddef
1897
Bram Moolenaar62aec932022-01-29 21:45:34 +00001898def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001899 g:nr = 9
1900 var plus = +g:nr
1901 var minus = -g:nr
1902 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001903enddef
1904
1905def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001906 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001907 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001908 'g:nr = 9\_s*' ..
1909 '\d PUSHNR 9\_s*' ..
1910 '\d STOREG g:nr\_s*' ..
1911 'var plus = +g:nr\_s*' ..
1912 '\d LOADG g:nr\_s*' ..
1913 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1914 '\d STORE $0\_s*' ..
1915 'var minus = -g:nr\_s*' ..
1916 '\d LOADG g:nr\_s*' ..
1917 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001918 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001919 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001920 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001921 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001922enddef
1923
Bram Moolenaar62aec932022-01-29 21:45:34 +00001924def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001925 var flag = true
1926 var invert = !flag
1927 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001928 return res
1929enddef
1930
1931def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001932 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001933 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001934 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001935 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001936 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001937 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001938 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001939 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001940 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001941 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001942 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001943 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001944 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001945 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001946 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001947enddef
1948
Bram Moolenaar62aec932022-01-29 21:45:34 +00001949def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001950 var one = 1
1951 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001952 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001953 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001954 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001955enddef
1956
1957def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001958 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001959 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001960 'var one = 1\_s*' ..
1961 '0 STORE 1 in $0\_s*' ..
1962 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001963 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001964 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001965 '1 LOAD $0\_s*' ..
1966 '2 COND2BOOL\_s*' ..
1967 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1968 '4 LOAD $1\_s*' ..
1969 '5 COND2BOOL\_s*' ..
1970 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1971 '7 LOAD $0\_s*' ..
1972 '8 COND2BOOL\_s*' ..
1973 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001974 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001975 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001976 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001977 instr)
1978 assert_equal(true, InvertBool())
1979enddef
1980
Bram Moolenaar62aec932022-01-29 21:45:34 +00001981def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00001982 var t: number
1983 t = 1
1984 t = 0
1985enddef
1986
1987def Test_disassemble_auto_init()
1988 var instr = execute('disassemble AutoInit')
1989 assert_match('AutoInit\_s*' ..
1990 'var t: number\_s*' ..
1991 't = 1\_s*' ..
1992 '\d STORE 1 in $0\_s*' ..
1993 't = 0\_s*' ..
1994 '\d STORE 0 in $0\_s*' ..
1995 '\d\+ RETURN void',
1996 instr)
1997enddef
1998
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001999def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02002000 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02002001 ['true == isFalse', 'COMPAREBOOL =='],
2002 ['true != isFalse', 'COMPAREBOOL !='],
2003 ['v:none == isNull', 'COMPARESPECIAL =='],
2004 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00002005 ['"text" == isNull', 'COMPARENULL =='],
2006 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002007
Bram Moolenaara5565e42020-05-09 15:44:01 +02002008 ['111 == aNumber', 'COMPARENR =='],
2009 ['111 != aNumber', 'COMPARENR !='],
2010 ['111 > aNumber', 'COMPARENR >'],
2011 ['111 < aNumber', 'COMPARENR <'],
2012 ['111 >= aNumber', 'COMPARENR >='],
2013 ['111 <= aNumber', 'COMPARENR <='],
2014 ['111 =~ aNumber', 'COMPARENR =\~'],
2015 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002016
Bram Moolenaara5565e42020-05-09 15:44:01 +02002017 ['"xx" != aString', 'COMPARESTRING !='],
2018 ['"xx" > aString', 'COMPARESTRING >'],
2019 ['"xx" < aString', 'COMPARESTRING <'],
2020 ['"xx" >= aString', 'COMPARESTRING >='],
2021 ['"xx" <= aString', 'COMPARESTRING <='],
2022 ['"xx" =~ aString', 'COMPARESTRING =\~'],
2023 ['"xx" !~ aString', 'COMPARESTRING !\~'],
2024 ['"xx" is aString', 'COMPARESTRING is'],
2025 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002026
Bram Moolenaara5565e42020-05-09 15:44:01 +02002027 ['0z11 == aBlob', 'COMPAREBLOB =='],
2028 ['0z11 != aBlob', 'COMPAREBLOB !='],
2029 ['0z11 is aBlob', 'COMPAREBLOB is'],
2030 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002031
Bram Moolenaara5565e42020-05-09 15:44:01 +02002032 ['[1, 2] == aList', 'COMPARELIST =='],
2033 ['[1, 2] != aList', 'COMPARELIST !='],
2034 ['[1, 2] is aList', 'COMPARELIST is'],
2035 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002036
Bram Moolenaare0de1712020-12-02 17:36:54 +01002037 ['{a: 1} == aDict', 'COMPAREDICT =='],
2038 ['{a: 1} != aDict', 'COMPAREDICT !='],
2039 ['{a: 1} is aDict', 'COMPAREDICT is'],
2040 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002041
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002042 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2043 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2044 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2045 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002046
2047 ['77 == g:xx', 'COMPAREANY =='],
2048 ['77 != g:xx', 'COMPAREANY !='],
2049 ['77 > g:xx', 'COMPAREANY >'],
2050 ['77 < g:xx', 'COMPAREANY <'],
2051 ['77 >= g:xx', 'COMPAREANY >='],
2052 ['77 <= g:xx', 'COMPAREANY <='],
2053 ['77 =~ g:xx', 'COMPAREANY =\~'],
2054 ['77 !~ g:xx', 'COMPAREANY !\~'],
2055 ['77 is g:xx', 'COMPAREANY is'],
2056 ['77 isnot g:xx', 'COMPAREANY isnot'],
2057 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002058 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002059 if has('float')
2060 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02002061 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2062 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2063 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2064 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2065 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2066 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2067 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2068 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002069 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02002070 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002071 endif
2072
Bram Moolenaarac564082020-09-27 19:05:33 +02002073 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002074 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002075 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002076 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002077 ' var isFalse = false',
2078 ' var isNull = v:null',
2079 ' var aNumber = 222',
2080 ' var aString = "yy"',
2081 ' var aBlob = 0z22',
2082 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002083 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002084 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002085 ' if ' .. case[0],
2086 ' echo 42'
2087 ' endif',
2088 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002089 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002090 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002091 assert_match('TestCase' .. nr .. '.*' ..
2092 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2093 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002094 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002095 '\d ' .. case[1] .. '.*' ..
2096 '\d JUMP_IF_FALSE -> \d\+.*',
2097 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002098
2099 nr += 1
2100 endfor
2101
Bram Moolenaar22da5592020-03-19 14:52:20 +01002102 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002103enddef
2104
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002105def s:FalsyOp()
2106 echo g:flag ?? "yes"
2107 echo [] ?? "empty list"
2108 echo "" ?? "empty string"
2109enddef
2110
Dominique Pelle81b573d2022-03-22 21:14:55 +00002111def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002112 var res = execute('disass s:FalsyOp')
2113 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2114 'echo g:flag ?? "yes"\_s*' ..
2115 '0 LOADG g:flag\_s*' ..
2116 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2117 '2 PUSHS "yes"\_s*' ..
2118 '3 ECHO 1\_s*' ..
2119 'echo \[\] ?? "empty list"\_s*' ..
2120 '4 NEWLIST size 0\_s*' ..
2121 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2122 '6 PUSHS "empty list"\_s*' ..
2123 '7 ECHO 1\_s*' ..
2124 'echo "" ?? "empty string"\_s*' ..
2125 '\d\+ PUSHS "empty string"\_s*' ..
2126 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002127 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002128 res)
2129enddef
2130
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002131def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002132 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002133 ['"xx" == "yy"', false],
2134 ['"aa" == "aa"', true],
2135 ['has("eval") ? true : false', true],
2136 ['has("asdf") ? true : false', false],
2137 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002138
Bram Moolenaarac564082020-09-27 19:05:33 +02002139 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002140 for case in cases
2141 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002142 ' if ' .. case[0],
2143 ' echo 42'
2144 ' endif',
2145 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002146 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002147 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002148 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002149 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002150 assert_match('TestCase' .. nr .. '.*' ..
2151 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2152 '\d PUSHNR 42.*' ..
2153 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002154 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002155 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002156 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002157 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002158 assert_match('TestCase' .. nr .. '.*' ..
2159 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2160 'echo 42[ \n]*' ..
2161 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002162 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002163 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002164 endif
2165
2166 nr += 1
2167 endfor
2168
2169 delete('Xdisassemble')
2170enddef
2171
Bram Moolenaarad39c092020-02-26 18:23:43 +01002172def s:Execute()
2173 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002174 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002175 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002176 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002177 execute 'help ' .. tag
2178enddef
2179
2180def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002181 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002182 assert_match('\<SNR>\d*_Execute\_s*' ..
2183 "execute 'help vim9.txt'\\_s*" ..
2184 '\d PUSHS "help vim9.txt"\_s*' ..
2185 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002186 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002187 '\d PUSHS "help vim9.txt"\_s*' ..
2188 '\d STORE $0\_s*' ..
2189 'execute cmd\_s*' ..
2190 '\d LOAD $0\_s*' ..
2191 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002192 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002193 '\d PUSHS "vim9.txt"\_s*' ..
2194 '\d STORE $1\_s*' ..
2195 "execute 'help ' .. tag\\_s*" ..
2196 '\d\+ PUSHS "help "\_s*' ..
2197 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002198 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002199 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002200 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002201 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002202enddef
2203
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002204def s:OnlyRange()
2205 :$
2206 :123
2207 :'m
2208enddef
2209
2210def Test_disassemble_range_only()
2211 var res = execute('disass s:OnlyRange')
2212 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2213 ':$\_s*' ..
2214 '\d EXECRANGE $\_s*' ..
2215 ':123\_s*' ..
2216 '\d EXECRANGE 123\_s*' ..
2217 ':''m\_s*' ..
2218 '\d EXECRANGE ''m\_s*' ..
2219 '\d\+ RETURN void',
2220 res)
2221enddef
2222
Bram Moolenaarf6ced982022-04-28 12:00:49 +01002223def s:StoreRange()
2224 var l = [1, 2]
2225 l[0 : 1] = [7, 8]
2226enddef
2227
2228def Test_disassemble_store_range()
2229 var res = execute('disass s:StoreRange')
2230 assert_match('\<SNR>\d*_StoreRange\_s*' ..
2231 'var l = \[1, 2]\_s*' ..
2232 '\d PUSHNR 1\_s*' ..
2233 '\d PUSHNR 2\_s*' ..
2234 '\d NEWLIST size 2\_s*' ..
2235 '\d SETTYPE list<number>\_s*' ..
2236 '\d STORE $0\_s*' ..
2237
2238 'l\[0 : 1] = \[7, 8]\_s*' ..
2239 '\d\+ PUSHNR 7\_s*' ..
2240 '\d\+ PUSHNR 8\_s*' ..
2241 '\d\+ NEWLIST size 2\_s*' ..
2242 '\d\+ PUSHNR 0\_s*' ..
2243 '\d\+ PUSHNR 1\_s*' ..
2244 '\d\+ LOAD $0\_s*' ..
2245 '\d\+ STORERANGE\_s*' ..
2246 '\d\+ RETURN void',
2247 res)
2248enddef
2249
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002250def s:Echomsg()
2251 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002252 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002253 echoerr 'went' .. 'wrong'
2254enddef
2255
2256def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002257 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002258 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2259 "echomsg 'some' 'message'\\_s*" ..
2260 '\d PUSHS "some"\_s*' ..
2261 '\d PUSHS "message"\_s*' ..
2262 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002263 "echoconsole 'nothing'\\_s*" ..
2264 '\d PUSHS "nothing"\_s*' ..
2265 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002266 "echoerr 'went' .. 'wrong'\\_s*" ..
2267 '\d PUSHS "wentwrong"\_s*' ..
2268 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002269 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002270 res)
2271enddef
2272
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002273def SomeStringArg(arg: string)
2274 echo arg
2275enddef
2276
2277def SomeAnyArg(arg: any)
2278 echo arg
2279enddef
2280
2281def SomeStringArgAndReturn(arg: string): string
2282 return arg
2283enddef
2284
2285def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002286 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002287 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2288 '\d *echo arg.*' ..
2289 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002290 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002291
Bram Moolenaarac564082020-09-27 19:05:33 +02002292 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002293 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2294 '\d *echo arg\_s*' ..
2295 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002296 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002297
Bram Moolenaarac564082020-09-27 19:05:33 +02002298 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002299 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2300 '\d *return arg\_s*' ..
2301 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002302 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002303enddef
2304
Bram Moolenaar09689a02020-05-09 22:50:08 +02002305def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002306 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002307 vim9script
2308 def FuncOne(): string
2309 return FuncTwo()
2310 enddef
2311 def FuncTwo(): string
2312 return 'two'
2313 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002314 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002315 END
2316 writefile(lines, 'Xdisassemble')
2317 source Xdisassemble
2318
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002319 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002320 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2321 'return FuncTwo()\_s*' ..
2322 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002323 '\d RETURN',
2324 g:res_FuncOne)
2325
2326 delete('Xdisassemble')
2327 unlet g:res_FuncOne
2328enddef
2329
Bram Moolenaar61a89812020-05-07 16:58:17 +02002330def s:ConcatStrings(): string
2331 return 'one' .. 'two' .. 'three'
2332enddef
2333
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002334def s:ComputeConst(): number
2335 return 2 + 3 * 4 / 6 + 7
2336enddef
2337
Bram Moolenaar1c747212020-05-09 18:28:34 +02002338def s:ComputeConstParen(): number
2339 return ((2 + 4) * (8 / 2)) / (3 + 4)
2340enddef
2341
Bram Moolenaar61a89812020-05-07 16:58:17 +02002342def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002343 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002344 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2345 "return 'one' .. 'two' .. 'three'\\_s*" ..
2346 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002347 '\d RETURN',
2348 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002349
2350 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002351 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2352 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2353 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002354 '\d RETURN',
2355 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002356
2357 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002358 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2359 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2360 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002361 '\d RETURN',
2362 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002363enddef
2364
Bram Moolenaar389df252020-07-09 21:20:47 +02002365def s:CallAppend()
2366 eval "some text"->append(2)
2367enddef
2368
2369def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002370 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002371 assert_match('<SNR>\d*_CallAppend\_s*' ..
2372 'eval "some text"->append(2)\_s*' ..
2373 '\d PUSHS "some text"\_s*' ..
2374 '\d PUSHNR 2\_s*' ..
2375 '\d SHUFFLE 2 up 1\_s*' ..
2376 '\d BCALL append(argc 2)\_s*' ..
2377 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002378 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002379 res)
2380enddef
2381
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002382
2383def s:SilentMessage()
2384 silent echomsg "text"
2385 silent! echoerr "error"
2386enddef
2387
2388def Test_silent()
2389 var res = execute('disass s:SilentMessage')
2390 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2391 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002392 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002393 '\d PUSHS "text"\_s*' ..
2394 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002395 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002396 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002397 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002398 '\d PUSHS "error"\_s*' ..
2399 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002400 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002401 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002402 res)
2403enddef
2404
2405def s:SilentIf()
2406 silent if 4 == g:five
2407 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002408 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002409enddef
2410
2411def Test_silent_if()
2412 var res = execute('disass s:SilentIf')
2413 assert_match('<SNR>\d*_SilentIf\_s*' ..
2414 'silent if 4 == g:five\_s*' ..
2415 '\d\+ CMDMOD silent\_s*' ..
2416 '\d\+ PUSHNR 4\_s*' ..
2417 '\d\+ LOADG g:five\_s*' ..
2418 '\d\+ COMPAREANY ==\_s*' ..
2419 '\d\+ CMDMOD_REV\_s*' ..
2420 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2421 'silent elseif 4 == g:five\_s*' ..
2422 '\d\+ JUMP -> \d\+\_s*' ..
2423 '\d\+ CMDMOD silent\_s*' ..
2424 '\d\+ PUSHNR 4\_s*' ..
2425 '\d\+ LOADG g:five\_s*' ..
2426 '\d\+ COMPAREANY ==\_s*' ..
2427 '\d\+ CMDMOD_REV\_s*' ..
2428 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002429 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002430 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002431 res)
2432enddef
2433
2434def s:SilentFor()
2435 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002436 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002437enddef
2438
2439def Test_silent_for()
2440 var res = execute('disass s:SilentFor')
2441 assert_match('<SNR>\d*_SilentFor\_s*' ..
2442 'silent for i in \[0\]\_s*' ..
2443 '\d CMDMOD silent\_s*' ..
2444 '\d STORE -1 in $0\_s*' ..
2445 '\d PUSHNR 0\_s*' ..
2446 '\d NEWLIST size 1\_s*' ..
2447 '\d CMDMOD_REV\_s*' ..
2448 '5 FOR $0 -> 8\_s*' ..
2449 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002450 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002451 '\d JUMP -> 5\_s*' ..
2452 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002453 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002454 res)
2455enddef
2456
2457def s:SilentWhile()
2458 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002459 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002460enddef
2461
2462def Test_silent_while()
2463 var res = execute('disass s:SilentWhile')
2464 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2465 'silent while g:not\_s*' ..
2466 '0 CMDMOD silent\_s*' ..
2467 '\d LOADG g:not\_s*' ..
2468 '\d COND2BOOL\_s*' ..
2469 '\d CMDMOD_REV\_s*' ..
2470 '\d JUMP_IF_FALSE -> 6\_s*' ..
2471
Bram Moolenaarfa984412021-03-25 22:15:28 +01002472 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002473 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002474 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002475 res)
2476enddef
2477
2478def s:SilentReturn(): string
2479 silent return "done"
2480enddef
2481
2482def Test_silent_return()
2483 var res = execute('disass s:SilentReturn')
2484 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2485 'silent return "done"\_s*' ..
2486 '\d CMDMOD silent\_s*' ..
2487 '\d PUSHS "done"\_s*' ..
2488 '\d CMDMOD_REV\_s*' ..
2489 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002490 res)
2491enddef
2492
Bram Moolenaarb2049902021-01-24 12:53:53 +01002493def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002494 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002495 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002496 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002497 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002498 return "done"
2499enddef
2500
2501def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002502 if !has('profile')
2503 MissingFeature 'profile'
2504 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002505 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002506 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002507 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002508 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002509 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002510 '\d PUSHS "profiled"\_s*' ..
2511 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002512 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002513 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002514 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002515 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002516 '\d PUSHS "some text"\_s*' ..
2517 '\d STORE $0\_s*' ..
2518 'return "done"\_s*' ..
2519 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002520 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002521 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002522 '\d\+ RETURN\_s*' ..
2523 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002524 res)
2525enddef
2526
Bram Moolenaare99d4222021-06-13 14:01:26 +02002527def Test_debugged()
2528 var res = execute('disass debug s:Profiled')
2529 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002530 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002531 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002532 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002533 '\d PUSHS "profiled"\_s*' ..
2534 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002535 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002536 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002537 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002538 '\d PUSHS "some text"\_s*' ..
2539 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002540 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002541 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002542 '\d PUSHS "done"\_s*' ..
2543 '\d RETURN\_s*',
2544 res)
2545enddef
2546
Bram Moolenaar90770b72021-11-30 20:57:38 +00002547def s:ElseifConstant()
2548 if g:value
2549 echo "one"
2550 elseif true
2551 echo "true"
2552 elseif false
2553 echo "false"
2554 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002555 if 0
2556 echo "yes"
2557 elseif 0
2558 echo "no"
2559 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002560enddef
2561
2562def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002563 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002564 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2565 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002566 '0 DEBUG line 1-1 varcount 0\_s*' ..
2567 '1 LOADG g:value\_s*' ..
2568 '2 COND2BOOL\_s*' ..
2569 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002570 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002571 '4 DEBUG line 2-2 varcount 0\_s*' ..
2572 '5 PUSHS "one"\_s*' ..
2573 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002574 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002575 '7 JUMP -> 12\_s*' ..
2576 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002577 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002578 '9 DEBUG line 4-4 varcount 0\_s*' ..
2579 '10 PUSHS "true"\_s*' ..
2580 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002581 'elseif false\_s*' ..
2582 'echo "false"\_s*' ..
2583 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002584 'if 0\_s*' ..
2585 '12 DEBUG line 8-8 varcount 0\_s*' ..
2586 'echo "yes"\_s*' ..
2587 'elseif 0\_s*' ..
2588 '13 DEBUG line 11-10 varcount 0\_s*' ..
2589 'echo "no"\_s*' ..
2590 'endif\_s*' ..
2591 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002592 res)
2593enddef
2594
Bram Moolenaar093165c2021-08-22 13:35:31 +02002595def s:DebugElseif()
2596 var b = false
2597 if b
2598 eval 1 + 0
2599 silent elseif !b
2600 eval 2 + 0
2601 endif
2602enddef
2603
2604def Test_debug_elseif()
2605 var res = execute('disass debug s:DebugElseif')
2606 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2607 'var b = false\_s*' ..
2608 '0 DEBUG line 1-1 varcount 0\_s*' ..
2609 '1 PUSH false\_s*' ..
2610 '2 STORE $0\_s*' ..
2611
2612 'if b\_s*' ..
2613 '3 DEBUG line 2-2 varcount 1\_s*' ..
2614 '4 LOAD $0\_s*' ..
2615 '5 JUMP_IF_FALSE -> 10\_s*' ..
2616
2617 'eval 1 + 0\_s*' ..
2618 '6 DEBUG line 3-3 varcount 1\_s*' ..
2619 '7 PUSHNR 1\_s*' ..
2620 '8 DROP\_s*' ..
2621
2622 'silent elseif !b\_s*' ..
2623 '9 JUMP -> 20\_s*' ..
2624 '10 CMDMOD silent\_s*' ..
2625 '11 DEBUG line 4-4 varcount 1\_s*' ..
2626 '12 LOAD $0\_s*' ..
2627 '13 INVERT -1 (!val)\_s*' ..
2628 '14 CMDMOD_REV\_s*' ..
2629 '15 JUMP_IF_FALSE -> 20\_s*' ..
2630
2631 'eval 2 + 0\_s*' ..
2632 '16 DEBUG line 5-5 varcount 1\_s*' ..
2633 '17 PUSHNR 2\_s*' ..
2634 '18 DROP\_s*' ..
2635
2636 'endif\_s*' ..
2637 '19 DEBUG line 6-6 varcount 1\_s*' ..
2638 '20 RETURN void*',
2639 res)
2640enddef
2641
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002642def s:DebugFor()
2643 echo "hello"
2644 for a in [0]
2645 echo a
2646 endfor
2647enddef
2648
2649def Test_debug_for()
2650 var res = execute('disass debug s:DebugFor')
2651 assert_match('<SNR>\d*_DebugFor\_s*' ..
2652 'echo "hello"\_s*' ..
2653 '0 DEBUG line 1-1 varcount 0\_s*' ..
2654 '1 PUSHS "hello"\_s*' ..
2655 '2 ECHO 1\_s*' ..
2656
2657 'for a in \[0\]\_s*' ..
2658 '3 DEBUG line 2-2 varcount 0\_s*' ..
2659 '4 STORE -1 in $0\_s*' ..
2660 '5 PUSHNR 0\_s*' ..
2661 '6 NEWLIST size 1\_s*' ..
2662 '7 DEBUG line 2-2 varcount 2\_s*' ..
2663 '8 FOR $0 -> 15\_s*' ..
2664 '9 STORE $1\_s*' ..
2665
2666 'echo a\_s*' ..
2667 '10 DEBUG line 3-3 varcount 2\_s*' ..
2668 '11 LOAD $1\_s*' ..
2669 '12 ECHO 1\_s*' ..
2670
2671 'endfor\_s*' ..
2672 '13 DEBUG line 4-4 varcount 2\_s*' ..
2673 '14 JUMP -> 7\_s*' ..
2674 '15 DROP\_s*' ..
2675 '16 RETURN void*',
2676 res)
2677enddef
2678
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002679def s:TryCatch()
2680 try
2681 echo "try"
2682 catch /error/
2683 echo "caught"
2684 endtry
2685enddef
2686
2687def Test_debug_try_catch()
2688 var res = execute('disass debug s:TryCatch')
2689 assert_match('<SNR>\d*_TryCatch\_s*' ..
2690 'try\_s*' ..
2691 '0 DEBUG line 1-1 varcount 0\_s*' ..
2692 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2693 'echo "try"\_s*' ..
2694 '2 DEBUG line 2-2 varcount 0\_s*' ..
2695 '3 PUSHS "try"\_s*' ..
2696 '4 ECHO 1\_s*' ..
2697 'catch /error/\_s*' ..
2698 '5 DEBUG line 3-3 varcount 0\_s*' ..
2699 '6 JUMP -> 17\_s*' ..
2700 '7 DEBUG line 4-3 varcount 0\_s*' ..
2701 '8 PUSH v:exception\_s*' ..
2702 '9 PUSHS "error"\_s*' ..
2703 '10 COMPARESTRING =\~\_s*' ..
2704 '11 JUMP_IF_FALSE -> 17\_s*' ..
2705 '12 CATCH\_s*' ..
2706 'echo "caught"\_s*' ..
2707 '13 DEBUG line 4-4 varcount 0\_s*' ..
2708 '14 PUSHS "caught"\_s*' ..
2709 '15 ECHO 1\_s*' ..
2710 'endtry\_s*' ..
2711 '16 DEBUG line 5-5 varcount 0\_s*' ..
2712 '17 ENDTRY\_s*' ..
2713 '\d\+ RETURN void',
2714 res)
2715enddef
2716
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002717func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002718 echo 'legacy'
2719endfunc
2720
2721def s:UseMember()
2722 var d = {func: Legacy}
2723 var v = d.func()
2724enddef
2725
2726def Test_disassemble_dict_stack()
2727 var res = execute('disass s:UseMember')
2728 assert_match('<SNR>\d*_UseMember\_s*' ..
2729 'var d = {func: Legacy}\_s*' ..
2730 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002731 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002732 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002733 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002734 '\d STORE $0\_s*' ..
2735
2736 'var v = d.func()\_s*' ..
2737 '\d LOAD $0\_s*' ..
2738 '\d MEMBER func\_s*' ..
2739 '\d PCALL top (argc 0)\_s*' ..
2740 '\d PCALL end\_s*' ..
2741 '\d CLEARDICT\_s*' ..
2742 '\d\+ STORE $1\_s*' ..
2743 '\d\+ RETURN void*',
2744 res)
2745enddef
2746
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002747def s:RetLegacy(): string
2748 legacy return "yes"
2749enddef
2750
2751def Test_disassemble_return_legacy()
2752 var res = execute('disass s:RetLegacy')
2753 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2754 'legacy return "yes"\_s*' ..
2755 '\d CMDMOD legacy\_s*' ..
2756 '\d EVAL legacy "yes"\_s*' ..
2757 '\d CHECKTYPE string stack\[-1]\_s*' ..
2758 '\d CMDMOD_REV\_s*' ..
2759 '\d RETURN',
2760 res)
2761enddef
2762
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002763def s:EchoMessages()
2764 echohl ErrorMsg | echom v:exception | echohl NONE
2765enddef
2766
2767def Test_disassemble_nextcmd()
2768 # splitting commands and removing trailing blanks should not change the line
2769 var res = execute('disass s:EchoMessages')
2770 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2771 'echohl ErrorMsg | echom v:exception | echohl NONE',
2772 res)
2773enddef
2774
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002775def Test_disassemble_after_reload()
2776 var lines =<< trim END
2777 vim9script
2778 if exists('g:ThisFunc')
2779 finish
2780 endif
2781 var name: any
2782 def g:ThisFunc(): number
2783 g:name = name
2784 return 0
2785 enddef
2786 def g:ThatFunc(): number
2787 name = g:name
2788 return 0
2789 enddef
2790 END
2791 lines->writefile('Xreload.vim')
2792
2793 source Xreload.vim
2794 g:ThisFunc()
2795 g:ThatFunc()
2796
2797 source Xreload.vim
2798 var res = execute('disass g:ThisFunc')
2799 assert_match('ThisFunc\_s*' ..
2800 'g:name = name\_s*' ..
2801 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2802 '\d STOREG g:name\_s*' ..
2803 'return 0\_s*' ..
2804 '\d PUSHNR 0\_s*' ..
2805 '\d RETURN\_s*',
2806 res)
2807
2808 res = execute('disass g:ThatFunc')
2809 assert_match('ThatFunc\_s*' ..
2810 'name = g:name\_s*' ..
2811 '\d LOADG g:name\_s*' ..
2812 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2813 'return 0\_s*' ..
2814 '\d PUSHNR 0\_s*' ..
2815 '\d RETURN\_s*',
2816 res)
2817
2818 delete('Xreload.vim')
2819 delfunc g:ThisFunc
2820 delfunc g:ThatFunc
2821enddef
2822
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002823
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002824
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002825" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker