blob: 77c4675888ef6a0280d8949ed67af9f7d7d4fb75 [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
Bram Moolenaar62aec932022-01-29 21:45:34 +00004import './vim9.vim' as v9
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01005
Bram Moolenaar62aec932022-01-29 21:45:34 +00006func s:NotCompiled()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01007 echo "not"
8endfunc
9
10let s:scriptvar = 4
11let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020012let b:buffervar = 'b'
13let w:windowvar = 'w'
14let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010015
16def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020017 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010018 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010019 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010020 echo arg
21 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020022 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010023 echo v:version
24 echo s:scriptvar
25 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020026 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010027 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020028 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020029 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020030 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020031 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020032 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020033 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010034 echo &tabstop
35 echo $ENVVAR
36 echo @z
37enddef
38
Bram Moolenaarf2460a32020-02-07 22:09:54 +010039def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010040 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020041 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010042 assert_fails('disass', 'E471:')
43 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020044 assert_fails('disass 234', 'E129:')
45 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010046
Bram Moolenaarac564082020-09-27 19:05:33 +020047 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020048 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010049 'buffers\_s*' ..
50 '\d\+ EXEC \+buffers\_s*' ..
51 'echo\_s*' ..
52 'echo arg\_s*' ..
53 '\d\+ LOAD arg\[-1\]\_s*' ..
54 '\d\+ ECHO 1\_s*' ..
55 'echo local\_s*' ..
56 '\d\+ LOAD $0\_s*' ..
57 '\d\+ ECHO 1\_s*' ..
58 'echo &lines\_s*' ..
59 '\d\+ LOADOPT &lines\_s*' ..
60 '\d\+ ECHO 1\_s*' ..
61 'echo v:version\_s*' ..
62 '\d\+ LOADV v:version\_s*' ..
63 '\d\+ ECHO 1\_s*' ..
64 'echo s:scriptvar\_s*' ..
65 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
66 '\d\+ ECHO 1\_s*' ..
67 'echo g:globalvar\_s*' ..
68 '\d\+ LOADG g:globalvar\_s*' ..
69 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020070 'echo get(g:, "global")\_s*' ..
71 '\d\+ LOAD g:\_s*' ..
72 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010073 '\d\+ BCALL get(argc 2)\_s*' ..
74 '\d\+ ECHO 1\_s*' ..
75 'echo g:auto#var\_s*' ..
76 '\d\+ LOADAUTO g:auto#var\_s*' ..
77 '\d\+ ECHO 1\_s*' ..
78 'echo b:buffervar\_s*' ..
79 '\d\+ LOADB b:buffervar\_s*' ..
80 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020081 'echo get(b:, "buffer")\_s*' ..
82 '\d\+ LOAD b:\_s*' ..
83 '\d\+ PUSHS "buffer"\_s*' ..
84 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020085 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020086 'echo get(w:, "window")\_s*' ..
87 '\d\+ LOAD w:\_s*' ..
88 '\d\+ PUSHS "window"\_s*' ..
89 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020090 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020091 'echo get(t:, "tab")\_s*' ..
92 '\d\+ LOAD t:\_s*' ..
93 '\d\+ PUSHS "tab"\_s*' ..
94 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020095 ' LOADENV $ENVVAR.*' ..
96 ' LOADREG @z.*',
97 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010098enddef
99
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200100def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200101 var filename = "file"
102 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200103 edit the`=filename``=filenr`.txt
104enddef
105
106def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200107 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200108 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200109 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200110 '\d PUSHS "file"\_s*' ..
111 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200112 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200113 '\d STORE 123 in $1\_s*' ..
114 ' edit the`=filename``=filenr`.txt\_s*' ..
115 '\d PUSHS "edit the"\_s*' ..
116 '\d LOAD $0\_s*' ..
117 '\d LOAD $1\_s*' ..
118 '\d 2STRING stack\[-1\]\_s*' ..
119 '\d\+ PUSHS ".txt"\_s*' ..
120 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200121 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200122 res)
123enddef
124
Bram Moolenaar20677332021-06-06 17:02:53 +0200125if has('python3')
126 def s:PyHeredoc()
127 python3 << EOF
128 print('hello')
129EOF
130 enddef
131
132 def Test_disassemble_python_heredoc()
133 var res = execute('disass s:PyHeredoc')
134 assert_match('<SNR>\d*_PyHeredoc.*' ..
135 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
136 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200137 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200138 res)
139 enddef
140endif
141
Bram Moolenaar4c137212021-04-19 16:48:48 +0200142def s:Substitute()
143 var expr = "abc"
144 :%s/a/\=expr/&g#c
145enddef
146
147def Test_disassemble_substitute()
148 var res = execute('disass s:Substitute')
149 assert_match('<SNR>\d*_Substitute.*' ..
150 ' var expr = "abc"\_s*' ..
151 '\d PUSHS "abc"\_s*' ..
152 '\d STORE $0\_s*' ..
153 ' :%s/a/\\=expr/&g#c\_s*' ..
154 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
155 ' 0 LOAD $0\_s*' ..
156 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200157 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200158 res)
159enddef
160
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200161
162def s:SearchPair()
163 var col = 8
164 searchpair("{", "", "}", "", "col('.') > col")
165enddef
166
167def Test_disassemble_seachpair()
168 var res = execute('disass s:SearchPair')
169 assert_match('<SNR>\d*_SearchPair.*' ..
170 ' var col = 8\_s*' ..
171 '\d STORE 8 in $0\_s*' ..
172 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
173 '\d PUSHS "{"\_s*' ..
174 '\d PUSHS ""\_s*' ..
175 '\d PUSHS "}"\_s*' ..
176 '\d PUSHS ""\_s*' ..
177 '\d INSTR\_s*' ..
178 ' 0 PUSHS "."\_s*' ..
179 ' 1 BCALL col(argc 1)\_s*' ..
180 ' 2 LOAD $0\_s*' ..
181 ' 3 COMPARENR >\_s*' ..
182 ' -------------\_s*' ..
183 '\d BCALL searchpair(argc 5)\_s*' ..
184 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200185 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200186 res)
187enddef
188
189
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200190def s:RedirVar()
191 var result: string
192 redir =>> result
193 echo "text"
194 redir END
195enddef
196
197def Test_disassemble_redir_var()
198 var res = execute('disass s:RedirVar')
199 assert_match('<SNR>\d*_RedirVar.*' ..
200 ' var result: string\_s*' ..
201 '\d PUSHS "\[NULL\]"\_s*' ..
202 '\d STORE $0\_s*' ..
203 ' redir =>> result\_s*' ..
204 '\d REDIR\_s*' ..
205 ' echo "text"\_s*' ..
206 '\d PUSHS "text"\_s*' ..
207 '\d ECHO 1\_s*' ..
208 ' redir END\_s*' ..
209 '\d LOAD $0\_s*' ..
210 '\d REDIR END\_s*' ..
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
Bram Moolenaara749a422022-02-12 19:52:25 +0000303 def AutoloadFunc()
Bram Moolenaar06b77222022-01-25 15:51:56 +0000304 &operatorfunc = autoscript.Opfunc
305 enddef
306
Bram Moolenaara749a422022-02-12 19:52:25 +0000307 var res = execute('disass AutoloadFunc')
Bram Moolenaar06b77222022-01-25 15:51:56 +0000308 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
Bram Moolenaar62aec932022-01-29 21:45:34 +0000315 v9.CheckScriptSuccess(lines)
Bram Moolenaar06b77222022-01-25 15:51:56 +0000316
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 Moolenaar8acb9cc2022-03-08 13:18:55 +0000418if has('job')
419 def s:StoreNull()
420 var ss = null_string
421 var bb = null_blob
422 var dd = null_dict
423 var ll = null_list
424 var Ff = null_function
425 var Pp = null_partial
426 var jj = null_job
427 var cc = null_channel
428 enddef
429
430 def Test_disassemble_assign_null()
431 var res = execute('disass s:StoreNull')
432 assert_match('<SNR>\d*_StoreNull\_s*' ..
433 'var ss = null_string\_s*' ..
434 '\d\+ PUSHS "\[NULL\]"\_s*' ..
435 '\d\+ STORE $\d\_s*' ..
436
437 'var bb = null_blob\_s*' ..
438 '\d\+ PUSHBLOB 0z\_s*' ..
439 '\d\+ STORE $\d\_s*' ..
440
441 'var dd = null_dict\_s*' ..
442 '\d\+ NEWDICT size 0\_s*' ..
443 '\d\+ STORE $\d\_s*' ..
444
445 'var ll = null_list\_s*' ..
446 '\d\+ NEWLIST size 0\_s*' ..
447 '\d\+ STORE $\d\_s*' ..
448
449 'var Ff = null_function\_s*' ..
450 '\d\+ PUSHFUNC "\[none\]"\_s*' ..
451 '\d\+ STORE $\d\_s*' ..
452
453 'var Pp = null_partial\_s*' ..
454 '\d\+ NEWPARTIAL\_s*' ..
455 '\d\+ STORE $\d\_s*' ..
456
457 'var jj = null_job\_s*' ..
458 '\d\+ PUSHJOB "no process"\_s*' ..
459 '\d\+ STORE $\d\_s*' ..
460
461 'var cc = null_channel\_s*' ..
462 '\d\+ PUSHCHANNEL 0\_s*' ..
463 '\d\+ STORE $\d\_s*' ..
464
465 '\d\+ RETURN void',
466 res)
467 enddef
468endif
469
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100470def s:ScriptFuncStoreIndex()
471 var d = {dd: {}}
472 d.dd[0] = 0
473enddef
474
475def Test_disassemble_store_index()
476 var res = execute('disass s:ScriptFuncStoreIndex')
477 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
478 'var d = {dd: {}}\_s*' ..
479 '\d PUSHS "dd"\_s*' ..
480 '\d NEWDICT size 0\_s*' ..
481 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000482 '\d SETTYPE dict<dict<unknown>>\_s*' ..
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100483 '\d STORE $0\_s*' ..
484 'd.dd\[0\] = 0\_s*' ..
485 '\d PUSHNR 0\_s*' ..
486 '\d PUSHNR 0\_s*' ..
487 '\d LOAD $0\_s*' ..
488 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200489 '\d\+ USEDICT\_s*' ..
490 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200491 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100492 res)
493enddef
494
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200495def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200496 var x: string
497 var y: string
498 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200499 [x, y; l] = g:stringlist
500enddef
501
502def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200503 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200504 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200505 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200506 '\d PUSHS "\[NULL\]"\_s*' ..
507 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200508 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200509 '\d PUSHS "\[NULL\]"\_s*' ..
510 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200511 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200512 '\d NEWLIST size 0\_s*' ..
513 '\d STORE $2\_s*' ..
514 '\[x, y; l\] = g:stringlist\_s*' ..
515 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200516 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200517 '\d CHECKLEN >= 2\_s*' ..
518 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200519 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200520 '\d\+ STORE $0\_s*' ..
521 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200522 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200523 '\d\+ STORE $1\_s*' ..
524 '\d\+ SLICE 2\_s*' ..
525 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200526 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200527 res)
528enddef
529
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200530def s:ListAssignWithOp()
531 var a = 2
532 var b = 3
533 [a, b] += [4, 5]
534enddef
535
536def Test_disassemble_list_assign_with_op()
537 var res = execute('disass s:ListAssignWithOp')
538 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
539 'var a = 2\_s*' ..
540 '\d STORE 2 in $0\_s*' ..
541 'var b = 3\_s*' ..
542 '\d STORE 3 in $1\_s*' ..
543 '\[a, b\] += \[4, 5\]\_s*' ..
544 '\d\+ PUSHNR 4\_s*' ..
545 '\d\+ PUSHNR 5\_s*' ..
546 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200547 '\d\+ LOAD $0\_s*' ..
548 '\d\+ ITEM 0 with op\_s*' ..
549 '\d\+ OPNR +\_s*' ..
550 '\d\+ STORE $0\_s*' ..
551 '\d\+ LOAD $1\_s*' ..
552 '\d\+ ITEM 1 with op\_s*' ..
553 '\d\+ OPNR +\_s*' ..
554 '\d\+ STORE $1\_s*' ..
555 '\d\+ DROP\_s*' ..
556 '\d\+ RETURN void',
557 res)
558enddef
559
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200560def s:ListAdd()
561 var l: list<number> = []
562 add(l, 123)
563 add(l, g:aNumber)
564enddef
565
566def Test_disassemble_list_add()
567 var res = execute('disass s:ListAdd')
568 assert_match('<SNR>\d*_ListAdd\_s*' ..
569 'var l: list<number> = []\_s*' ..
570 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100571 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200572 '\d STORE $0\_s*' ..
573 'add(l, 123)\_s*' ..
574 '\d LOAD $0\_s*' ..
575 '\d PUSHNR 123\_s*' ..
576 '\d LISTAPPEND\_s*' ..
577 '\d DROP\_s*' ..
578 'add(l, g:aNumber)\_s*' ..
579 '\d LOAD $0\_s*' ..
580 '\d\+ LOADG g:aNumber\_s*' ..
581 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
582 '\d\+ LISTAPPEND\_s*' ..
583 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200584 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200585 res)
586enddef
587
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200588def s:BlobAdd()
589 var b: blob = 0z
590 add(b, 123)
591 add(b, g:aNumber)
592enddef
593
594def Test_disassemble_blob_add()
595 var res = execute('disass s:BlobAdd')
596 assert_match('<SNR>\d*_BlobAdd\_s*' ..
597 'var b: blob = 0z\_s*' ..
598 '\d PUSHBLOB 0z\_s*' ..
599 '\d STORE $0\_s*' ..
600 'add(b, 123)\_s*' ..
601 '\d LOAD $0\_s*' ..
602 '\d PUSHNR 123\_s*' ..
603 '\d BLOBAPPEND\_s*' ..
604 '\d DROP\_s*' ..
605 'add(b, g:aNumber)\_s*' ..
606 '\d LOAD $0\_s*' ..
607 '\d\+ LOADG g:aNumber\_s*' ..
608 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
609 '\d\+ BLOBAPPEND\_s*' ..
610 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200611 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200612 res)
613enddef
614
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200615def s:BlobIndexSlice()
616 var b: blob = 0z112233
617 echo b[1]
618 echo b[1 : 2]
619enddef
620
621def Test_disassemble_blob_index_slice()
622 var res = execute('disass s:BlobIndexSlice')
623 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
624 'var b: blob = 0z112233\_s*' ..
625 '\d PUSHBLOB 0z112233\_s*' ..
626 '\d STORE $0\_s*' ..
627 'echo b\[1\]\_s*' ..
628 '\d LOAD $0\_s*' ..
629 '\d PUSHNR 1\_s*' ..
630 '\d BLOBINDEX\_s*' ..
631 '\d ECHO 1\_s*' ..
632 'echo b\[1 : 2\]\_s*' ..
633 '\d LOAD $0\_s*' ..
634 '\d PUSHNR 1\_s*' ..
635 '\d\+ PUSHNR 2\_s*' ..
636 '\d\+ BLOBSLICE\_s*' ..
637 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200638 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200639 res)
640enddef
641
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200642def s:ScriptFuncUnlet()
643 g:somevar = "value"
644 unlet g:somevar
645 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200646 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200647enddef
648
649def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200650 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200651 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
652 'g:somevar = "value"\_s*' ..
653 '\d PUSHS "value"\_s*' ..
654 '\d STOREG g:somevar\_s*' ..
655 'unlet g:somevar\_s*' ..
656 '\d UNLET g:somevar\_s*' ..
657 'unlet! g:somevar\_s*' ..
658 '\d UNLET! g:somevar\_s*' ..
659 'unlet $SOMEVAR\_s*' ..
660 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200661 res)
662enddef
663
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200664def s:LockLocal()
665 var d = {a: 1}
666 lockvar d.a
667enddef
668
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000669def Test_disassemble_lock_local()
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200670 var res = execute('disass s:LockLocal')
671 assert_match('<SNR>\d*_LockLocal\_s*' ..
672 'var d = {a: 1}\_s*' ..
673 '\d PUSHS "a"\_s*' ..
674 '\d PUSHNR 1\_s*' ..
675 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +0000676 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200677 '\d STORE $0\_s*' ..
678 'lockvar d.a\_s*' ..
679 '\d LOAD $0\_s*' ..
Bram Moolenaar70c43d82022-01-26 21:01:15 +0000680 '\d LOCKUNLOCK lockvar 2 d.a\_s*',
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200681 res)
682enddef
683
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100684def s:ScriptFuncTry()
685 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200686 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100687 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200688 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100689 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200690 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100691 endtry
692enddef
693
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100694def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200695 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200696 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
697 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100698 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200699 'echo "yes"\_s*' ..
700 '\d PUSHS "yes"\_s*' ..
701 '\d ECHO 1\_s*' ..
702 'catch /fail/\_s*' ..
703 '\d JUMP -> \d\+\_s*' ..
704 '\d PUSH v:exception\_s*' ..
705 '\d PUSHS "fail"\_s*' ..
706 '\d COMPARESTRING =\~\_s*' ..
707 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
708 '\d CATCH\_s*' ..
709 'echo "no"\_s*' ..
710 '\d\+ PUSHS "no"\_s*' ..
711 '\d\+ ECHO 1\_s*' ..
712 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100713 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200714 'throw "end"\_s*' ..
715 '\d\+ PUSHS "end"\_s*' ..
716 '\d\+ THROW\_s*' ..
717 'endtry\_s*' ..
718 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200719 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100720enddef
721
722def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200723 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100724 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100725enddef
726
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100727def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200728 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200729 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200730 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200731 '\d PUSHNR 1\_s*' ..
732 '\d PUSHS "two"\_s*' ..
733 '\d PUSHNR 333\_s*' ..
734 '\d NEWLIST size 3\_s*' ..
735 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100736 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200737 '\d PUSHS "one"\_s*' ..
738 '\d PUSHNR 1\_s*' ..
739 '\d PUSHS "two"\_s*' ..
740 '\d PUSHS "val"\_s*' ..
741 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200742 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100743enddef
744
Bram Moolenaar62aec932022-01-29 21:45:34 +0000745def s:FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100746 echo arg
747enddef
748
Bram Moolenaar62aec932022-01-29 21:45:34 +0000749func s:UserFunc()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100750 echo 'nothing'
751endfunc
752
Bram Moolenaar62aec932022-01-29 21:45:34 +0000753func s:UserFuncWithArg(arg)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100754 echo a:arg
755endfunc
756
757def s:ScriptFuncCall(): string
758 changenr()
759 char2nr("abc")
Bram Moolenaar62aec932022-01-29 21:45:34 +0000760 g:Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100761 FuncWithArg(343)
762 ScriptFuncNew()
763 s:ScriptFuncNew()
764 UserFunc()
765 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200766 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100767 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200768 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100769 FuncRefWithArg("bar")
770 return "yes"
771enddef
772
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100773def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200774 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200775 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
776 'changenr()\_s*' ..
777 '\d BCALL changenr(argc 0)\_s*' ..
778 '\d DROP\_s*' ..
779 'char2nr("abc")\_s*' ..
780 '\d PUSHS "abc"\_s*' ..
781 '\d BCALL char2nr(argc 1)\_s*' ..
782 '\d DROP\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000783 'g:Test_disassemble_new()\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200784 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
785 '\d DROP\_s*' ..
786 'FuncWithArg(343)\_s*' ..
787 '\d\+ PUSHNR 343\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000788 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200789 '\d\+ DROP\_s*' ..
790 'ScriptFuncNew()\_s*' ..
791 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
792 '\d\+ DROP\_s*' ..
793 's:ScriptFuncNew()\_s*' ..
794 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
795 '\d\+ DROP\_s*' ..
796 'UserFunc()\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000797 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200798 '\d\+ DROP\_s*' ..
799 'UserFuncWithArg("foo")\_s*' ..
800 '\d\+ PUSHS "foo"\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000801 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200802 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200803 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200804 '\d\+ PUSHS "UserFunc"\_s*' ..
805 '\d\+ BCALL function(argc 1)\_s*' ..
806 '\d\+ STORE $0\_s*' ..
807 'FuncRef()\_s*' ..
808 '\d\+ LOAD $\d\_s*' ..
809 '\d\+ PCALL (argc 0)\_s*' ..
810 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200811 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200812 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
813 '\d\+ BCALL function(argc 1)\_s*' ..
814 '\d\+ STORE $1\_s*' ..
815 'FuncRefWithArg("bar")\_s*' ..
816 '\d\+ PUSHS "bar"\_s*' ..
817 '\d\+ LOAD $\d\_s*' ..
818 '\d\+ PCALL (argc 1)\_s*' ..
819 '\d\+ DROP\_s*' ..
820 'return "yes"\_s*' ..
821 '\d\+ PUSHS "yes"\_s*' ..
822 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200823 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100824enddef
825
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200826
827def s:CreateRefs()
828 var local = 'a'
829 def Append(arg: string)
830 local ..= arg
831 enddef
832 g:Append = Append
833 def Get(): string
834 return local
835 enddef
836 g:Get = Get
837enddef
838
839def Test_disassemble_closure()
840 CreateRefs()
841 var res = execute('disass g:Append')
842 assert_match('<lambda>\d\_s*' ..
843 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100844 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200845 '\d LOAD arg\[-1\]\_s*' ..
846 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100847 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200848 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200849 res)
850
851 res = execute('disass g:Get')
852 assert_match('<lambda>\d\_s*' ..
853 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100854 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200855 '\d RETURN',
856 res)
857
858 unlet g:Append
859 unlet g:Get
860enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200861
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100862
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200863def EchoArg(arg: string): string
864 return arg
865enddef
Bram Moolenaar62aec932022-01-29 21:45:34 +0000866def s:RefThis(): func
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200867 return function('EchoArg')
868enddef
869def s:ScriptPCall()
870 RefThis()("text")
871enddef
872
873def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200874 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200875 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
876 'RefThis()("text")\_s*' ..
Bram Moolenaar62aec932022-01-29 21:45:34 +0000877 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200878 '\d PUSHS "text"\_s*' ..
879 '\d PCALL top (argc 1)\_s*' ..
880 '\d PCALL end\_s*' ..
881 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200882 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200883 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200884enddef
885
886
Bram Moolenaara26b9702020-04-18 19:53:28 +0200887def s:FuncWithForwardCall(): string
888 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100889enddef
890
891def DefinedLater(arg: string): string
892 return arg
893enddef
894
895def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200896 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200897 assert_match('FuncWithForwardCall\_s*' ..
898 'return g:DefinedLater("yes")\_s*' ..
899 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200900 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200901 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200902 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100903
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200904 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100905 assert_equal('yes', FuncWithForwardCall())
906
Bram Moolenaara26b9702020-04-18 19:53:28 +0200907 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200908 assert_match('FuncWithForwardCall\_s*' ..
909 'return g:DefinedLater("yes")\_s*' ..
910 '\d PUSHS "yes"\_s*' ..
911 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200912 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200913 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100914enddef
915
916
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200917def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200918 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100919enddef
920
921def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200922 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200923 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200924 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200925 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200926 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200927 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200928 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200929 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
930 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200931 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200932 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200933 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200934 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200935 '\d 2STRING stack\[-1]\_s*' ..
936 '\d\+ CONCAT\_s*' ..
937 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200938 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100939enddef
940
941
Bram Moolenaar848fadd2022-01-30 15:28:30 +0000942def s:HasEval()
Bram Moolenaar158906c2020-02-06 20:39:45 +0100943 if has("eval")
944 echo "yes"
945 else
946 echo "no"
947 endif
948enddef
949
Bram Moolenaar848fadd2022-01-30 15:28:30 +0000950def s:HasNothing()
Bram Moolenaar158906c2020-02-06 20:39:45 +0100951 if has("nothing")
952 echo "yes"
953 else
954 echo "no"
955 endif
956enddef
957
Bram Moolenaar848fadd2022-01-30 15:28:30 +0000958def s:HasSomething()
Bram Moolenaar158906c2020-02-06 20:39:45 +0100959 if has("nothing")
960 echo "nothing"
961 elseif has("something")
962 echo "something"
963 elseif has("eval")
964 echo "eval"
965 elseif has("less")
966 echo "less"
967 endif
968enddef
969
Bram Moolenaar848fadd2022-01-30 15:28:30 +0000970def s:HasGuiRunning()
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100971 if has("gui_running")
972 echo "yes"
973 else
974 echo "no"
975 endif
976enddef
977
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100978def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200979 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200980 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200981 assert_match('HasEval\_s*' ..
982 'if has("eval")\_s*' ..
983 'echo "yes"\_s*' ..
984 '\d PUSHS "yes"\_s*' ..
985 '\d ECHO 1\_s*' ..
986 'else\_s*' ..
987 'echo "no"\_s*' ..
988 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200989 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100990 assert_notmatch('JUMP', instr)
991
Bram Moolenaard2c61702020-09-06 15:58:36 +0200992 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100993 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200994 assert_match('HasNothing\_s*' ..
995 'if has("nothing")\_s*' ..
996 'echo "yes"\_s*' ..
997 'else\_s*' ..
998 'echo "no"\_s*' ..
999 '\d PUSHS "no"\_s*' ..
1000 '\d ECHO 1\_s*' ..
1001 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001002 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001003 assert_notmatch('PUSHS "yes"', instr)
1004 assert_notmatch('JUMP', instr)
1005
Bram Moolenaard2c61702020-09-06 15:58:36 +02001006 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +01001007 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001008 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001009 'if has("nothing")\_s*' ..
1010 'echo "nothing"\_s*' ..
1011 'elseif has("something")\_s*' ..
1012 'echo "something"\_s*' ..
1013 'elseif has("eval")\_s*' ..
1014 'echo "eval"\_s*' ..
1015 '\d PUSHS "eval"\_s*' ..
1016 '\d ECHO 1\_s*' ..
1017 'elseif has("less").*' ..
1018 'echo "less"\_s*' ..
1019 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001020 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001021 assert_notmatch('PUSHS "nothing"', instr)
1022 assert_notmatch('PUSHS "something"', instr)
1023 assert_notmatch('PUSHS "less"', instr)
1024 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001025
1026 var result: string
1027 var instr_expected: string
1028 if has('gui')
1029 if has('gui_running')
1030 # GUI already running, always returns "yes"
1031 result = "\nyes"
1032 instr_expected = 'HasGuiRunning.*' ..
1033 'if has("gui_running")\_s*' ..
1034 ' echo "yes"\_s*' ..
1035 '\d PUSHS "yes"\_s*' ..
1036 '\d ECHO 1\_s*' ..
1037 'else\_s*' ..
1038 ' echo "no"\_s*' ..
1039 'endif'
1040 else
1041 result = "\nno"
1042 if has('unix')
1043 # GUI not running but can start later, call has()
1044 instr_expected = 'HasGuiRunning.*' ..
1045 'if has("gui_running")\_s*' ..
1046 '\d PUSHS "gui_running"\_s*' ..
1047 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001048 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +01001049 '\d JUMP_IF_FALSE -> \d\_s*' ..
1050 ' echo "yes"\_s*' ..
1051 '\d PUSHS "yes"\_s*' ..
1052 '\d ECHO 1\_s*' ..
1053 'else\_s*' ..
1054 '\d JUMP -> \d\_s*' ..
1055 ' echo "no"\_s*' ..
1056 '\d PUSHS "no"\_s*' ..
1057 '\d ECHO 1\_s*' ..
1058 'endif'
1059 else
1060 # GUI not running, always return "no"
1061 instr_expected = 'HasGuiRunning.*' ..
1062 'if has("gui_running")\_s*' ..
1063 ' echo "yes"\_s*' ..
1064 'else\_s*' ..
1065 ' echo "no"\_s*' ..
1066 '\d PUSHS "no"\_s*' ..
1067 '\d ECHO 1\_s*' ..
1068 'endif'
1069 endif
1070 endif
1071 else
1072 # GUI not supported, always return "no"
1073 result = "\nno"
1074 instr_expected = 'HasGuiRunning.*' ..
1075 'if has("gui_running")\_s*' ..
1076 ' echo "yes"\_s*' ..
1077 'else\_s*' ..
1078 ' echo "no"\_s*' ..
1079 '\d PUSHS "no"\_s*' ..
1080 '\d ECHO 1\_s*' ..
1081 'endif'
1082 endif
1083
1084 assert_equal(result, execute('HasGuiRunning()'))
1085 instr = execute('disassemble HasGuiRunning')
1086 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001087enddef
1088
Bram Moolenaarefd88552020-06-18 20:50:10 +02001089def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001090 if 1 < 0
1091 return "maybe"
1092 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001093 if g:cond
1094 return "yes"
1095 else
1096 return "no"
1097 endif
1098enddef
1099
1100def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001101 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001102 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001103 'if 1 < 0\_s*' ..
1104 ' return "maybe"\_s*' ..
1105 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001106 'if g:cond\_s*' ..
1107 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001108 '1 COND2BOOL\_s*' ..
1109 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001110 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001111 '3 PUSHS "yes"\_s*' ..
1112 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001113 'else\_s*' ..
1114 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001115 '5 PUSHS "no"\_s*' ..
1116 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001117 instr)
1118enddef
1119
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001120def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001121 var Funky1: func
1122 var Funky2: func = function("len")
1123 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001124enddef
1125
1126def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001127 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001128 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001129 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001130 '0 PUSHFUNC "\[none]"\_s*' ..
1131 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001132 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001133 '2 PUSHS "len"\_s*' ..
1134 '3 BCALL function(argc 1)\_s*' ..
1135 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001136 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001137 '\d PUSHS "UserFunc"\_s*' ..
1138 '\d BCALL funcref(argc 1)\_s*' ..
1139 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001140 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001141 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001142enddef
1143
1144if has('channel')
1145 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001146 var job1: job
1147 var job2: job = job_start("donothing")
1148 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001149 enddef
1150endif
1151
1152def Test_disassemble_channel()
1153 CheckFeature channel
1154
Bram Moolenaarac564082020-09-27 19:05:33 +02001155 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001156 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001157 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001158 '\d PUSHJOB "no process"\_s*' ..
1159 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001160 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001161 '\d PUSHS "donothing"\_s*' ..
1162 '\d BCALL job_start(argc 1)\_s*' ..
1163 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001164 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001165 '\d PUSHCHANNEL 0\_s*' ..
1166 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001167 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001168 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001169enddef
1170
Bram Moolenaar62aec932022-01-29 21:45:34 +00001171def s:WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001172 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001173 return F("x")
1174enddef
1175
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001176def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001177 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001178 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001179 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001180 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001181 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001182 '\d STORE $0\_s*' ..
1183 'return F("x")\_s*' ..
1184 '\d PUSHS "x"\_s*' ..
1185 '\d LOAD $0\_s*' ..
1186 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001187 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001188 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001189
Bram Moolenaarac564082020-09-27 19:05:33 +02001190 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001191 instr = execute('disassemble ' .. name)
1192 assert_match('<lambda>\d\+\_s*' ..
1193 'return "X" .. a .. "X"\_s*' ..
1194 '\d PUSHS "X"\_s*' ..
1195 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001196 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001197 '\d CONCAT\_s*' ..
1198 '\d PUSHS "X"\_s*' ..
1199 '\d CONCAT\_s*' ..
1200 '\d RETURN',
1201 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001202enddef
1203
Bram Moolenaar62aec932022-01-29 21:45:34 +00001204def s:LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001205 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001206 return Ref(g:value)
1207enddef
1208
1209def Test_disassemble_lambda_with_type()
1210 g:value = 5
1211 assert_equal(15, LambdaWithType())
1212 var instr = execute('disassemble LambdaWithType')
1213 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001214 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001215 '\d FUNCREF <lambda>\d\+\_s*' ..
1216 '\d STORE $0\_s*' ..
1217 'return Ref(g:value)\_s*' ..
1218 '\d LOADG g:value\_s*' ..
1219 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001220 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001221 '\d PCALL (argc 1)\_s*' ..
1222 '\d RETURN',
1223 instr)
1224enddef
1225
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001226def NestedOuter()
1227 def g:Inner()
1228 echomsg "inner"
1229 enddef
1230enddef
1231
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001232def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001233 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001234 assert_match('NestedOuter\_s*' ..
1235 'def g:Inner()\_s*' ..
1236 'echomsg "inner"\_s*' ..
1237 'enddef\_s*' ..
1238 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001239 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001240 instr)
1241enddef
1242
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001243def NestedDefList()
1244 def
1245 def Info
1246 def /Info
1247 def /Info/
1248enddef
1249
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001250def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001251 var instr = execute('disassemble NestedDefList')
1252 assert_match('NestedDefList\_s*' ..
1253 'def\_s*' ..
1254 '\d DEF \_s*' ..
1255 'def Info\_s*' ..
1256 '\d DEF Info\_s*' ..
1257 'def /Info\_s*' ..
1258 '\d DEF /Info\_s*' ..
1259 'def /Info/\_s*' ..
1260 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001261 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001262 instr)
1263enddef
1264
Bram Moolenaar62aec932022-01-29 21:45:34 +00001265def s:AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001266 if arg == 1 && arg != 2 || arg == 4
1267 return 'yes'
1268 endif
1269 return 'no'
1270enddef
1271
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001272def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001273 assert_equal("yes", AndOr(1))
1274 assert_equal("no", AndOr(2))
1275 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001276 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001277 assert_match('AndOr\_s*' ..
1278 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1279 '\d LOAD arg\[-1]\_s*' ..
1280 '\d PUSHNR 1\_s*' ..
1281 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001282 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001283 '\d LOAD arg\[-1]\_s*' ..
1284 '\d PUSHNR 2\_s*' ..
1285 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001286 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001287 '\d LOAD arg\[-1]\_s*' ..
1288 '\d\+ PUSHNR 4\_s*' ..
1289 '\d\+ COMPAREANY ==\_s*' ..
1290 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001291 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001292enddef
1293
Bram Moolenaar62aec932022-01-29 21:45:34 +00001294def s:AndConstant(arg: any): string
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001295 if true && arg
1296 return "yes"
1297 endif
1298 if false && arg
1299 return "never"
1300 endif
1301 return "no"
1302enddef
1303
1304def Test_disassemble_and_constant()
1305 assert_equal("yes", AndConstant(1))
1306 assert_equal("no", AndConstant(false))
1307 var instr = execute('disassemble AndConstant')
1308 assert_match('AndConstant\_s*' ..
1309 'if true && arg\_s*' ..
1310 '0 LOAD arg\[-1\]\_s*' ..
1311 '1 COND2BOOL\_s*' ..
1312 '2 JUMP_IF_FALSE -> 5\_s*' ..
1313 'return "yes"\_s*' ..
1314 '3 PUSHS "yes"\_s*' ..
1315 '4 RETURN\_s*' ..
1316 'endif\_s*' ..
1317 'if false && arg\_s*' ..
1318 'return "never"\_s*' ..
1319 'endif\_s*' ..
1320 'return "no"\_s*' ..
1321 '5 PUSHS "no"\_s*' ..
1322 '6 RETURN',
1323 instr)
1324enddef
1325
Bram Moolenaar62aec932022-01-29 21:45:34 +00001326def s:ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001327 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001328 for i in range(3)
1329 res->add(i)
1330 endfor
1331 return res
1332enddef
1333
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001334def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001335 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001336 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001337 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001338 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001339 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001340 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001341 '\d STORE $0\_s*' ..
1342 'for i in range(3)\_s*' ..
1343 '\d STORE -1 in $1\_s*' ..
1344 '\d PUSHNR 3\_s*' ..
1345 '\d BCALL range(argc 1)\_s*' ..
1346 '\d FOR $1 -> \d\+\_s*' ..
1347 '\d STORE $2\_s*' ..
1348 'res->add(i)\_s*' ..
1349 '\d LOAD $0\_s*' ..
1350 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001351 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001352 '\d\+ DROP\_s*' ..
1353 'endfor\_s*' ..
1354 '\d\+ JUMP -> \d\+\_s*' ..
1355 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001356 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001357enddef
1358
Bram Moolenaar62aec932022-01-29 21:45:34 +00001359def s:ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001361 for str in eval('["one", "two"]')
1362 res ..= str
1363 endfor
1364 return res
1365enddef
1366
1367def Test_disassemble_for_loop_eval()
1368 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001369 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001370 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001371 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001372 '\d PUSHS ""\_s*' ..
1373 '\d STORE $0\_s*' ..
1374 'for str in eval(''\["one", "two"\]'')\_s*' ..
1375 '\d STORE -1 in $1\_s*' ..
1376 '\d PUSHS "\["one", "two"\]"\_s*' ..
1377 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001378 '\d FOR $1 -> \d\+\_s*' ..
1379 '\d STORE $2\_s*' ..
1380 'res ..= str\_s*' ..
1381 '\d\+ LOAD $0\_s*' ..
1382 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001383 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001384 '\d\+ CONCAT\_s*' ..
1385 '\d\+ STORE $0\_s*' ..
1386 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001387 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001388 '\d\+ DROP\_s*' ..
1389 'return res\_s*' ..
1390 '\d\+ LOAD $0\_s*' ..
1391 '\d\+ RETURN',
1392 instr)
1393enddef
1394
Bram Moolenaar62aec932022-01-29 21:45:34 +00001395def s:ForLoopUnpack()
Bram Moolenaar792f7862020-11-23 08:31:18 +01001396 for [x1, x2] in [[1, 2], [3, 4]]
1397 echo x1 x2
1398 endfor
1399enddef
1400
1401def Test_disassemble_for_loop_unpack()
1402 var instr = execute('disassemble ForLoopUnpack')
1403 assert_match('ForLoopUnpack\_s*' ..
1404 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1405 '\d\+ STORE -1 in $0\_s*' ..
1406 '\d\+ PUSHNR 1\_s*' ..
1407 '\d\+ PUSHNR 2\_s*' ..
1408 '\d\+ NEWLIST size 2\_s*' ..
1409 '\d\+ PUSHNR 3\_s*' ..
1410 '\d\+ PUSHNR 4\_s*' ..
1411 '\d\+ NEWLIST size 2\_s*' ..
1412 '\d\+ NEWLIST size 2\_s*' ..
1413 '\d\+ FOR $0 -> 16\_s*' ..
1414 '\d\+ UNPACK 2\_s*' ..
1415 '\d\+ STORE $1\_s*' ..
1416 '\d\+ STORE $2\_s*' ..
1417 'echo x1 x2\_s*' ..
1418 '\d\+ LOAD $1\_s*' ..
1419 '\d\+ LOAD $2\_s*' ..
1420 '\d\+ ECHO 2\_s*' ..
1421 'endfor\_s*' ..
1422 '\d\+ JUMP -> 8\_s*' ..
1423 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001424 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001425 instr)
1426enddef
1427
Bram Moolenaar62aec932022-01-29 21:45:34 +00001428def s:ForLoopContinue()
Bram Moolenaarc150c092021-02-13 15:02:46 +01001429 for nr in [1, 2]
1430 try
1431 echo "ok"
1432 try
1433 echo "deeper"
1434 catch
1435 continue
1436 endtry
1437 catch
1438 echo "not ok"
1439 endtry
1440 endfor
1441enddef
1442
1443def Test_disassemble_for_loop_continue()
1444 var instr = execute('disassemble ForLoopContinue')
1445 assert_match('ForLoopContinue\_s*' ..
1446 'for nr in \[1, 2]\_s*' ..
1447 '0 STORE -1 in $0\_s*' ..
1448 '1 PUSHNR 1\_s*' ..
1449 '2 PUSHNR 2\_s*' ..
1450 '3 NEWLIST size 2\_s*' ..
1451 '4 FOR $0 -> 22\_s*' ..
1452 '5 STORE $1\_s*' ..
1453 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001454 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001455 'echo "ok"\_s*' ..
1456 '7 PUSHS "ok"\_s*' ..
1457 '8 ECHO 1\_s*' ..
1458 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001459 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001460 'echo "deeper"\_s*' ..
1461 '10 PUSHS "deeper"\_s*' ..
1462 '11 ECHO 1\_s*' ..
1463 'catch\_s*' ..
1464 '12 JUMP -> 15\_s*' ..
1465 '13 CATCH\_s*' ..
1466 'continue\_s*' ..
1467 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1468 'endtry\_s*' ..
1469 '15 ENDTRY\_s*' ..
1470 'catch\_s*' ..
1471 '16 JUMP -> 20\_s*' ..
1472 '17 CATCH\_s*' ..
1473 'echo "not ok"\_s*' ..
1474 '18 PUSHS "not ok"\_s*' ..
1475 '19 ECHO 1\_s*' ..
1476 'endtry\_s*' ..
1477 '20 ENDTRY\_s*' ..
1478 'endfor\_s*' ..
1479 '21 JUMP -> 4\_s*' ..
1480 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001481 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001482 instr)
1483enddef
1484
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001485let g:number = 42
1486
Bram Moolenaar62aec932022-01-29 21:45:34 +00001487def s:TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001488 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001489enddef
1490
1491def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001492 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001493 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001494 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001495 '\d PUSHNR 23\_s*' ..
1496 '\d LOADG g:number\_s*' ..
1497 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1498 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001499 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001500 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001501 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001502 instr)
1503enddef
1504
Bram Moolenaar62aec932022-01-29 21:45:34 +00001505def s:Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001506 var nr = 3
1507 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001508 nrres = nr - 7
1509 nrres = nr * 7
1510 nrres = nr / 7
1511 nrres = nr % 7
1512
Bram Moolenaarac564082020-09-27 19:05:33 +02001513 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001514 anyres = g:number - 7
1515 anyres = g:number * 7
1516 anyres = g:number / 7
1517 anyres = g:number % 7
1518
1519 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001520 var fl = 3.0
1521 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001522 flres = fl - 7.0
1523 flres = fl * 7.0
1524 flres = fl / 7.0
1525 endif
1526enddef
1527
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001528def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001530 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001531 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001532 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001533 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001534 '\d LOAD $0.*' ..
1535 '\d PUSHNR 7.*' ..
1536 '\d OPNR +.*' ..
1537 '\d STORE $1.*' ..
1538 'nrres = nr - 7.*' ..
1539 '\d OPNR -.*' ..
1540 'nrres = nr \* 7.*' ..
1541 '\d OPNR \*.*' ..
1542 'nrres = nr / 7.*' ..
1543 '\d OPNR /.*' ..
1544 'nrres = nr % 7.*' ..
1545 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001546 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001547 '\d LOADG g:number.*' ..
1548 '\d PUSHNR 7.*' ..
1549 '\d OPANY +.*' ..
1550 '\d STORE $2.*' ..
1551 'anyres = g:number - 7.*' ..
1552 '\d OPANY -.*' ..
1553 'anyres = g:number \* 7.*' ..
1554 '\d OPANY \*.*' ..
1555 'anyres = g:number / 7.*' ..
1556 '\d OPANY /.*' ..
1557 'anyres = g:number % 7.*' ..
1558 '\d OPANY %.*',
1559 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001560 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001561 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001562 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001563 '\d PUSHF 3.0.*' ..
1564 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001565 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001566 '\d LOAD $3.*' ..
1567 '\d PUSHF 7.0.*' ..
1568 '\d OPFLOAT +.*' ..
1569 '\d STORE $4.*' ..
1570 'flres = fl - 7.0.*' ..
1571 '\d OPFLOAT -.*' ..
1572 'flres = fl \* 7.0.*' ..
1573 '\d OPFLOAT \*.*' ..
1574 'flres = fl / 7.0.*' ..
1575 '\d OPFLOAT /.*',
1576 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001577 endif
1578enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001579
Bram Moolenaar62aec932022-01-29 21:45:34 +00001580def s:AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001581 var reslist = [1, 2] + [3, 4]
1582 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001583enddef
1584
1585def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001586 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001587 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001588 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001589 '\d PUSHNR 1.*' ..
1590 '\d PUSHNR 2.*' ..
1591 '\d NEWLIST size 2.*' ..
1592 '\d PUSHNR 3.*' ..
1593 '\d PUSHNR 4.*' ..
1594 '\d NEWLIST size 2.*' ..
1595 '\d ADDLIST.*' ..
1596 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001597 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001598 '\d PUSHBLOB 0z1122.*' ..
1599 '\d PUSHBLOB 0z3344.*' ..
1600 '\d ADDBLOB.*' ..
1601 '\d STORE $.*',
1602 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001603enddef
1604
1605let g:aa = 'aa'
Bram Moolenaar62aec932022-01-29 21:45:34 +00001606def s:ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001607 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001608 return res
1609enddef
1610
1611def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001612 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001613 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001614 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001615 '\d LOADG g:aa.*' ..
1616 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001617 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001618 '\d CONCAT.*' ..
1619 '\d STORE $.*',
1620 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001621 assert_equal('aabb', ConcatString())
1622enddef
1623
Bram Moolenaar62aec932022-01-29 21:45:34 +00001624def s:StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001625 var s = "abcd"
1626 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001627 return res
1628enddef
1629
1630def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001631 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001632 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001633 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001634 '\d PUSHS "abcd"\_s*' ..
1635 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001636 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001637 '\d LOAD $0\_s*' ..
1638 '\d PUSHNR 1\_s*' ..
1639 '\d STRINDEX\_s*' ..
1640 '\d STORE $1\_s*',
1641 instr)
1642 assert_equal('b', StringIndex())
1643enddef
1644
Bram Moolenaar62aec932022-01-29 21:45:34 +00001645def s:StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001646 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001647 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001648 return res
1649enddef
1650
1651def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001652 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001653 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001654 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001655 '\d PUSHS "abcd"\_s*' ..
1656 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001657 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001658 '\d LOAD $0\_s*' ..
1659 '\d PUSHNR 1\_s*' ..
1660 '\d PUSHNR 8\_s*' ..
1661 '\d STRSLICE\_s*' ..
1662 '\d STORE $1\_s*',
1663 instr)
1664 assert_equal('bcd', StringSlice())
1665enddef
1666
Bram Moolenaar62aec932022-01-29 21:45:34 +00001667def s:ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001668 var l = [1, 2, 3]
1669 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001670 return res
1671enddef
1672
1673def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001674 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001675 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001676 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001677 '\d PUSHNR 1\_s*' ..
1678 '\d PUSHNR 2\_s*' ..
1679 '\d PUSHNR 3\_s*' ..
1680 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001681 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001682 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001683 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001684 '\d LOAD $0\_s*' ..
1685 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001686 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001687 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001688 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001689 assert_equal(2, ListIndex())
1690enddef
1691
Bram Moolenaar62aec932022-01-29 21:45:34 +00001692def s:ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001693 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001694 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001695 return res
1696enddef
1697
1698def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001699 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001700 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001702 '\d PUSHNR 1\_s*' ..
1703 '\d PUSHNR 2\_s*' ..
1704 '\d PUSHNR 3\_s*' ..
1705 '\d NEWLIST size 3\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001706 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001707 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001708 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001709 '\d LOAD $0\_s*' ..
1710 '\d PUSHNR 1\_s*' ..
1711 '\d PUSHNR 8\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001712 '\d\+ LISTSLICE\_s*' ..
1713 '\d\+ SETTYPE list<number>\_s*' ..
1714 '\d\+ STORE $1\_s*',
Bram Moolenaared591872020-08-15 22:14:53 +02001715 instr)
1716 assert_equal([2, 3], ListSlice())
1717enddef
1718
Bram Moolenaar62aec932022-01-29 21:45:34 +00001719def s:DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001720 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001722 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001723 return res
1724enddef
1725
1726def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001727 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001728 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001729 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001730 '\d PUSHS "item"\_s*' ..
1731 '\d PUSHNR 1\_s*' ..
1732 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00001733 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001734 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001735 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001736 '\d\+ LOAD $0\_s*' ..
1737 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001738 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001739 '\d\+ STORE $1\_s*' ..
1740 'res = d\["item"\]\_s*' ..
1741 '\d\+ LOAD $0\_s*' ..
1742 '\d\+ PUSHS "item"\_s*' ..
1743 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001744 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001745 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001746 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001747 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001748enddef
1749
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001750let somelist = [1, 2, 3, 4, 5]
Bram Moolenaar62aec932022-01-29 21:45:34 +00001751def s:AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001752 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001753 return res
1754enddef
1755
1756def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001758 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001759 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001760 '\d LOADG g:somelist\_s*' ..
1761 '\d PUSHNR 2\_s*' ..
1762 '\d ANYINDEX\_s*' ..
1763 '\d STORE $0\_s*' ..
1764 'return res\_s*' ..
1765 '\d LOAD $0\_s*' ..
1766 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1767 '\d RETURN',
1768 instr)
1769 assert_equal(3, AnyIndex())
1770enddef
1771
Bram Moolenaar62aec932022-01-29 21:45:34 +00001772def s:AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001773 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001774 return res
1775enddef
1776
1777def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001778 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001779 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001780 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001781 '\d LOADG g:somelist\_s*' ..
1782 '\d PUSHNR 1\_s*' ..
1783 '\d PUSHNR 3\_s*' ..
1784 '\d ANYSLICE\_s*' ..
1785 '\d STORE $0\_s*' ..
1786 'return res\_s*' ..
1787 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001788 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001789 '\d RETURN',
1790 instr)
1791 assert_equal([2, 3, 4], AnySlice())
1792enddef
1793
Bram Moolenaar62aec932022-01-29 21:45:34 +00001794def s:NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001795 g:nr = 9
1796 var plus = +g:nr
1797 var minus = -g:nr
1798 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001799enddef
1800
1801def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001802 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001803 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001804 'g:nr = 9\_s*' ..
1805 '\d PUSHNR 9\_s*' ..
1806 '\d STOREG g:nr\_s*' ..
1807 'var plus = +g:nr\_s*' ..
1808 '\d LOADG g:nr\_s*' ..
1809 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1810 '\d STORE $0\_s*' ..
1811 'var minus = -g:nr\_s*' ..
1812 '\d LOADG g:nr\_s*' ..
1813 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001814 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001815 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001816 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001817 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001818enddef
1819
Bram Moolenaar62aec932022-01-29 21:45:34 +00001820def s:InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001821 var flag = true
1822 var invert = !flag
1823 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001824 return res
1825enddef
1826
1827def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001828 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001829 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001830 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001831 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001832 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001833 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001834 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001835 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001836 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001837 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001838 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001839 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001840 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001841 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001842 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001843enddef
1844
Bram Moolenaar62aec932022-01-29 21:45:34 +00001845def s:ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001846 var one = 1
1847 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001848 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001849 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001850 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001851enddef
1852
1853def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001854 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001855 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001856 'var one = 1\_s*' ..
1857 '0 STORE 1 in $0\_s*' ..
1858 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001859 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001860 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001861 '1 LOAD $0\_s*' ..
1862 '2 COND2BOOL\_s*' ..
1863 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1864 '4 LOAD $1\_s*' ..
1865 '5 COND2BOOL\_s*' ..
1866 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1867 '7 LOAD $0\_s*' ..
1868 '8 COND2BOOL\_s*' ..
1869 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001870 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001871 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001872 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001873 instr)
1874 assert_equal(true, InvertBool())
1875enddef
1876
Bram Moolenaar62aec932022-01-29 21:45:34 +00001877def s:AutoInit()
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00001878 var t: number
1879 t = 1
1880 t = 0
1881enddef
1882
1883def Test_disassemble_auto_init()
1884 var instr = execute('disassemble AutoInit')
1885 assert_match('AutoInit\_s*' ..
1886 'var t: number\_s*' ..
1887 't = 1\_s*' ..
1888 '\d STORE 1 in $0\_s*' ..
1889 't = 0\_s*' ..
1890 '\d STORE 0 in $0\_s*' ..
1891 '\d\+ RETURN void',
1892 instr)
1893enddef
1894
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001895def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001896 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001897 ['true == isFalse', 'COMPAREBOOL =='],
1898 ['true != isFalse', 'COMPAREBOOL !='],
1899 ['v:none == isNull', 'COMPARESPECIAL =='],
1900 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar7a222242022-03-01 19:23:24 +00001901 ['"text" == isNull', 'COMPARENULL =='],
1902 ['"text" != isNull', 'COMPARENULL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001903
Bram Moolenaara5565e42020-05-09 15:44:01 +02001904 ['111 == aNumber', 'COMPARENR =='],
1905 ['111 != aNumber', 'COMPARENR !='],
1906 ['111 > aNumber', 'COMPARENR >'],
1907 ['111 < aNumber', 'COMPARENR <'],
1908 ['111 >= aNumber', 'COMPARENR >='],
1909 ['111 <= aNumber', 'COMPARENR <='],
1910 ['111 =~ aNumber', 'COMPARENR =\~'],
1911 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001912
Bram Moolenaara5565e42020-05-09 15:44:01 +02001913 ['"xx" != aString', 'COMPARESTRING !='],
1914 ['"xx" > aString', 'COMPARESTRING >'],
1915 ['"xx" < aString', 'COMPARESTRING <'],
1916 ['"xx" >= aString', 'COMPARESTRING >='],
1917 ['"xx" <= aString', 'COMPARESTRING <='],
1918 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1919 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1920 ['"xx" is aString', 'COMPARESTRING is'],
1921 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001922
Bram Moolenaara5565e42020-05-09 15:44:01 +02001923 ['0z11 == aBlob', 'COMPAREBLOB =='],
1924 ['0z11 != aBlob', 'COMPAREBLOB !='],
1925 ['0z11 is aBlob', 'COMPAREBLOB is'],
1926 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001927
Bram Moolenaara5565e42020-05-09 15:44:01 +02001928 ['[1, 2] == aList', 'COMPARELIST =='],
1929 ['[1, 2] != aList', 'COMPARELIST !='],
1930 ['[1, 2] is aList', 'COMPARELIST is'],
1931 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001932
Bram Moolenaare0de1712020-12-02 17:36:54 +01001933 ['{a: 1} == aDict', 'COMPAREDICT =='],
1934 ['{a: 1} != aDict', 'COMPAREDICT !='],
1935 ['{a: 1} is aDict', 'COMPAREDICT is'],
1936 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001937
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001938 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1939 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1940 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1941 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001942
1943 ['77 == g:xx', 'COMPAREANY =='],
1944 ['77 != g:xx', 'COMPAREANY !='],
1945 ['77 > g:xx', 'COMPAREANY >'],
1946 ['77 < g:xx', 'COMPAREANY <'],
1947 ['77 >= g:xx', 'COMPAREANY >='],
1948 ['77 <= g:xx', 'COMPAREANY <='],
1949 ['77 =~ g:xx', 'COMPAREANY =\~'],
1950 ['77 !~ g:xx', 'COMPAREANY !\~'],
1951 ['77 is g:xx', 'COMPAREANY is'],
1952 ['77 isnot g:xx', 'COMPAREANY isnot'],
1953 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001954 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001955 if has('float')
1956 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001957 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1958 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1959 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1960 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1961 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1962 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1963 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1964 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001965 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001966 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001967 endif
1968
Bram Moolenaarac564082020-09-27 19:05:33 +02001969 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001970 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001971 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001972 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001973 ' var isFalse = false',
1974 ' var isNull = v:null',
1975 ' var aNumber = 222',
1976 ' var aString = "yy"',
1977 ' var aBlob = 0z22',
1978 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001979 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001980 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001981 ' if ' .. case[0],
1982 ' echo 42'
1983 ' endif',
1984 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001985 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001986 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001987 assert_match('TestCase' .. nr .. '.*' ..
1988 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1989 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001990 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001991 '\d ' .. case[1] .. '.*' ..
1992 '\d JUMP_IF_FALSE -> \d\+.*',
1993 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001994
1995 nr += 1
1996 endfor
1997
Bram Moolenaar22da5592020-03-19 14:52:20 +01001998 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001999enddef
2000
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002001def s:FalsyOp()
2002 echo g:flag ?? "yes"
2003 echo [] ?? "empty list"
2004 echo "" ?? "empty string"
2005enddef
2006
Dominique Pelle81b573d2022-03-22 21:14:55 +00002007def Test_disassemble_falsy_op()
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002008 var res = execute('disass s:FalsyOp')
2009 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
2010 'echo g:flag ?? "yes"\_s*' ..
2011 '0 LOADG g:flag\_s*' ..
2012 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
2013 '2 PUSHS "yes"\_s*' ..
2014 '3 ECHO 1\_s*' ..
2015 'echo \[\] ?? "empty list"\_s*' ..
2016 '4 NEWLIST size 0\_s*' ..
2017 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
2018 '6 PUSHS "empty list"\_s*' ..
2019 '7 ECHO 1\_s*' ..
2020 'echo "" ?? "empty string"\_s*' ..
2021 '\d\+ PUSHS "empty string"\_s*' ..
2022 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002023 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02002024 res)
2025enddef
2026
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002027def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02002028 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02002029 ['"xx" == "yy"', false],
2030 ['"aa" == "aa"', true],
2031 ['has("eval") ? true : false', true],
2032 ['has("asdf") ? true : false', false],
2033 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002034
Bram Moolenaarac564082020-09-27 19:05:33 +02002035 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002036 for case in cases
2037 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002038 ' if ' .. case[0],
2039 ' echo 42'
2040 ' endif',
2041 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002042 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02002043 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002044 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002045 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02002046 assert_match('TestCase' .. nr .. '.*' ..
2047 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
2048 '\d PUSHNR 42.*' ..
2049 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002050 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002051 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002052 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002053 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02002054 assert_match('TestCase' .. nr .. '.*' ..
2055 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
2056 'echo 42[ \n]*' ..
2057 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002058 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002059 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02002060 endif
2061
2062 nr += 1
2063 endfor
2064
2065 delete('Xdisassemble')
2066enddef
2067
Bram Moolenaarad39c092020-02-26 18:23:43 +01002068def s:Execute()
2069 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02002070 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002071 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02002072 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002073 execute 'help ' .. tag
2074enddef
2075
2076def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002077 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002078 assert_match('\<SNR>\d*_Execute\_s*' ..
2079 "execute 'help vim9.txt'\\_s*" ..
2080 '\d PUSHS "help vim9.txt"\_s*' ..
2081 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002082 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002083 '\d PUSHS "help vim9.txt"\_s*' ..
2084 '\d STORE $0\_s*' ..
2085 'execute cmd\_s*' ..
2086 '\d LOAD $0\_s*' ..
2087 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002088 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002089 '\d PUSHS "vim9.txt"\_s*' ..
2090 '\d STORE $1\_s*' ..
2091 "execute 'help ' .. tag\\_s*" ..
2092 '\d\+ PUSHS "help "\_s*' ..
2093 '\d\+ LOAD $1\_s*' ..
2094 '\d\+ CONCAT\_s*' ..
2095 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002096 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002097 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002098enddef
2099
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002100def s:OnlyRange()
2101 :$
2102 :123
2103 :'m
2104enddef
2105
2106def Test_disassemble_range_only()
2107 var res = execute('disass s:OnlyRange')
2108 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2109 ':$\_s*' ..
2110 '\d EXECRANGE $\_s*' ..
2111 ':123\_s*' ..
2112 '\d EXECRANGE 123\_s*' ..
2113 ':''m\_s*' ..
2114 '\d EXECRANGE ''m\_s*' ..
2115 '\d\+ RETURN void',
2116 res)
2117enddef
2118
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002119def s:Echomsg()
2120 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002121 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002122 echoerr 'went' .. 'wrong'
2123enddef
2124
2125def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002126 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002127 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2128 "echomsg 'some' 'message'\\_s*" ..
2129 '\d PUSHS "some"\_s*' ..
2130 '\d PUSHS "message"\_s*' ..
2131 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002132 "echoconsole 'nothing'\\_s*" ..
2133 '\d PUSHS "nothing"\_s*' ..
2134 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002135 "echoerr 'went' .. 'wrong'\\_s*" ..
2136 '\d PUSHS "wentwrong"\_s*' ..
2137 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002138 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002139 res)
2140enddef
2141
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002142def SomeStringArg(arg: string)
2143 echo arg
2144enddef
2145
2146def SomeAnyArg(arg: any)
2147 echo arg
2148enddef
2149
2150def SomeStringArgAndReturn(arg: string): string
2151 return arg
2152enddef
2153
2154def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002155 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002156 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2157 '\d *echo arg.*' ..
2158 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002159 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002160
Bram Moolenaarac564082020-09-27 19:05:33 +02002161 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002162 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2163 '\d *echo arg\_s*' ..
2164 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002165 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002166
Bram Moolenaarac564082020-09-27 19:05:33 +02002167 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002168 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2169 '\d *return arg\_s*' ..
2170 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002171 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002172enddef
2173
Bram Moolenaar09689a02020-05-09 22:50:08 +02002174def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002175 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002176 vim9script
2177 def FuncOne(): string
2178 return FuncTwo()
2179 enddef
2180 def FuncTwo(): string
2181 return 'two'
2182 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002183 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002184 END
2185 writefile(lines, 'Xdisassemble')
2186 source Xdisassemble
2187
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002188 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002189 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2190 'return FuncTwo()\_s*' ..
2191 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002192 '\d RETURN',
2193 g:res_FuncOne)
2194
2195 delete('Xdisassemble')
2196 unlet g:res_FuncOne
2197enddef
2198
Bram Moolenaar61a89812020-05-07 16:58:17 +02002199def s:ConcatStrings(): string
2200 return 'one' .. 'two' .. 'three'
2201enddef
2202
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002203def s:ComputeConst(): number
2204 return 2 + 3 * 4 / 6 + 7
2205enddef
2206
Bram Moolenaar1c747212020-05-09 18:28:34 +02002207def s:ComputeConstParen(): number
2208 return ((2 + 4) * (8 / 2)) / (3 + 4)
2209enddef
2210
Bram Moolenaar61a89812020-05-07 16:58:17 +02002211def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002212 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002213 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2214 "return 'one' .. 'two' .. 'three'\\_s*" ..
2215 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002216 '\d RETURN',
2217 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002218
2219 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002220 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2221 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2222 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002223 '\d RETURN',
2224 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002225
2226 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002227 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2228 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2229 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002230 '\d RETURN',
2231 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002232enddef
2233
Bram Moolenaar389df252020-07-09 21:20:47 +02002234def s:CallAppend()
2235 eval "some text"->append(2)
2236enddef
2237
2238def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002239 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002240 assert_match('<SNR>\d*_CallAppend\_s*' ..
2241 'eval "some text"->append(2)\_s*' ..
2242 '\d PUSHS "some text"\_s*' ..
2243 '\d PUSHNR 2\_s*' ..
2244 '\d SHUFFLE 2 up 1\_s*' ..
2245 '\d BCALL append(argc 2)\_s*' ..
2246 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002247 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002248 res)
2249enddef
2250
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002251
2252def s:SilentMessage()
2253 silent echomsg "text"
2254 silent! echoerr "error"
2255enddef
2256
2257def Test_silent()
2258 var res = execute('disass s:SilentMessage')
2259 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2260 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002261 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002262 '\d PUSHS "text"\_s*' ..
2263 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002264 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002265 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002266 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002267 '\d PUSHS "error"\_s*' ..
2268 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002269 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002270 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002271 res)
2272enddef
2273
2274def s:SilentIf()
2275 silent if 4 == g:five
2276 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002277 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002278enddef
2279
2280def Test_silent_if()
2281 var res = execute('disass s:SilentIf')
2282 assert_match('<SNR>\d*_SilentIf\_s*' ..
2283 'silent if 4 == g:five\_s*' ..
2284 '\d\+ CMDMOD silent\_s*' ..
2285 '\d\+ PUSHNR 4\_s*' ..
2286 '\d\+ LOADG g:five\_s*' ..
2287 '\d\+ COMPAREANY ==\_s*' ..
2288 '\d\+ CMDMOD_REV\_s*' ..
2289 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2290 'silent elseif 4 == g:five\_s*' ..
2291 '\d\+ JUMP -> \d\+\_s*' ..
2292 '\d\+ CMDMOD silent\_s*' ..
2293 '\d\+ PUSHNR 4\_s*' ..
2294 '\d\+ LOADG g:five\_s*' ..
2295 '\d\+ COMPAREANY ==\_s*' ..
2296 '\d\+ CMDMOD_REV\_s*' ..
2297 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002298 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002299 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002300 res)
2301enddef
2302
2303def s:SilentFor()
2304 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002305 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002306enddef
2307
2308def Test_silent_for()
2309 var res = execute('disass s:SilentFor')
2310 assert_match('<SNR>\d*_SilentFor\_s*' ..
2311 'silent for i in \[0\]\_s*' ..
2312 '\d CMDMOD silent\_s*' ..
2313 '\d STORE -1 in $0\_s*' ..
2314 '\d PUSHNR 0\_s*' ..
2315 '\d NEWLIST size 1\_s*' ..
2316 '\d CMDMOD_REV\_s*' ..
2317 '5 FOR $0 -> 8\_s*' ..
2318 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002319 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002320 '\d JUMP -> 5\_s*' ..
2321 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002322 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002323 res)
2324enddef
2325
2326def s:SilentWhile()
2327 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002328 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002329enddef
2330
2331def Test_silent_while()
2332 var res = execute('disass s:SilentWhile')
2333 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2334 'silent while g:not\_s*' ..
2335 '0 CMDMOD silent\_s*' ..
2336 '\d LOADG g:not\_s*' ..
2337 '\d COND2BOOL\_s*' ..
2338 '\d CMDMOD_REV\_s*' ..
2339 '\d JUMP_IF_FALSE -> 6\_s*' ..
2340
Bram Moolenaarfa984412021-03-25 22:15:28 +01002341 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002342 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002343 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002344 res)
2345enddef
2346
2347def s:SilentReturn(): string
2348 silent return "done"
2349enddef
2350
2351def Test_silent_return()
2352 var res = execute('disass s:SilentReturn')
2353 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2354 'silent return "done"\_s*' ..
2355 '\d CMDMOD silent\_s*' ..
2356 '\d PUSHS "done"\_s*' ..
2357 '\d CMDMOD_REV\_s*' ..
2358 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002359 res)
2360enddef
2361
Bram Moolenaarb2049902021-01-24 12:53:53 +01002362def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002363 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002364 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002365 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002366 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002367 return "done"
2368enddef
2369
2370def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002371 if !has('profile')
2372 MissingFeature 'profile'
2373 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002374 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002375 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002376 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002377 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002378 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002379 '\d PUSHS "profiled"\_s*' ..
2380 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002381 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002382 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002383 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002384 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002385 '\d PUSHS "some text"\_s*' ..
2386 '\d STORE $0\_s*' ..
2387 'return "done"\_s*' ..
2388 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002389 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002390 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002391 '\d\+ RETURN\_s*' ..
2392 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002393 res)
2394enddef
2395
Bram Moolenaare99d4222021-06-13 14:01:26 +02002396def Test_debugged()
2397 var res = execute('disass debug s:Profiled')
2398 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002399 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002400 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002401 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002402 '\d PUSHS "profiled"\_s*' ..
2403 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002404 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002405 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002406 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002407 '\d PUSHS "some text"\_s*' ..
2408 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002409 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002410 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002411 '\d PUSHS "done"\_s*' ..
2412 '\d RETURN\_s*',
2413 res)
2414enddef
2415
Bram Moolenaar90770b72021-11-30 20:57:38 +00002416def s:ElseifConstant()
2417 if g:value
2418 echo "one"
2419 elseif true
2420 echo "true"
2421 elseif false
2422 echo "false"
2423 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002424 if 0
2425 echo "yes"
2426 elseif 0
2427 echo "no"
2428 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002429enddef
2430
2431def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002432 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002433 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2434 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002435 '0 DEBUG line 1-1 varcount 0\_s*' ..
2436 '1 LOADG g:value\_s*' ..
2437 '2 COND2BOOL\_s*' ..
2438 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002439 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002440 '4 DEBUG line 2-2 varcount 0\_s*' ..
2441 '5 PUSHS "one"\_s*' ..
2442 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002443 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002444 '7 JUMP -> 12\_s*' ..
2445 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002446 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002447 '9 DEBUG line 4-4 varcount 0\_s*' ..
2448 '10 PUSHS "true"\_s*' ..
2449 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002450 'elseif false\_s*' ..
2451 'echo "false"\_s*' ..
2452 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002453 'if 0\_s*' ..
2454 '12 DEBUG line 8-8 varcount 0\_s*' ..
2455 'echo "yes"\_s*' ..
2456 'elseif 0\_s*' ..
2457 '13 DEBUG line 11-10 varcount 0\_s*' ..
2458 'echo "no"\_s*' ..
2459 'endif\_s*' ..
2460 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002461 res)
2462enddef
2463
Bram Moolenaar093165c2021-08-22 13:35:31 +02002464def s:DebugElseif()
2465 var b = false
2466 if b
2467 eval 1 + 0
2468 silent elseif !b
2469 eval 2 + 0
2470 endif
2471enddef
2472
2473def Test_debug_elseif()
2474 var res = execute('disass debug s:DebugElseif')
2475 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2476 'var b = false\_s*' ..
2477 '0 DEBUG line 1-1 varcount 0\_s*' ..
2478 '1 PUSH false\_s*' ..
2479 '2 STORE $0\_s*' ..
2480
2481 'if b\_s*' ..
2482 '3 DEBUG line 2-2 varcount 1\_s*' ..
2483 '4 LOAD $0\_s*' ..
2484 '5 JUMP_IF_FALSE -> 10\_s*' ..
2485
2486 'eval 1 + 0\_s*' ..
2487 '6 DEBUG line 3-3 varcount 1\_s*' ..
2488 '7 PUSHNR 1\_s*' ..
2489 '8 DROP\_s*' ..
2490
2491 'silent elseif !b\_s*' ..
2492 '9 JUMP -> 20\_s*' ..
2493 '10 CMDMOD silent\_s*' ..
2494 '11 DEBUG line 4-4 varcount 1\_s*' ..
2495 '12 LOAD $0\_s*' ..
2496 '13 INVERT -1 (!val)\_s*' ..
2497 '14 CMDMOD_REV\_s*' ..
2498 '15 JUMP_IF_FALSE -> 20\_s*' ..
2499
2500 'eval 2 + 0\_s*' ..
2501 '16 DEBUG line 5-5 varcount 1\_s*' ..
2502 '17 PUSHNR 2\_s*' ..
2503 '18 DROP\_s*' ..
2504
2505 'endif\_s*' ..
2506 '19 DEBUG line 6-6 varcount 1\_s*' ..
2507 '20 RETURN void*',
2508 res)
2509enddef
2510
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002511def s:DebugFor()
2512 echo "hello"
2513 for a in [0]
2514 echo a
2515 endfor
2516enddef
2517
2518def Test_debug_for()
2519 var res = execute('disass debug s:DebugFor')
2520 assert_match('<SNR>\d*_DebugFor\_s*' ..
2521 'echo "hello"\_s*' ..
2522 '0 DEBUG line 1-1 varcount 0\_s*' ..
2523 '1 PUSHS "hello"\_s*' ..
2524 '2 ECHO 1\_s*' ..
2525
2526 'for a in \[0\]\_s*' ..
2527 '3 DEBUG line 2-2 varcount 0\_s*' ..
2528 '4 STORE -1 in $0\_s*' ..
2529 '5 PUSHNR 0\_s*' ..
2530 '6 NEWLIST size 1\_s*' ..
2531 '7 DEBUG line 2-2 varcount 2\_s*' ..
2532 '8 FOR $0 -> 15\_s*' ..
2533 '9 STORE $1\_s*' ..
2534
2535 'echo a\_s*' ..
2536 '10 DEBUG line 3-3 varcount 2\_s*' ..
2537 '11 LOAD $1\_s*' ..
2538 '12 ECHO 1\_s*' ..
2539
2540 'endfor\_s*' ..
2541 '13 DEBUG line 4-4 varcount 2\_s*' ..
2542 '14 JUMP -> 7\_s*' ..
2543 '15 DROP\_s*' ..
2544 '16 RETURN void*',
2545 res)
2546enddef
2547
Bram Moolenaar21ebb082022-02-04 21:58:58 +00002548def s:TryCatch()
2549 try
2550 echo "try"
2551 catch /error/
2552 echo "caught"
2553 endtry
2554enddef
2555
2556def Test_debug_try_catch()
2557 var res = execute('disass debug s:TryCatch')
2558 assert_match('<SNR>\d*_TryCatch\_s*' ..
2559 'try\_s*' ..
2560 '0 DEBUG line 1-1 varcount 0\_s*' ..
2561 '1 TRY catch -> 7, endtry -> 17\_s*' ..
2562 'echo "try"\_s*' ..
2563 '2 DEBUG line 2-2 varcount 0\_s*' ..
2564 '3 PUSHS "try"\_s*' ..
2565 '4 ECHO 1\_s*' ..
2566 'catch /error/\_s*' ..
2567 '5 DEBUG line 3-3 varcount 0\_s*' ..
2568 '6 JUMP -> 17\_s*' ..
2569 '7 DEBUG line 4-3 varcount 0\_s*' ..
2570 '8 PUSH v:exception\_s*' ..
2571 '9 PUSHS "error"\_s*' ..
2572 '10 COMPARESTRING =\~\_s*' ..
2573 '11 JUMP_IF_FALSE -> 17\_s*' ..
2574 '12 CATCH\_s*' ..
2575 'echo "caught"\_s*' ..
2576 '13 DEBUG line 4-4 varcount 0\_s*' ..
2577 '14 PUSHS "caught"\_s*' ..
2578 '15 ECHO 1\_s*' ..
2579 'endtry\_s*' ..
2580 '16 DEBUG line 5-5 varcount 0\_s*' ..
2581 '17 ENDTRY\_s*' ..
2582 '\d\+ RETURN void',
2583 res)
2584enddef
2585
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002586func s:Legacy() dict
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002587 echo 'legacy'
2588endfunc
2589
2590def s:UseMember()
2591 var d = {func: Legacy}
2592 var v = d.func()
2593enddef
2594
2595def Test_disassemble_dict_stack()
2596 var res = execute('disass s:UseMember')
2597 assert_match('<SNR>\d*_UseMember\_s*' ..
2598 'var d = {func: Legacy}\_s*' ..
2599 '\d PUSHS "func"\_s*' ..
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002600 '\d PUSHFUNC "<80><fd>R\d\+_Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002601 '\d NEWDICT size 1\_s*' ..
Bram Moolenaare88c6b72022-02-15 15:37:11 +00002602 '\d SETTYPE dict<func(...): any>\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002603 '\d STORE $0\_s*' ..
2604
2605 'var v = d.func()\_s*' ..
2606 '\d LOAD $0\_s*' ..
2607 '\d MEMBER func\_s*' ..
2608 '\d PCALL top (argc 0)\_s*' ..
2609 '\d PCALL end\_s*' ..
2610 '\d CLEARDICT\_s*' ..
2611 '\d\+ STORE $1\_s*' ..
2612 '\d\+ RETURN void*',
2613 res)
2614enddef
2615
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002616def s:EchoMessages()
2617 echohl ErrorMsg | echom v:exception | echohl NONE
2618enddef
2619
2620def Test_disassemble_nextcmd()
2621 # splitting commands and removing trailing blanks should not change the line
2622 var res = execute('disass s:EchoMessages')
2623 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2624 'echohl ErrorMsg | echom v:exception | echohl NONE',
2625 res)
2626enddef
2627
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002628def Test_disassemble_after_reload()
2629 var lines =<< trim END
2630 vim9script
2631 if exists('g:ThisFunc')
2632 finish
2633 endif
2634 var name: any
2635 def g:ThisFunc(): number
2636 g:name = name
2637 return 0
2638 enddef
2639 def g:ThatFunc(): number
2640 name = g:name
2641 return 0
2642 enddef
2643 END
2644 lines->writefile('Xreload.vim')
2645
2646 source Xreload.vim
2647 g:ThisFunc()
2648 g:ThatFunc()
2649
2650 source Xreload.vim
2651 var res = execute('disass g:ThisFunc')
2652 assert_match('ThisFunc\_s*' ..
2653 'g:name = name\_s*' ..
2654 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2655 '\d STOREG g:name\_s*' ..
2656 'return 0\_s*' ..
2657 '\d PUSHNR 0\_s*' ..
2658 '\d RETURN\_s*',
2659 res)
2660
2661 res = execute('disass g:ThatFunc')
2662 assert_match('ThatFunc\_s*' ..
2663 'name = g:name\_s*' ..
2664 '\d LOADG g:name\_s*' ..
2665 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2666 'return 0\_s*' ..
2667 '\d PUSHNR 0\_s*' ..
2668 '\d RETURN\_s*',
2669 res)
2670
2671 delete('Xreload.vim')
2672 delfunc g:ThisFunc
2673 delfunc g:ThatFunc
2674enddef
2675
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002676
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002677
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002678" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker