blob: c4482a5d9cedd31a2e214368b97eaf7b0110ad16 [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
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100120 '\d\+ RETURN 0',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
Bram Moolenaar4c137212021-04-19 16:48:48 +0200124def s:Substitute()
125 var expr = "abc"
126 :%s/a/\=expr/&g#c
127enddef
128
129def Test_disassemble_substitute()
130 var res = execute('disass s:Substitute')
131 assert_match('<SNR>\d*_Substitute.*' ..
132 ' var expr = "abc"\_s*' ..
133 '\d PUSHS "abc"\_s*' ..
134 '\d STORE $0\_s*' ..
135 ' :%s/a/\\=expr/&g#c\_s*' ..
136 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
137 ' 0 LOAD $0\_s*' ..
138 ' -------------\_s*' ..
139 '\d RETURN 0',
140 res)
141enddef
142
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200143
144def s:SearchPair()
145 var col = 8
146 searchpair("{", "", "}", "", "col('.') > col")
147enddef
148
149def Test_disassemble_seachpair()
150 var res = execute('disass s:SearchPair')
151 assert_match('<SNR>\d*_SearchPair.*' ..
152 ' var col = 8\_s*' ..
153 '\d STORE 8 in $0\_s*' ..
154 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
155 '\d PUSHS "{"\_s*' ..
156 '\d PUSHS ""\_s*' ..
157 '\d PUSHS "}"\_s*' ..
158 '\d PUSHS ""\_s*' ..
159 '\d INSTR\_s*' ..
160 ' 0 PUSHS "."\_s*' ..
161 ' 1 BCALL col(argc 1)\_s*' ..
162 ' 2 LOAD $0\_s*' ..
163 ' 3 COMPARENR >\_s*' ..
164 ' -------------\_s*' ..
165 '\d BCALL searchpair(argc 5)\_s*' ..
166 '\d DROP\_s*' ..
167 '\d RETURN 0',
168 res)
169enddef
170
171
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200172def s:RedirVar()
173 var result: string
174 redir =>> result
175 echo "text"
176 redir END
177enddef
178
179def Test_disassemble_redir_var()
180 var res = execute('disass s:RedirVar')
181 assert_match('<SNR>\d*_RedirVar.*' ..
182 ' var result: string\_s*' ..
183 '\d PUSHS "\[NULL\]"\_s*' ..
184 '\d STORE $0\_s*' ..
185 ' redir =>> result\_s*' ..
186 '\d REDIR\_s*' ..
187 ' echo "text"\_s*' ..
188 '\d PUSHS "text"\_s*' ..
189 '\d ECHO 1\_s*' ..
190 ' redir END\_s*' ..
191 '\d LOAD $0\_s*' ..
192 '\d REDIR END\_s*' ..
193 '\d CONCAT\_s*' ..
194 '\d STORE $0\_s*' ..
195 '\d RETURN 0',
196 res)
197enddef
198
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200199def s:Cexpr()
200 var errors = "list of errors"
201 cexpr errors
202enddef
203
204def Test_disassemble_cexpr()
205 var res = execute('disass s:Cexpr')
206 assert_match('<SNR>\d*_Cexpr.*' ..
207 ' var errors = "list of errors"\_s*' ..
208 '\d PUSHS "list of errors"\_s*' ..
209 '\d STORE $0\_s*' ..
210 ' cexpr errors\_s*' ..
211 '\d CEXPR pre cexpr\_s*' ..
212 '\d LOAD $0\_s*' ..
213 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
214 '\d RETURN 0',
215 res)
216enddef
217
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200218def s:YankRange()
219 norm! m[jjm]
220 :'[,']yank
221enddef
222
223def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200224 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200225 assert_match('<SNR>\d*_YankRange.*' ..
226 ' norm! m\[jjm\]\_s*' ..
227 '\d EXEC norm! m\[jjm\]\_s*' ..
228 ' :''\[,''\]yank\_s*' ..
229 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100230 '\d RETURN 0',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200231 res)
232enddef
233
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200234def s:PutExpr()
235 :3put ="text"
236enddef
237
238def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200239 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200240 assert_match('<SNR>\d*_PutExpr.*' ..
241 ' :3put ="text"\_s*' ..
242 '\d PUSHS "text"\_s*' ..
243 '\d PUT = 3\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100244 '\d RETURN 0',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200245 res)
246enddef
247
Bram Moolenaar08597872020-12-10 19:43:40 +0100248def s:PutRange()
249 :$-2put a
250enddef
251
252def Test_disassemble_put_range()
253 var res = execute('disass s:PutRange')
254 assert_match('<SNR>\d*_PutRange.*' ..
255 ' :$-2put a\_s*' ..
256 '\d RANGE $-2\_s*' ..
257 '\d PUT a range\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100258 '\d RETURN 0',
Bram Moolenaar08597872020-12-10 19:43:40 +0100259 res)
260enddef
261
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100262def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200263 var localbool = true
264 var localspec = v:none
265 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100266 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200267 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100268 endif
269enddef
270
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100271def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200272 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200273 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
274 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100275 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200276 'localspec = v:none.*' ..
277 ' PUSH v:none.*' ..
278 'localblob = 0z1234.*' ..
279 ' PUSHBLOB 0z1234.*',
280 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100281 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200282 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
283 'localfloat = 1.234.*' ..
284 ' PUSHF 1.234.*',
285 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100286 endif
287enddef
288
289def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200290 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100291 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200292 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100293 localstr = 'xyz'
294 v:char = 'abc'
295 s:scriptvar = 'sv'
296 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100297 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200298 b:buffervar = 'bv'
299 w:windowvar = 'wv'
300 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100301 &tabstop = 8
302 $ENVVAR = 'ev'
303 @z = 'rv'
304enddef
305
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100306def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200307 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200308 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200310 'localnr = 2.*' ..
311 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200312 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200313 'localstr = ''xyz''.*' ..
314 ' STORE $1.*' ..
315 'v:char = ''abc''.*' ..
316 'STOREV v:char.*' ..
317 's:scriptvar = ''sv''.*' ..
318 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
319 'g:globalvar = ''gv''.*' ..
320 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100321 'g:auto#var = ''av''.*' ..
322 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200323 'b:buffervar = ''bv''.*' ..
324 ' STOREB b:buffervar.*' ..
325 'w:windowvar = ''wv''.*' ..
326 ' STOREW w:windowvar.*' ..
327 't:tabpagevar = ''tv''.*' ..
328 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200329 '&tabstop = 8.*' ..
330 ' STOREOPT &tabstop.*' ..
331 '$ENVVAR = ''ev''.*' ..
332 ' STOREENV $ENVVAR.*' ..
333 '@z = ''rv''.*' ..
334 ' STOREREG @z.*',
335 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100336enddef
337
Bram Moolenaarcb790402020-05-15 20:53:00 +0200338def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200339 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200340 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200341 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200342 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200343 var localblob: blob = 0z1122
344 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200345enddef
346
347def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200348 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200349 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200350 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200351 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100352 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200353 '\d STORE $0\_s*' ..
354 'locallist\[0\] = 123\_s*' ..
355 '\d PUSHNR 123\_s*' ..
356 '\d PUSHNR 0\_s*' ..
357 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200358 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200359 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200360 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100361 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200362 '\d STORE $1\_s*' ..
363 'localdict\["a"\] = 456\_s*' ..
364 '\d\+ PUSHNR 456\_s*' ..
365 '\d\+ PUSHS "a"\_s*' ..
366 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200367 '\d\+ STOREINDEX dict\_s*' ..
368 'var localblob: blob = 0z1122\_s*' ..
369 '\d\+ PUSHBLOB 0z1122\_s*' ..
370 '\d\+ STORE $2\_s*' ..
371 'localblob\[1\] = 33\_s*' ..
372 '\d\+ PUSHNR 33\_s*' ..
373 '\d\+ PUSHNR 1\_s*' ..
374 '\d\+ LOAD $2\_s*' ..
375 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100376 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200377 res)
378enddef
379
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100380def s:ScriptFuncStoreIndex()
381 var d = {dd: {}}
382 d.dd[0] = 0
383enddef
384
385def Test_disassemble_store_index()
386 var res = execute('disass s:ScriptFuncStoreIndex')
387 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
388 'var d = {dd: {}}\_s*' ..
389 '\d PUSHS "dd"\_s*' ..
390 '\d NEWDICT size 0\_s*' ..
391 '\d NEWDICT size 1\_s*' ..
392 '\d STORE $0\_s*' ..
393 'd.dd\[0\] = 0\_s*' ..
394 '\d PUSHNR 0\_s*' ..
395 '\d PUSHNR 0\_s*' ..
396 '\d LOAD $0\_s*' ..
397 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200398 '\d STOREINDEX any\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100399 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100400 res)
401enddef
402
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200403def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200404 var x: string
405 var y: string
406 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200407 [x, y; l] = g:stringlist
408enddef
409
410def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200411 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200412 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200413 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200414 '\d PUSHS "\[NULL\]"\_s*' ..
415 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200416 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200417 '\d PUSHS "\[NULL\]"\_s*' ..
418 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200419 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200420 '\d NEWLIST size 0\_s*' ..
421 '\d STORE $2\_s*' ..
422 '\[x, y; l\] = g:stringlist\_s*' ..
423 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200424 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200425 '\d CHECKLEN >= 2\_s*' ..
426 '\d\+ ITEM 0\_s*' ..
427 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
428 '\d\+ STORE $0\_s*' ..
429 '\d\+ ITEM 1\_s*' ..
430 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
431 '\d\+ STORE $1\_s*' ..
432 '\d\+ SLICE 2\_s*' ..
433 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100434 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200435 res)
436enddef
437
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200438def s:ListAdd()
439 var l: list<number> = []
440 add(l, 123)
441 add(l, g:aNumber)
442enddef
443
444def Test_disassemble_list_add()
445 var res = execute('disass s:ListAdd')
446 assert_match('<SNR>\d*_ListAdd\_s*' ..
447 'var l: list<number> = []\_s*' ..
448 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100449 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200450 '\d STORE $0\_s*' ..
451 'add(l, 123)\_s*' ..
452 '\d LOAD $0\_s*' ..
453 '\d PUSHNR 123\_s*' ..
454 '\d LISTAPPEND\_s*' ..
455 '\d DROP\_s*' ..
456 'add(l, g:aNumber)\_s*' ..
457 '\d LOAD $0\_s*' ..
458 '\d\+ LOADG g:aNumber\_s*' ..
459 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
460 '\d\+ LISTAPPEND\_s*' ..
461 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100462 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200463 res)
464enddef
465
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200466def s:BlobAdd()
467 var b: blob = 0z
468 add(b, 123)
469 add(b, g:aNumber)
470enddef
471
472def Test_disassemble_blob_add()
473 var res = execute('disass s:BlobAdd')
474 assert_match('<SNR>\d*_BlobAdd\_s*' ..
475 'var b: blob = 0z\_s*' ..
476 '\d PUSHBLOB 0z\_s*' ..
477 '\d STORE $0\_s*' ..
478 'add(b, 123)\_s*' ..
479 '\d LOAD $0\_s*' ..
480 '\d PUSHNR 123\_s*' ..
481 '\d BLOBAPPEND\_s*' ..
482 '\d DROP\_s*' ..
483 'add(b, g:aNumber)\_s*' ..
484 '\d LOAD $0\_s*' ..
485 '\d\+ LOADG g:aNumber\_s*' ..
486 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
487 '\d\+ BLOBAPPEND\_s*' ..
488 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100489 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200490 res)
491enddef
492
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200493def s:BlobIndexSlice()
494 var b: blob = 0z112233
495 echo b[1]
496 echo b[1 : 2]
497enddef
498
499def Test_disassemble_blob_index_slice()
500 var res = execute('disass s:BlobIndexSlice')
501 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
502 'var b: blob = 0z112233\_s*' ..
503 '\d PUSHBLOB 0z112233\_s*' ..
504 '\d STORE $0\_s*' ..
505 'echo b\[1\]\_s*' ..
506 '\d LOAD $0\_s*' ..
507 '\d PUSHNR 1\_s*' ..
508 '\d BLOBINDEX\_s*' ..
509 '\d ECHO 1\_s*' ..
510 'echo b\[1 : 2\]\_s*' ..
511 '\d LOAD $0\_s*' ..
512 '\d PUSHNR 1\_s*' ..
513 '\d\+ PUSHNR 2\_s*' ..
514 '\d\+ BLOBSLICE\_s*' ..
515 '\d\+ ECHO 1\_s*' ..
516 '\d\+ RETURN 0',
517 res)
518enddef
519
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200520def s:ScriptFuncUnlet()
521 g:somevar = "value"
522 unlet g:somevar
523 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200524 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200525enddef
526
527def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200528 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200529 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
530 'g:somevar = "value"\_s*' ..
531 '\d PUSHS "value"\_s*' ..
532 '\d STOREG g:somevar\_s*' ..
533 'unlet g:somevar\_s*' ..
534 '\d UNLET g:somevar\_s*' ..
535 'unlet! g:somevar\_s*' ..
536 '\d UNLET! g:somevar\_s*' ..
537 'unlet $SOMEVAR\_s*' ..
538 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200539 res)
540enddef
541
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100542def s:ScriptFuncTry()
543 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200544 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100545 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200546 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100547 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200548 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100549 endtry
550enddef
551
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100552def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200553 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200554 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
555 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100556 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200557 'echo "yes"\_s*' ..
558 '\d PUSHS "yes"\_s*' ..
559 '\d ECHO 1\_s*' ..
560 'catch /fail/\_s*' ..
561 '\d JUMP -> \d\+\_s*' ..
562 '\d PUSH v:exception\_s*' ..
563 '\d PUSHS "fail"\_s*' ..
564 '\d COMPARESTRING =\~\_s*' ..
565 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
566 '\d CATCH\_s*' ..
567 'echo "no"\_s*' ..
568 '\d\+ PUSHS "no"\_s*' ..
569 '\d\+ ECHO 1\_s*' ..
570 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100571 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200572 'throw "end"\_s*' ..
573 '\d\+ PUSHS "end"\_s*' ..
574 '\d\+ THROW\_s*' ..
575 'endtry\_s*' ..
576 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200577 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100578enddef
579
580def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200581 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100582 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100583enddef
584
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100585def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200586 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200587 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200588 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200589 '\d PUSHNR 1\_s*' ..
590 '\d PUSHS "two"\_s*' ..
591 '\d PUSHNR 333\_s*' ..
592 '\d NEWLIST size 3\_s*' ..
593 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100594 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200595 '\d PUSHS "one"\_s*' ..
596 '\d PUSHNR 1\_s*' ..
597 '\d PUSHS "two"\_s*' ..
598 '\d PUSHS "val"\_s*' ..
599 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200600 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100601enddef
602
Bram Moolenaar6e949782020-04-13 17:21:00 +0200603def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100604 echo arg
605enddef
606
607func UserFunc()
608 echo 'nothing'
609endfunc
610
611func UserFuncWithArg(arg)
612 echo a:arg
613endfunc
614
615def s:ScriptFuncCall(): string
616 changenr()
617 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100618 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100619 FuncWithArg(343)
620 ScriptFuncNew()
621 s:ScriptFuncNew()
622 UserFunc()
623 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200624 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100625 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200626 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100627 FuncRefWithArg("bar")
628 return "yes"
629enddef
630
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100631def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200632 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200633 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
634 'changenr()\_s*' ..
635 '\d BCALL changenr(argc 0)\_s*' ..
636 '\d DROP\_s*' ..
637 'char2nr("abc")\_s*' ..
638 '\d PUSHS "abc"\_s*' ..
639 '\d BCALL char2nr(argc 1)\_s*' ..
640 '\d DROP\_s*' ..
641 'Test_disassemble_new()\_s*' ..
642 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
643 '\d DROP\_s*' ..
644 'FuncWithArg(343)\_s*' ..
645 '\d\+ PUSHNR 343\_s*' ..
646 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
647 '\d\+ DROP\_s*' ..
648 'ScriptFuncNew()\_s*' ..
649 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
650 '\d\+ DROP\_s*' ..
651 's:ScriptFuncNew()\_s*' ..
652 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
653 '\d\+ DROP\_s*' ..
654 'UserFunc()\_s*' ..
655 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
656 '\d\+ DROP\_s*' ..
657 'UserFuncWithArg("foo")\_s*' ..
658 '\d\+ PUSHS "foo"\_s*' ..
659 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
660 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200661 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200662 '\d\+ PUSHS "UserFunc"\_s*' ..
663 '\d\+ BCALL function(argc 1)\_s*' ..
664 '\d\+ STORE $0\_s*' ..
665 'FuncRef()\_s*' ..
666 '\d\+ LOAD $\d\_s*' ..
667 '\d\+ PCALL (argc 0)\_s*' ..
668 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200669 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200670 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
671 '\d\+ BCALL function(argc 1)\_s*' ..
672 '\d\+ STORE $1\_s*' ..
673 'FuncRefWithArg("bar")\_s*' ..
674 '\d\+ PUSHS "bar"\_s*' ..
675 '\d\+ LOAD $\d\_s*' ..
676 '\d\+ PCALL (argc 1)\_s*' ..
677 '\d\+ DROP\_s*' ..
678 'return "yes"\_s*' ..
679 '\d\+ PUSHS "yes"\_s*' ..
680 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200681 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100682enddef
683
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200684
685def s:CreateRefs()
686 var local = 'a'
687 def Append(arg: string)
688 local ..= arg
689 enddef
690 g:Append = Append
691 def Get(): string
692 return local
693 enddef
694 g:Get = Get
695enddef
696
697def Test_disassemble_closure()
698 CreateRefs()
699 var res = execute('disass g:Append')
700 assert_match('<lambda>\d\_s*' ..
701 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100702 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200703 '\d LOAD arg\[-1\]\_s*' ..
704 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100705 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100706 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200707 res)
708
709 res = execute('disass g:Get')
710 assert_match('<lambda>\d\_s*' ..
711 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100712 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200713 '\d RETURN',
714 res)
715
716 unlet g:Append
717 unlet g:Get
718enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200719
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100720
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200721def EchoArg(arg: string): string
722 return arg
723enddef
724def RefThis(): func
725 return function('EchoArg')
726enddef
727def s:ScriptPCall()
728 RefThis()("text")
729enddef
730
731def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200732 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200733 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
734 'RefThis()("text")\_s*' ..
735 '\d DCALL RefThis(argc 0)\_s*' ..
736 '\d PUSHS "text"\_s*' ..
737 '\d PCALL top (argc 1)\_s*' ..
738 '\d PCALL end\_s*' ..
739 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100740 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200741 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200742enddef
743
744
Bram Moolenaara26b9702020-04-18 19:53:28 +0200745def s:FuncWithForwardCall(): string
746 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100747enddef
748
749def DefinedLater(arg: string): string
750 return arg
751enddef
752
753def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200754 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200755 assert_match('FuncWithForwardCall\_s*' ..
756 'return g:DefinedLater("yes")\_s*' ..
757 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200758 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200759 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200760 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100761
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200762 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100763 assert_equal('yes', FuncWithForwardCall())
764
Bram Moolenaara26b9702020-04-18 19:53:28 +0200765 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200766 assert_match('FuncWithForwardCall\_s*' ..
767 'return g:DefinedLater("yes")\_s*' ..
768 '\d PUSHS "yes"\_s*' ..
769 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200770 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200771 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100772enddef
773
774
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200775def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200776 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100777enddef
778
779def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200780 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200781 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200782 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200783 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200784 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200785 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200786 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200787 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
788 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200789 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200790 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200791 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200792 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200793 '\d 2STRING stack\[-1]\_s*' ..
794 '\d\+ CONCAT\_s*' ..
795 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200796 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100797enddef
798
799
Bram Moolenaar158906c2020-02-06 20:39:45 +0100800def HasEval()
801 if has("eval")
802 echo "yes"
803 else
804 echo "no"
805 endif
806enddef
807
808def HasNothing()
809 if has("nothing")
810 echo "yes"
811 else
812 echo "no"
813 endif
814enddef
815
816def HasSomething()
817 if has("nothing")
818 echo "nothing"
819 elseif has("something")
820 echo "something"
821 elseif has("eval")
822 echo "eval"
823 elseif has("less")
824 echo "less"
825 endif
826enddef
827
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100828def HasGuiRunning()
829 if has("gui_running")
830 echo "yes"
831 else
832 echo "no"
833 endif
834enddef
835
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100836def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200837 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200838 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200839 assert_match('HasEval\_s*' ..
840 'if has("eval")\_s*' ..
841 'echo "yes"\_s*' ..
842 '\d PUSHS "yes"\_s*' ..
843 '\d ECHO 1\_s*' ..
844 'else\_s*' ..
845 'echo "no"\_s*' ..
846 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200847 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100848 assert_notmatch('JUMP', instr)
849
Bram Moolenaard2c61702020-09-06 15:58:36 +0200850 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100851 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200852 assert_match('HasNothing\_s*' ..
853 'if has("nothing")\_s*' ..
854 'echo "yes"\_s*' ..
855 'else\_s*' ..
856 'echo "no"\_s*' ..
857 '\d PUSHS "no"\_s*' ..
858 '\d ECHO 1\_s*' ..
859 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200860 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100861 assert_notmatch('PUSHS "yes"', instr)
862 assert_notmatch('JUMP', instr)
863
Bram Moolenaard2c61702020-09-06 15:58:36 +0200864 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100865 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200866 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200867 'if has("nothing")\_s*' ..
868 'echo "nothing"\_s*' ..
869 'elseif has("something")\_s*' ..
870 'echo "something"\_s*' ..
871 'elseif has("eval")\_s*' ..
872 'echo "eval"\_s*' ..
873 '\d PUSHS "eval"\_s*' ..
874 '\d ECHO 1\_s*' ..
875 'elseif has("less").*' ..
876 'echo "less"\_s*' ..
877 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200878 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100879 assert_notmatch('PUSHS "nothing"', instr)
880 assert_notmatch('PUSHS "something"', instr)
881 assert_notmatch('PUSHS "less"', instr)
882 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100883
884 var result: string
885 var instr_expected: string
886 if has('gui')
887 if has('gui_running')
888 # GUI already running, always returns "yes"
889 result = "\nyes"
890 instr_expected = 'HasGuiRunning.*' ..
891 'if has("gui_running")\_s*' ..
892 ' echo "yes"\_s*' ..
893 '\d PUSHS "yes"\_s*' ..
894 '\d ECHO 1\_s*' ..
895 'else\_s*' ..
896 ' echo "no"\_s*' ..
897 'endif'
898 else
899 result = "\nno"
900 if has('unix')
901 # GUI not running but can start later, call has()
902 instr_expected = 'HasGuiRunning.*' ..
903 'if has("gui_running")\_s*' ..
904 '\d PUSHS "gui_running"\_s*' ..
905 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200906 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100907 '\d JUMP_IF_FALSE -> \d\_s*' ..
908 ' echo "yes"\_s*' ..
909 '\d PUSHS "yes"\_s*' ..
910 '\d ECHO 1\_s*' ..
911 'else\_s*' ..
912 '\d JUMP -> \d\_s*' ..
913 ' echo "no"\_s*' ..
914 '\d PUSHS "no"\_s*' ..
915 '\d ECHO 1\_s*' ..
916 'endif'
917 else
918 # GUI not running, always return "no"
919 instr_expected = 'HasGuiRunning.*' ..
920 'if has("gui_running")\_s*' ..
921 ' echo "yes"\_s*' ..
922 'else\_s*' ..
923 ' echo "no"\_s*' ..
924 '\d PUSHS "no"\_s*' ..
925 '\d ECHO 1\_s*' ..
926 'endif'
927 endif
928 endif
929 else
930 # GUI not supported, always return "no"
931 result = "\nno"
932 instr_expected = 'HasGuiRunning.*' ..
933 'if has("gui_running")\_s*' ..
934 ' echo "yes"\_s*' ..
935 'else\_s*' ..
936 ' echo "no"\_s*' ..
937 '\d PUSHS "no"\_s*' ..
938 '\d ECHO 1\_s*' ..
939 'endif'
940 endif
941
942 assert_equal(result, execute('HasGuiRunning()'))
943 instr = execute('disassemble HasGuiRunning')
944 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100945enddef
946
Bram Moolenaarefd88552020-06-18 20:50:10 +0200947def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100948 if 1 < 0
949 return "maybe"
950 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200951 if g:cond
952 return "yes"
953 else
954 return "no"
955 endif
956enddef
957
958def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200959 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200960 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100961 'if 1 < 0\_s*' ..
962 ' return "maybe"\_s*' ..
963 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200964 'if g:cond\_s*' ..
965 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100966 '1 COND2BOOL\_s*' ..
967 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200968 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100969 '3 PUSHS "yes"\_s*' ..
970 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200971 'else\_s*' ..
972 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100973 '5 PUSHS "no"\_s*' ..
974 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200975 instr)
976enddef
977
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100978def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200979 var Funky1: func
980 var Funky2: func = function("len")
981 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100982enddef
983
984def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200985 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200986 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200987 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200988 '0 PUSHFUNC "\[none]"\_s*' ..
989 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200990 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200991 '2 PUSHS "len"\_s*' ..
992 '3 BCALL function(argc 1)\_s*' ..
993 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200994 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200995 '\d PUSHS "UserFunc"\_s*' ..
996 '\d BCALL funcref(argc 1)\_s*' ..
997 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100998 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200999 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001000enddef
1001
1002if has('channel')
1003 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001004 var job1: job
1005 var job2: job = job_start("donothing")
1006 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001007 enddef
1008endif
1009
1010def Test_disassemble_channel()
1011 CheckFeature channel
1012
Bram Moolenaarac564082020-09-27 19:05:33 +02001013 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001014 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001015 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001016 '\d PUSHJOB "no process"\_s*' ..
1017 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001018 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001019 '\d PUSHS "donothing"\_s*' ..
1020 '\d BCALL job_start(argc 1)\_s*' ..
1021 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001022 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001023 '\d PUSHCHANNEL 0\_s*' ..
1024 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001025 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001026 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001027enddef
1028
Bram Moolenaar777770f2020-02-06 21:27:08 +01001029def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001030 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001031 return F("x")
1032enddef
1033
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001034def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001035 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001036 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001037 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001038 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001039 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001040 '\d STORE $0\_s*' ..
1041 'return F("x")\_s*' ..
1042 '\d PUSHS "x"\_s*' ..
1043 '\d LOAD $0\_s*' ..
1044 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001045 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001046 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001047
Bram Moolenaarac564082020-09-27 19:05:33 +02001048 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001049 instr = execute('disassemble ' .. name)
1050 assert_match('<lambda>\d\+\_s*' ..
1051 'return "X" .. a .. "X"\_s*' ..
1052 '\d PUSHS "X"\_s*' ..
1053 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001054 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001055 '\d CONCAT\_s*' ..
1056 '\d PUSHS "X"\_s*' ..
1057 '\d CONCAT\_s*' ..
1058 '\d RETURN',
1059 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001060enddef
1061
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001062def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001063 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001064 return Ref(g:value)
1065enddef
1066
1067def Test_disassemble_lambda_with_type()
1068 g:value = 5
1069 assert_equal(15, LambdaWithType())
1070 var instr = execute('disassemble LambdaWithType')
1071 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001072 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001073 '\d FUNCREF <lambda>\d\+\_s*' ..
1074 '\d STORE $0\_s*' ..
1075 'return Ref(g:value)\_s*' ..
1076 '\d LOADG g:value\_s*' ..
1077 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001078 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001079 '\d PCALL (argc 1)\_s*' ..
1080 '\d RETURN',
1081 instr)
1082enddef
1083
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001084def NestedOuter()
1085 def g:Inner()
1086 echomsg "inner"
1087 enddef
1088enddef
1089
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001090def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001091 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001092 assert_match('NestedOuter\_s*' ..
1093 'def g:Inner()\_s*' ..
1094 'echomsg "inner"\_s*' ..
1095 'enddef\_s*' ..
1096 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001097 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001098 instr)
1099enddef
1100
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001101def NestedDefList()
1102 def
1103 def Info
1104 def /Info
1105 def /Info/
1106enddef
1107
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001108def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001109 var instr = execute('disassemble NestedDefList')
1110 assert_match('NestedDefList\_s*' ..
1111 'def\_s*' ..
1112 '\d DEF \_s*' ..
1113 'def Info\_s*' ..
1114 '\d DEF Info\_s*' ..
1115 'def /Info\_s*' ..
1116 '\d DEF /Info\_s*' ..
1117 'def /Info/\_s*' ..
1118 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001119 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001120 instr)
1121enddef
1122
Bram Moolenaar6e949782020-04-13 17:21:00 +02001123def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001124 if arg == 1 && arg != 2 || arg == 4
1125 return 'yes'
1126 endif
1127 return 'no'
1128enddef
1129
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001130def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001131 assert_equal("yes", AndOr(1))
1132 assert_equal("no", AndOr(2))
1133 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001134 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001135 assert_match('AndOr\_s*' ..
1136 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1137 '\d LOAD arg\[-1]\_s*' ..
1138 '\d PUSHNR 1\_s*' ..
1139 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001140 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001141 '\d LOAD arg\[-1]\_s*' ..
1142 '\d PUSHNR 2\_s*' ..
1143 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001144 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001145 '\d LOAD arg\[-1]\_s*' ..
1146 '\d\+ PUSHNR 4\_s*' ..
1147 '\d\+ COMPAREANY ==\_s*' ..
1148 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001149 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001150enddef
1151
Bram Moolenaar04d05222020-02-06 22:06:54 +01001152def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001153 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001154 for i in range(3)
1155 res->add(i)
1156 endfor
1157 return res
1158enddef
1159
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001160def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001161 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001162 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001163 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001164 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001165 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001166 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001167 '\d STORE $0\_s*' ..
1168 'for i in range(3)\_s*' ..
1169 '\d STORE -1 in $1\_s*' ..
1170 '\d PUSHNR 3\_s*' ..
1171 '\d BCALL range(argc 1)\_s*' ..
1172 '\d FOR $1 -> \d\+\_s*' ..
1173 '\d STORE $2\_s*' ..
1174 'res->add(i)\_s*' ..
1175 '\d LOAD $0\_s*' ..
1176 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001177 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001178 '\d\+ DROP\_s*' ..
1179 'endfor\_s*' ..
1180 '\d\+ JUMP -> \d\+\_s*' ..
1181 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001182 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001183enddef
1184
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001185def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001186 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001187 for str in eval('["one", "two"]')
1188 res ..= str
1189 endfor
1190 return res
1191enddef
1192
1193def Test_disassemble_for_loop_eval()
1194 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001195 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001196 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001197 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001198 '\d PUSHS ""\_s*' ..
1199 '\d STORE $0\_s*' ..
1200 'for str in eval(''\["one", "two"\]'')\_s*' ..
1201 '\d STORE -1 in $1\_s*' ..
1202 '\d PUSHS "\["one", "two"\]"\_s*' ..
1203 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001204 '\d FOR $1 -> \d\+\_s*' ..
1205 '\d STORE $2\_s*' ..
1206 'res ..= str\_s*' ..
1207 '\d\+ LOAD $0\_s*' ..
1208 '\d\+ LOAD $2\_s*' ..
1209 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1210 '\d\+ CONCAT\_s*' ..
1211 '\d\+ STORE $0\_s*' ..
1212 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001213 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001214 '\d\+ DROP\_s*' ..
1215 'return res\_s*' ..
1216 '\d\+ LOAD $0\_s*' ..
1217 '\d\+ RETURN',
1218 instr)
1219enddef
1220
Bram Moolenaar792f7862020-11-23 08:31:18 +01001221def ForLoopUnpack()
1222 for [x1, x2] in [[1, 2], [3, 4]]
1223 echo x1 x2
1224 endfor
1225enddef
1226
1227def Test_disassemble_for_loop_unpack()
1228 var instr = execute('disassemble ForLoopUnpack')
1229 assert_match('ForLoopUnpack\_s*' ..
1230 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1231 '\d\+ STORE -1 in $0\_s*' ..
1232 '\d\+ PUSHNR 1\_s*' ..
1233 '\d\+ PUSHNR 2\_s*' ..
1234 '\d\+ NEWLIST size 2\_s*' ..
1235 '\d\+ PUSHNR 3\_s*' ..
1236 '\d\+ PUSHNR 4\_s*' ..
1237 '\d\+ NEWLIST size 2\_s*' ..
1238 '\d\+ NEWLIST size 2\_s*' ..
1239 '\d\+ FOR $0 -> 16\_s*' ..
1240 '\d\+ UNPACK 2\_s*' ..
1241 '\d\+ STORE $1\_s*' ..
1242 '\d\+ STORE $2\_s*' ..
1243 'echo x1 x2\_s*' ..
1244 '\d\+ LOAD $1\_s*' ..
1245 '\d\+ LOAD $2\_s*' ..
1246 '\d\+ ECHO 2\_s*' ..
1247 'endfor\_s*' ..
1248 '\d\+ JUMP -> 8\_s*' ..
1249 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001250 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001251 instr)
1252enddef
1253
Bram Moolenaarc150c092021-02-13 15:02:46 +01001254def ForLoopContinue()
1255 for nr in [1, 2]
1256 try
1257 echo "ok"
1258 try
1259 echo "deeper"
1260 catch
1261 continue
1262 endtry
1263 catch
1264 echo "not ok"
1265 endtry
1266 endfor
1267enddef
1268
1269def Test_disassemble_for_loop_continue()
1270 var instr = execute('disassemble ForLoopContinue')
1271 assert_match('ForLoopContinue\_s*' ..
1272 'for nr in \[1, 2]\_s*' ..
1273 '0 STORE -1 in $0\_s*' ..
1274 '1 PUSHNR 1\_s*' ..
1275 '2 PUSHNR 2\_s*' ..
1276 '3 NEWLIST size 2\_s*' ..
1277 '4 FOR $0 -> 22\_s*' ..
1278 '5 STORE $1\_s*' ..
1279 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001280 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001281 'echo "ok"\_s*' ..
1282 '7 PUSHS "ok"\_s*' ..
1283 '8 ECHO 1\_s*' ..
1284 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001285 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001286 'echo "deeper"\_s*' ..
1287 '10 PUSHS "deeper"\_s*' ..
1288 '11 ECHO 1\_s*' ..
1289 'catch\_s*' ..
1290 '12 JUMP -> 15\_s*' ..
1291 '13 CATCH\_s*' ..
1292 'continue\_s*' ..
1293 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1294 'endtry\_s*' ..
1295 '15 ENDTRY\_s*' ..
1296 'catch\_s*' ..
1297 '16 JUMP -> 20\_s*' ..
1298 '17 CATCH\_s*' ..
1299 'echo "not ok"\_s*' ..
1300 '18 PUSHS "not ok"\_s*' ..
1301 '19 ECHO 1\_s*' ..
1302 'endtry\_s*' ..
1303 '20 ENDTRY\_s*' ..
1304 'endfor\_s*' ..
1305 '21 JUMP -> 4\_s*' ..
1306 '\d\+ DROP\_s*' ..
1307 '\d\+ RETURN 0',
1308 instr)
1309enddef
1310
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001311let g:number = 42
1312
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001313def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001314 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001315enddef
1316
1317def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001318 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001319 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001320 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001321 '\d PUSHNR 23\_s*' ..
1322 '\d LOADG g:number\_s*' ..
1323 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1324 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001325 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001326 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001327 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001328 instr)
1329enddef
1330
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001331def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001332 var nr = 3
1333 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001334 nrres = nr - 7
1335 nrres = nr * 7
1336 nrres = nr / 7
1337 nrres = nr % 7
1338
Bram Moolenaarac564082020-09-27 19:05:33 +02001339 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001340 anyres = g:number - 7
1341 anyres = g:number * 7
1342 anyres = g:number / 7
1343 anyres = g:number % 7
1344
1345 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001346 var fl = 3.0
1347 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001348 flres = fl - 7.0
1349 flres = fl * 7.0
1350 flres = fl / 7.0
1351 endif
1352enddef
1353
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001354def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001355 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001356 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001357 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001358 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001359 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001360 '\d LOAD $0.*' ..
1361 '\d PUSHNR 7.*' ..
1362 '\d OPNR +.*' ..
1363 '\d STORE $1.*' ..
1364 'nrres = nr - 7.*' ..
1365 '\d OPNR -.*' ..
1366 'nrres = nr \* 7.*' ..
1367 '\d OPNR \*.*' ..
1368 'nrres = nr / 7.*' ..
1369 '\d OPNR /.*' ..
1370 'nrres = nr % 7.*' ..
1371 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001372 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001373 '\d LOADG g:number.*' ..
1374 '\d PUSHNR 7.*' ..
1375 '\d OPANY +.*' ..
1376 '\d STORE $2.*' ..
1377 'anyres = g:number - 7.*' ..
1378 '\d OPANY -.*' ..
1379 'anyres = g:number \* 7.*' ..
1380 '\d OPANY \*.*' ..
1381 'anyres = g:number / 7.*' ..
1382 '\d OPANY /.*' ..
1383 'anyres = g:number % 7.*' ..
1384 '\d OPANY %.*',
1385 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001386 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001387 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001388 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001389 '\d PUSHF 3.0.*' ..
1390 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001391 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001392 '\d LOAD $3.*' ..
1393 '\d PUSHF 7.0.*' ..
1394 '\d OPFLOAT +.*' ..
1395 '\d STORE $4.*' ..
1396 'flres = fl - 7.0.*' ..
1397 '\d OPFLOAT -.*' ..
1398 'flres = fl \* 7.0.*' ..
1399 '\d OPFLOAT \*.*' ..
1400 'flres = fl / 7.0.*' ..
1401 '\d OPFLOAT /.*',
1402 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001403 endif
1404enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001405
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001406def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001407 var reslist = [1, 2] + [3, 4]
1408 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001409enddef
1410
1411def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001412 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001413 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001414 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001415 '\d PUSHNR 1.*' ..
1416 '\d PUSHNR 2.*' ..
1417 '\d NEWLIST size 2.*' ..
1418 '\d PUSHNR 3.*' ..
1419 '\d PUSHNR 4.*' ..
1420 '\d NEWLIST size 2.*' ..
1421 '\d ADDLIST.*' ..
1422 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001423 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001424 '\d PUSHBLOB 0z1122.*' ..
1425 '\d PUSHBLOB 0z3344.*' ..
1426 '\d ADDBLOB.*' ..
1427 '\d STORE $.*',
1428 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001429enddef
1430
1431let g:aa = 'aa'
1432def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001433 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001434 return res
1435enddef
1436
1437def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001438 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001439 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001441 '\d LOADG g:aa.*' ..
1442 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001443 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001444 '\d CONCAT.*' ..
1445 '\d STORE $.*',
1446 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001447 assert_equal('aabb', ConcatString())
1448enddef
1449
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001450def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001451 var s = "abcd"
1452 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001453 return res
1454enddef
1455
1456def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001457 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001458 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001459 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001460 '\d PUSHS "abcd"\_s*' ..
1461 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001462 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001463 '\d LOAD $0\_s*' ..
1464 '\d PUSHNR 1\_s*' ..
1465 '\d STRINDEX\_s*' ..
1466 '\d STORE $1\_s*',
1467 instr)
1468 assert_equal('b', StringIndex())
1469enddef
1470
Bram Moolenaared591872020-08-15 22:14:53 +02001471def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001472 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001473 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001474 return res
1475enddef
1476
1477def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001478 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001479 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001480 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001481 '\d PUSHS "abcd"\_s*' ..
1482 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001483 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001484 '\d LOAD $0\_s*' ..
1485 '\d PUSHNR 1\_s*' ..
1486 '\d PUSHNR 8\_s*' ..
1487 '\d STRSLICE\_s*' ..
1488 '\d STORE $1\_s*',
1489 instr)
1490 assert_equal('bcd', StringSlice())
1491enddef
1492
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001493def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001494 var l = [1, 2, 3]
1495 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001496 return res
1497enddef
1498
1499def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001500 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001501 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001502 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001503 '\d PUSHNR 1\_s*' ..
1504 '\d PUSHNR 2\_s*' ..
1505 '\d PUSHNR 3\_s*' ..
1506 '\d NEWLIST size 3\_s*' ..
1507 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001508 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001509 '\d LOAD $0\_s*' ..
1510 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001511 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001512 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001513 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001514 assert_equal(2, ListIndex())
1515enddef
1516
Bram Moolenaared591872020-08-15 22:14:53 +02001517def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001518 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001519 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001520 return res
1521enddef
1522
1523def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001524 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001525 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001526 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001527 '\d PUSHNR 1\_s*' ..
1528 '\d PUSHNR 2\_s*' ..
1529 '\d PUSHNR 3\_s*' ..
1530 '\d NEWLIST size 3\_s*' ..
1531 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001532 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001533 '\d LOAD $0\_s*' ..
1534 '\d PUSHNR 1\_s*' ..
1535 '\d PUSHNR 8\_s*' ..
1536 '\d LISTSLICE\_s*' ..
1537 '\d STORE $1\_s*',
1538 instr)
1539 assert_equal([2, 3], ListSlice())
1540enddef
1541
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001542def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001543 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001544 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001545 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001546 return res
1547enddef
1548
1549def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001550 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001551 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001552 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001553 '\d PUSHS "item"\_s*' ..
1554 '\d PUSHNR 1\_s*' ..
1555 '\d NEWDICT size 1\_s*' ..
1556 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001557 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001558 '\d\+ LOAD $0\_s*' ..
1559 '\d\+ MEMBER item\_s*' ..
1560 '\d\+ STORE $1\_s*' ..
1561 'res = d\["item"\]\_s*' ..
1562 '\d\+ LOAD $0\_s*' ..
1563 '\d\+ PUSHS "item"\_s*' ..
1564 '\d\+ MEMBER\_s*' ..
1565 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001566 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001567 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001568enddef
1569
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001570let somelist = [1, 2, 3, 4, 5]
1571def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001572 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001573 return res
1574enddef
1575
1576def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001577 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001578 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001580 '\d LOADG g:somelist\_s*' ..
1581 '\d PUSHNR 2\_s*' ..
1582 '\d ANYINDEX\_s*' ..
1583 '\d STORE $0\_s*' ..
1584 'return res\_s*' ..
1585 '\d LOAD $0\_s*' ..
1586 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1587 '\d RETURN',
1588 instr)
1589 assert_equal(3, AnyIndex())
1590enddef
1591
1592def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001593 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001594 return res
1595enddef
1596
1597def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001598 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001599 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001600 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001601 '\d LOADG g:somelist\_s*' ..
1602 '\d PUSHNR 1\_s*' ..
1603 '\d PUSHNR 3\_s*' ..
1604 '\d ANYSLICE\_s*' ..
1605 '\d STORE $0\_s*' ..
1606 'return res\_s*' ..
1607 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001608 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001609 '\d RETURN',
1610 instr)
1611 assert_equal([2, 3, 4], AnySlice())
1612enddef
1613
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001614def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001615 var nr = 9
1616 var plus = +nr
1617 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001618 return res
1619enddef
1620
1621def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001622 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001623 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001625 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001626 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001627 '\d LOAD $0\_s*' ..
1628 '\d CHECKNR\_s*' ..
1629 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001630 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001631 '\d LOAD $0\_s*' ..
1632 '\d NEGATENR\_s*' ..
1633 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001634 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001635 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001636enddef
1637
1638def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001639 var flag = true
1640 var invert = !flag
1641 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001642 return res
1643enddef
1644
1645def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001646 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001647 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001648 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001649 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001650 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001651 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001652 '\d LOAD $0\_s*' ..
1653 '\d INVERT (!val)\_s*' ..
1654 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001655 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001656 '\d LOAD $0\_s*' ..
1657 '\d 2BOOL (!!val)\_s*' ..
1658 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001659 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001660 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001661enddef
1662
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001663def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001664 var name: bool = 1 && 0 || 1
1665 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001666enddef
1667
1668def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001669 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001670 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001671 'var name: bool = 1 && 0 || 1\_s*' ..
1672 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001673 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001674 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1675 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001676 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001677 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1678 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001679 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001680 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001681 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001682 '\d\+ LOAD $0\_s*' ..
1683 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001684 instr)
1685 assert_equal(true, InvertBool())
1686enddef
1687
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001688def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001689 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001690 ['true == isFalse', 'COMPAREBOOL =='],
1691 ['true != isFalse', 'COMPAREBOOL !='],
1692 ['v:none == isNull', 'COMPARESPECIAL =='],
1693 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001694
Bram Moolenaara5565e42020-05-09 15:44:01 +02001695 ['111 == aNumber', 'COMPARENR =='],
1696 ['111 != aNumber', 'COMPARENR !='],
1697 ['111 > aNumber', 'COMPARENR >'],
1698 ['111 < aNumber', 'COMPARENR <'],
1699 ['111 >= aNumber', 'COMPARENR >='],
1700 ['111 <= aNumber', 'COMPARENR <='],
1701 ['111 =~ aNumber', 'COMPARENR =\~'],
1702 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001703
Bram Moolenaara5565e42020-05-09 15:44:01 +02001704 ['"xx" != aString', 'COMPARESTRING !='],
1705 ['"xx" > aString', 'COMPARESTRING >'],
1706 ['"xx" < aString', 'COMPARESTRING <'],
1707 ['"xx" >= aString', 'COMPARESTRING >='],
1708 ['"xx" <= aString', 'COMPARESTRING <='],
1709 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1710 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1711 ['"xx" is aString', 'COMPARESTRING is'],
1712 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001713
Bram Moolenaara5565e42020-05-09 15:44:01 +02001714 ['0z11 == aBlob', 'COMPAREBLOB =='],
1715 ['0z11 != aBlob', 'COMPAREBLOB !='],
1716 ['0z11 is aBlob', 'COMPAREBLOB is'],
1717 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001718
Bram Moolenaara5565e42020-05-09 15:44:01 +02001719 ['[1, 2] == aList', 'COMPARELIST =='],
1720 ['[1, 2] != aList', 'COMPARELIST !='],
1721 ['[1, 2] is aList', 'COMPARELIST is'],
1722 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001723
Bram Moolenaare0de1712020-12-02 17:36:54 +01001724 ['{a: 1} == aDict', 'COMPAREDICT =='],
1725 ['{a: 1} != aDict', 'COMPAREDICT !='],
1726 ['{a: 1} is aDict', 'COMPAREDICT is'],
1727 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001728
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001729 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1730 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1731 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1732 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001733
1734 ['77 == g:xx', 'COMPAREANY =='],
1735 ['77 != g:xx', 'COMPAREANY !='],
1736 ['77 > g:xx', 'COMPAREANY >'],
1737 ['77 < g:xx', 'COMPAREANY <'],
1738 ['77 >= g:xx', 'COMPAREANY >='],
1739 ['77 <= g:xx', 'COMPAREANY <='],
1740 ['77 =~ g:xx', 'COMPAREANY =\~'],
1741 ['77 !~ g:xx', 'COMPAREANY !\~'],
1742 ['77 is g:xx', 'COMPAREANY is'],
1743 ['77 isnot g:xx', 'COMPAREANY isnot'],
1744 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001745 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001746 if has('float')
1747 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001748 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1749 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1750 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1751 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1752 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1753 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1754 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1755 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001756 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001758 endif
1759
Bram Moolenaarac564082020-09-27 19:05:33 +02001760 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001761 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001762 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001763 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001764 ' var isFalse = false',
1765 ' var isNull = v:null',
1766 ' var aNumber = 222',
1767 ' var aString = "yy"',
1768 ' var aBlob = 0z22',
1769 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001770 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001771 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001772 ' if ' .. case[0],
1773 ' echo 42'
1774 ' endif',
1775 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001776 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001777 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001778 assert_match('TestCase' .. nr .. '.*' ..
1779 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1780 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001781 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001782 '\d ' .. case[1] .. '.*' ..
1783 '\d JUMP_IF_FALSE -> \d\+.*',
1784 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001785
1786 nr += 1
1787 endfor
1788
Bram Moolenaar22da5592020-03-19 14:52:20 +01001789 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001790enddef
1791
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001792def s:FalsyOp()
1793 echo g:flag ?? "yes"
1794 echo [] ?? "empty list"
1795 echo "" ?? "empty string"
1796enddef
1797
1798def Test_dsassemble_falsy_op()
1799 var res = execute('disass s:FalsyOp')
1800 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1801 'echo g:flag ?? "yes"\_s*' ..
1802 '0 LOADG g:flag\_s*' ..
1803 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1804 '2 PUSHS "yes"\_s*' ..
1805 '3 ECHO 1\_s*' ..
1806 'echo \[\] ?? "empty list"\_s*' ..
1807 '4 NEWLIST size 0\_s*' ..
1808 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1809 '6 PUSHS "empty list"\_s*' ..
1810 '7 ECHO 1\_s*' ..
1811 'echo "" ?? "empty string"\_s*' ..
1812 '\d\+ PUSHS "empty string"\_s*' ..
1813 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001814 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001815 res)
1816enddef
1817
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001818def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001819 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001820 ['"xx" == "yy"', false],
1821 ['"aa" == "aa"', true],
1822 ['has("eval") ? true : false', true],
1823 ['has("asdf") ? true : false', false],
1824 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001825
Bram Moolenaarac564082020-09-27 19:05:33 +02001826 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001827 for case in cases
1828 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001829 ' if ' .. case[0],
1830 ' echo 42'
1831 ' endif',
1832 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001833 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001834 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001835 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001836 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001837 assert_match('TestCase' .. nr .. '.*' ..
1838 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1839 '\d PUSHNR 42.*' ..
1840 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001841 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001842 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001843 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001844 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001845 assert_match('TestCase' .. nr .. '.*' ..
1846 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1847 'echo 42[ \n]*' ..
1848 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001849 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001850 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001851 endif
1852
1853 nr += 1
1854 endfor
1855
1856 delete('Xdisassemble')
1857enddef
1858
Bram Moolenaarad39c092020-02-26 18:23:43 +01001859def s:Execute()
1860 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001861 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001862 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001863 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001864 execute 'help ' .. tag
1865enddef
1866
1867def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001868 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001869 assert_match('\<SNR>\d*_Execute\_s*' ..
1870 "execute 'help vim9.txt'\\_s*" ..
1871 '\d PUSHS "help vim9.txt"\_s*' ..
1872 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001873 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001874 '\d PUSHS "help vim9.txt"\_s*' ..
1875 '\d STORE $0\_s*' ..
1876 'execute cmd\_s*' ..
1877 '\d LOAD $0\_s*' ..
1878 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001879 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001880 '\d PUSHS "vim9.txt"\_s*' ..
1881 '\d STORE $1\_s*' ..
1882 "execute 'help ' .. tag\\_s*" ..
1883 '\d\+ PUSHS "help "\_s*' ..
1884 '\d\+ LOAD $1\_s*' ..
1885 '\d\+ CONCAT\_s*' ..
1886 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001887 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001888 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001889enddef
1890
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001891def s:Echomsg()
1892 echomsg 'some' 'message'
1893 echoerr 'went' .. 'wrong'
1894enddef
1895
1896def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001897 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001898 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1899 "echomsg 'some' 'message'\\_s*" ..
1900 '\d PUSHS "some"\_s*' ..
1901 '\d PUSHS "message"\_s*' ..
1902 '\d ECHOMSG 2\_s*' ..
1903 "echoerr 'went' .. 'wrong'\\_s*" ..
1904 '\d PUSHS "wentwrong"\_s*' ..
1905 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001906 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001907 res)
1908enddef
1909
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001910def SomeStringArg(arg: string)
1911 echo arg
1912enddef
1913
1914def SomeAnyArg(arg: any)
1915 echo arg
1916enddef
1917
1918def SomeStringArgAndReturn(arg: string): string
1919 return arg
1920enddef
1921
1922def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001923 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001924 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1925 '\d *echo arg.*' ..
1926 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001927 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001928
Bram Moolenaarac564082020-09-27 19:05:33 +02001929 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001930 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1931 '\d *echo arg\_s*' ..
1932 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001933 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001934
Bram Moolenaarac564082020-09-27 19:05:33 +02001935 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001936 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1937 '\d *return arg\_s*' ..
1938 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001939 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001940enddef
1941
Bram Moolenaar09689a02020-05-09 22:50:08 +02001942def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001943 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001944 vim9script
1945 def FuncOne(): string
1946 return FuncTwo()
1947 enddef
1948 def FuncTwo(): string
1949 return 'two'
1950 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001951 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001952 END
1953 writefile(lines, 'Xdisassemble')
1954 source Xdisassemble
1955
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001956 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001957 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1958 'return FuncTwo()\_s*' ..
1959 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001960 '\d RETURN',
1961 g:res_FuncOne)
1962
1963 delete('Xdisassemble')
1964 unlet g:res_FuncOne
1965enddef
1966
Bram Moolenaar61a89812020-05-07 16:58:17 +02001967def s:ConcatStrings(): string
1968 return 'one' .. 'two' .. 'three'
1969enddef
1970
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001971def s:ComputeConst(): number
1972 return 2 + 3 * 4 / 6 + 7
1973enddef
1974
Bram Moolenaar1c747212020-05-09 18:28:34 +02001975def s:ComputeConstParen(): number
1976 return ((2 + 4) * (8 / 2)) / (3 + 4)
1977enddef
1978
Bram Moolenaar61a89812020-05-07 16:58:17 +02001979def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001980 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001981 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1982 "return 'one' .. 'two' .. 'three'\\_s*" ..
1983 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001984 '\d RETURN',
1985 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001986
1987 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001988 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1989 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1990 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001991 '\d RETURN',
1992 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001993
1994 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001995 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1996 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1997 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001998 '\d RETURN',
1999 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002000enddef
2001
Bram Moolenaar389df252020-07-09 21:20:47 +02002002def s:CallAppend()
2003 eval "some text"->append(2)
2004enddef
2005
2006def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002007 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002008 assert_match('<SNR>\d*_CallAppend\_s*' ..
2009 'eval "some text"->append(2)\_s*' ..
2010 '\d PUSHS "some text"\_s*' ..
2011 '\d PUSHNR 2\_s*' ..
2012 '\d SHUFFLE 2 up 1\_s*' ..
2013 '\d BCALL append(argc 2)\_s*' ..
2014 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01002015 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02002016 res)
2017enddef
2018
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002019
2020def s:SilentMessage()
2021 silent echomsg "text"
2022 silent! echoerr "error"
2023enddef
2024
2025def Test_silent()
2026 var res = execute('disass s:SilentMessage')
2027 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2028 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002029 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002030 '\d PUSHS "text"\_s*' ..
2031 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002032 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002033 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002034 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002035 '\d PUSHS "error"\_s*' ..
2036 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002037 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002038 '\d\+ RETURN 0',
2039 res)
2040enddef
2041
2042def s:SilentIf()
2043 silent if 4 == g:five
2044 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002045 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002046enddef
2047
2048def Test_silent_if()
2049 var res = execute('disass s:SilentIf')
2050 assert_match('<SNR>\d*_SilentIf\_s*' ..
2051 'silent if 4 == g:five\_s*' ..
2052 '\d\+ CMDMOD silent\_s*' ..
2053 '\d\+ PUSHNR 4\_s*' ..
2054 '\d\+ LOADG g:five\_s*' ..
2055 '\d\+ COMPAREANY ==\_s*' ..
2056 '\d\+ CMDMOD_REV\_s*' ..
2057 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2058 'silent elseif 4 == g:five\_s*' ..
2059 '\d\+ JUMP -> \d\+\_s*' ..
2060 '\d\+ CMDMOD silent\_s*' ..
2061 '\d\+ PUSHNR 4\_s*' ..
2062 '\d\+ LOADG g:five\_s*' ..
2063 '\d\+ COMPAREANY ==\_s*' ..
2064 '\d\+ CMDMOD_REV\_s*' ..
2065 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002066 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002067 '\d\+ RETURN 0',
2068 res)
2069enddef
2070
2071def s:SilentFor()
2072 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002073 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002074enddef
2075
2076def Test_silent_for()
2077 var res = execute('disass s:SilentFor')
2078 assert_match('<SNR>\d*_SilentFor\_s*' ..
2079 'silent for i in \[0\]\_s*' ..
2080 '\d CMDMOD silent\_s*' ..
2081 '\d STORE -1 in $0\_s*' ..
2082 '\d PUSHNR 0\_s*' ..
2083 '\d NEWLIST size 1\_s*' ..
2084 '\d CMDMOD_REV\_s*' ..
2085 '5 FOR $0 -> 8\_s*' ..
2086 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002087 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002088 '\d JUMP -> 5\_s*' ..
2089 '8 DROP\_s*' ..
2090 '\d RETURN 0\_s*',
2091 res)
2092enddef
2093
2094def s:SilentWhile()
2095 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002096 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002097enddef
2098
2099def Test_silent_while()
2100 var res = execute('disass s:SilentWhile')
2101 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2102 'silent while g:not\_s*' ..
2103 '0 CMDMOD silent\_s*' ..
2104 '\d LOADG g:not\_s*' ..
2105 '\d COND2BOOL\_s*' ..
2106 '\d CMDMOD_REV\_s*' ..
2107 '\d JUMP_IF_FALSE -> 6\_s*' ..
2108
Bram Moolenaarfa984412021-03-25 22:15:28 +01002109 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002110 '\d JUMP -> 0\_s*' ..
2111 '6 RETURN 0\_s*',
2112 res)
2113enddef
2114
2115def s:SilentReturn(): string
2116 silent return "done"
2117enddef
2118
2119def Test_silent_return()
2120 var res = execute('disass s:SilentReturn')
2121 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2122 'silent return "done"\_s*' ..
2123 '\d CMDMOD silent\_s*' ..
2124 '\d PUSHS "done"\_s*' ..
2125 '\d CMDMOD_REV\_s*' ..
2126 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002127 res)
2128enddef
2129
Bram Moolenaarb2049902021-01-24 12:53:53 +01002130def s:Profiled(): string
2131 echo "profiled"
2132 return "done"
2133enddef
2134
2135def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002136 if !has('profile')
2137 MissingFeature 'profile'
2138 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002139 var res = execute('disass! s:Profiled')
2140 assert_match('<SNR>\d*_Profiled\_s*' ..
2141 'echo "profiled"\_s*' ..
2142 '\d PROFILE START line 1\_s*' ..
2143 '\d PUSHS "profiled"\_s*' ..
2144 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002145 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002146 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002147 '\d PROFILE START line 2\_s*' ..
2148 '\d PUSHS "done"\_s*' ..
2149 '\d RETURN\_s*' ..
2150 '\d PROFILE END',
2151 res)
2152enddef
2153
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002154def s:EchoMessages()
2155 echohl ErrorMsg | echom v:exception | echohl NONE
2156enddef
2157
2158def Test_disassemble_nextcmd()
2159 # splitting commands and removing trailing blanks should not change the line
2160 var res = execute('disass s:EchoMessages')
2161 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2162 'echohl ErrorMsg | echom v:exception | echohl NONE',
2163 res)
2164enddef
2165
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002166
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002167" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker