blob: 8731052aa31d05482d3d0129994496f862aafbea [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 Moolenaar06b77222022-01-25 15:51:56 +00004source vim9.vim
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01005
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01006func NotCompiled()
7 echo "not"
8endfunc
9
10let s:scriptvar = 4
11let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020012let b:buffervar = 'b'
13let w:windowvar = 'w'
14let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010015
16def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020017 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010018 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010019 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010020 echo arg
21 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020022 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010023 echo v:version
24 echo s:scriptvar
25 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020026 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010027 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020028 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020029 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020030 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020031 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020032 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020033 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010034 echo &tabstop
35 echo $ENVVAR
36 echo @z
37enddef
38
Bram Moolenaarf2460a32020-02-07 22:09:54 +010039def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010040 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020041 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010042 assert_fails('disass', 'E471:')
43 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020044 assert_fails('disass 234', 'E129:')
45 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010046
Bram Moolenaarac564082020-09-27 19:05:33 +020047 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020048 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010049 'buffers\_s*' ..
50 '\d\+ EXEC \+buffers\_s*' ..
51 'echo\_s*' ..
52 'echo arg\_s*' ..
53 '\d\+ LOAD arg\[-1\]\_s*' ..
54 '\d\+ ECHO 1\_s*' ..
55 'echo local\_s*' ..
56 '\d\+ LOAD $0\_s*' ..
57 '\d\+ ECHO 1\_s*' ..
58 'echo &lines\_s*' ..
59 '\d\+ LOADOPT &lines\_s*' ..
60 '\d\+ ECHO 1\_s*' ..
61 'echo v:version\_s*' ..
62 '\d\+ LOADV v:version\_s*' ..
63 '\d\+ ECHO 1\_s*' ..
64 'echo s:scriptvar\_s*' ..
65 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
66 '\d\+ ECHO 1\_s*' ..
67 'echo g:globalvar\_s*' ..
68 '\d\+ LOADG g:globalvar\_s*' ..
69 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020070 'echo get(g:, "global")\_s*' ..
71 '\d\+ LOAD g:\_s*' ..
72 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010073 '\d\+ BCALL get(argc 2)\_s*' ..
74 '\d\+ ECHO 1\_s*' ..
75 'echo g:auto#var\_s*' ..
76 '\d\+ LOADAUTO g:auto#var\_s*' ..
77 '\d\+ ECHO 1\_s*' ..
78 'echo b:buffervar\_s*' ..
79 '\d\+ LOADB b:buffervar\_s*' ..
80 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020081 'echo get(b:, "buffer")\_s*' ..
82 '\d\+ LOAD b:\_s*' ..
83 '\d\+ PUSHS "buffer"\_s*' ..
84 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020085 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020086 'echo get(w:, "window")\_s*' ..
87 '\d\+ LOAD w:\_s*' ..
88 '\d\+ PUSHS "window"\_s*' ..
89 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020090 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020091 'echo get(t:, "tab")\_s*' ..
92 '\d\+ LOAD t:\_s*' ..
93 '\d\+ PUSHS "tab"\_s*' ..
94 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020095 ' LOADENV $ENVVAR.*' ..
96 ' LOADREG @z.*',
97 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010098enddef
99
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200100def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200101 var filename = "file"
102 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200103 edit the`=filename``=filenr`.txt
104enddef
105
106def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200107 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200108 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200109 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200110 '\d PUSHS "file"\_s*' ..
111 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200112 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200113 '\d STORE 123 in $1\_s*' ..
114 ' edit the`=filename``=filenr`.txt\_s*' ..
115 '\d PUSHS "edit the"\_s*' ..
116 '\d LOAD $0\_s*' ..
117 '\d LOAD $1\_s*' ..
118 '\d 2STRING stack\[-1\]\_s*' ..
119 '\d\+ PUSHS ".txt"\_s*' ..
120 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200121 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200122 res)
123enddef
124
Bram Moolenaar20677332021-06-06 17:02:53 +0200125if has('python3')
126 def s:PyHeredoc()
127 python3 << EOF
128 print('hello')
129EOF
130 enddef
131
132 def Test_disassemble_python_heredoc()
133 var res = execute('disass s:PyHeredoc')
134 assert_match('<SNR>\d*_PyHeredoc.*' ..
135 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
136 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200137 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200138 res)
139 enddef
140endif
141
Bram Moolenaar4c137212021-04-19 16:48:48 +0200142def s:Substitute()
143 var expr = "abc"
144 :%s/a/\=expr/&g#c
145enddef
146
147def Test_disassemble_substitute()
148 var res = execute('disass s:Substitute')
149 assert_match('<SNR>\d*_Substitute.*' ..
150 ' var expr = "abc"\_s*' ..
151 '\d PUSHS "abc"\_s*' ..
152 '\d STORE $0\_s*' ..
153 ' :%s/a/\\=expr/&g#c\_s*' ..
154 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
155 ' 0 LOAD $0\_s*' ..
156 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200157 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200158 res)
159enddef
160
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200161
162def s:SearchPair()
163 var col = 8
164 searchpair("{", "", "}", "", "col('.') > col")
165enddef
166
167def Test_disassemble_seachpair()
168 var res = execute('disass s:SearchPair')
169 assert_match('<SNR>\d*_SearchPair.*' ..
170 ' var col = 8\_s*' ..
171 '\d STORE 8 in $0\_s*' ..
172 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
173 '\d PUSHS "{"\_s*' ..
174 '\d PUSHS ""\_s*' ..
175 '\d PUSHS "}"\_s*' ..
176 '\d PUSHS ""\_s*' ..
177 '\d INSTR\_s*' ..
178 ' 0 PUSHS "."\_s*' ..
179 ' 1 BCALL col(argc 1)\_s*' ..
180 ' 2 LOAD $0\_s*' ..
181 ' 3 COMPARENR >\_s*' ..
182 ' -------------\_s*' ..
183 '\d BCALL searchpair(argc 5)\_s*' ..
184 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200185 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200186 res)
187enddef
188
189
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200190def s:RedirVar()
191 var result: string
192 redir =>> result
193 echo "text"
194 redir END
195enddef
196
197def Test_disassemble_redir_var()
198 var res = execute('disass s:RedirVar')
199 assert_match('<SNR>\d*_RedirVar.*' ..
200 ' var result: string\_s*' ..
201 '\d PUSHS "\[NULL\]"\_s*' ..
202 '\d STORE $0\_s*' ..
203 ' redir =>> result\_s*' ..
204 '\d REDIR\_s*' ..
205 ' echo "text"\_s*' ..
206 '\d PUSHS "text"\_s*' ..
207 '\d ECHO 1\_s*' ..
208 ' redir END\_s*' ..
209 '\d LOAD $0\_s*' ..
210 '\d REDIR END\_s*' ..
211 '\d CONCAT\_s*' ..
212 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200213 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200214 res)
215enddef
216
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200217def s:Cexpr()
218 var errors = "list of errors"
219 cexpr errors
220enddef
221
222def Test_disassemble_cexpr()
223 var res = execute('disass s:Cexpr')
224 assert_match('<SNR>\d*_Cexpr.*' ..
225 ' var errors = "list of errors"\_s*' ..
226 '\d PUSHS "list of errors"\_s*' ..
227 '\d STORE $0\_s*' ..
228 ' cexpr errors\_s*' ..
229 '\d CEXPR pre cexpr\_s*' ..
230 '\d LOAD $0\_s*' ..
231 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200232 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200233 res)
234enddef
235
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200236def s:YankRange()
237 norm! m[jjm]
238 :'[,']yank
239enddef
240
241def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200242 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200243 assert_match('<SNR>\d*_YankRange.*' ..
244 ' norm! m\[jjm\]\_s*' ..
245 '\d EXEC norm! m\[jjm\]\_s*' ..
246 ' :''\[,''\]yank\_s*' ..
247 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200248 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200249 res)
250enddef
251
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200252def s:PutExpr()
253 :3put ="text"
254enddef
255
256def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200257 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200258 assert_match('<SNR>\d*_PutExpr.*' ..
259 ' :3put ="text"\_s*' ..
260 '\d PUSHS "text"\_s*' ..
261 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200262 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200263 res)
264enddef
265
Bram Moolenaar08597872020-12-10 19:43:40 +0100266def s:PutRange()
267 :$-2put a
268enddef
269
270def Test_disassemble_put_range()
271 var res = execute('disass s:PutRange')
272 assert_match('<SNR>\d*_PutRange.*' ..
273 ' :$-2put a\_s*' ..
274 '\d RANGE $-2\_s*' ..
275 '\d PUT a range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200276 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100277 res)
278enddef
279
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100280def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200281 var localbool = true
282 var localspec = v:none
283 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100284 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200285 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100286 endif
287enddef
288
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100289def Test_disassemble_push()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000290 mkdir('Xdir/autoload', 'p')
291 var save_rtp = &rtp
292 exe 'set rtp^=' .. getcwd() .. '/Xdir'
293
294 var lines =<< trim END
295 vim9script
296 END
297 writefile(lines, 'Xdir/autoload/autoscript.vim')
298
299 lines =<< trim END
300 vim9script
301 import autoload 'autoscript.vim'
302
303 def s:AutoloadFunc()
304 &operatorfunc = autoscript.Opfunc
305 enddef
306
307 var res = execute('disass s:AutoloadFunc')
308 assert_match('<SNR>\d*_AutoloadFunc.*' ..
309 '&operatorfunc = autoscript.Opfunc\_s*' ..
310 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
311 '1 STOREFUNCOPT &operatorfunc\_s*' ..
312 '2 RETURN void',
313 res)
314 END
315 CheckScriptSuccess(lines)
316
317 delete('Xdir', 'rf')
318 &rtp = save_rtp
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100319enddef
320
321def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200322 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100323 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200324 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100325 localstr = 'xyz'
326 v:char = 'abc'
327 s:scriptvar = 'sv'
328 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100329 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200330 b:buffervar = 'bv'
331 w:windowvar = 'wv'
332 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100333 &tabstop = 8
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000334 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100335 $ENVVAR = 'ev'
336 @z = 'rv'
337enddef
338
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100339def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200340 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200341 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200342 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200343 'localnr = 2.*' ..
344 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200345 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200346 'localstr = ''xyz''.*' ..
347 ' STORE $1.*' ..
348 'v:char = ''abc''.*' ..
349 'STOREV v:char.*' ..
350 's:scriptvar = ''sv''.*' ..
351 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
352 'g:globalvar = ''gv''.*' ..
353 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100354 'g:auto#var = ''av''.*' ..
355 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200356 'b:buffervar = ''bv''.*' ..
357 ' STOREB b:buffervar.*' ..
358 'w:windowvar = ''wv''.*' ..
359 ' STOREW w:windowvar.*' ..
360 't:tabpagevar = ''tv''.*' ..
361 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000362 '&tabstop = 8\_s*' ..
363 '\d\+ PUSHNR 8\_s*' ..
364 '\d\+ STOREOPT &tabstop\_s*' ..
365 '&opfunc = (t) => len(t)\_s*' ..
366 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
367 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
368 '$ENVVAR = ''ev''\_s*' ..
369 '\d\+ PUSHS "ev"\_s*' ..
370 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200371 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000372 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200373 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100374enddef
375
Bram Moolenaarcb790402020-05-15 20:53:00 +0200376def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200377 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200378 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200379 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200380 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200381 var localblob: blob = 0z1122
382 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200383enddef
384
385def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200386 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200387 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200388 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200389 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100390 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200391 '\d STORE $0\_s*' ..
392 'locallist\[0\] = 123\_s*' ..
393 '\d PUSHNR 123\_s*' ..
394 '\d PUSHNR 0\_s*' ..
395 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200396 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200397 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200398 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100399 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200400 '\d STORE $1\_s*' ..
401 'localdict\["a"\] = 456\_s*' ..
402 '\d\+ PUSHNR 456\_s*' ..
403 '\d\+ PUSHS "a"\_s*' ..
404 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200405 '\d\+ STOREINDEX dict\_s*' ..
406 'var localblob: blob = 0z1122\_s*' ..
407 '\d\+ PUSHBLOB 0z1122\_s*' ..
408 '\d\+ STORE $2\_s*' ..
409 'localblob\[1\] = 33\_s*' ..
410 '\d\+ PUSHNR 33\_s*' ..
411 '\d\+ PUSHNR 1\_s*' ..
412 '\d\+ LOAD $2\_s*' ..
413 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200414 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200415 res)
416enddef
417
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100418def s:ScriptFuncStoreIndex()
419 var d = {dd: {}}
420 d.dd[0] = 0
421enddef
422
423def Test_disassemble_store_index()
424 var res = execute('disass s:ScriptFuncStoreIndex')
425 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
426 'var d = {dd: {}}\_s*' ..
427 '\d PUSHS "dd"\_s*' ..
428 '\d NEWDICT size 0\_s*' ..
429 '\d NEWDICT size 1\_s*' ..
430 '\d STORE $0\_s*' ..
431 'd.dd\[0\] = 0\_s*' ..
432 '\d PUSHNR 0\_s*' ..
433 '\d PUSHNR 0\_s*' ..
434 '\d LOAD $0\_s*' ..
435 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200436 '\d\+ USEDICT\_s*' ..
437 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200438 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100439 res)
440enddef
441
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200442def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200443 var x: string
444 var y: string
445 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200446 [x, y; l] = g:stringlist
447enddef
448
449def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200450 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200451 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200452 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200453 '\d PUSHS "\[NULL\]"\_s*' ..
454 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200455 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200456 '\d PUSHS "\[NULL\]"\_s*' ..
457 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200458 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200459 '\d NEWLIST size 0\_s*' ..
Bram Moolenaar6e48b842021-08-10 22:52:02 +0200460 '\d SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200461 '\d STORE $2\_s*' ..
462 '\[x, y; l\] = g:stringlist\_s*' ..
463 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200464 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200465 '\d CHECKLEN >= 2\_s*' ..
466 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200467 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200468 '\d\+ STORE $0\_s*' ..
469 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200470 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200471 '\d\+ STORE $1\_s*' ..
472 '\d\+ SLICE 2\_s*' ..
Bram Moolenaar10d6f182022-01-04 15:54:38 +0000473 '\d\+ SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200474 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200475 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200476 res)
477enddef
478
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200479def s:ListAssignWithOp()
480 var a = 2
481 var b = 3
482 [a, b] += [4, 5]
483enddef
484
485def Test_disassemble_list_assign_with_op()
486 var res = execute('disass s:ListAssignWithOp')
487 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
488 'var a = 2\_s*' ..
489 '\d STORE 2 in $0\_s*' ..
490 'var b = 3\_s*' ..
491 '\d STORE 3 in $1\_s*' ..
492 '\[a, b\] += \[4, 5\]\_s*' ..
493 '\d\+ PUSHNR 4\_s*' ..
494 '\d\+ PUSHNR 5\_s*' ..
495 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200496 '\d\+ LOAD $0\_s*' ..
497 '\d\+ ITEM 0 with op\_s*' ..
498 '\d\+ OPNR +\_s*' ..
499 '\d\+ STORE $0\_s*' ..
500 '\d\+ LOAD $1\_s*' ..
501 '\d\+ ITEM 1 with op\_s*' ..
502 '\d\+ OPNR +\_s*' ..
503 '\d\+ STORE $1\_s*' ..
504 '\d\+ DROP\_s*' ..
505 '\d\+ RETURN void',
506 res)
507enddef
508
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200509def s:ListAdd()
510 var l: list<number> = []
511 add(l, 123)
512 add(l, g:aNumber)
513enddef
514
515def Test_disassemble_list_add()
516 var res = execute('disass s:ListAdd')
517 assert_match('<SNR>\d*_ListAdd\_s*' ..
518 'var l: list<number> = []\_s*' ..
519 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100520 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200521 '\d STORE $0\_s*' ..
522 'add(l, 123)\_s*' ..
523 '\d LOAD $0\_s*' ..
524 '\d PUSHNR 123\_s*' ..
525 '\d LISTAPPEND\_s*' ..
526 '\d DROP\_s*' ..
527 'add(l, g:aNumber)\_s*' ..
528 '\d LOAD $0\_s*' ..
529 '\d\+ LOADG g:aNumber\_s*' ..
530 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
531 '\d\+ LISTAPPEND\_s*' ..
532 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200533 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200534 res)
535enddef
536
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200537def s:BlobAdd()
538 var b: blob = 0z
539 add(b, 123)
540 add(b, g:aNumber)
541enddef
542
543def Test_disassemble_blob_add()
544 var res = execute('disass s:BlobAdd')
545 assert_match('<SNR>\d*_BlobAdd\_s*' ..
546 'var b: blob = 0z\_s*' ..
547 '\d PUSHBLOB 0z\_s*' ..
548 '\d STORE $0\_s*' ..
549 'add(b, 123)\_s*' ..
550 '\d LOAD $0\_s*' ..
551 '\d PUSHNR 123\_s*' ..
552 '\d BLOBAPPEND\_s*' ..
553 '\d DROP\_s*' ..
554 'add(b, g:aNumber)\_s*' ..
555 '\d LOAD $0\_s*' ..
556 '\d\+ LOADG g:aNumber\_s*' ..
557 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
558 '\d\+ BLOBAPPEND\_s*' ..
559 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200560 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200561 res)
562enddef
563
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200564def s:BlobIndexSlice()
565 var b: blob = 0z112233
566 echo b[1]
567 echo b[1 : 2]
568enddef
569
570def Test_disassemble_blob_index_slice()
571 var res = execute('disass s:BlobIndexSlice')
572 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
573 'var b: blob = 0z112233\_s*' ..
574 '\d PUSHBLOB 0z112233\_s*' ..
575 '\d STORE $0\_s*' ..
576 'echo b\[1\]\_s*' ..
577 '\d LOAD $0\_s*' ..
578 '\d PUSHNR 1\_s*' ..
579 '\d BLOBINDEX\_s*' ..
580 '\d ECHO 1\_s*' ..
581 'echo b\[1 : 2\]\_s*' ..
582 '\d LOAD $0\_s*' ..
583 '\d PUSHNR 1\_s*' ..
584 '\d\+ PUSHNR 2\_s*' ..
585 '\d\+ BLOBSLICE\_s*' ..
586 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200587 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200588 res)
589enddef
590
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200591def s:ScriptFuncUnlet()
592 g:somevar = "value"
593 unlet g:somevar
594 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200595 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200596enddef
597
598def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200599 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200600 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
601 'g:somevar = "value"\_s*' ..
602 '\d PUSHS "value"\_s*' ..
603 '\d STOREG g:somevar\_s*' ..
604 'unlet g:somevar\_s*' ..
605 '\d UNLET g:somevar\_s*' ..
606 'unlet! g:somevar\_s*' ..
607 '\d UNLET! g:somevar\_s*' ..
608 'unlet $SOMEVAR\_s*' ..
609 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200610 res)
611enddef
612
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200613def s:LockLocal()
614 var d = {a: 1}
615 lockvar d.a
616enddef
617
618def Test_disassemble_locl_local()
619 var res = execute('disass s:LockLocal')
620 assert_match('<SNR>\d*_LockLocal\_s*' ..
621 'var d = {a: 1}\_s*' ..
622 '\d PUSHS "a"\_s*' ..
623 '\d PUSHNR 1\_s*' ..
624 '\d NEWDICT size 1\_s*' ..
625 '\d STORE $0\_s*' ..
626 'lockvar d.a\_s*' ..
627 '\d LOAD $0\_s*' ..
628 '\d LOCKUNLOCK lockvar d.a\_s*',
629 res)
630enddef
631
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100632def s:ScriptFuncTry()
633 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200634 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100635 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200636 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100637 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200638 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100639 endtry
640enddef
641
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100642def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200643 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200644 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
645 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100646 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200647 'echo "yes"\_s*' ..
648 '\d PUSHS "yes"\_s*' ..
649 '\d ECHO 1\_s*' ..
650 'catch /fail/\_s*' ..
651 '\d JUMP -> \d\+\_s*' ..
652 '\d PUSH v:exception\_s*' ..
653 '\d PUSHS "fail"\_s*' ..
654 '\d COMPARESTRING =\~\_s*' ..
655 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
656 '\d CATCH\_s*' ..
657 'echo "no"\_s*' ..
658 '\d\+ PUSHS "no"\_s*' ..
659 '\d\+ ECHO 1\_s*' ..
660 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100661 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200662 'throw "end"\_s*' ..
663 '\d\+ PUSHS "end"\_s*' ..
664 '\d\+ THROW\_s*' ..
665 'endtry\_s*' ..
666 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200667 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100668enddef
669
670def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200671 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100672 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100673enddef
674
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100675def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200676 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200677 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200678 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200679 '\d PUSHNR 1\_s*' ..
680 '\d PUSHS "two"\_s*' ..
681 '\d PUSHNR 333\_s*' ..
682 '\d NEWLIST size 3\_s*' ..
683 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100684 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200685 '\d PUSHS "one"\_s*' ..
686 '\d PUSHNR 1\_s*' ..
687 '\d PUSHS "two"\_s*' ..
688 '\d PUSHS "val"\_s*' ..
689 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200690 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100691enddef
692
Bram Moolenaar6e949782020-04-13 17:21:00 +0200693def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100694 echo arg
695enddef
696
697func UserFunc()
698 echo 'nothing'
699endfunc
700
701func UserFuncWithArg(arg)
702 echo a:arg
703endfunc
704
705def s:ScriptFuncCall(): string
706 changenr()
707 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100708 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100709 FuncWithArg(343)
710 ScriptFuncNew()
711 s:ScriptFuncNew()
712 UserFunc()
713 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200714 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100715 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200716 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100717 FuncRefWithArg("bar")
718 return "yes"
719enddef
720
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100721def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200722 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200723 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
724 'changenr()\_s*' ..
725 '\d BCALL changenr(argc 0)\_s*' ..
726 '\d DROP\_s*' ..
727 'char2nr("abc")\_s*' ..
728 '\d PUSHS "abc"\_s*' ..
729 '\d BCALL char2nr(argc 1)\_s*' ..
730 '\d DROP\_s*' ..
731 'Test_disassemble_new()\_s*' ..
732 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
733 '\d DROP\_s*' ..
734 'FuncWithArg(343)\_s*' ..
735 '\d\+ PUSHNR 343\_s*' ..
736 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
737 '\d\+ DROP\_s*' ..
738 'ScriptFuncNew()\_s*' ..
739 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
740 '\d\+ DROP\_s*' ..
741 's:ScriptFuncNew()\_s*' ..
742 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
743 '\d\+ DROP\_s*' ..
744 'UserFunc()\_s*' ..
745 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
746 '\d\+ DROP\_s*' ..
747 'UserFuncWithArg("foo")\_s*' ..
748 '\d\+ PUSHS "foo"\_s*' ..
749 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
750 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200751 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200752 '\d\+ PUSHS "UserFunc"\_s*' ..
753 '\d\+ BCALL function(argc 1)\_s*' ..
754 '\d\+ STORE $0\_s*' ..
755 'FuncRef()\_s*' ..
756 '\d\+ LOAD $\d\_s*' ..
757 '\d\+ PCALL (argc 0)\_s*' ..
758 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200759 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200760 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
761 '\d\+ BCALL function(argc 1)\_s*' ..
762 '\d\+ STORE $1\_s*' ..
763 'FuncRefWithArg("bar")\_s*' ..
764 '\d\+ PUSHS "bar"\_s*' ..
765 '\d\+ LOAD $\d\_s*' ..
766 '\d\+ PCALL (argc 1)\_s*' ..
767 '\d\+ DROP\_s*' ..
768 'return "yes"\_s*' ..
769 '\d\+ PUSHS "yes"\_s*' ..
770 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200771 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100772enddef
773
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200774
775def s:CreateRefs()
776 var local = 'a'
777 def Append(arg: string)
778 local ..= arg
779 enddef
780 g:Append = Append
781 def Get(): string
782 return local
783 enddef
784 g:Get = Get
785enddef
786
787def Test_disassemble_closure()
788 CreateRefs()
789 var res = execute('disass g:Append')
790 assert_match('<lambda>\d\_s*' ..
791 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100792 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200793 '\d LOAD arg\[-1\]\_s*' ..
794 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100795 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200796 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200797 res)
798
799 res = execute('disass g:Get')
800 assert_match('<lambda>\d\_s*' ..
801 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100802 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200803 '\d RETURN',
804 res)
805
806 unlet g:Append
807 unlet g:Get
808enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200809
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100810
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200811def EchoArg(arg: string): string
812 return arg
813enddef
814def RefThis(): func
815 return function('EchoArg')
816enddef
817def s:ScriptPCall()
818 RefThis()("text")
819enddef
820
821def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
824 'RefThis()("text")\_s*' ..
825 '\d DCALL RefThis(argc 0)\_s*' ..
826 '\d PUSHS "text"\_s*' ..
827 '\d PCALL top (argc 1)\_s*' ..
828 '\d PCALL end\_s*' ..
829 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200830 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200831 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200832enddef
833
834
Bram Moolenaara26b9702020-04-18 19:53:28 +0200835def s:FuncWithForwardCall(): string
836 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100837enddef
838
839def DefinedLater(arg: string): string
840 return arg
841enddef
842
843def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200844 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200845 assert_match('FuncWithForwardCall\_s*' ..
846 'return g:DefinedLater("yes")\_s*' ..
847 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200848 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200849 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200850 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100851
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200852 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100853 assert_equal('yes', FuncWithForwardCall())
854
Bram Moolenaara26b9702020-04-18 19:53:28 +0200855 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200856 assert_match('FuncWithForwardCall\_s*' ..
857 'return g:DefinedLater("yes")\_s*' ..
858 '\d PUSHS "yes"\_s*' ..
859 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200860 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200861 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100862enddef
863
864
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200865def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200866 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100867enddef
868
869def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200870 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200871 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200872 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200873 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200874 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200875 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200876 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200877 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
878 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200879 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200880 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200881 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200882 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200883 '\d 2STRING stack\[-1]\_s*' ..
884 '\d\+ CONCAT\_s*' ..
885 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200886 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100887enddef
888
889
Bram Moolenaar158906c2020-02-06 20:39:45 +0100890def HasEval()
891 if has("eval")
892 echo "yes"
893 else
894 echo "no"
895 endif
896enddef
897
898def HasNothing()
899 if has("nothing")
900 echo "yes"
901 else
902 echo "no"
903 endif
904enddef
905
906def HasSomething()
907 if has("nothing")
908 echo "nothing"
909 elseif has("something")
910 echo "something"
911 elseif has("eval")
912 echo "eval"
913 elseif has("less")
914 echo "less"
915 endif
916enddef
917
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100918def HasGuiRunning()
919 if has("gui_running")
920 echo "yes"
921 else
922 echo "no"
923 endif
924enddef
925
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100926def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200927 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200928 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200929 assert_match('HasEval\_s*' ..
930 'if has("eval")\_s*' ..
931 'echo "yes"\_s*' ..
932 '\d PUSHS "yes"\_s*' ..
933 '\d ECHO 1\_s*' ..
934 'else\_s*' ..
935 'echo "no"\_s*' ..
936 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200937 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100938 assert_notmatch('JUMP', instr)
939
Bram Moolenaard2c61702020-09-06 15:58:36 +0200940 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100941 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200942 assert_match('HasNothing\_s*' ..
943 'if has("nothing")\_s*' ..
944 'echo "yes"\_s*' ..
945 'else\_s*' ..
946 'echo "no"\_s*' ..
947 '\d PUSHS "no"\_s*' ..
948 '\d ECHO 1\_s*' ..
949 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200950 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100951 assert_notmatch('PUSHS "yes"', instr)
952 assert_notmatch('JUMP', instr)
953
Bram Moolenaard2c61702020-09-06 15:58:36 +0200954 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100955 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200956 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200957 'if has("nothing")\_s*' ..
958 'echo "nothing"\_s*' ..
959 'elseif has("something")\_s*' ..
960 'echo "something"\_s*' ..
961 'elseif has("eval")\_s*' ..
962 'echo "eval"\_s*' ..
963 '\d PUSHS "eval"\_s*' ..
964 '\d ECHO 1\_s*' ..
965 'elseif has("less").*' ..
966 'echo "less"\_s*' ..
967 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200968 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100969 assert_notmatch('PUSHS "nothing"', instr)
970 assert_notmatch('PUSHS "something"', instr)
971 assert_notmatch('PUSHS "less"', instr)
972 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100973
974 var result: string
975 var instr_expected: string
976 if has('gui')
977 if has('gui_running')
978 # GUI already running, always returns "yes"
979 result = "\nyes"
980 instr_expected = 'HasGuiRunning.*' ..
981 'if has("gui_running")\_s*' ..
982 ' echo "yes"\_s*' ..
983 '\d PUSHS "yes"\_s*' ..
984 '\d ECHO 1\_s*' ..
985 'else\_s*' ..
986 ' echo "no"\_s*' ..
987 'endif'
988 else
989 result = "\nno"
990 if has('unix')
991 # GUI not running but can start later, call has()
992 instr_expected = 'HasGuiRunning.*' ..
993 'if has("gui_running")\_s*' ..
994 '\d PUSHS "gui_running"\_s*' ..
995 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200996 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100997 '\d JUMP_IF_FALSE -> \d\_s*' ..
998 ' echo "yes"\_s*' ..
999 '\d PUSHS "yes"\_s*' ..
1000 '\d ECHO 1\_s*' ..
1001 'else\_s*' ..
1002 '\d JUMP -> \d\_s*' ..
1003 ' echo "no"\_s*' ..
1004 '\d PUSHS "no"\_s*' ..
1005 '\d ECHO 1\_s*' ..
1006 'endif'
1007 else
1008 # GUI not running, always return "no"
1009 instr_expected = 'HasGuiRunning.*' ..
1010 'if has("gui_running")\_s*' ..
1011 ' echo "yes"\_s*' ..
1012 'else\_s*' ..
1013 ' echo "no"\_s*' ..
1014 '\d PUSHS "no"\_s*' ..
1015 '\d ECHO 1\_s*' ..
1016 'endif'
1017 endif
1018 endif
1019 else
1020 # GUI not supported, always return "no"
1021 result = "\nno"
1022 instr_expected = 'HasGuiRunning.*' ..
1023 'if has("gui_running")\_s*' ..
1024 ' echo "yes"\_s*' ..
1025 'else\_s*' ..
1026 ' echo "no"\_s*' ..
1027 '\d PUSHS "no"\_s*' ..
1028 '\d ECHO 1\_s*' ..
1029 'endif'
1030 endif
1031
1032 assert_equal(result, execute('HasGuiRunning()'))
1033 instr = execute('disassemble HasGuiRunning')
1034 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001035enddef
1036
Bram Moolenaarefd88552020-06-18 20:50:10 +02001037def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001038 if 1 < 0
1039 return "maybe"
1040 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001041 if g:cond
1042 return "yes"
1043 else
1044 return "no"
1045 endif
1046enddef
1047
1048def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001049 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001050 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001051 'if 1 < 0\_s*' ..
1052 ' return "maybe"\_s*' ..
1053 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001054 'if g:cond\_s*' ..
1055 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001056 '1 COND2BOOL\_s*' ..
1057 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001058 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001059 '3 PUSHS "yes"\_s*' ..
1060 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001061 'else\_s*' ..
1062 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001063 '5 PUSHS "no"\_s*' ..
1064 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001065 instr)
1066enddef
1067
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001068def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001069 var Funky1: func
1070 var Funky2: func = function("len")
1071 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001072enddef
1073
1074def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001075 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001076 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001077 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001078 '0 PUSHFUNC "\[none]"\_s*' ..
1079 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001080 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001081 '2 PUSHS "len"\_s*' ..
1082 '3 BCALL function(argc 1)\_s*' ..
1083 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001084 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001085 '\d PUSHS "UserFunc"\_s*' ..
1086 '\d BCALL funcref(argc 1)\_s*' ..
1087 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001088 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001089 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001090enddef
1091
1092if has('channel')
1093 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001094 var job1: job
1095 var job2: job = job_start("donothing")
1096 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001097 enddef
1098endif
1099
1100def Test_disassemble_channel()
1101 CheckFeature channel
1102
Bram Moolenaarac564082020-09-27 19:05:33 +02001103 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001104 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001105 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001106 '\d PUSHJOB "no process"\_s*' ..
1107 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001108 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001109 '\d PUSHS "donothing"\_s*' ..
1110 '\d BCALL job_start(argc 1)\_s*' ..
1111 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001112 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001113 '\d PUSHCHANNEL 0\_s*' ..
1114 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001115 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001116 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001117enddef
1118
Bram Moolenaar777770f2020-02-06 21:27:08 +01001119def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001120 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001121 return F("x")
1122enddef
1123
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001124def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001125 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001126 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001127 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001128 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001129 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001130 '\d STORE $0\_s*' ..
1131 'return F("x")\_s*' ..
1132 '\d PUSHS "x"\_s*' ..
1133 '\d LOAD $0\_s*' ..
1134 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001135 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001136 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001137
Bram Moolenaarac564082020-09-27 19:05:33 +02001138 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001139 instr = execute('disassemble ' .. name)
1140 assert_match('<lambda>\d\+\_s*' ..
1141 'return "X" .. a .. "X"\_s*' ..
1142 '\d PUSHS "X"\_s*' ..
1143 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001144 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001145 '\d CONCAT\_s*' ..
1146 '\d PUSHS "X"\_s*' ..
1147 '\d CONCAT\_s*' ..
1148 '\d RETURN',
1149 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001150enddef
1151
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001152def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001153 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001154 return Ref(g:value)
1155enddef
1156
1157def Test_disassemble_lambda_with_type()
1158 g:value = 5
1159 assert_equal(15, LambdaWithType())
1160 var instr = execute('disassemble LambdaWithType')
1161 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001162 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001163 '\d FUNCREF <lambda>\d\+\_s*' ..
1164 '\d STORE $0\_s*' ..
1165 'return Ref(g:value)\_s*' ..
1166 '\d LOADG g:value\_s*' ..
1167 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001168 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001169 '\d PCALL (argc 1)\_s*' ..
1170 '\d RETURN',
1171 instr)
1172enddef
1173
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001174def NestedOuter()
1175 def g:Inner()
1176 echomsg "inner"
1177 enddef
1178enddef
1179
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001180def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001181 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001182 assert_match('NestedOuter\_s*' ..
1183 'def g:Inner()\_s*' ..
1184 'echomsg "inner"\_s*' ..
1185 'enddef\_s*' ..
1186 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001187 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001188 instr)
1189enddef
1190
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001191def NestedDefList()
1192 def
1193 def Info
1194 def /Info
1195 def /Info/
1196enddef
1197
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001198def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001199 var instr = execute('disassemble NestedDefList')
1200 assert_match('NestedDefList\_s*' ..
1201 'def\_s*' ..
1202 '\d DEF \_s*' ..
1203 'def Info\_s*' ..
1204 '\d DEF Info\_s*' ..
1205 'def /Info\_s*' ..
1206 '\d DEF /Info\_s*' ..
1207 'def /Info/\_s*' ..
1208 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001209 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001210 instr)
1211enddef
1212
Bram Moolenaar6e949782020-04-13 17:21:00 +02001213def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001214 if arg == 1 && arg != 2 || arg == 4
1215 return 'yes'
1216 endif
1217 return 'no'
1218enddef
1219
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001220def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001221 assert_equal("yes", AndOr(1))
1222 assert_equal("no", AndOr(2))
1223 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001224 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001225 assert_match('AndOr\_s*' ..
1226 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1227 '\d LOAD arg\[-1]\_s*' ..
1228 '\d PUSHNR 1\_s*' ..
1229 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001230 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001231 '\d LOAD arg\[-1]\_s*' ..
1232 '\d PUSHNR 2\_s*' ..
1233 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001234 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001235 '\d LOAD arg\[-1]\_s*' ..
1236 '\d\+ PUSHNR 4\_s*' ..
1237 '\d\+ COMPAREANY ==\_s*' ..
1238 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001239 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001240enddef
1241
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001242def AndConstant(arg: any): string
1243 if true && arg
1244 return "yes"
1245 endif
1246 if false && arg
1247 return "never"
1248 endif
1249 return "no"
1250enddef
1251
1252def Test_disassemble_and_constant()
1253 assert_equal("yes", AndConstant(1))
1254 assert_equal("no", AndConstant(false))
1255 var instr = execute('disassemble AndConstant')
1256 assert_match('AndConstant\_s*' ..
1257 'if true && arg\_s*' ..
1258 '0 LOAD arg\[-1\]\_s*' ..
1259 '1 COND2BOOL\_s*' ..
1260 '2 JUMP_IF_FALSE -> 5\_s*' ..
1261 'return "yes"\_s*' ..
1262 '3 PUSHS "yes"\_s*' ..
1263 '4 RETURN\_s*' ..
1264 'endif\_s*' ..
1265 'if false && arg\_s*' ..
1266 'return "never"\_s*' ..
1267 'endif\_s*' ..
1268 'return "no"\_s*' ..
1269 '5 PUSHS "no"\_s*' ..
1270 '6 RETURN',
1271 instr)
1272enddef
1273
Bram Moolenaar04d05222020-02-06 22:06:54 +01001274def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001275 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001276 for i in range(3)
1277 res->add(i)
1278 endfor
1279 return res
1280enddef
1281
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001282def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001283 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001285 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001286 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001287 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001288 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001289 '\d STORE $0\_s*' ..
1290 'for i in range(3)\_s*' ..
1291 '\d STORE -1 in $1\_s*' ..
1292 '\d PUSHNR 3\_s*' ..
1293 '\d BCALL range(argc 1)\_s*' ..
1294 '\d FOR $1 -> \d\+\_s*' ..
1295 '\d STORE $2\_s*' ..
1296 'res->add(i)\_s*' ..
1297 '\d LOAD $0\_s*' ..
1298 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001299 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001300 '\d\+ DROP\_s*' ..
1301 'endfor\_s*' ..
1302 '\d\+ JUMP -> \d\+\_s*' ..
1303 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001304 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001305enddef
1306
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001307def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001308 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001309 for str in eval('["one", "two"]')
1310 res ..= str
1311 endfor
1312 return res
1313enddef
1314
1315def Test_disassemble_for_loop_eval()
1316 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001318 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001319 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001320 '\d PUSHS ""\_s*' ..
1321 '\d STORE $0\_s*' ..
1322 'for str in eval(''\["one", "two"\]'')\_s*' ..
1323 '\d STORE -1 in $1\_s*' ..
1324 '\d PUSHS "\["one", "two"\]"\_s*' ..
1325 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001326 '\d FOR $1 -> \d\+\_s*' ..
1327 '\d STORE $2\_s*' ..
1328 'res ..= str\_s*' ..
1329 '\d\+ LOAD $0\_s*' ..
1330 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001331 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001332 '\d\+ CONCAT\_s*' ..
1333 '\d\+ STORE $0\_s*' ..
1334 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001335 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001336 '\d\+ DROP\_s*' ..
1337 'return res\_s*' ..
1338 '\d\+ LOAD $0\_s*' ..
1339 '\d\+ RETURN',
1340 instr)
1341enddef
1342
Bram Moolenaar792f7862020-11-23 08:31:18 +01001343def ForLoopUnpack()
1344 for [x1, x2] in [[1, 2], [3, 4]]
1345 echo x1 x2
1346 endfor
1347enddef
1348
1349def Test_disassemble_for_loop_unpack()
1350 var instr = execute('disassemble ForLoopUnpack')
1351 assert_match('ForLoopUnpack\_s*' ..
1352 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1353 '\d\+ STORE -1 in $0\_s*' ..
1354 '\d\+ PUSHNR 1\_s*' ..
1355 '\d\+ PUSHNR 2\_s*' ..
1356 '\d\+ NEWLIST size 2\_s*' ..
1357 '\d\+ PUSHNR 3\_s*' ..
1358 '\d\+ PUSHNR 4\_s*' ..
1359 '\d\+ NEWLIST size 2\_s*' ..
1360 '\d\+ NEWLIST size 2\_s*' ..
1361 '\d\+ FOR $0 -> 16\_s*' ..
1362 '\d\+ UNPACK 2\_s*' ..
1363 '\d\+ STORE $1\_s*' ..
1364 '\d\+ STORE $2\_s*' ..
1365 'echo x1 x2\_s*' ..
1366 '\d\+ LOAD $1\_s*' ..
1367 '\d\+ LOAD $2\_s*' ..
1368 '\d\+ ECHO 2\_s*' ..
1369 'endfor\_s*' ..
1370 '\d\+ JUMP -> 8\_s*' ..
1371 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001372 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001373 instr)
1374enddef
1375
Bram Moolenaarc150c092021-02-13 15:02:46 +01001376def ForLoopContinue()
1377 for nr in [1, 2]
1378 try
1379 echo "ok"
1380 try
1381 echo "deeper"
1382 catch
1383 continue
1384 endtry
1385 catch
1386 echo "not ok"
1387 endtry
1388 endfor
1389enddef
1390
1391def Test_disassemble_for_loop_continue()
1392 var instr = execute('disassemble ForLoopContinue')
1393 assert_match('ForLoopContinue\_s*' ..
1394 'for nr in \[1, 2]\_s*' ..
1395 '0 STORE -1 in $0\_s*' ..
1396 '1 PUSHNR 1\_s*' ..
1397 '2 PUSHNR 2\_s*' ..
1398 '3 NEWLIST size 2\_s*' ..
1399 '4 FOR $0 -> 22\_s*' ..
1400 '5 STORE $1\_s*' ..
1401 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001402 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001403 'echo "ok"\_s*' ..
1404 '7 PUSHS "ok"\_s*' ..
1405 '8 ECHO 1\_s*' ..
1406 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001407 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001408 'echo "deeper"\_s*' ..
1409 '10 PUSHS "deeper"\_s*' ..
1410 '11 ECHO 1\_s*' ..
1411 'catch\_s*' ..
1412 '12 JUMP -> 15\_s*' ..
1413 '13 CATCH\_s*' ..
1414 'continue\_s*' ..
1415 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1416 'endtry\_s*' ..
1417 '15 ENDTRY\_s*' ..
1418 'catch\_s*' ..
1419 '16 JUMP -> 20\_s*' ..
1420 '17 CATCH\_s*' ..
1421 'echo "not ok"\_s*' ..
1422 '18 PUSHS "not ok"\_s*' ..
1423 '19 ECHO 1\_s*' ..
1424 'endtry\_s*' ..
1425 '20 ENDTRY\_s*' ..
1426 'endfor\_s*' ..
1427 '21 JUMP -> 4\_s*' ..
1428 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001429 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001430 instr)
1431enddef
1432
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001433let g:number = 42
1434
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001435def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001436 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001437enddef
1438
1439def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001441 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001442 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001443 '\d PUSHNR 23\_s*' ..
1444 '\d LOADG g:number\_s*' ..
1445 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1446 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001447 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001448 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001449 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001450 instr)
1451enddef
1452
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001453def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001454 var nr = 3
1455 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001456 nrres = nr - 7
1457 nrres = nr * 7
1458 nrres = nr / 7
1459 nrres = nr % 7
1460
Bram Moolenaarac564082020-09-27 19:05:33 +02001461 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001462 anyres = g:number - 7
1463 anyres = g:number * 7
1464 anyres = g:number / 7
1465 anyres = g:number % 7
1466
1467 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001468 var fl = 3.0
1469 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001470 flres = fl - 7.0
1471 flres = fl * 7.0
1472 flres = fl / 7.0
1473 endif
1474enddef
1475
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001476def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001477 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001478 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001479 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001480 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001481 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001482 '\d LOAD $0.*' ..
1483 '\d PUSHNR 7.*' ..
1484 '\d OPNR +.*' ..
1485 '\d STORE $1.*' ..
1486 'nrres = nr - 7.*' ..
1487 '\d OPNR -.*' ..
1488 'nrres = nr \* 7.*' ..
1489 '\d OPNR \*.*' ..
1490 'nrres = nr / 7.*' ..
1491 '\d OPNR /.*' ..
1492 'nrres = nr % 7.*' ..
1493 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001494 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001495 '\d LOADG g:number.*' ..
1496 '\d PUSHNR 7.*' ..
1497 '\d OPANY +.*' ..
1498 '\d STORE $2.*' ..
1499 'anyres = g:number - 7.*' ..
1500 '\d OPANY -.*' ..
1501 'anyres = g:number \* 7.*' ..
1502 '\d OPANY \*.*' ..
1503 'anyres = g:number / 7.*' ..
1504 '\d OPANY /.*' ..
1505 'anyres = g:number % 7.*' ..
1506 '\d OPANY %.*',
1507 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001508 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001509 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001510 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001511 '\d PUSHF 3.0.*' ..
1512 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001513 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001514 '\d LOAD $3.*' ..
1515 '\d PUSHF 7.0.*' ..
1516 '\d OPFLOAT +.*' ..
1517 '\d STORE $4.*' ..
1518 'flres = fl - 7.0.*' ..
1519 '\d OPFLOAT -.*' ..
1520 'flres = fl \* 7.0.*' ..
1521 '\d OPFLOAT \*.*' ..
1522 'flres = fl / 7.0.*' ..
1523 '\d OPFLOAT /.*',
1524 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001525 endif
1526enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001527
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001528def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 var reslist = [1, 2] + [3, 4]
1530 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001531enddef
1532
1533def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001534 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001535 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001536 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001537 '\d PUSHNR 1.*' ..
1538 '\d PUSHNR 2.*' ..
1539 '\d NEWLIST size 2.*' ..
1540 '\d PUSHNR 3.*' ..
1541 '\d PUSHNR 4.*' ..
1542 '\d NEWLIST size 2.*' ..
1543 '\d ADDLIST.*' ..
1544 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001545 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001546 '\d PUSHBLOB 0z1122.*' ..
1547 '\d PUSHBLOB 0z3344.*' ..
1548 '\d ADDBLOB.*' ..
1549 '\d STORE $.*',
1550 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001551enddef
1552
1553let g:aa = 'aa'
1554def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001555 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001556 return res
1557enddef
1558
1559def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001560 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001561 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001562 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001563 '\d LOADG g:aa.*' ..
1564 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001565 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001566 '\d CONCAT.*' ..
1567 '\d STORE $.*',
1568 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001569 assert_equal('aabb', ConcatString())
1570enddef
1571
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001572def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001573 var s = "abcd"
1574 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001575 return res
1576enddef
1577
1578def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001580 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001581 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001582 '\d PUSHS "abcd"\_s*' ..
1583 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001584 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001585 '\d LOAD $0\_s*' ..
1586 '\d PUSHNR 1\_s*' ..
1587 '\d STRINDEX\_s*' ..
1588 '\d STORE $1\_s*',
1589 instr)
1590 assert_equal('b', StringIndex())
1591enddef
1592
Bram Moolenaared591872020-08-15 22:14:53 +02001593def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001594 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001595 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001596 return res
1597enddef
1598
1599def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001600 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001601 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001602 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001603 '\d PUSHS "abcd"\_s*' ..
1604 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001605 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001606 '\d LOAD $0\_s*' ..
1607 '\d PUSHNR 1\_s*' ..
1608 '\d PUSHNR 8\_s*' ..
1609 '\d STRSLICE\_s*' ..
1610 '\d STORE $1\_s*',
1611 instr)
1612 assert_equal('bcd', StringSlice())
1613enddef
1614
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001615def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001616 var l = [1, 2, 3]
1617 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001618 return res
1619enddef
1620
1621def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001622 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001623 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001625 '\d PUSHNR 1\_s*' ..
1626 '\d PUSHNR 2\_s*' ..
1627 '\d PUSHNR 3\_s*' ..
1628 '\d NEWLIST size 3\_s*' ..
1629 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001630 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001631 '\d LOAD $0\_s*' ..
1632 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001633 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001634 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001635 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001636 assert_equal(2, ListIndex())
1637enddef
1638
Bram Moolenaared591872020-08-15 22:14:53 +02001639def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001640 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001641 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001642 return res
1643enddef
1644
1645def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001646 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001647 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001648 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001649 '\d PUSHNR 1\_s*' ..
1650 '\d PUSHNR 2\_s*' ..
1651 '\d PUSHNR 3\_s*' ..
1652 '\d NEWLIST size 3\_s*' ..
1653 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001654 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001655 '\d LOAD $0\_s*' ..
1656 '\d PUSHNR 1\_s*' ..
1657 '\d PUSHNR 8\_s*' ..
1658 '\d LISTSLICE\_s*' ..
1659 '\d STORE $1\_s*',
1660 instr)
1661 assert_equal([2, 3], ListSlice())
1662enddef
1663
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001664def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001665 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001666 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001667 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001668 return res
1669enddef
1670
1671def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001672 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001673 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001674 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001675 '\d PUSHS "item"\_s*' ..
1676 '\d PUSHNR 1\_s*' ..
1677 '\d NEWDICT size 1\_s*' ..
1678 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001679 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001680 '\d\+ LOAD $0\_s*' ..
1681 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001682 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001683 '\d\+ STORE $1\_s*' ..
1684 'res = d\["item"\]\_s*' ..
1685 '\d\+ LOAD $0\_s*' ..
1686 '\d\+ PUSHS "item"\_s*' ..
1687 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001688 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001689 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001690 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001691 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001692enddef
1693
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001694let somelist = [1, 2, 3, 4, 5]
1695def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001696 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001697 return res
1698enddef
1699
1700def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001702 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001703 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001704 '\d LOADG g:somelist\_s*' ..
1705 '\d PUSHNR 2\_s*' ..
1706 '\d ANYINDEX\_s*' ..
1707 '\d STORE $0\_s*' ..
1708 'return res\_s*' ..
1709 '\d LOAD $0\_s*' ..
1710 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1711 '\d RETURN',
1712 instr)
1713 assert_equal(3, AnyIndex())
1714enddef
1715
1716def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001717 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001718 return res
1719enddef
1720
1721def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001722 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001723 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001724 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001725 '\d LOADG g:somelist\_s*' ..
1726 '\d PUSHNR 1\_s*' ..
1727 '\d PUSHNR 3\_s*' ..
1728 '\d ANYSLICE\_s*' ..
1729 '\d STORE $0\_s*' ..
1730 'return res\_s*' ..
1731 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001732 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001733 '\d RETURN',
1734 instr)
1735 assert_equal([2, 3, 4], AnySlice())
1736enddef
1737
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001738def NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001739 g:nr = 9
1740 var plus = +g:nr
1741 var minus = -g:nr
1742 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001743enddef
1744
1745def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001746 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001747 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001748 'g:nr = 9\_s*' ..
1749 '\d PUSHNR 9\_s*' ..
1750 '\d STOREG g:nr\_s*' ..
1751 'var plus = +g:nr\_s*' ..
1752 '\d LOADG g:nr\_s*' ..
1753 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1754 '\d STORE $0\_s*' ..
1755 'var minus = -g:nr\_s*' ..
1756 '\d LOADG g:nr\_s*' ..
1757 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001758 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001759 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001760 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001761 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001762enddef
1763
1764def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001765 var flag = true
1766 var invert = !flag
1767 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001768 return res
1769enddef
1770
1771def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001772 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001773 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001774 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001775 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001776 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001777 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001778 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001779 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001780 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001781 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001782 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001783 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001784 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001785 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001786 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001787enddef
1788
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001789def ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001790 var one = 1
1791 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001792 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001793 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001794 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001795enddef
1796
1797def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001798 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001799 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001800 'var one = 1\_s*' ..
1801 '0 STORE 1 in $0\_s*' ..
1802 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001803 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001804 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001805 '1 LOAD $0\_s*' ..
1806 '2 COND2BOOL\_s*' ..
1807 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1808 '4 LOAD $1\_s*' ..
1809 '5 COND2BOOL\_s*' ..
1810 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1811 '7 LOAD $0\_s*' ..
1812 '8 COND2BOOL\_s*' ..
1813 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001814 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001815 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001816 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001817 instr)
1818 assert_equal(true, InvertBool())
1819enddef
1820
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00001821def AutoInit()
1822 var t: number
1823 t = 1
1824 t = 0
1825enddef
1826
1827def Test_disassemble_auto_init()
1828 var instr = execute('disassemble AutoInit')
1829 assert_match('AutoInit\_s*' ..
1830 'var t: number\_s*' ..
1831 't = 1\_s*' ..
1832 '\d STORE 1 in $0\_s*' ..
1833 't = 0\_s*' ..
1834 '\d STORE 0 in $0\_s*' ..
1835 '\d\+ RETURN void',
1836 instr)
1837enddef
1838
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001839def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001840 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001841 ['true == isFalse', 'COMPAREBOOL =='],
1842 ['true != isFalse', 'COMPAREBOOL !='],
1843 ['v:none == isNull', 'COMPARESPECIAL =='],
1844 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001845
Bram Moolenaara5565e42020-05-09 15:44:01 +02001846 ['111 == aNumber', 'COMPARENR =='],
1847 ['111 != aNumber', 'COMPARENR !='],
1848 ['111 > aNumber', 'COMPARENR >'],
1849 ['111 < aNumber', 'COMPARENR <'],
1850 ['111 >= aNumber', 'COMPARENR >='],
1851 ['111 <= aNumber', 'COMPARENR <='],
1852 ['111 =~ aNumber', 'COMPARENR =\~'],
1853 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001854
Bram Moolenaara5565e42020-05-09 15:44:01 +02001855 ['"xx" != aString', 'COMPARESTRING !='],
1856 ['"xx" > aString', 'COMPARESTRING >'],
1857 ['"xx" < aString', 'COMPARESTRING <'],
1858 ['"xx" >= aString', 'COMPARESTRING >='],
1859 ['"xx" <= aString', 'COMPARESTRING <='],
1860 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1861 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1862 ['"xx" is aString', 'COMPARESTRING is'],
1863 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001864
Bram Moolenaara5565e42020-05-09 15:44:01 +02001865 ['0z11 == aBlob', 'COMPAREBLOB =='],
1866 ['0z11 != aBlob', 'COMPAREBLOB !='],
1867 ['0z11 is aBlob', 'COMPAREBLOB is'],
1868 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001869
Bram Moolenaara5565e42020-05-09 15:44:01 +02001870 ['[1, 2] == aList', 'COMPARELIST =='],
1871 ['[1, 2] != aList', 'COMPARELIST !='],
1872 ['[1, 2] is aList', 'COMPARELIST is'],
1873 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001874
Bram Moolenaare0de1712020-12-02 17:36:54 +01001875 ['{a: 1} == aDict', 'COMPAREDICT =='],
1876 ['{a: 1} != aDict', 'COMPAREDICT !='],
1877 ['{a: 1} is aDict', 'COMPAREDICT is'],
1878 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001879
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001880 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1881 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1882 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1883 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001884
1885 ['77 == g:xx', 'COMPAREANY =='],
1886 ['77 != g:xx', 'COMPAREANY !='],
1887 ['77 > g:xx', 'COMPAREANY >'],
1888 ['77 < g:xx', 'COMPAREANY <'],
1889 ['77 >= g:xx', 'COMPAREANY >='],
1890 ['77 <= g:xx', 'COMPAREANY <='],
1891 ['77 =~ g:xx', 'COMPAREANY =\~'],
1892 ['77 !~ g:xx', 'COMPAREANY !\~'],
1893 ['77 is g:xx', 'COMPAREANY is'],
1894 ['77 isnot g:xx', 'COMPAREANY isnot'],
1895 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001896 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001897 if has('float')
1898 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001899 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1900 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1901 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1902 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1903 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1904 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1905 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1906 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001907 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001908 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001909 endif
1910
Bram Moolenaarac564082020-09-27 19:05:33 +02001911 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001912 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001913 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001914 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001915 ' var isFalse = false',
1916 ' var isNull = v:null',
1917 ' var aNumber = 222',
1918 ' var aString = "yy"',
1919 ' var aBlob = 0z22',
1920 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001921 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001922 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001923 ' if ' .. case[0],
1924 ' echo 42'
1925 ' endif',
1926 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001927 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001928 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001929 assert_match('TestCase' .. nr .. '.*' ..
1930 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1931 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001932 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001933 '\d ' .. case[1] .. '.*' ..
1934 '\d JUMP_IF_FALSE -> \d\+.*',
1935 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001936
1937 nr += 1
1938 endfor
1939
Bram Moolenaar22da5592020-03-19 14:52:20 +01001940 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001941enddef
1942
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001943def s:FalsyOp()
1944 echo g:flag ?? "yes"
1945 echo [] ?? "empty list"
1946 echo "" ?? "empty string"
1947enddef
1948
1949def Test_dsassemble_falsy_op()
1950 var res = execute('disass s:FalsyOp')
1951 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1952 'echo g:flag ?? "yes"\_s*' ..
1953 '0 LOADG g:flag\_s*' ..
1954 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1955 '2 PUSHS "yes"\_s*' ..
1956 '3 ECHO 1\_s*' ..
1957 'echo \[\] ?? "empty list"\_s*' ..
1958 '4 NEWLIST size 0\_s*' ..
1959 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1960 '6 PUSHS "empty list"\_s*' ..
1961 '7 ECHO 1\_s*' ..
1962 'echo "" ?? "empty string"\_s*' ..
1963 '\d\+ PUSHS "empty string"\_s*' ..
1964 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001965 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001966 res)
1967enddef
1968
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001969def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001970 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001971 ['"xx" == "yy"', false],
1972 ['"aa" == "aa"', true],
1973 ['has("eval") ? true : false', true],
1974 ['has("asdf") ? true : false', false],
1975 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001976
Bram Moolenaarac564082020-09-27 19:05:33 +02001977 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001978 for case in cases
1979 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001980 ' if ' .. case[0],
1981 ' echo 42'
1982 ' endif',
1983 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001984 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001985 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001986 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001987 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001988 assert_match('TestCase' .. nr .. '.*' ..
1989 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1990 '\d PUSHNR 42.*' ..
1991 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001992 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001993 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001994 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001995 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001996 assert_match('TestCase' .. nr .. '.*' ..
1997 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1998 'echo 42[ \n]*' ..
1999 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002000 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002001 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002002 endif
2003
2004 nr += 1
2005 endfor
2006
2007 delete('Xdisassemble')
2008enddef
2009
Bram Moolenaarad39c092020-02-26 18:23:43 +01002010def s:Execute()
2011 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002012 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002013 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002014 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002015 execute 'help ' .. tag
2016enddef
2017
2018def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002019 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002020 assert_match('\<SNR>\d*_Execute\_s*' ..
2021 "execute 'help vim9.txt'\\_s*" ..
2022 '\d PUSHS "help vim9.txt"\_s*' ..
2023 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002024 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002025 '\d PUSHS "help vim9.txt"\_s*' ..
2026 '\d STORE $0\_s*' ..
2027 'execute cmd\_s*' ..
2028 '\d LOAD $0\_s*' ..
2029 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002030 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002031 '\d PUSHS "vim9.txt"\_s*' ..
2032 '\d STORE $1\_s*' ..
2033 "execute 'help ' .. tag\\_s*" ..
2034 '\d\+ PUSHS "help "\_s*' ..
2035 '\d\+ LOAD $1\_s*' ..
2036 '\d\+ CONCAT\_s*' ..
2037 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002038 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002039 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002040enddef
2041
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002042def s:OnlyRange()
2043 :$
2044 :123
2045 :'m
2046enddef
2047
2048def Test_disassemble_range_only()
2049 var res = execute('disass s:OnlyRange')
2050 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2051 ':$\_s*' ..
2052 '\d EXECRANGE $\_s*' ..
2053 ':123\_s*' ..
2054 '\d EXECRANGE 123\_s*' ..
2055 ':''m\_s*' ..
2056 '\d EXECRANGE ''m\_s*' ..
2057 '\d\+ RETURN void',
2058 res)
2059enddef
2060
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002061def s:Echomsg()
2062 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002063 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002064 echoerr 'went' .. 'wrong'
2065enddef
2066
2067def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002068 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002069 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2070 "echomsg 'some' 'message'\\_s*" ..
2071 '\d PUSHS "some"\_s*' ..
2072 '\d PUSHS "message"\_s*' ..
2073 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002074 "echoconsole 'nothing'\\_s*" ..
2075 '\d PUSHS "nothing"\_s*' ..
2076 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002077 "echoerr 'went' .. 'wrong'\\_s*" ..
2078 '\d PUSHS "wentwrong"\_s*' ..
2079 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002080 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002081 res)
2082enddef
2083
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002084def SomeStringArg(arg: string)
2085 echo arg
2086enddef
2087
2088def SomeAnyArg(arg: any)
2089 echo arg
2090enddef
2091
2092def SomeStringArgAndReturn(arg: string): string
2093 return arg
2094enddef
2095
2096def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002097 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002098 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2099 '\d *echo arg.*' ..
2100 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002101 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002102
Bram Moolenaarac564082020-09-27 19:05:33 +02002103 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002104 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2105 '\d *echo arg\_s*' ..
2106 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002107 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002108
Bram Moolenaarac564082020-09-27 19:05:33 +02002109 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002110 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2111 '\d *return arg\_s*' ..
2112 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002113 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002114enddef
2115
Bram Moolenaar09689a02020-05-09 22:50:08 +02002116def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002117 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002118 vim9script
2119 def FuncOne(): string
2120 return FuncTwo()
2121 enddef
2122 def FuncTwo(): string
2123 return 'two'
2124 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002125 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002126 END
2127 writefile(lines, 'Xdisassemble')
2128 source Xdisassemble
2129
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002130 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002131 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2132 'return FuncTwo()\_s*' ..
2133 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002134 '\d RETURN',
2135 g:res_FuncOne)
2136
2137 delete('Xdisassemble')
2138 unlet g:res_FuncOne
2139enddef
2140
Bram Moolenaar61a89812020-05-07 16:58:17 +02002141def s:ConcatStrings(): string
2142 return 'one' .. 'two' .. 'three'
2143enddef
2144
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002145def s:ComputeConst(): number
2146 return 2 + 3 * 4 / 6 + 7
2147enddef
2148
Bram Moolenaar1c747212020-05-09 18:28:34 +02002149def s:ComputeConstParen(): number
2150 return ((2 + 4) * (8 / 2)) / (3 + 4)
2151enddef
2152
Bram Moolenaar61a89812020-05-07 16:58:17 +02002153def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002154 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002155 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2156 "return 'one' .. 'two' .. 'three'\\_s*" ..
2157 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002158 '\d RETURN',
2159 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002160
2161 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002162 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2163 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2164 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002165 '\d RETURN',
2166 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002167
2168 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002169 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2170 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2171 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002172 '\d RETURN',
2173 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002174enddef
2175
Bram Moolenaar389df252020-07-09 21:20:47 +02002176def s:CallAppend()
2177 eval "some text"->append(2)
2178enddef
2179
2180def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002181 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002182 assert_match('<SNR>\d*_CallAppend\_s*' ..
2183 'eval "some text"->append(2)\_s*' ..
2184 '\d PUSHS "some text"\_s*' ..
2185 '\d PUSHNR 2\_s*' ..
2186 '\d SHUFFLE 2 up 1\_s*' ..
2187 '\d BCALL append(argc 2)\_s*' ..
2188 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002189 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002190 res)
2191enddef
2192
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002193
2194def s:SilentMessage()
2195 silent echomsg "text"
2196 silent! echoerr "error"
2197enddef
2198
2199def Test_silent()
2200 var res = execute('disass s:SilentMessage')
2201 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2202 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002203 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002204 '\d PUSHS "text"\_s*' ..
2205 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002206 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002207 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002208 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002209 '\d PUSHS "error"\_s*' ..
2210 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002211 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002212 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002213 res)
2214enddef
2215
2216def s:SilentIf()
2217 silent if 4 == g:five
2218 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002219 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002220enddef
2221
2222def Test_silent_if()
2223 var res = execute('disass s:SilentIf')
2224 assert_match('<SNR>\d*_SilentIf\_s*' ..
2225 'silent if 4 == g:five\_s*' ..
2226 '\d\+ CMDMOD silent\_s*' ..
2227 '\d\+ PUSHNR 4\_s*' ..
2228 '\d\+ LOADG g:five\_s*' ..
2229 '\d\+ COMPAREANY ==\_s*' ..
2230 '\d\+ CMDMOD_REV\_s*' ..
2231 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2232 'silent elseif 4 == g:five\_s*' ..
2233 '\d\+ JUMP -> \d\+\_s*' ..
2234 '\d\+ CMDMOD silent\_s*' ..
2235 '\d\+ PUSHNR 4\_s*' ..
2236 '\d\+ LOADG g:five\_s*' ..
2237 '\d\+ COMPAREANY ==\_s*' ..
2238 '\d\+ CMDMOD_REV\_s*' ..
2239 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002240 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002241 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002242 res)
2243enddef
2244
2245def s:SilentFor()
2246 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002247 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002248enddef
2249
2250def Test_silent_for()
2251 var res = execute('disass s:SilentFor')
2252 assert_match('<SNR>\d*_SilentFor\_s*' ..
2253 'silent for i in \[0\]\_s*' ..
2254 '\d CMDMOD silent\_s*' ..
2255 '\d STORE -1 in $0\_s*' ..
2256 '\d PUSHNR 0\_s*' ..
2257 '\d NEWLIST size 1\_s*' ..
2258 '\d CMDMOD_REV\_s*' ..
2259 '5 FOR $0 -> 8\_s*' ..
2260 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002261 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002262 '\d JUMP -> 5\_s*' ..
2263 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002264 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002265 res)
2266enddef
2267
2268def s:SilentWhile()
2269 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002270 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002271enddef
2272
2273def Test_silent_while()
2274 var res = execute('disass s:SilentWhile')
2275 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2276 'silent while g:not\_s*' ..
2277 '0 CMDMOD silent\_s*' ..
2278 '\d LOADG g:not\_s*' ..
2279 '\d COND2BOOL\_s*' ..
2280 '\d CMDMOD_REV\_s*' ..
2281 '\d JUMP_IF_FALSE -> 6\_s*' ..
2282
Bram Moolenaarfa984412021-03-25 22:15:28 +01002283 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002284 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002285 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002286 res)
2287enddef
2288
2289def s:SilentReturn(): string
2290 silent return "done"
2291enddef
2292
2293def Test_silent_return()
2294 var res = execute('disass s:SilentReturn')
2295 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2296 'silent return "done"\_s*' ..
2297 '\d CMDMOD silent\_s*' ..
2298 '\d PUSHS "done"\_s*' ..
2299 '\d CMDMOD_REV\_s*' ..
2300 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002301 res)
2302enddef
2303
Bram Moolenaarb2049902021-01-24 12:53:53 +01002304def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002305 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002306 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002307 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002308 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002309 return "done"
2310enddef
2311
2312def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002313 if !has('profile')
2314 MissingFeature 'profile'
2315 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002316 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002317 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002318 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002319 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002320 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002321 '\d PUSHS "profiled"\_s*' ..
2322 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002323 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002324 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002325 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002326 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002327 '\d PUSHS "some text"\_s*' ..
2328 '\d STORE $0\_s*' ..
2329 'return "done"\_s*' ..
2330 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002331 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002332 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002333 '\d\+ RETURN\_s*' ..
2334 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002335 res)
2336enddef
2337
Bram Moolenaare99d4222021-06-13 14:01:26 +02002338def Test_debugged()
2339 var res = execute('disass debug s:Profiled')
2340 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002341 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002342 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002343 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002344 '\d PUSHS "profiled"\_s*' ..
2345 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002346 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002347 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002348 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002349 '\d PUSHS "some text"\_s*' ..
2350 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002351 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002352 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002353 '\d PUSHS "done"\_s*' ..
2354 '\d RETURN\_s*',
2355 res)
2356enddef
2357
Bram Moolenaar90770b72021-11-30 20:57:38 +00002358def s:ElseifConstant()
2359 if g:value
2360 echo "one"
2361 elseif true
2362 echo "true"
2363 elseif false
2364 echo "false"
2365 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002366 if 0
2367 echo "yes"
2368 elseif 0
2369 echo "no"
2370 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002371enddef
2372
2373def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002374 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002375 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2376 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002377 '0 DEBUG line 1-1 varcount 0\_s*' ..
2378 '1 LOADG g:value\_s*' ..
2379 '2 COND2BOOL\_s*' ..
2380 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002381 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002382 '4 DEBUG line 2-2 varcount 0\_s*' ..
2383 '5 PUSHS "one"\_s*' ..
2384 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002385 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002386 '7 JUMP -> 12\_s*' ..
2387 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002388 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002389 '9 DEBUG line 4-4 varcount 0\_s*' ..
2390 '10 PUSHS "true"\_s*' ..
2391 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002392 'elseif false\_s*' ..
2393 'echo "false"\_s*' ..
2394 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002395 'if 0\_s*' ..
2396 '12 DEBUG line 8-8 varcount 0\_s*' ..
2397 'echo "yes"\_s*' ..
2398 'elseif 0\_s*' ..
2399 '13 DEBUG line 11-10 varcount 0\_s*' ..
2400 'echo "no"\_s*' ..
2401 'endif\_s*' ..
2402 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002403 res)
2404enddef
2405
Bram Moolenaar093165c2021-08-22 13:35:31 +02002406def s:DebugElseif()
2407 var b = false
2408 if b
2409 eval 1 + 0
2410 silent elseif !b
2411 eval 2 + 0
2412 endif
2413enddef
2414
2415def Test_debug_elseif()
2416 var res = execute('disass debug s:DebugElseif')
2417 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2418 'var b = false\_s*' ..
2419 '0 DEBUG line 1-1 varcount 0\_s*' ..
2420 '1 PUSH false\_s*' ..
2421 '2 STORE $0\_s*' ..
2422
2423 'if b\_s*' ..
2424 '3 DEBUG line 2-2 varcount 1\_s*' ..
2425 '4 LOAD $0\_s*' ..
2426 '5 JUMP_IF_FALSE -> 10\_s*' ..
2427
2428 'eval 1 + 0\_s*' ..
2429 '6 DEBUG line 3-3 varcount 1\_s*' ..
2430 '7 PUSHNR 1\_s*' ..
2431 '8 DROP\_s*' ..
2432
2433 'silent elseif !b\_s*' ..
2434 '9 JUMP -> 20\_s*' ..
2435 '10 CMDMOD silent\_s*' ..
2436 '11 DEBUG line 4-4 varcount 1\_s*' ..
2437 '12 LOAD $0\_s*' ..
2438 '13 INVERT -1 (!val)\_s*' ..
2439 '14 CMDMOD_REV\_s*' ..
2440 '15 JUMP_IF_FALSE -> 20\_s*' ..
2441
2442 'eval 2 + 0\_s*' ..
2443 '16 DEBUG line 5-5 varcount 1\_s*' ..
2444 '17 PUSHNR 2\_s*' ..
2445 '18 DROP\_s*' ..
2446
2447 'endif\_s*' ..
2448 '19 DEBUG line 6-6 varcount 1\_s*' ..
2449 '20 RETURN void*',
2450 res)
2451enddef
2452
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002453def s:DebugFor()
2454 echo "hello"
2455 for a in [0]
2456 echo a
2457 endfor
2458enddef
2459
2460def Test_debug_for()
2461 var res = execute('disass debug s:DebugFor')
2462 assert_match('<SNR>\d*_DebugFor\_s*' ..
2463 'echo "hello"\_s*' ..
2464 '0 DEBUG line 1-1 varcount 0\_s*' ..
2465 '1 PUSHS "hello"\_s*' ..
2466 '2 ECHO 1\_s*' ..
2467
2468 'for a in \[0\]\_s*' ..
2469 '3 DEBUG line 2-2 varcount 0\_s*' ..
2470 '4 STORE -1 in $0\_s*' ..
2471 '5 PUSHNR 0\_s*' ..
2472 '6 NEWLIST size 1\_s*' ..
2473 '7 DEBUG line 2-2 varcount 2\_s*' ..
2474 '8 FOR $0 -> 15\_s*' ..
2475 '9 STORE $1\_s*' ..
2476
2477 'echo a\_s*' ..
2478 '10 DEBUG line 3-3 varcount 2\_s*' ..
2479 '11 LOAD $1\_s*' ..
2480 '12 ECHO 1\_s*' ..
2481
2482 'endfor\_s*' ..
2483 '13 DEBUG line 4-4 varcount 2\_s*' ..
2484 '14 JUMP -> 7\_s*' ..
2485 '15 DROP\_s*' ..
2486 '16 RETURN void*',
2487 res)
2488enddef
2489
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002490func Legacy() dict
2491 echo 'legacy'
2492endfunc
2493
2494def s:UseMember()
2495 var d = {func: Legacy}
2496 var v = d.func()
2497enddef
2498
2499def Test_disassemble_dict_stack()
2500 var res = execute('disass s:UseMember')
2501 assert_match('<SNR>\d*_UseMember\_s*' ..
2502 'var d = {func: Legacy}\_s*' ..
2503 '\d PUSHS "func"\_s*' ..
Bram Moolenaarb15cf442021-12-16 15:49:43 +00002504 '\d PUSHFUNC "g:Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002505 '\d NEWDICT size 1\_s*' ..
2506 '\d STORE $0\_s*' ..
2507
2508 'var v = d.func()\_s*' ..
2509 '\d LOAD $0\_s*' ..
2510 '\d MEMBER func\_s*' ..
2511 '\d PCALL top (argc 0)\_s*' ..
2512 '\d PCALL end\_s*' ..
2513 '\d CLEARDICT\_s*' ..
2514 '\d\+ STORE $1\_s*' ..
2515 '\d\+ RETURN void*',
2516 res)
2517enddef
2518
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002519def s:EchoMessages()
2520 echohl ErrorMsg | echom v:exception | echohl NONE
2521enddef
2522
2523def Test_disassemble_nextcmd()
2524 # splitting commands and removing trailing blanks should not change the line
2525 var res = execute('disass s:EchoMessages')
2526 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2527 'echohl ErrorMsg | echom v:exception | echohl NONE',
2528 res)
2529enddef
2530
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002531def Test_disassemble_after_reload()
2532 var lines =<< trim END
2533 vim9script
2534 if exists('g:ThisFunc')
2535 finish
2536 endif
2537 var name: any
2538 def g:ThisFunc(): number
2539 g:name = name
2540 return 0
2541 enddef
2542 def g:ThatFunc(): number
2543 name = g:name
2544 return 0
2545 enddef
2546 END
2547 lines->writefile('Xreload.vim')
2548
2549 source Xreload.vim
2550 g:ThisFunc()
2551 g:ThatFunc()
2552
2553 source Xreload.vim
2554 var res = execute('disass g:ThisFunc')
2555 assert_match('ThisFunc\_s*' ..
2556 'g:name = name\_s*' ..
2557 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2558 '\d STOREG g:name\_s*' ..
2559 'return 0\_s*' ..
2560 '\d PUSHNR 0\_s*' ..
2561 '\d RETURN\_s*',
2562 res)
2563
2564 res = execute('disass g:ThatFunc')
2565 assert_match('ThatFunc\_s*' ..
2566 'name = g:name\_s*' ..
2567 '\d LOADG g:name\_s*' ..
2568 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2569 'return 0\_s*' ..
2570 '\d PUSHNR 0\_s*' ..
2571 '\d RETURN\_s*',
2572 res)
2573
2574 delete('Xreload.vim')
2575 delfunc g:ThisFunc
2576 delfunc g:ThatFunc
2577enddef
2578
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002579
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002580
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002581" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker