blob: e42ee78470b4bceb68aaaaebc191ad8059a7edbe [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
LemonBoyf3b48952022-05-05 13:53:03 +0100190def s:SubstituteExpr()
191 substitute('a', 'b', '\=123', 'g')
192enddef
193
194def Test_disassemble_substitute_expr()
195 var res = execute('disass s:SubstituteExpr')
196 assert_match('<SNR>\d*_SubstituteExpr.*' ..
197 'substitute(''a'', ''b'', ''\\=123'', ''g'')\_s*' ..
198 '\d PUSHS "a"\_s*' ..
199 '\d PUSHS "b"\_s*' ..
200 '\d INSTR\_s*' ..
201 ' 0 PUSHNR 123\_s*' ..
202 ' -------------\_s*' ..
203 '\d PUSHS "g"\_s*' ..
204 '\d BCALL substitute(argc 4)\_s*' ..
205 '\d DROP\_s*' ..
206 '\d RETURN void',
207 res)
208enddef
209
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200210def s:RedirVar()
211 var result: string
212 redir =>> result
213 echo "text"
214 redir END
215enddef
216
217def Test_disassemble_redir_var()
218 var res = execute('disass s:RedirVar')
219 assert_match('<SNR>\d*_RedirVar.*' ..
220 ' var result: string\_s*' ..
221 '\d PUSHS "\[NULL\]"\_s*' ..
222 '\d STORE $0\_s*' ..
223 ' redir =>> result\_s*' ..
224 '\d REDIR\_s*' ..
225 ' echo "text"\_s*' ..
226 '\d PUSHS "text"\_s*' ..
227 '\d ECHO 1\_s*' ..
228 ' redir END\_s*' ..
229 '\d LOAD $0\_s*' ..
230 '\d REDIR END\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100231 '\d CONCAT size 2\_s*' ..
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200232 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200233 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200234 res)
235enddef
236
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200237def s:Cexpr()
238 var errors = "list of errors"
239 cexpr errors
240enddef
241
242def Test_disassemble_cexpr()
243 var res = execute('disass s:Cexpr')
244 assert_match('<SNR>\d*_Cexpr.*' ..
245 ' var errors = "list of errors"\_s*' ..
246 '\d PUSHS "list of errors"\_s*' ..
247 '\d STORE $0\_s*' ..
248 ' cexpr errors\_s*' ..
249 '\d CEXPR pre cexpr\_s*' ..
250 '\d LOAD $0\_s*' ..
251 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200252 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200253 res)
254enddef
255
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200256def s:YankRange()
257 norm! m[jjm]
258 :'[,']yank
259enddef
260
261def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200262 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200263 assert_match('<SNR>\d*_YankRange.*' ..
264 ' norm! m\[jjm\]\_s*' ..
265 '\d EXEC norm! m\[jjm\]\_s*' ..
266 ' :''\[,''\]yank\_s*' ..
267 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200268 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200269 res)
270enddef
271
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200272def s:PutExpr()
273 :3put ="text"
274enddef
275
276def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200277 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200278 assert_match('<SNR>\d*_PutExpr.*' ..
279 ' :3put ="text"\_s*' ..
280 '\d PUSHS "text"\_s*' ..
281 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200282 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200283 res)
284enddef
285
Bram Moolenaar08597872020-12-10 19:43:40 +0100286def s:PutRange()
287 :$-2put a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100288 :$-3put! b
Bram Moolenaar08597872020-12-10 19:43:40 +0100289enddef
290
291def Test_disassemble_put_range()
292 var res = execute('disass s:PutRange')
293 assert_match('<SNR>\d*_PutRange.*' ..
294 ' :$-2put a\_s*' ..
295 '\d RANGE $-2\_s*' ..
296 '\d PUT a range\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100297
298 ' :$-3put! b\_s*' ..
299 '\d RANGE $-3\_s*' ..
300 '\d PUT b above range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200301 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100302 res)
303enddef
304
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100305def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200306 var localbool = true
307 var localspec = v:none
308 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100309 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200310 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100311 endif
312enddef
313
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100314def Test_disassemble_push()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000315 mkdir('Xdir/autoload', 'p')
316 var save_rtp = &rtp
317 exe 'set rtp^=' .. getcwd() .. '/Xdir'
318
319 var lines =<< trim END
320 vim9script
321 END
322 writefile(lines, 'Xdir/autoload/autoscript.vim')
323
324 lines =<< trim END
325 vim9script
326 import autoload 'autoscript.vim'
327
Bram Moolenaara749a422022-02-12 19:52:25 +0000328 def AutoloadFunc()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000329 &operatorfunc = autoscript.Opfunc
330 enddef
331
Bram Moolenaara749a422022-02-12 19:52:25 +0000332 var res = execute('disass AutoloadFunc')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000333 assert_match('<SNR>\d*_AutoloadFunc.*' ..
334 '&operatorfunc = autoscript.Opfunc\_s*' ..
335 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
336 '1 STOREFUNCOPT &operatorfunc\_s*' ..
337 '2 RETURN void',
338 res)
339 END
Bram Moolenaar62aec932022-01-29 21:45:34 +0000340 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000341
342 delete('Xdir', 'rf')
343 &rtp = save_rtp
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100344enddef
345
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100346def Test_disassemble_import_autoload()
347 writefile(['vim9script'], 'XimportAL.vim')
348
349 var lines =<< trim END
350 vim9script
351 import autoload './XimportAL.vim'
352
353 def AutoloadFunc()
354 echo XimportAL.SomeFunc()
355 echo XimportAL.someVar
356 XimportAL.someVar = "yes"
357 enddef
358
359 var res = execute('disass AutoloadFunc')
360 assert_match('<SNR>\d*_AutoloadFunc.*' ..
361 'echo XimportAL.SomeFunc()\_s*' ..
Bram Moolenaar17125182022-03-30 21:57:50 +0100362 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
Bram Moolenaarc0ceeeb2022-03-30 21:12:27 +0100363 '\d PUSHFUNC "<80><fd>R\d\+_SomeFunc"\_s*' ..
364 '\d PCALL top (argc 0)\_s*' ..
365 '\d PCALL end\_s*' ..
366 '\d ECHO 1\_s*' ..
367
368 'echo XimportAL.someVar\_s*' ..
369 '\d SOURCE .*/testdir/XimportAL.vim\_s*' ..
370 '\d LOADEXPORT s:someVar from .*/testdir/XimportAL.vim\_s*' ..
371 '\d ECHO 1\_s*' ..
372
373 'XimportAL.someVar = "yes"\_s*' ..
374 '\d\+ PUSHS "yes"\_s*' ..
375 '\d\+ SOURCE .*/testdir/XimportAL.vim\_s*' ..
376 '\d\+ STOREEXPORT someVar in .*/testdir/XimportAL.vim\_s*' ..
377
378 '\d\+ RETURN void',
379 res)
380 END
381 v9.CheckScriptSuccess(lines)
382
383 delete('XimportAL.vim')
384enddef
385
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100386def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200387 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100388 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200389 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100390 localstr = 'xyz'
391 v:char = 'abc'
392 s:scriptvar = 'sv'
393 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100394 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200395 b:buffervar = 'bv'
396 w:windowvar = 'wv'
397 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100398 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000399 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100400 $ENVVAR = 'ev'
401 @z = 'rv'
402enddef
403
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100404def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200405 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200406 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200407 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200408 'localnr = 2.*' ..
409 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200410 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200411 'localstr = ''xyz''.*' ..
412 ' STORE $1.*' ..
413 'v:char = ''abc''.*' ..
414 'STOREV v:char.*' ..
415 's:scriptvar = ''sv''.*' ..
416 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
417 'g:globalvar = ''gv''.*' ..
418 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100419 'g:auto#var = ''av''.*' ..
420 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200421 'b:buffervar = ''bv''.*' ..
422 ' STOREB b:buffervar.*' ..
423 'w:windowvar = ''wv''.*' ..
424 ' STOREW w:windowvar.*' ..
425 't:tabpagevar = ''tv''.*' ..
426 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000427 '&tabstop = 8\_s*' ..
428 '\d\+ PUSHNR 8\_s*' ..
429 '\d\+ STOREOPT &tabstop\_s*' ..
430 '&opfunc = (t) => len(t)\_s*' ..
431 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
432 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
433 '$ENVVAR = ''ev''\_s*' ..
434 '\d\+ PUSHS "ev"\_s*' ..
435 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200436 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000437 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200438 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100439enddef
440
Bram Moolenaarcb790402020-05-15 20:53:00 +0200441def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200442 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200443 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200444 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200445 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200446 var localblob: blob = 0z1122
447 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200448enddef
449
450def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200451 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200452 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200453 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200454 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100455 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200456 '\d STORE $0\_s*' ..
457 'locallist\[0\] = 123\_s*' ..
458 '\d PUSHNR 123\_s*' ..
459 '\d PUSHNR 0\_s*' ..
460 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200461 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200462 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200463 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100464 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200465 '\d STORE $1\_s*' ..
466 'localdict\["a"\] = 456\_s*' ..
467 '\d\+ PUSHNR 456\_s*' ..
468 '\d\+ PUSHS "a"\_s*' ..
469 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200470 '\d\+ STOREINDEX dict\_s*' ..
471 'var localblob: blob = 0z1122\_s*' ..
472 '\d\+ PUSHBLOB 0z1122\_s*' ..
473 '\d\+ STORE $2\_s*' ..
474 'localblob\[1\] = 33\_s*' ..
475 '\d\+ PUSHNR 33\_s*' ..
476 '\d\+ PUSHNR 1\_s*' ..
477 '\d\+ LOAD $2\_s*' ..
478 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200479 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200480 res)
481enddef
482
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000483if has('job')
484 def s:StoreNull()
485 var ss = null_string
486 var bb = null_blob
487 var dd = null_dict
488 var ll = null_list
489 var Ff = null_function
490 var Pp = null_partial
491 var jj = null_job
492 var cc = null_channel
493 enddef
494
495 def Test_disassemble_assign_null()
496 var res = execute('disass s:StoreNull')
497 assert_match('<SNR>\d*_StoreNull\_s*' ..
498 'var ss = null_string\_s*' ..
499 '\d\+ PUSHS "\[NULL\]"\_s*' ..
500 '\d\+ STORE $\d\_s*' ..
501
502 'var bb = null_blob\_s*' ..
503 '\d\+ PUSHBLOB 0z\_s*' ..
504 '\d\+ STORE $\d\_s*' ..
505
506 'var dd = null_dict\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100507 '\d\+ NEWDICT size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000508 '\d\+ STORE $\d\_s*' ..
509
510 'var ll = null_list\_s*' ..
Bram Moolenaarec15b1c2022-03-27 16:29:53 +0100511 '\d\+ NEWLIST size -1\_s*' ..
Bram Moolenaar8acb9cc2022-03-08 13:18:55 +0000512 '\d\+ STORE $\d\_s*' ..
513
514 'var Ff = null_function\_s*' ..
515 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
516 '\d\+ STORE $\d\_s*' ..
517
518 'var Pp = null_partial\_s*' ..
519 '\d\+ NEWPARTIAL\_s*' ..
520 '\d\+ STORE $\d\_s*' ..
521
522 'var jj = null_job\_s*' ..
523 '\d\+ PUSHJOB "no process"\_s*' ..
524 '\d\+ STORE $\d\_s*' ..
525
526 'var cc = null_channel\_s*' ..
527 '\d\+ PUSHCHANNEL 0\_s*' ..
528 '\d\+ STORE $\d\_s*' ..
529
530 '\d\+ RETURN void',
531 res)
532 enddef
533endif
534
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100535def s:ScriptFuncStoreIndex()
536 var d = {dd: {}}
537 d.dd[0] = 0
538enddef
539
540def Test_disassemble_store_index()
541 var res = execute('disass s:ScriptFuncStoreIndex')
542 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
543 'var d = {dd: {}}\_s*' ..
544 '\d PUSHS "dd"\_s*' ..
545 '\d NEWDICT size 0\_s*' ..
546 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000547 '\d SETTYPE dict<dict<unknown>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100548 '\d STORE $0\_s*' ..
549 'd.dd\[0\] = 0\_s*' ..
550 '\d PUSHNR 0\_s*' ..
551 '\d PUSHNR 0\_s*' ..
552 '\d LOAD $0\_s*' ..
553 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200554 '\d\+ USEDICT\_s*' ..
555 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200556 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100557 res)
558enddef
559
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200560def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200561 var x: string
562 var y: string
563 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200564 [x, y; l] = g:stringlist
565enddef
566
567def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200568 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200569 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200570 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200571 '\d PUSHS "\[NULL\]"\_s*' ..
572 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200573 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200574 '\d PUSHS "\[NULL\]"\_s*' ..
575 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200576 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200577 '\d NEWLIST size 0\_s*' ..
578 '\d STORE $2\_s*' ..
579 '\[x, y; l\] = g:stringlist\_s*' ..
580 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200581 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200582 '\d CHECKLEN >= 2\_s*' ..
583 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200584 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200585 '\d\+ STORE $0\_s*' ..
586 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200587 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200588 '\d\+ STORE $1\_s*' ..
589 '\d\+ SLICE 2\_s*' ..
590 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200591 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200592 res)
593enddef
594
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200595def s:ListAssignWithOp()
596 var a = 2
597 var b = 3
598 [a, b] += [4, 5]
599enddef
600
601def Test_disassemble_list_assign_with_op()
602 var res = execute('disass s:ListAssignWithOp')
603 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
604 'var a = 2\_s*' ..
605 '\d STORE 2 in $0\_s*' ..
606 'var b = 3\_s*' ..
607 '\d STORE 3 in $1\_s*' ..
608 '\[a, b\] += \[4, 5\]\_s*' ..
609 '\d\+ PUSHNR 4\_s*' ..
610 '\d\+ PUSHNR 5\_s*' ..
611 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200612 '\d\+ LOAD $0\_s*' ..
613 '\d\+ ITEM 0 with op\_s*' ..
614 '\d\+ OPNR +\_s*' ..
615 '\d\+ STORE $0\_s*' ..
616 '\d\+ LOAD $1\_s*' ..
617 '\d\+ ITEM 1 with op\_s*' ..
618 '\d\+ OPNR +\_s*' ..
619 '\d\+ STORE $1\_s*' ..
620 '\d\+ DROP\_s*' ..
621 '\d\+ RETURN void',
622 res)
623enddef
624
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200625def s:ListAdd()
626 var l: list<number> = []
627 add(l, 123)
628 add(l, g:aNumber)
629enddef
630
631def Test_disassemble_list_add()
632 var res = execute('disass s:ListAdd')
633 assert_match('<SNR>\d*_ListAdd\_s*' ..
634 'var l: list<number> = []\_s*' ..
635 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100636 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200637 '\d STORE $0\_s*' ..
638 'add(l, 123)\_s*' ..
639 '\d LOAD $0\_s*' ..
640 '\d PUSHNR 123\_s*' ..
641 '\d LISTAPPEND\_s*' ..
642 '\d DROP\_s*' ..
643 'add(l, g:aNumber)\_s*' ..
644 '\d LOAD $0\_s*' ..
645 '\d\+ LOADG g:aNumber\_s*' ..
646 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
647 '\d\+ LISTAPPEND\_s*' ..
648 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200649 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200650 res)
651enddef
652
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200653def s:BlobAdd()
654 var b: blob = 0z
655 add(b, 123)
656 add(b, g:aNumber)
657enddef
658
659def Test_disassemble_blob_add()
660 var res = execute('disass s:BlobAdd')
661 assert_match('<SNR>\d*_BlobAdd\_s*' ..
662 'var b: blob = 0z\_s*' ..
663 '\d PUSHBLOB 0z\_s*' ..
664 '\d STORE $0\_s*' ..
665 'add(b, 123)\_s*' ..
666 '\d LOAD $0\_s*' ..
667 '\d PUSHNR 123\_s*' ..
668 '\d BLOBAPPEND\_s*' ..
669 '\d DROP\_s*' ..
670 'add(b, g:aNumber)\_s*' ..
671 '\d LOAD $0\_s*' ..
672 '\d\+ LOADG g:aNumber\_s*' ..
673 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
674 '\d\+ BLOBAPPEND\_s*' ..
675 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200676 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200677 res)
678enddef
679
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200680def s:BlobIndexSlice()
681 var b: blob = 0z112233
682 echo b[1]
683 echo b[1 : 2]
684enddef
685
686def Test_disassemble_blob_index_slice()
687 var res = execute('disass s:BlobIndexSlice')
688 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
689 'var b: blob = 0z112233\_s*' ..
690 '\d PUSHBLOB 0z112233\_s*' ..
691 '\d STORE $0\_s*' ..
692 'echo b\[1\]\_s*' ..
693 '\d LOAD $0\_s*' ..
694 '\d PUSHNR 1\_s*' ..
695 '\d BLOBINDEX\_s*' ..
696 '\d ECHO 1\_s*' ..
697 'echo b\[1 : 2\]\_s*' ..
698 '\d LOAD $0\_s*' ..
699 '\d PUSHNR 1\_s*' ..
700 '\d\+ PUSHNR 2\_s*' ..
701 '\d\+ BLOBSLICE\_s*' ..
702 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200703 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200704 res)
705enddef
706
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200707def s:ScriptFuncUnlet()
708 g:somevar = "value"
709 unlet g:somevar
710 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200711 unlet $SOMEVAR
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100712
713 var l = [1, 2, 3]
714 unlet l[2]
715 unlet l[0 : 1]
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200716enddef
717
718def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200719 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200720 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
721 'g:somevar = "value"\_s*' ..
722 '\d PUSHS "value"\_s*' ..
723 '\d STOREG g:somevar\_s*' ..
724 'unlet g:somevar\_s*' ..
725 '\d UNLET g:somevar\_s*' ..
726 'unlet! g:somevar\_s*' ..
727 '\d UNLET! g:somevar\_s*' ..
728 'unlet $SOMEVAR\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100729 '\d UNLETENV $SOMEVAR\_s*' ..
730
731 'var l = \[1, 2, 3]\_s*' ..
732 '\d\+ PUSHNR 1\_s*' ..
733 '\d\+ PUSHNR 2\_s*' ..
734 '\d\+ PUSHNR 3\_s*' ..
735 '\d\+ NEWLIST size 3\_s*' ..
736 '\d\+ SETTYPE list<number>\_s*' ..
737 '\d\+ STORE $0\_s*' ..
738
739 'unlet l\[2]\_s*' ..
740 '\d\+ PUSHNR 2\_s*' ..
741 '\d\+ LOAD $0\_s*' ..
742 '\d\+ UNLETINDEX\_s*' ..
743
744 'unlet l\[0 : 1]\_s*' ..
745 '\d\+ PUSHNR 0\_s*' ..
746 '\d\+ PUSHNR 1\_s*' ..
747 '\d\+ LOAD $0\_s*' ..
748 '\d\+ UNLETRANGE\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200749 res)
750enddef
751
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200752def s:LockLocal()
753 var d = {a: 1}
754 lockvar d.a
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100755 const nr = 22
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200756enddef
757
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000758def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200759 var res = execute('disass s:LockLocal')
760 assert_match('<SNR>\d*_LockLocal\_s*' ..
761 'var d = {a: 1}\_s*' ..
762 '\d PUSHS "a"\_s*' ..
763 '\d PUSHNR 1\_s*' ..
764 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000765 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200766 '\d STORE $0\_s*' ..
767 'lockvar d.a\_s*' ..
768 '\d LOAD $0\_s*' ..
Bram Moolenaarf6ced982022-04-28 12:00:49 +0100769 '\d LOCKUNLOCK lockvar 2 d.a\_s*' ..
770
771 'const nr = 22\_s*' ..
772 '\d\+ PUSHNR 22\_s*' ..
773 '\d\+ LOCKCONST\_s*' ..
774 '\d\+ STORE $1',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200775 res)
776enddef
777
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100778def s:ScriptFuncTry()
779 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200780 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100781 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200782 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100783 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200784 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100785 endtry
786enddef
787
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100788def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200789 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200790 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
791 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100792 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200793 'echo "yes"\_s*' ..
794 '\d PUSHS "yes"\_s*' ..
795 '\d ECHO 1\_s*' ..
796 'catch /fail/\_s*' ..
797 '\d JUMP -> \d\+\_s*' ..
798 '\d PUSH v:exception\_s*' ..
799 '\d PUSHS "fail"\_s*' ..
800 '\d COMPARESTRING =\~\_s*' ..
801 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
802 '\d CATCH\_s*' ..
803 'echo "no"\_s*' ..
804 '\d\+ PUSHS "no"\_s*' ..
805 '\d\+ ECHO 1\_s*' ..
806 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100807 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200808 'throw "end"\_s*' ..
809 '\d\+ PUSHS "end"\_s*' ..
810 '\d\+ THROW\_s*' ..
811 'endtry\_s*' ..
812 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200813 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100814enddef
815
816def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200817 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100818 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100819enddef
820
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100821def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200824 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200825 '\d PUSHNR 1\_s*' ..
826 '\d PUSHS "two"\_s*' ..
827 '\d PUSHNR 333\_s*' ..
828 '\d NEWLIST size 3\_s*' ..
829 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100830 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200831 '\d PUSHS "one"\_s*' ..
832 '\d PUSHNR 1\_s*' ..
833 '\d PUSHS "two"\_s*' ..
834 '\d PUSHS "val"\_s*' ..
835 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200836 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100837enddef
838
Bram Moolenaar62aec932022-01-29 21:45:34 +0000839def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100840 echo arg
841enddef
842
Bram Moolenaar62aec932022-01-29 21:45:34 +0000843func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100844 echo 'nothing'
845endfunc
846
Bram Moolenaar62aec932022-01-29 21:45:34 +0000847func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100848 echo a:arg
849endfunc
850
851def s:ScriptFuncCall(): string
852 changenr()
853 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000854 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100855 FuncWithArg(343)
856 ScriptFuncNew()
857 s:ScriptFuncNew()
858 UserFunc()
859 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200860 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100861 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200862 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100863 FuncRefWithArg("bar")
864 return "yes"
865enddef
866
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100867def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200868 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200869 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
870 'changenr()\_s*' ..
871 '\d BCALL changenr(argc 0)\_s*' ..
872 '\d DROP\_s*' ..
873 'char2nr("abc")\_s*' ..
874 '\d PUSHS "abc"\_s*' ..
875 '\d BCALL char2nr(argc 1)\_s*' ..
876 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000877 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200878 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
879 '\d DROP\_s*' ..
880 'FuncWithArg(343)\_s*' ..
881 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000882 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200883 '\d\+ DROP\_s*' ..
884 'ScriptFuncNew()\_s*' ..
885 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
886 '\d\+ DROP\_s*' ..
887 's:ScriptFuncNew()\_s*' ..
888 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
889 '\d\+ DROP\_s*' ..
890 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000891 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200892 '\d\+ DROP\_s*' ..
893 'UserFuncWithArg("foo")\_s*' ..
894 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000895 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200896 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200897 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200898 '\d\+ PUSHS "UserFunc"\_s*' ..
899 '\d\+ BCALL function(argc 1)\_s*' ..
900 '\d\+ STORE $0\_s*' ..
901 'FuncRef()\_s*' ..
902 '\d\+ LOAD $\d\_s*' ..
903 '\d\+ PCALL (argc 0)\_s*' ..
904 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200905 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200906 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
907 '\d\+ BCALL function(argc 1)\_s*' ..
908 '\d\+ STORE $1\_s*' ..
909 'FuncRefWithArg("bar")\_s*' ..
910 '\d\+ PUSHS "bar"\_s*' ..
911 '\d\+ LOAD $\d\_s*' ..
912 '\d\+ PCALL (argc 1)\_s*' ..
913 '\d\+ DROP\_s*' ..
914 'return "yes"\_s*' ..
915 '\d\+ PUSHS "yes"\_s*' ..
916 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200917 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100918enddef
919
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200920
921def s:CreateRefs()
922 var local = 'a'
923 def Append(arg: string)
924 local ..= arg
925 enddef
926 g:Append = Append
927 def Get(): string
928 return local
929 enddef
930 g:Get = Get
931enddef
932
933def Test_disassemble_closure()
934 CreateRefs()
935 var res = execute('disass g:Append')
936 assert_match('<lambda>\d\_s*' ..
937 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100938 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200939 '\d LOAD arg\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +0100940 '\d CONCAT size 2\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100941 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200942 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200943 res)
944
945 res = execute('disass g:Get')
946 assert_match('<lambda>\d\_s*' ..
947 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100948 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200949 '\d RETURN',
950 res)
951
952 unlet g:Append
953 unlet g:Get
954enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200955
Bram Moolenaar95e4dd82022-04-27 22:15:40 +0100956def s:ClosureArg(arg: string)
957 var Ref = () => arg .. "x"
958enddef
959
960def Test_disassemble_closure_arg()
961 var res = execute('disass s:ClosureArg')
962 assert_match('<SNR>\d\+_ClosureArg\_s*' ..
963 'var Ref = () => arg .. "x"\_s*' ..
964 '\d FUNCREF <lambda>\d\+',
965 res)
966 var lres = execute('disass ' .. matchstr(res, '<lambda>\d\+'))
967 assert_match('<lambda>\d\+\_s*' ..
968 'return arg .. "x"\_s*' ..
969 '\d LOADOUTER level 1 arg\[-1]\_s*' ..
970 '\d PUSHS "x"\_s*' ..
971 '\d CONCAT size 2\_s*' ..
972 '\d RETURN',
973 lres)
974enddef
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100975
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200976def EchoArg(arg: string): string
977 return arg
978enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +0000979def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200980 return function('EchoArg')
981enddef
982def s:ScriptPCall()
983 RefThis()("text")
984enddef
985
986def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200987 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200988 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
989 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000990 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200991 '\d PUSHS "text"\_s*' ..
992 '\d PCALL top (argc 1)\_s*' ..
993 '\d PCALL end\_s*' ..
994 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200995 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200996 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200997enddef
998
999
Bram Moolenaara26b9702020-04-18 19:53:28 +02001000def s:FuncWithForwardCall(): string
1001 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001002enddef
1003
1004def DefinedLater(arg: string): string
1005 return arg
1006enddef
1007
1008def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001009 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001010 assert_match('FuncWithForwardCall\_s*' ..
1011 'return g:DefinedLater("yes")\_s*' ..
1012 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001013 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001014 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001015 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001016
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001017 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001018 assert_equal('yes', FuncWithForwardCall())
1019
Bram Moolenaara26b9702020-04-18 19:53:28 +02001020 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001021 assert_match('FuncWithForwardCall\_s*' ..
1022 'return g:DefinedLater("yes")\_s*' ..
1023 '\d PUSHS "yes"\_s*' ..
1024 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001025 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001026 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +01001027enddef
1028
1029
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001030def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001031 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001032enddef
1033
1034def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +02001035 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001036 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001037 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001038 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001039 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001040 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001041 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001042 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
1043 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001044 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +02001045 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001046 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001047 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001048 '\d 2STRING stack\[-1]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001049 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +02001050 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001051 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +01001052enddef
1053
1054
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001055def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001056 if has("eval")
1057 echo "yes"
1058 else
1059 echo "no"
1060 endif
1061enddef
1062
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001063def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001064 if has("nothing")
1065 echo "yes"
1066 else
1067 echo "no"
1068 endif
1069enddef
1070
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001071def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +01001072 if has("nothing")
1073 echo "nothing"
1074 elseif has("something")
1075 echo "something"
1076 elseif has("eval")
1077 echo "eval"
1078 elseif has("less")
1079 echo "less"
1080 endif
1081enddef
1082
Bram Moolenaar848fadd2022-01-30 15:28:30 +00001083def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001084 if has("gui_running")
1085 echo "yes"
1086 else
1087 echo "no"
1088 endif
1089enddef
1090
LemonBoy58f331a2022-04-02 21:59:06 +01001091def s:LenConstant(): number
1092 return len("foo") + len("fighters")
1093enddef
1094
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001095def Test_disassemble_const_expr()
LemonBoy58f331a2022-04-02 21:59:06 +01001096 var instr = execute('disassemble LenConstant')
1097 assert_match('LenConstant\_s*' ..
1098 'return len("foo") + len("fighters")\_s*' ..
1099 '\d PUSHNR 11\_s*',
1100 instr)
1101 assert_notmatch('BCALL len', instr)
1102
Bram Moolenaard2c61702020-09-06 15:58:36 +02001103 assert_equal("\nyes", execute('HasEval()'))
LemonBoy58f331a2022-04-02 21:59:06 +01001104 instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001105 assert_match('HasEval\_s*' ..
1106 'if has("eval")\_s*' ..
1107 'echo "yes"\_s*' ..
1108 '\d PUSHS "yes"\_s*' ..
1109 '\d ECHO 1\_s*' ..
1110 'else\_s*' ..
1111 'echo "no"\_s*' ..
1112 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001113 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001114 assert_notmatch('JUMP', instr)
1115
Bram Moolenaard2c61702020-09-06 15:58:36 +02001116 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001117 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001118 assert_match('HasNothing\_s*' ..
1119 'if has("nothing")\_s*' ..
1120 'echo "yes"\_s*' ..
1121 'else\_s*' ..
1122 'echo "no"\_s*' ..
1123 '\d PUSHS "no"\_s*' ..
1124 '\d ECHO 1\_s*' ..
1125 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001126 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001127 assert_notmatch('PUSHS "yes"', instr)
1128 assert_notmatch('JUMP', instr)
1129
Bram Moolenaard2c61702020-09-06 15:58:36 +02001130 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001131 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001132 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001133 'if has("nothing")\_s*' ..
1134 'echo "nothing"\_s*' ..
1135 'elseif has("something")\_s*' ..
1136 'echo "something"\_s*' ..
1137 'elseif has("eval")\_s*' ..
1138 'echo "eval"\_s*' ..
1139 '\d PUSHS "eval"\_s*' ..
1140 '\d ECHO 1\_s*' ..
1141 'elseif has("less").*' ..
1142 'echo "less"\_s*' ..
1143 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001144 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001145 assert_notmatch('PUSHS "nothing"', instr)
1146 assert_notmatch('PUSHS "something"', instr)
1147 assert_notmatch('PUSHS "less"', instr)
1148 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001149
1150 var result: string
1151 var instr_expected: string
1152 if has('gui')
1153 if has('gui_running')
1154 # GUI already running, always returns "yes"
1155 result = "\nyes"
1156 instr_expected = 'HasGuiRunning.*' ..
1157 'if has("gui_running")\_s*' ..
1158 ' echo "yes"\_s*' ..
1159 '\d PUSHS "yes"\_s*' ..
1160 '\d ECHO 1\_s*' ..
1161 'else\_s*' ..
1162 ' echo "no"\_s*' ..
1163 'endif'
1164 else
1165 result = "\nno"
1166 if has('unix')
1167 # GUI not running but can start later, call has()
1168 instr_expected = 'HasGuiRunning.*' ..
1169 'if has("gui_running")\_s*' ..
1170 '\d PUSHS "gui_running"\_s*' ..
1171 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001172 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001173 '\d JUMP_IF_FALSE -> \d\_s*' ..
1174 ' echo "yes"\_s*' ..
1175 '\d PUSHS "yes"\_s*' ..
1176 '\d ECHO 1\_s*' ..
1177 'else\_s*' ..
1178 '\d JUMP -> \d\_s*' ..
1179 ' echo "no"\_s*' ..
1180 '\d PUSHS "no"\_s*' ..
1181 '\d ECHO 1\_s*' ..
1182 'endif'
1183 else
1184 # GUI not running, always return "no"
1185 instr_expected = 'HasGuiRunning.*' ..
1186 'if has("gui_running")\_s*' ..
1187 ' echo "yes"\_s*' ..
1188 'else\_s*' ..
1189 ' echo "no"\_s*' ..
1190 '\d PUSHS "no"\_s*' ..
1191 '\d ECHO 1\_s*' ..
1192 'endif'
1193 endif
1194 endif
1195 else
1196 # GUI not supported, always return "no"
1197 result = "\nno"
1198 instr_expected = 'HasGuiRunning.*' ..
1199 'if has("gui_running")\_s*' ..
1200 ' echo "yes"\_s*' ..
1201 'else\_s*' ..
1202 ' echo "no"\_s*' ..
1203 '\d PUSHS "no"\_s*' ..
1204 '\d ECHO 1\_s*' ..
1205 'endif'
1206 endif
1207
1208 assert_equal(result, execute('HasGuiRunning()'))
1209 instr = execute('disassemble HasGuiRunning')
1210 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001211enddef
1212
Bram Moolenaarefd88552020-06-18 20:50:10 +02001213def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001214 if 1 < 0
1215 return "maybe"
1216 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001217 if g:cond
1218 return "yes"
1219 else
1220 return "no"
1221 endif
1222enddef
1223
1224def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001225 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001226 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001227 'if 1 < 0\_s*' ..
1228 ' return "maybe"\_s*' ..
1229 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001230 'if g:cond\_s*' ..
1231 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001232 '1 COND2BOOL\_s*' ..
1233 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001234 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001235 '3 PUSHS "yes"\_s*' ..
1236 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001237 'else\_s*' ..
1238 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001239 '5 PUSHS "no"\_s*' ..
1240 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001241 instr)
1242enddef
1243
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001244def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001245 var Funky1: func
1246 var Funky2: func = function("len")
1247 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001248enddef
1249
1250def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001251 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001252 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001254 '0 PUSHFUNC "\[none]"\_s*' ..
1255 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001256 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001257 '2 PUSHS "len"\_s*' ..
1258 '3 BCALL function(argc 1)\_s*' ..
1259 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001260 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001261 '\d PUSHS "UserFunc"\_s*' ..
1262 '\d BCALL funcref(argc 1)\_s*' ..
1263 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001264 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001265 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001266enddef
1267
1268if has('channel')
1269 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001270 var job1: job
1271 var job2: job = job_start("donothing")
1272 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001273 enddef
1274endif
1275
1276def Test_disassemble_channel()
1277 CheckFeature channel
1278
Bram Moolenaarac564082020-09-27 19:05:33 +02001279 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001280 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001281 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001282 '\d PUSHJOB "no process"\_s*' ..
1283 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001285 '\d PUSHS "donothing"\_s*' ..
1286 '\d BCALL job_start(argc 1)\_s*' ..
1287 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001288 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001289 '\d PUSHCHANNEL 0\_s*' ..
1290 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001291 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001292 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001293enddef
1294
Bram Moolenaar62aec932022-01-29 21:45:34 +00001295def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001296 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001297 return F("x")
1298enddef
1299
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001300def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001301 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001302 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001303 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001304 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001305 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001306 '\d STORE $0\_s*' ..
1307 'return F("x")\_s*' ..
1308 '\d PUSHS "x"\_s*' ..
1309 '\d LOAD $0\_s*' ..
1310 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001311 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001312 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001313
Bram Moolenaarac564082020-09-27 19:05:33 +02001314 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001315 instr = execute('disassemble ' .. name)
1316 assert_match('<lambda>\d\+\_s*' ..
1317 'return "X" .. a .. "X"\_s*' ..
1318 '\d PUSHS "X"\_s*' ..
1319 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001320 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001321 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001322 '\d PUSHS "X"\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001323 '\d CONCAT size 2\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001324 '\d RETURN',
1325 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001326enddef
1327
Bram Moolenaar62aec932022-01-29 21:45:34 +00001328def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001329 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001330 return Ref(g:value)
1331enddef
1332
1333def Test_disassemble_lambda_with_type()
1334 g:value = 5
1335 assert_equal(15, LambdaWithType())
1336 var instr = execute('disassemble LambdaWithType')
1337 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001338 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001339 '\d FUNCREF <lambda>\d\+\_s*' ..
1340 '\d STORE $0\_s*' ..
1341 'return Ref(g:value)\_s*' ..
1342 '\d LOADG g:value\_s*' ..
1343 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001344 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001345 '\d PCALL (argc 1)\_s*' ..
1346 '\d RETURN',
1347 instr)
1348enddef
1349
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001350def NestedOuter()
1351 def g:Inner()
1352 echomsg "inner"
1353 enddef
1354enddef
1355
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001356def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001357 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001358 assert_match('NestedOuter\_s*' ..
1359 'def g:Inner()\_s*' ..
1360 'echomsg "inner"\_s*' ..
1361 'enddef\_s*' ..
1362 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001363 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001364 instr)
1365enddef
1366
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001367def NestedDefList()
1368 def
1369 def Info
1370 def /Info
1371 def /Info/
1372enddef
1373
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001374def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001375 var instr = execute('disassemble NestedDefList')
1376 assert_match('NestedDefList\_s*' ..
1377 'def\_s*' ..
1378 '\d DEF \_s*' ..
1379 'def Info\_s*' ..
1380 '\d DEF Info\_s*' ..
1381 'def /Info\_s*' ..
1382 '\d DEF /Info\_s*' ..
1383 'def /Info/\_s*' ..
1384 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001385 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001386 instr)
1387enddef
1388
Bram Moolenaar62aec932022-01-29 21:45:34 +00001389def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001390 if arg == 1 && arg != 2 || arg == 4
1391 return 'yes'
1392 endif
1393 return 'no'
1394enddef
1395
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001396def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001397 assert_equal("yes", AndOr(1))
1398 assert_equal("no", AndOr(2))
1399 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001400 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001401 assert_match('AndOr\_s*' ..
1402 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1403 '\d LOAD arg\[-1]\_s*' ..
1404 '\d PUSHNR 1\_s*' ..
1405 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001406 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001407 '\d LOAD arg\[-1]\_s*' ..
1408 '\d PUSHNR 2\_s*' ..
1409 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001410 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001411 '\d LOAD arg\[-1]\_s*' ..
1412 '\d\+ PUSHNR 4\_s*' ..
1413 '\d\+ COMPAREANY ==\_s*' ..
1414 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001415 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001416enddef
1417
Bram Moolenaar62aec932022-01-29 21:45:34 +00001418def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001419 if true && arg
1420 return "yes"
1421 endif
1422 if false && arg
1423 return "never"
1424 endif
1425 return "no"
1426enddef
1427
1428def Test_disassemble_and_constant()
1429 assert_equal("yes", AndConstant(1))
1430 assert_equal("no", AndConstant(false))
1431 var instr = execute('disassemble AndConstant')
1432 assert_match('AndConstant\_s*' ..
1433 'if true && arg\_s*' ..
1434 '0 LOAD arg\[-1\]\_s*' ..
1435 '1 COND2BOOL\_s*' ..
1436 '2 JUMP_IF_FALSE -> 5\_s*' ..
1437 'return "yes"\_s*' ..
1438 '3 PUSHS "yes"\_s*' ..
1439 '4 RETURN\_s*' ..
1440 'endif\_s*' ..
1441 'if false && arg\_s*' ..
1442 'return "never"\_s*' ..
1443 'endif\_s*' ..
1444 'return "no"\_s*' ..
1445 '5 PUSHS "no"\_s*' ..
1446 '6 RETURN',
1447 instr)
1448enddef
1449
Bram Moolenaar62aec932022-01-29 21:45:34 +00001450def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001451 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001452 for i in range(3)
1453 res->add(i)
1454 endfor
1455 return res
1456enddef
1457
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001458def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001459 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001460 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001461 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001462 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001463 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001464 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001465 '\d STORE $0\_s*' ..
1466 'for i in range(3)\_s*' ..
1467 '\d STORE -1 in $1\_s*' ..
1468 '\d PUSHNR 3\_s*' ..
1469 '\d BCALL range(argc 1)\_s*' ..
1470 '\d FOR $1 -> \d\+\_s*' ..
1471 '\d STORE $2\_s*' ..
1472 'res->add(i)\_s*' ..
1473 '\d LOAD $0\_s*' ..
1474 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001475 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001476 '\d\+ DROP\_s*' ..
1477 'endfor\_s*' ..
1478 '\d\+ JUMP -> \d\+\_s*' ..
1479 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001480 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001481enddef
1482
Bram Moolenaar62aec932022-01-29 21:45:34 +00001483def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001484 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001485 for str in eval('["one", "two"]')
1486 res ..= str
1487 endfor
1488 return res
1489enddef
1490
1491def Test_disassemble_for_loop_eval()
1492 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001493 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001494 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001495 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001496 '\d PUSHS ""\_s*' ..
1497 '\d STORE $0\_s*' ..
1498 'for str in eval(''\["one", "two"\]'')\_s*' ..
1499 '\d STORE -1 in $1\_s*' ..
1500 '\d PUSHS "\["one", "two"\]"\_s*' ..
1501 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001502 '\d FOR $1 -> \d\+\_s*' ..
1503 '\d STORE $2\_s*' ..
1504 'res ..= str\_s*' ..
1505 '\d\+ LOAD $0\_s*' ..
1506 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001507 '\d 2STRING_ANY stack\[-1\]\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01001508 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001509 '\d\+ STORE $0\_s*' ..
1510 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001511 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001512 '\d\+ DROP\_s*' ..
1513 'return res\_s*' ..
1514 '\d\+ LOAD $0\_s*' ..
1515 '\d\+ RETURN',
1516 instr)
1517enddef
1518
Bram Moolenaar62aec932022-01-29 21:45:34 +00001519def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001520 for [x1, x2] in [[1, 2], [3, 4]]
1521 echo x1 x2
1522 endfor
1523enddef
1524
1525def Test_disassemble_for_loop_unpack()
1526 var instr = execute('disassemble ForLoopUnpack')
1527 assert_match('ForLoopUnpack\_s*' ..
1528 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1529 '\d\+ STORE -1 in $0\_s*' ..
1530 '\d\+ PUSHNR 1\_s*' ..
1531 '\d\+ PUSHNR 2\_s*' ..
1532 '\d\+ NEWLIST size 2\_s*' ..
1533 '\d\+ PUSHNR 3\_s*' ..
1534 '\d\+ PUSHNR 4\_s*' ..
1535 '\d\+ NEWLIST size 2\_s*' ..
1536 '\d\+ NEWLIST size 2\_s*' ..
1537 '\d\+ FOR $0 -> 16\_s*' ..
1538 '\d\+ UNPACK 2\_s*' ..
1539 '\d\+ STORE $1\_s*' ..
1540 '\d\+ STORE $2\_s*' ..
1541 'echo x1 x2\_s*' ..
1542 '\d\+ LOAD $1\_s*' ..
1543 '\d\+ LOAD $2\_s*' ..
1544 '\d\+ ECHO 2\_s*' ..
1545 'endfor\_s*' ..
1546 '\d\+ JUMP -> 8\_s*' ..
1547 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001548 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001549 instr)
1550enddef
1551
Bram Moolenaar62aec932022-01-29 21:45:34 +00001552def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001553 for nr in [1, 2]
1554 try
1555 echo "ok"
1556 try
1557 echo "deeper"
1558 catch
1559 continue
1560 endtry
1561 catch
1562 echo "not ok"
1563 endtry
1564 endfor
1565enddef
1566
1567def Test_disassemble_for_loop_continue()
1568 var instr = execute('disassemble ForLoopContinue')
1569 assert_match('ForLoopContinue\_s*' ..
1570 'for nr in \[1, 2]\_s*' ..
1571 '0 STORE -1 in $0\_s*' ..
1572 '1 PUSHNR 1\_s*' ..
1573 '2 PUSHNR 2\_s*' ..
1574 '3 NEWLIST size 2\_s*' ..
1575 '4 FOR $0 -> 22\_s*' ..
1576 '5 STORE $1\_s*' ..
1577 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001578 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001579 'echo "ok"\_s*' ..
1580 '7 PUSHS "ok"\_s*' ..
1581 '8 ECHO 1\_s*' ..
1582 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001583 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001584 'echo "deeper"\_s*' ..
1585 '10 PUSHS "deeper"\_s*' ..
1586 '11 ECHO 1\_s*' ..
1587 'catch\_s*' ..
1588 '12 JUMP -> 15\_s*' ..
1589 '13 CATCH\_s*' ..
1590 'continue\_s*' ..
1591 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1592 'endtry\_s*' ..
1593 '15 ENDTRY\_s*' ..
1594 'catch\_s*' ..
1595 '16 JUMP -> 20\_s*' ..
1596 '17 CATCH\_s*' ..
1597 'echo "not ok"\_s*' ..
1598 '18 PUSHS "not ok"\_s*' ..
1599 '19 ECHO 1\_s*' ..
1600 'endtry\_s*' ..
1601 '20 ENDTRY\_s*' ..
1602 'endfor\_s*' ..
1603 '21 JUMP -> 4\_s*' ..
1604 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001605 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001606 instr)
1607enddef
1608
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001609let g:number = 42
1610
Bram Moolenaar62aec932022-01-29 21:45:34 +00001611def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001612 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001613enddef
1614
1615def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001616 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001617 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001618 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001619 '\d PUSHNR 23\_s*' ..
1620 '\d LOADG g:number\_s*' ..
1621 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1622 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001623 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001624 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001625 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001626 instr)
1627enddef
1628
Bram Moolenaar62aec932022-01-29 21:45:34 +00001629def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001630 var nr = 3
1631 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001632 nrres = nr - 7
1633 nrres = nr * 7
1634 nrres = nr / 7
1635 nrres = nr % 7
1636
Bram Moolenaarac564082020-09-27 19:05:33 +02001637 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001638 anyres = g:number - 7
1639 anyres = g:number * 7
1640 anyres = g:number / 7
1641 anyres = g:number % 7
1642
1643 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001644 var fl = 3.0
1645 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001646 flres = fl - 7.0
1647 flres = fl * 7.0
1648 flres = fl / 7.0
1649 endif
1650enddef
1651
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001652def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001653 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001654 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001655 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001656 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001657 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001658 '\d LOAD $0.*' ..
1659 '\d PUSHNR 7.*' ..
1660 '\d OPNR +.*' ..
1661 '\d STORE $1.*' ..
1662 'nrres = nr - 7.*' ..
1663 '\d OPNR -.*' ..
1664 'nrres = nr \* 7.*' ..
1665 '\d OPNR \*.*' ..
1666 'nrres = nr / 7.*' ..
1667 '\d OPNR /.*' ..
1668 'nrres = nr % 7.*' ..
1669 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001670 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001671 '\d LOADG g:number.*' ..
1672 '\d PUSHNR 7.*' ..
1673 '\d OPANY +.*' ..
1674 '\d STORE $2.*' ..
1675 'anyres = g:number - 7.*' ..
1676 '\d OPANY -.*' ..
1677 'anyres = g:number \* 7.*' ..
1678 '\d OPANY \*.*' ..
1679 'anyres = g:number / 7.*' ..
1680 '\d OPANY /.*' ..
1681 'anyres = g:number % 7.*' ..
1682 '\d OPANY %.*',
1683 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001684 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001685 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001687 '\d PUSHF 3.0.*' ..
1688 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001689 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001690 '\d LOAD $3.*' ..
1691 '\d PUSHF 7.0.*' ..
1692 '\d OPFLOAT +.*' ..
1693 '\d STORE $4.*' ..
1694 'flres = fl - 7.0.*' ..
1695 '\d OPFLOAT -.*' ..
1696 'flres = fl \* 7.0.*' ..
1697 '\d OPFLOAT \*.*' ..
1698 'flres = fl / 7.0.*' ..
1699 '\d OPFLOAT /.*',
1700 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001701 endif
1702enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001703
Bram Moolenaar62aec932022-01-29 21:45:34 +00001704def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001705 var reslist = [1, 2] + [3, 4]
1706 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001707enddef
1708
1709def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001710 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001711 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001712 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001713 '\d PUSHNR 1.*' ..
1714 '\d PUSHNR 2.*' ..
1715 '\d NEWLIST size 2.*' ..
1716 '\d PUSHNR 3.*' ..
1717 '\d PUSHNR 4.*' ..
1718 '\d NEWLIST size 2.*' ..
1719 '\d ADDLIST.*' ..
1720 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001722 '\d PUSHBLOB 0z1122.*' ..
1723 '\d PUSHBLOB 0z3344.*' ..
1724 '\d ADDBLOB.*' ..
1725 '\d STORE $.*',
1726 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001727enddef
1728
1729let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001730def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001731 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001732 return res
1733enddef
1734
1735def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001736 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001737 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001738 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001739 '\d LOADG g:aa.*' ..
1740 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001741 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001742 '\d CONCAT.*' ..
1743 '\d STORE $.*',
1744 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001745 assert_equal('aabb', ConcatString())
1746enddef
1747
Bram Moolenaar62aec932022-01-29 21:45:34 +00001748def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001749 var s = "abcd"
1750 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001751 return res
1752enddef
1753
1754def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001755 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001756 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001758 '\d PUSHS "abcd"\_s*' ..
1759 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001760 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001761 '\d LOAD $0\_s*' ..
1762 '\d PUSHNR 1\_s*' ..
1763 '\d STRINDEX\_s*' ..
1764 '\d STORE $1\_s*',
1765 instr)
1766 assert_equal('b', StringIndex())
1767enddef
1768
Bram Moolenaar62aec932022-01-29 21:45:34 +00001769def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001770 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001771 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001772 return res
1773enddef
1774
1775def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001776 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001777 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001778 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001779 '\d PUSHS "abcd"\_s*' ..
1780 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001781 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001782 '\d LOAD $0\_s*' ..
1783 '\d PUSHNR 1\_s*' ..
1784 '\d PUSHNR 8\_s*' ..
1785 '\d STRSLICE\_s*' ..
1786 '\d STORE $1\_s*',
1787 instr)
1788 assert_equal('bcd', StringSlice())
1789enddef
1790
Bram Moolenaar62aec932022-01-29 21:45:34 +00001791def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001792 var l = [1, 2, 3]
1793 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001794 return res
1795enddef
1796
1797def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001798 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001799 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001800 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001801 '\d PUSHNR 1\_s*' ..
1802 '\d PUSHNR 2\_s*' ..
1803 '\d PUSHNR 3\_s*' ..
1804 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001805 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001806 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001807 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001808 '\d LOAD $0\_s*' ..
1809 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001810 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001811 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001812 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001813 assert_equal(2, ListIndex())
1814enddef
1815
Bram Moolenaar62aec932022-01-29 21:45:34 +00001816def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001817 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001818 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001819 return res
1820enddef
1821
1822def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001823 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001824 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001825 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001826 '\d PUSHNR 1\_s*' ..
1827 '\d PUSHNR 2\_s*' ..
1828 '\d PUSHNR 3\_s*' ..
1829 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001830 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001831 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001832 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001833 '\d LOAD $0\_s*' ..
1834 '\d PUSHNR 1\_s*' ..
1835 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001836 '\d\+ LISTSLICE\_s*' ..
1837 '\d\+ SETTYPE list<number>\_s*' ..
1838 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001839 instr)
1840 assert_equal([2, 3], ListSlice())
1841enddef
1842
Bram Moolenaar62aec932022-01-29 21:45:34 +00001843def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001844 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001845 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001846 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001847 return res
1848enddef
1849
1850def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001851 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001852 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001853 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001854 '\d PUSHS "item"\_s*' ..
1855 '\d PUSHNR 1\_s*' ..
1856 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001857 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001858 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001859 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001860 '\d\+ LOAD $0\_s*' ..
1861 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001862 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001863 '\d\+ STORE $1\_s*' ..
1864 'res = d\["item"\]\_s*' ..
1865 '\d\+ LOAD $0\_s*' ..
1866 '\d\+ PUSHS "item"\_s*' ..
1867 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001868 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001869 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001870 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001871 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001872enddef
1873
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001874let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001875def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001876 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001877 return res
1878enddef
1879
1880def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001881 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001882 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001883 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001884 '\d LOADG g:somelist\_s*' ..
1885 '\d PUSHNR 2\_s*' ..
1886 '\d ANYINDEX\_s*' ..
1887 '\d STORE $0\_s*' ..
1888 'return res\_s*' ..
1889 '\d LOAD $0\_s*' ..
1890 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1891 '\d RETURN',
1892 instr)
1893 assert_equal(3, AnyIndex())
1894enddef
1895
Bram Moolenaar62aec932022-01-29 21:45:34 +00001896def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001897 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001898 return res
1899enddef
1900
1901def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001902 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001903 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001904 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001905 '\d LOADG g:somelist\_s*' ..
1906 '\d PUSHNR 1\_s*' ..
1907 '\d PUSHNR 3\_s*' ..
1908 '\d ANYSLICE\_s*' ..
1909 '\d STORE $0\_s*' ..
1910 'return res\_s*' ..
1911 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001912 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001913 '\d RETURN',
1914 instr)
1915 assert_equal([2, 3, 4], AnySlice())
1916enddef
1917
Bram Moolenaar62aec932022-01-29 21:45:34 +00001918def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001919 g:nr = 9
1920 var plus = +g:nr
1921 var minus = -g:nr
1922 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001923enddef
1924
1925def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001926 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001927 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001928 'g:nr = 9\_s*' ..
1929 '\d PUSHNR 9\_s*' ..
1930 '\d STOREG g:nr\_s*' ..
1931 'var plus = +g:nr\_s*' ..
1932 '\d LOADG g:nr\_s*' ..
1933 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1934 '\d STORE $0\_s*' ..
1935 'var minus = -g:nr\_s*' ..
1936 '\d LOADG g:nr\_s*' ..
1937 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001938 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001939 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001940 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001941 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001942enddef
1943
Bram Moolenaar62aec932022-01-29 21:45:34 +00001944def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001945 var flag = true
1946 var invert = !flag
1947 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001948 return res
1949enddef
1950
1951def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001952 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001953 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001954 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001955 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001956 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001957 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001958 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001959 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001960 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001961 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001962 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001963 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001964 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001965 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001966 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001967enddef
1968
Bram Moolenaar62aec932022-01-29 21:45:34 +00001969def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001970 var one = 1
1971 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001972 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001973 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001974 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001975enddef
1976
1977def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001978 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001979 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001980 'var one = 1\_s*' ..
1981 '0 STORE 1 in $0\_s*' ..
1982 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001983 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001984 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001985 '1 LOAD $0\_s*' ..
1986 '2 COND2BOOL\_s*' ..
1987 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1988 '4 LOAD $1\_s*' ..
1989 '5 COND2BOOL\_s*' ..
1990 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1991 '7 LOAD $0\_s*' ..
1992 '8 COND2BOOL\_s*' ..
1993 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001994 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001995 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001996 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001997 instr)
1998 assert_equal(true, InvertBool())
1999enddef
2000
Bram Moolenaar62aec932022-01-29 21:45:34 +00002001def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00002002 var t: number
2003 t = 1
2004 t = 0
2005enddef
2006
2007def Test_disassemble_auto_init()
2008 var instr = execute('disassemble AutoInit')
2009 assert_match('AutoInit\_s*' ..
2010 'var t: number\_s*' ..
2011 't = 1\_s*' ..
2012 '\d STORE 1 in $0\_s*' ..
2013 't = 0\_s*' ..
2014 '\d STORE 0 in $0\_s*' ..
2015 '\d\+ RETURN void',
2016 instr)
2017enddef
2018
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002019def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02002020 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02002021 ['true == isFalse', 'COMPAREBOOL =='],
2022 ['true != isFalse', 'COMPAREBOOL !='],
2023 ['v:none == isNull', 'COMPARESPECIAL =='],
2024 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00002025 ['"text" == isNull', 'COMPARENULL =='],
2026 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002027
Bram Moolenaara5565e42020-05-09 15:44:01 +02002028 ['111 == aNumber', 'COMPARENR =='],
2029 ['111 != aNumber', 'COMPARENR !='],
2030 ['111 > aNumber', 'COMPARENR >'],
2031 ['111 < aNumber', 'COMPARENR <'],
2032 ['111 >= aNumber', 'COMPARENR >='],
2033 ['111 <= aNumber', 'COMPARENR <='],
2034 ['111 =~ aNumber', 'COMPARENR =\~'],
2035 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002036
Bram Moolenaara5565e42020-05-09 15:44:01 +02002037 ['"xx" != aString', 'COMPARESTRING !='],
2038 ['"xx" > aString', 'COMPARESTRING >'],
2039 ['"xx" < aString', 'COMPARESTRING <'],
2040 ['"xx" >= aString', 'COMPARESTRING >='],
2041 ['"xx" <= aString', 'COMPARESTRING <='],
2042 ['"xx" =~ aString', 'COMPARESTRING =\~'],
2043 ['"xx" !~ aString', 'COMPARESTRING !\~'],
2044 ['"xx" is aString', 'COMPARESTRING is'],
2045 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002046
Bram Moolenaara5565e42020-05-09 15:44:01 +02002047 ['0z11 == aBlob', 'COMPAREBLOB =='],
2048 ['0z11 != aBlob', 'COMPAREBLOB !='],
2049 ['0z11 is aBlob', 'COMPAREBLOB is'],
2050 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002051
Bram Moolenaara5565e42020-05-09 15:44:01 +02002052 ['[1, 2] == aList', 'COMPARELIST =='],
2053 ['[1, 2] != aList', 'COMPARELIST !='],
2054 ['[1, 2] is aList', 'COMPARELIST is'],
2055 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002056
Bram Moolenaare0de1712020-12-02 17:36:54 +01002057 ['{a: 1} == aDict', 'COMPAREDICT =='],
2058 ['{a: 1} != aDict', 'COMPAREDICT !='],
2059 ['{a: 1} is aDict', 'COMPAREDICT is'],
2060 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002061
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01002062 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
2063 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
2064 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
2065 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002066
2067 ['77 == g:xx', 'COMPAREANY =='],
2068 ['77 != g:xx', 'COMPAREANY !='],
2069 ['77 > g:xx', 'COMPAREANY >'],
2070 ['77 < g:xx', 'COMPAREANY <'],
2071 ['77 >= g:xx', 'COMPAREANY >='],
2072 ['77 <= g:xx', 'COMPAREANY <='],
2073 ['77 =~ g:xx', 'COMPAREANY =\~'],
2074 ['77 !~ g:xx', 'COMPAREANY !\~'],
2075 ['77 is g:xx', 'COMPAREANY is'],
2076 ['77 isnot g:xx', 'COMPAREANY isnot'],
2077 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02002078 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002079 if has('float')
2080 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02002081 ['1.1 == aFloat', 'COMPAREFLOAT =='],
2082 ['1.1 != aFloat', 'COMPAREFLOAT !='],
2083 ['1.1 > aFloat', 'COMPAREFLOAT >'],
2084 ['1.1 < aFloat', 'COMPAREFLOAT <'],
2085 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
2086 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
2087 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
2088 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02002089 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02002090 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002091 endif
2092
Bram Moolenaarac564082020-09-27 19:05:33 +02002093 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002094 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002095 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002096 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02002097 ' var isFalse = false',
2098 ' var isNull = v:null',
2099 ' var aNumber = 222',
2100 ' var aString = "yy"',
2101 ' var aBlob = 0z22',
2102 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01002103 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02002104 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02002105 ' if ' .. case[0],
2106 ' echo 42'
2107 ' endif',
2108 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002109 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002110 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02002111 assert_match('TestCase' .. nr .. '.*' ..
2112 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2113 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02002114 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02002115 '\d ' .. case[1] .. '.*' ..
2116 '\d JUMP_IF_FALSE -> \d\+.*',
2117 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002118
2119 nr += 1
2120 endfor
2121
Bram Moolenaar22da5592020-03-19 14:52:20 +01002122 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01002123enddef
2124
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002125def s:FalsyOp()
2126 echo g:flag ?? "yes"
2127 echo [] ?? "empty list"
2128 echo "" ?? "empty string"
2129enddef
2130
Dominique Pelle81b573d2022-03-22 21:14:55 +00002131def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002132 var res = execute('disass s:FalsyOp')
2133 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2134 'echo g:flag ?? "yes"\_s*' ..
2135 '0 LOADG g:flag\_s*' ..
2136 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2137 '2 PUSHS "yes"\_s*' ..
2138 '3 ECHO 1\_s*' ..
2139 'echo \[\] ?? "empty list"\_s*' ..
2140 '4 NEWLIST size 0\_s*' ..
2141 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2142 '6 PUSHS "empty list"\_s*' ..
2143 '7 ECHO 1\_s*' ..
2144 'echo "" ?? "empty string"\_s*' ..
2145 '\d\+ PUSHS "empty string"\_s*' ..
2146 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002147 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002148 res)
2149enddef
2150
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002151def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002152 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002153 ['"xx" == "yy"', false],
2154 ['"aa" == "aa"', true],
2155 ['has("eval") ? true : false', true],
2156 ['has("asdf") ? true : false', false],
2157 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002158
Bram Moolenaarac564082020-09-27 19:05:33 +02002159 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002160 for case in cases
2161 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002162 ' if ' .. case[0],
2163 ' echo 42'
2164 ' endif',
2165 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002166 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002167 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002168 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002169 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002170 assert_match('TestCase' .. nr .. '.*' ..
2171 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2172 '\d PUSHNR 42.*' ..
2173 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002174 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002175 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002176 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002177 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002178 assert_match('TestCase' .. nr .. '.*' ..
2179 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2180 'echo 42[ \n]*' ..
2181 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002182 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002183 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002184 endif
2185
2186 nr += 1
2187 endfor
2188
2189 delete('Xdisassemble')
2190enddef
2191
Bram Moolenaarad39c092020-02-26 18:23:43 +01002192def s:Execute()
2193 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002194 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002195 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002196 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002197 execute 'help ' .. tag
2198enddef
2199
2200def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002201 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002202 assert_match('\<SNR>\d*_Execute\_s*' ..
2203 "execute 'help vim9.txt'\\_s*" ..
2204 '\d PUSHS "help vim9.txt"\_s*' ..
2205 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002206 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002207 '\d PUSHS "help vim9.txt"\_s*' ..
2208 '\d STORE $0\_s*' ..
2209 'execute cmd\_s*' ..
2210 '\d LOAD $0\_s*' ..
2211 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002212 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002213 '\d PUSHS "vim9.txt"\_s*' ..
2214 '\d STORE $1\_s*' ..
2215 "execute 'help ' .. tag\\_s*" ..
2216 '\d\+ PUSHS "help "\_s*' ..
2217 '\d\+ LOAD $1\_s*' ..
LemonBoy372bcce2022-04-25 12:43:20 +01002218 '\d\+ CONCAT size 2\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002219 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002220 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002221 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002222enddef
2223
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002224def s:OnlyRange()
2225 :$
2226 :123
2227 :'m
2228enddef
2229
2230def Test_disassemble_range_only()
2231 var res = execute('disass s:OnlyRange')
2232 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2233 ':$\_s*' ..
2234 '\d EXECRANGE $\_s*' ..
2235 ':123\_s*' ..
2236 '\d EXECRANGE 123\_s*' ..
2237 ':''m\_s*' ..
2238 '\d EXECRANGE ''m\_s*' ..
2239 '\d\+ RETURN void',
2240 res)
2241enddef
2242
Bram Moolenaarf6ced982022-04-28 12:00:49 +01002243def s:StoreRange()
2244 var l = [1, 2]
2245 l[0 : 1] = [7, 8]
2246enddef
2247
2248def Test_disassemble_store_range()
2249 var res = execute('disass s:StoreRange')
2250 assert_match('\<SNR>\d*_StoreRange\_s*' ..
2251 'var l = \[1, 2]\_s*' ..
2252 '\d PUSHNR 1\_s*' ..
2253 '\d PUSHNR 2\_s*' ..
2254 '\d NEWLIST size 2\_s*' ..
2255 '\d SETTYPE list<number>\_s*' ..
2256 '\d STORE $0\_s*' ..
2257
2258 'l\[0 : 1] = \[7, 8]\_s*' ..
2259 '\d\+ PUSHNR 7\_s*' ..
2260 '\d\+ PUSHNR 8\_s*' ..
2261 '\d\+ NEWLIST size 2\_s*' ..
2262 '\d\+ PUSHNR 0\_s*' ..
2263 '\d\+ PUSHNR 1\_s*' ..
2264 '\d\+ LOAD $0\_s*' ..
2265 '\d\+ STORERANGE\_s*' ..
2266 '\d\+ RETURN void',
2267 res)
2268enddef
2269
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002270def s:Echomsg()
2271 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002272 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002273 echoerr 'went' .. 'wrong'
2274enddef
2275
2276def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002277 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002278 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2279 "echomsg 'some' 'message'\\_s*" ..
2280 '\d PUSHS "some"\_s*' ..
2281 '\d PUSHS "message"\_s*' ..
2282 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002283 "echoconsole 'nothing'\\_s*" ..
2284 '\d PUSHS "nothing"\_s*' ..
2285 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002286 "echoerr 'went' .. 'wrong'\\_s*" ..
2287 '\d PUSHS "wentwrong"\_s*' ..
2288 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002289 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002290 res)
2291enddef
2292
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002293def SomeStringArg(arg: string)
2294 echo arg
2295enddef
2296
2297def SomeAnyArg(arg: any)
2298 echo arg
2299enddef
2300
2301def SomeStringArgAndReturn(arg: string): string
2302 return arg
2303enddef
2304
2305def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002306 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002307 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2308 '\d *echo arg.*' ..
2309 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002310 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002311
Bram Moolenaarac564082020-09-27 19:05:33 +02002312 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002313 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2314 '\d *echo arg\_s*' ..
2315 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002316 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002317
Bram Moolenaarac564082020-09-27 19:05:33 +02002318 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002319 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2320 '\d *return arg\_s*' ..
2321 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002322 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002323enddef
2324
Bram Moolenaar09689a02020-05-09 22:50:08 +02002325def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002326 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002327 vim9script
2328 def FuncOne(): string
2329 return FuncTwo()
2330 enddef
2331 def FuncTwo(): string
2332 return 'two'
2333 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002334 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002335 END
2336 writefile(lines, 'Xdisassemble')
2337 source Xdisassemble
2338
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002339 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002340 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2341 'return FuncTwo()\_s*' ..
2342 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002343 '\d RETURN',
2344 g:res_FuncOne)
2345
2346 delete('Xdisassemble')
2347 unlet g:res_FuncOne
2348enddef
2349
Bram Moolenaar61a89812020-05-07 16:58:17 +02002350def s:ConcatStrings(): string
2351 return 'one' .. 'two' .. 'three'
2352enddef
2353
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002354def s:ComputeConst(): number
2355 return 2 + 3 * 4 / 6 + 7
2356enddef
2357
Bram Moolenaar1c747212020-05-09 18:28:34 +02002358def s:ComputeConstParen(): number
2359 return ((2 + 4) * (8 / 2)) / (3 + 4)
2360enddef
2361
Bram Moolenaar61a89812020-05-07 16:58:17 +02002362def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002363 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002364 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2365 "return 'one' .. 'two' .. 'three'\\_s*" ..
2366 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002367 '\d RETURN',
2368 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002369
2370 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002371 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2372 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2373 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002374 '\d RETURN',
2375 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002376
2377 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002378 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2379 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2380 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002381 '\d RETURN',
2382 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002383enddef
2384
Bram Moolenaar389df252020-07-09 21:20:47 +02002385def s:CallAppend()
2386 eval "some text"->append(2)
2387enddef
2388
2389def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002390 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002391 assert_match('<SNR>\d*_CallAppend\_s*' ..
2392 'eval "some text"->append(2)\_s*' ..
2393 '\d PUSHS "some text"\_s*' ..
2394 '\d PUSHNR 2\_s*' ..
2395 '\d SHUFFLE 2 up 1\_s*' ..
2396 '\d BCALL append(argc 2)\_s*' ..
2397 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002398 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002399 res)
2400enddef
2401
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002402
2403def s:SilentMessage()
2404 silent echomsg "text"
2405 silent! echoerr "error"
2406enddef
2407
2408def Test_silent()
2409 var res = execute('disass s:SilentMessage')
2410 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2411 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002412 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002413 '\d PUSHS "text"\_s*' ..
2414 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002415 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002416 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002417 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002418 '\d PUSHS "error"\_s*' ..
2419 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002420 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002421 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002422 res)
2423enddef
2424
2425def s:SilentIf()
2426 silent if 4 == g:five
2427 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002428 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002429enddef
2430
2431def Test_silent_if()
2432 var res = execute('disass s:SilentIf')
2433 assert_match('<SNR>\d*_SilentIf\_s*' ..
2434 'silent if 4 == g:five\_s*' ..
2435 '\d\+ CMDMOD silent\_s*' ..
2436 '\d\+ PUSHNR 4\_s*' ..
2437 '\d\+ LOADG g:five\_s*' ..
2438 '\d\+ COMPAREANY ==\_s*' ..
2439 '\d\+ CMDMOD_REV\_s*' ..
2440 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2441 'silent elseif 4 == g:five\_s*' ..
2442 '\d\+ JUMP -> \d\+\_s*' ..
2443 '\d\+ CMDMOD silent\_s*' ..
2444 '\d\+ PUSHNR 4\_s*' ..
2445 '\d\+ LOADG g:five\_s*' ..
2446 '\d\+ COMPAREANY ==\_s*' ..
2447 '\d\+ CMDMOD_REV\_s*' ..
2448 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002449 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002450 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002451 res)
2452enddef
2453
2454def s:SilentFor()
2455 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002456 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002457enddef
2458
2459def Test_silent_for()
2460 var res = execute('disass s:SilentFor')
2461 assert_match('<SNR>\d*_SilentFor\_s*' ..
2462 'silent for i in \[0\]\_s*' ..
2463 '\d CMDMOD silent\_s*' ..
2464 '\d STORE -1 in $0\_s*' ..
2465 '\d PUSHNR 0\_s*' ..
2466 '\d NEWLIST size 1\_s*' ..
2467 '\d CMDMOD_REV\_s*' ..
2468 '5 FOR $0 -> 8\_s*' ..
2469 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002470 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002471 '\d JUMP -> 5\_s*' ..
2472 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002473 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002474 res)
2475enddef
2476
2477def s:SilentWhile()
2478 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002479 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002480enddef
2481
2482def Test_silent_while()
2483 var res = execute('disass s:SilentWhile')
2484 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2485 'silent while g:not\_s*' ..
2486 '0 CMDMOD silent\_s*' ..
2487 '\d LOADG g:not\_s*' ..
2488 '\d COND2BOOL\_s*' ..
2489 '\d CMDMOD_REV\_s*' ..
2490 '\d JUMP_IF_FALSE -> 6\_s*' ..
2491
Bram Moolenaarfa984412021-03-25 22:15:28 +01002492 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002493 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002494 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002495 res)
2496enddef
2497
2498def s:SilentReturn(): string
2499 silent return "done"
2500enddef
2501
2502def Test_silent_return()
2503 var res = execute('disass s:SilentReturn')
2504 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2505 'silent return "done"\_s*' ..
2506 '\d CMDMOD silent\_s*' ..
2507 '\d PUSHS "done"\_s*' ..
2508 '\d CMDMOD_REV\_s*' ..
2509 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002510 res)
2511enddef
2512
Bram Moolenaarb2049902021-01-24 12:53:53 +01002513def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002514 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002515 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002516 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002517 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002518 return "done"
2519enddef
2520
2521def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002522 if !has('profile')
2523 MissingFeature 'profile'
2524 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002525 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002526 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002527 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002528 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002529 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002530 '\d PUSHS "profiled"\_s*' ..
2531 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002532 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002533 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002534 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002535 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002536 '\d PUSHS "some text"\_s*' ..
2537 '\d STORE $0\_s*' ..
2538 'return "done"\_s*' ..
2539 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002540 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002541 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002542 '\d\+ RETURN\_s*' ..
2543 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002544 res)
2545enddef
2546
Bram Moolenaare99d4222021-06-13 14:01:26 +02002547def Test_debugged()
2548 var res = execute('disass debug s:Profiled')
2549 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002550 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002551 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002552 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002553 '\d PUSHS "profiled"\_s*' ..
2554 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002555 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002556 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002557 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002558 '\d PUSHS "some text"\_s*' ..
2559 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002560 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002561 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002562 '\d PUSHS "done"\_s*' ..
2563 '\d RETURN\_s*',
2564 res)
2565enddef
2566
Bram Moolenaar90770b72021-11-30 20:57:38 +00002567def s:ElseifConstant()
2568 if g:value
2569 echo "one"
2570 elseif true
2571 echo "true"
2572 elseif false
2573 echo "false"
2574 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002575 if 0
2576 echo "yes"
2577 elseif 0
2578 echo "no"
2579 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002580enddef
2581
2582def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002583 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002584 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2585 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002586 '0 DEBUG line 1-1 varcount 0\_s*' ..
2587 '1 LOADG g:value\_s*' ..
2588 '2 COND2BOOL\_s*' ..
2589 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002590 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002591 '4 DEBUG line 2-2 varcount 0\_s*' ..
2592 '5 PUSHS "one"\_s*' ..
2593 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002594 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002595 '7 JUMP -> 12\_s*' ..
2596 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002597 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002598 '9 DEBUG line 4-4 varcount 0\_s*' ..
2599 '10 PUSHS "true"\_s*' ..
2600 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002601 'elseif false\_s*' ..
2602 'echo "false"\_s*' ..
2603 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002604 'if 0\_s*' ..
2605 '12 DEBUG line 8-8 varcount 0\_s*' ..
2606 'echo "yes"\_s*' ..
2607 'elseif 0\_s*' ..
2608 '13 DEBUG line 11-10 varcount 0\_s*' ..
2609 'echo "no"\_s*' ..
2610 'endif\_s*' ..
2611 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002612 res)
2613enddef
2614
Bram Moolenaar093165c2021-08-22 13:35:31 +02002615def s:DebugElseif()
2616 var b = false
2617 if b
2618 eval 1 + 0
2619 silent elseif !b
2620 eval 2 + 0
2621 endif
2622enddef
2623
2624def Test_debug_elseif()
2625 var res = execute('disass debug s:DebugElseif')
2626 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2627 'var b = false\_s*' ..
2628 '0 DEBUG line 1-1 varcount 0\_s*' ..
2629 '1 PUSH false\_s*' ..
2630 '2 STORE $0\_s*' ..
2631
2632 'if b\_s*' ..
2633 '3 DEBUG line 2-2 varcount 1\_s*' ..
2634 '4 LOAD $0\_s*' ..
2635 '5 JUMP_IF_FALSE -> 10\_s*' ..
2636
2637 'eval 1 + 0\_s*' ..
2638 '6 DEBUG line 3-3 varcount 1\_s*' ..
2639 '7 PUSHNR 1\_s*' ..
2640 '8 DROP\_s*' ..
2641
2642 'silent elseif !b\_s*' ..
2643 '9 JUMP -> 20\_s*' ..
2644 '10 CMDMOD silent\_s*' ..
2645 '11 DEBUG line 4-4 varcount 1\_s*' ..
2646 '12 LOAD $0\_s*' ..
2647 '13 INVERT -1 (!val)\_s*' ..
2648 '14 CMDMOD_REV\_s*' ..
2649 '15 JUMP_IF_FALSE -> 20\_s*' ..
2650
2651 'eval 2 + 0\_s*' ..
2652 '16 DEBUG line 5-5 varcount 1\_s*' ..
2653 '17 PUSHNR 2\_s*' ..
2654 '18 DROP\_s*' ..
2655
2656 'endif\_s*' ..
2657 '19 DEBUG line 6-6 varcount 1\_s*' ..
2658 '20 RETURN void*',
2659 res)
2660enddef
2661
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002662def s:DebugFor()
2663 echo "hello"
2664 for a in [0]
2665 echo a
2666 endfor
2667enddef
2668
2669def Test_debug_for()
2670 var res = execute('disass debug s:DebugFor')
2671 assert_match('<SNR>\d*_DebugFor\_s*' ..
2672 'echo "hello"\_s*' ..
2673 '0 DEBUG line 1-1 varcount 0\_s*' ..
2674 '1 PUSHS "hello"\_s*' ..
2675 '2 ECHO 1\_s*' ..
2676
2677 'for a in \[0\]\_s*' ..
2678 '3 DEBUG line 2-2 varcount 0\_s*' ..
2679 '4 STORE -1 in $0\_s*' ..
2680 '5 PUSHNR 0\_s*' ..
2681 '6 NEWLIST size 1\_s*' ..
2682 '7 DEBUG line 2-2 varcount 2\_s*' ..
2683 '8 FOR $0 -> 15\_s*' ..
2684 '9 STORE $1\_s*' ..
2685
2686 'echo a\_s*' ..
2687 '10 DEBUG line 3-3 varcount 2\_s*' ..
2688 '11 LOAD $1\_s*' ..
2689 '12 ECHO 1\_s*' ..
2690
2691 'endfor\_s*' ..
2692 '13 DEBUG line 4-4 varcount 2\_s*' ..
2693 '14 JUMP -> 7\_s*' ..
2694 '15 DROP\_s*' ..
2695 '16 RETURN void*',
2696 res)
2697enddef
2698
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002699def s:TryCatch()
2700 try
2701 echo "try"
2702 catch /error/
2703 echo "caught"
2704 endtry
2705enddef
2706
2707def Test_debug_try_catch()
2708 var res = execute('disass debug s:TryCatch')
2709 assert_match('<SNR>\d*_TryCatch\_s*' ..
2710 'try\_s*' ..
2711 '0 DEBUG line 1-1 varcount 0\_s*' ..
2712 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2713 'echo "try"\_s*' ..
2714 '2 DEBUG line 2-2 varcount 0\_s*' ..
2715 '3 PUSHS "try"\_s*' ..
2716 '4 ECHO 1\_s*' ..
2717 'catch /error/\_s*' ..
2718 '5 DEBUG line 3-3 varcount 0\_s*' ..
2719 '6 JUMP -> 17\_s*' ..
2720 '7 DEBUG line 4-3 varcount 0\_s*' ..
2721 '8 PUSH v:exception\_s*' ..
2722 '9 PUSHS "error"\_s*' ..
2723 '10 COMPARESTRING =\~\_s*' ..
2724 '11 JUMP_IF_FALSE -> 17\_s*' ..
2725 '12 CATCH\_s*' ..
2726 'echo "caught"\_s*' ..
2727 '13 DEBUG line 4-4 varcount 0\_s*' ..
2728 '14 PUSHS "caught"\_s*' ..
2729 '15 ECHO 1\_s*' ..
2730 'endtry\_s*' ..
2731 '16 DEBUG line 5-5 varcount 0\_s*' ..
2732 '17 ENDTRY\_s*' ..
2733 '\d\+ RETURN void',
2734 res)
2735enddef
2736
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002737func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002738 echo 'legacy'
2739endfunc
2740
2741def s:UseMember()
2742 var d = {func: Legacy}
2743 var v = d.func()
2744enddef
2745
2746def Test_disassemble_dict_stack()
2747 var res = execute('disass s:UseMember')
2748 assert_match('<SNR>\d*_UseMember\_s*' ..
2749 'var d = {func: Legacy}\_s*' ..
2750 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002751 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002752 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002753 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002754 '\d STORE $0\_s*' ..
2755
2756 'var v = d.func()\_s*' ..
2757 '\d LOAD $0\_s*' ..
2758 '\d MEMBER func\_s*' ..
2759 '\d PCALL top (argc 0)\_s*' ..
2760 '\d PCALL end\_s*' ..
2761 '\d CLEARDICT\_s*' ..
2762 '\d\+ STORE $1\_s*' ..
2763 '\d\+ RETURN void*',
2764 res)
2765enddef
2766
Bram Moolenaar95e4dd82022-04-27 22:15:40 +01002767def s:RetLegacy(): string
2768 legacy return "yes"
2769enddef
2770
2771def Test_disassemble_return_legacy()
2772 var res = execute('disass s:RetLegacy')
2773 assert_match('<SNR>\d*_RetLegacy\_s*' ..
2774 'legacy return "yes"\_s*' ..
2775 '\d CMDMOD legacy\_s*' ..
2776 '\d EVAL legacy "yes"\_s*' ..
2777 '\d CHECKTYPE string stack\[-1]\_s*' ..
2778 '\d CMDMOD_REV\_s*' ..
2779 '\d RETURN',
2780 res)
2781enddef
2782
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002783def s:EchoMessages()
2784 echohl ErrorMsg | echom v:exception | echohl NONE
2785enddef
2786
2787def Test_disassemble_nextcmd()
2788 # splitting commands and removing trailing blanks should not change the line
2789 var res = execute('disass s:EchoMessages')
2790 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2791 'echohl ErrorMsg | echom v:exception | echohl NONE',
2792 res)
2793enddef
2794
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002795def Test_disassemble_after_reload()
2796 var lines =<< trim END
2797 vim9script
2798 if exists('g:ThisFunc')
2799 finish
2800 endif
2801 var name: any
2802 def g:ThisFunc(): number
2803 g:name = name
2804 return 0
2805 enddef
2806 def g:ThatFunc(): number
2807 name = g:name
2808 return 0
2809 enddef
2810 END
2811 lines->writefile('Xreload.vim')
2812
2813 source Xreload.vim
2814 g:ThisFunc()
2815 g:ThatFunc()
2816
2817 source Xreload.vim
2818 var res = execute('disass g:ThisFunc')
2819 assert_match('ThisFunc\_s*' ..
2820 'g:name = name\_s*' ..
2821 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2822 '\d STOREG g:name\_s*' ..
2823 'return 0\_s*' ..
2824 '\d PUSHNR 0\_s*' ..
2825 '\d RETURN\_s*',
2826 res)
2827
2828 res = execute('disass g:ThatFunc')
2829 assert_match('ThatFunc\_s*' ..
2830 'name = g:name\_s*' ..
2831 '\d LOADG g:name\_s*' ..
2832 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2833 'return 0\_s*' ..
2834 '\d PUSHNR 0\_s*' ..
2835 '\d RETURN\_s*',
2836 res)
2837
2838 delete('Xreload.vim')
2839 delfunc g:ThisFunc
2840 delfunc g:ThatFunc
2841enddef
2842
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002843
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002844
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002845" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker