blob: 7ea1491e6332b1621bd6f8a9261608365d1cb16d [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 Moolenaard3aac292020-04-19 14:32:17 +020026 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020027 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020028 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020029 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020030 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020031 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010032 echo &tabstop
33 echo $ENVVAR
34 echo @z
35enddef
36
Bram Moolenaarf2460a32020-02-07 22:09:54 +010037def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010038 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020039 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010040 assert_fails('disass', 'E471:')
41 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020042 assert_fails('disass 234', 'E129:')
43 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010044
Bram Moolenaarac564082020-09-27 19:05:33 +020045 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020046 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010047 'buffers\_s*' ..
48 '\d\+ EXEC \+buffers\_s*' ..
49 'echo\_s*' ..
50 'echo arg\_s*' ..
51 '\d\+ LOAD arg\[-1\]\_s*' ..
52 '\d\+ ECHO 1\_s*' ..
53 'echo local\_s*' ..
54 '\d\+ LOAD $0\_s*' ..
55 '\d\+ ECHO 1\_s*' ..
56 'echo &lines\_s*' ..
57 '\d\+ LOADOPT &lines\_s*' ..
58 '\d\+ ECHO 1\_s*' ..
59 'echo v:version\_s*' ..
60 '\d\+ LOADV v:version\_s*' ..
61 '\d\+ ECHO 1\_s*' ..
62 'echo s:scriptvar\_s*' ..
63 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
64 '\d\+ ECHO 1\_s*' ..
65 'echo g:globalvar\_s*' ..
66 '\d\+ LOADG g:globalvar\_s*' ..
67 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020068 'echo get(g:, "global")\_s*' ..
69 '\d\+ LOAD g:\_s*' ..
70 '\d\+ PUSHS "global"\_s*' ..
71 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020072 ' LOADB b:buffervar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020073 'echo get(b:, "buffer")\_s*' ..
74 '\d\+ LOAD b:\_s*' ..
75 '\d\+ PUSHS "buffer"\_s*' ..
76 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020077 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020078 'echo get(w:, "window")\_s*' ..
79 '\d\+ LOAD w:\_s*' ..
80 '\d\+ PUSHS "window"\_s*' ..
81 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020082 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020083 'echo get(t:, "tab")\_s*' ..
84 '\d\+ LOAD t:\_s*' ..
85 '\d\+ PUSHS "tab"\_s*' ..
86 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020087 ' LOADENV $ENVVAR.*' ..
88 ' LOADREG @z.*',
89 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010090enddef
91
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020092def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +020093 var filename = "file"
94 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020095 edit the`=filename``=filenr`.txt
96enddef
97
98def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +020099 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200100 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200101 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200102 '\d PUSHS "file"\_s*' ..
103 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200104 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200105 '\d STORE 123 in $1\_s*' ..
106 ' edit the`=filename``=filenr`.txt\_s*' ..
107 '\d PUSHS "edit the"\_s*' ..
108 '\d LOAD $0\_s*' ..
109 '\d LOAD $1\_s*' ..
110 '\d 2STRING stack\[-1\]\_s*' ..
111 '\d\+ PUSHS ".txt"\_s*' ..
112 '\d\+ EXECCONCAT 4\_s*' ..
113 '\d\+ PUSHNR 0\_s*' ..
114 '\d\+ RETURN',
115 res)
116enddef
117
118def s:YankRange()
119 norm! m[jjm]
120 :'[,']yank
121enddef
122
123def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200124 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200125 assert_match('<SNR>\d*_YankRange.*' ..
126 ' norm! m\[jjm\]\_s*' ..
127 '\d EXEC norm! m\[jjm\]\_s*' ..
128 ' :''\[,''\]yank\_s*' ..
129 '\d EXEC :''\[,''\]yank\_s*' ..
130 '\d PUSHNR 0\_s*' ..
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200131 '\d RETURN',
132 res)
133enddef
134
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200135def s:PutExpr()
136 :3put ="text"
137enddef
138
139def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200140 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200141 assert_match('<SNR>\d*_PutExpr.*' ..
142 ' :3put ="text"\_s*' ..
143 '\d PUSHS "text"\_s*' ..
144 '\d PUT = 3\_s*' ..
145 '\d PUSHNR 0\_s*' ..
146 '\d RETURN',
147 res)
148enddef
149
Bram Moolenaar08597872020-12-10 19:43:40 +0100150def s:PutRange()
151 :$-2put a
152enddef
153
154def Test_disassemble_put_range()
155 var res = execute('disass s:PutRange')
156 assert_match('<SNR>\d*_PutRange.*' ..
157 ' :$-2put a\_s*' ..
158 '\d RANGE $-2\_s*' ..
159 '\d PUT a range\_s*' ..
160 '\d PUSHNR 0\_s*' ..
161 '\d RETURN',
162 res)
163enddef
164
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100165def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200166 var localbool = true
167 var localspec = v:none
168 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100169 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200170 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100171 endif
172enddef
173
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100174def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200175 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200176 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
177 'localbool = true.*' ..
178 ' PUSH v:true.*' ..
179 'localspec = v:none.*' ..
180 ' PUSH v:none.*' ..
181 'localblob = 0z1234.*' ..
182 ' PUSHBLOB 0z1234.*',
183 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100184 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200185 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
186 'localfloat = 1.234.*' ..
187 ' PUSHF 1.234.*',
188 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100189 endif
190enddef
191
192def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200193 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100194 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200195 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100196 localstr = 'xyz'
197 v:char = 'abc'
198 s:scriptvar = 'sv'
199 g:globalvar = 'gv'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200200 b:buffervar = 'bv'
201 w:windowvar = 'wv'
202 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100203 &tabstop = 8
204 $ENVVAR = 'ev'
205 @z = 'rv'
206enddef
207
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100208def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200209 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200210 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200211 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200212 'localnr = 2.*' ..
213 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200214 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200215 'localstr = ''xyz''.*' ..
216 ' STORE $1.*' ..
217 'v:char = ''abc''.*' ..
218 'STOREV v:char.*' ..
219 's:scriptvar = ''sv''.*' ..
220 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
221 'g:globalvar = ''gv''.*' ..
222 ' STOREG g:globalvar.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200223 'b:buffervar = ''bv''.*' ..
224 ' STOREB b:buffervar.*' ..
225 'w:windowvar = ''wv''.*' ..
226 ' STOREW w:windowvar.*' ..
227 't:tabpagevar = ''tv''.*' ..
228 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200229 '&tabstop = 8.*' ..
230 ' STOREOPT &tabstop.*' ..
231 '$ENVVAR = ''ev''.*' ..
232 ' STOREENV $ENVVAR.*' ..
233 '@z = ''rv''.*' ..
234 ' STOREREG @z.*',
235 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100236enddef
237
Bram Moolenaarcb790402020-05-15 20:53:00 +0200238def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200239 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200240 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200241 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200242 localdict["a"] = 456
243enddef
244
245def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200246 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200247 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200248 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200249 '\d NEWLIST size 0\_s*' ..
250 '\d STORE $0\_s*' ..
251 'locallist\[0\] = 123\_s*' ..
252 '\d PUSHNR 123\_s*' ..
253 '\d PUSHNR 0\_s*' ..
254 '\d LOAD $0\_s*' ..
255 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200257 '\d NEWDICT size 0\_s*' ..
258 '\d STORE $1\_s*' ..
259 'localdict\["a"\] = 456\_s*' ..
260 '\d\+ PUSHNR 456\_s*' ..
261 '\d\+ PUSHS "a"\_s*' ..
262 '\d\+ LOAD $1\_s*' ..
263 '\d\+ STOREDICT\_s*' ..
264 '\d\+ PUSHNR 0\_s*' ..
265 '\d\+ RETURN',
266 res)
267enddef
268
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200269def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200270 var x: string
271 var y: string
272 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200273 [x, y; l] = g:stringlist
274enddef
275
276def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200277 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200278 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200279 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200280 '\d PUSHS "\[NULL\]"\_s*' ..
281 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200282 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200283 '\d PUSHS "\[NULL\]"\_s*' ..
284 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200285 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200286 '\d NEWLIST size 0\_s*' ..
287 '\d STORE $2\_s*' ..
288 '\[x, y; l\] = g:stringlist\_s*' ..
289 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200290 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200291 '\d CHECKLEN >= 2\_s*' ..
292 '\d\+ ITEM 0\_s*' ..
293 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
294 '\d\+ STORE $0\_s*' ..
295 '\d\+ ITEM 1\_s*' ..
296 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
297 '\d\+ STORE $1\_s*' ..
298 '\d\+ SLICE 2\_s*' ..
299 '\d\+ STORE $2\_s*' ..
300 '\d\+ PUSHNR 0\_s*' ..
301 '\d\+ RETURN',
302 res)
303enddef
304
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200305def s:ListAdd()
306 var l: list<number> = []
307 add(l, 123)
308 add(l, g:aNumber)
309enddef
310
311def Test_disassemble_list_add()
312 var res = execute('disass s:ListAdd')
313 assert_match('<SNR>\d*_ListAdd\_s*' ..
314 'var l: list<number> = []\_s*' ..
315 '\d NEWLIST size 0\_s*' ..
316 '\d STORE $0\_s*' ..
317 'add(l, 123)\_s*' ..
318 '\d LOAD $0\_s*' ..
319 '\d PUSHNR 123\_s*' ..
320 '\d LISTAPPEND\_s*' ..
321 '\d DROP\_s*' ..
322 'add(l, g:aNumber)\_s*' ..
323 '\d LOAD $0\_s*' ..
324 '\d\+ LOADG g:aNumber\_s*' ..
325 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
326 '\d\+ LISTAPPEND\_s*' ..
327 '\d\+ DROP\_s*' ..
328 '\d\+ PUSHNR 0\_s*' ..
329 '\d\+ RETURN',
330 res)
331enddef
332
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200333def s:BlobAdd()
334 var b: blob = 0z
335 add(b, 123)
336 add(b, g:aNumber)
337enddef
338
339def Test_disassemble_blob_add()
340 var res = execute('disass s:BlobAdd')
341 assert_match('<SNR>\d*_BlobAdd\_s*' ..
342 'var b: blob = 0z\_s*' ..
343 '\d PUSHBLOB 0z\_s*' ..
344 '\d STORE $0\_s*' ..
345 'add(b, 123)\_s*' ..
346 '\d LOAD $0\_s*' ..
347 '\d PUSHNR 123\_s*' ..
348 '\d BLOBAPPEND\_s*' ..
349 '\d DROP\_s*' ..
350 'add(b, g:aNumber)\_s*' ..
351 '\d LOAD $0\_s*' ..
352 '\d\+ LOADG g:aNumber\_s*' ..
353 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
354 '\d\+ BLOBAPPEND\_s*' ..
355 '\d\+ DROP\_s*' ..
356 '\d\+ PUSHNR 0\_s*' ..
357 '\d\+ RETURN',
358 res)
359enddef
360
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200361def s:ScriptFuncUnlet()
362 g:somevar = "value"
363 unlet g:somevar
364 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200365 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200366enddef
367
368def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200369 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200370 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
371 'g:somevar = "value"\_s*' ..
372 '\d PUSHS "value"\_s*' ..
373 '\d STOREG g:somevar\_s*' ..
374 'unlet g:somevar\_s*' ..
375 '\d UNLET g:somevar\_s*' ..
376 'unlet! g:somevar\_s*' ..
377 '\d UNLET! g:somevar\_s*' ..
378 'unlet $SOMEVAR\_s*' ..
379 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200380 res)
381enddef
382
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100383def s:ScriptFuncTry()
384 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200385 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100386 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200387 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100388 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200389 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100390 endtry
391enddef
392
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100393def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200394 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200395 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
396 'try\_s*' ..
397 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
398 'echo "yes"\_s*' ..
399 '\d PUSHS "yes"\_s*' ..
400 '\d ECHO 1\_s*' ..
401 'catch /fail/\_s*' ..
402 '\d JUMP -> \d\+\_s*' ..
403 '\d PUSH v:exception\_s*' ..
404 '\d PUSHS "fail"\_s*' ..
405 '\d COMPARESTRING =\~\_s*' ..
406 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
407 '\d CATCH\_s*' ..
408 'echo "no"\_s*' ..
409 '\d\+ PUSHS "no"\_s*' ..
410 '\d\+ ECHO 1\_s*' ..
411 'finally\_s*' ..
412 'throw "end"\_s*' ..
413 '\d\+ PUSHS "end"\_s*' ..
414 '\d\+ THROW\_s*' ..
415 'endtry\_s*' ..
416 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200417 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100418enddef
419
420def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200421 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100422 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100423enddef
424
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100425def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200426 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200427 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200428 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200429 '\d PUSHNR 1\_s*' ..
430 '\d PUSHS "two"\_s*' ..
431 '\d PUSHNR 333\_s*' ..
432 '\d NEWLIST size 3\_s*' ..
433 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100434 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200435 '\d PUSHS "one"\_s*' ..
436 '\d PUSHNR 1\_s*' ..
437 '\d PUSHS "two"\_s*' ..
438 '\d PUSHS "val"\_s*' ..
439 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200440 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100441enddef
442
Bram Moolenaar6e949782020-04-13 17:21:00 +0200443def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100444 echo arg
445enddef
446
447func UserFunc()
448 echo 'nothing'
449endfunc
450
451func UserFuncWithArg(arg)
452 echo a:arg
453endfunc
454
455def s:ScriptFuncCall(): string
456 changenr()
457 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100458 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100459 FuncWithArg(343)
460 ScriptFuncNew()
461 s:ScriptFuncNew()
462 UserFunc()
463 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200464 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100465 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200466 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100467 FuncRefWithArg("bar")
468 return "yes"
469enddef
470
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100471def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200472 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200473 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
474 'changenr()\_s*' ..
475 '\d BCALL changenr(argc 0)\_s*' ..
476 '\d DROP\_s*' ..
477 'char2nr("abc")\_s*' ..
478 '\d PUSHS "abc"\_s*' ..
479 '\d BCALL char2nr(argc 1)\_s*' ..
480 '\d DROP\_s*' ..
481 'Test_disassemble_new()\_s*' ..
482 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
483 '\d DROP\_s*' ..
484 'FuncWithArg(343)\_s*' ..
485 '\d\+ PUSHNR 343\_s*' ..
486 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
487 '\d\+ DROP\_s*' ..
488 'ScriptFuncNew()\_s*' ..
489 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
490 '\d\+ DROP\_s*' ..
491 's:ScriptFuncNew()\_s*' ..
492 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
493 '\d\+ DROP\_s*' ..
494 'UserFunc()\_s*' ..
495 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
496 '\d\+ DROP\_s*' ..
497 'UserFuncWithArg("foo")\_s*' ..
498 '\d\+ PUSHS "foo"\_s*' ..
499 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
500 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200501 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200502 '\d\+ PUSHS "UserFunc"\_s*' ..
503 '\d\+ BCALL function(argc 1)\_s*' ..
504 '\d\+ STORE $0\_s*' ..
505 'FuncRef()\_s*' ..
506 '\d\+ LOAD $\d\_s*' ..
507 '\d\+ PCALL (argc 0)\_s*' ..
508 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200509 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200510 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
511 '\d\+ BCALL function(argc 1)\_s*' ..
512 '\d\+ STORE $1\_s*' ..
513 'FuncRefWithArg("bar")\_s*' ..
514 '\d\+ PUSHS "bar"\_s*' ..
515 '\d\+ LOAD $\d\_s*' ..
516 '\d\+ PCALL (argc 1)\_s*' ..
517 '\d\+ DROP\_s*' ..
518 'return "yes"\_s*' ..
519 '\d\+ PUSHS "yes"\_s*' ..
520 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200521 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100522enddef
523
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200524
525def s:CreateRefs()
526 var local = 'a'
527 def Append(arg: string)
528 local ..= arg
529 enddef
530 g:Append = Append
531 def Get(): string
532 return local
533 enddef
534 g:Get = Get
535enddef
536
537def Test_disassemble_closure()
538 CreateRefs()
539 var res = execute('disass g:Append')
540 assert_match('<lambda>\d\_s*' ..
541 'local ..= arg\_s*' ..
542 '\d LOADOUTER $0\_s*' ..
543 '\d LOAD arg\[-1\]\_s*' ..
544 '\d CONCAT\_s*' ..
545 '\d STOREOUTER $0\_s*' ..
546 '\d PUSHNR 0\_s*' ..
547 '\d RETURN',
548 res)
549
550 res = execute('disass g:Get')
551 assert_match('<lambda>\d\_s*' ..
552 'return local\_s*' ..
553 '\d LOADOUTER $0\_s*' ..
554 '\d RETURN',
555 res)
556
557 unlet g:Append
558 unlet g:Get
559enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200560
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100561
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200562def EchoArg(arg: string): string
563 return arg
564enddef
565def RefThis(): func
566 return function('EchoArg')
567enddef
568def s:ScriptPCall()
569 RefThis()("text")
570enddef
571
572def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200573 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200574 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
575 'RefThis()("text")\_s*' ..
576 '\d DCALL RefThis(argc 0)\_s*' ..
577 '\d PUSHS "text"\_s*' ..
578 '\d PCALL top (argc 1)\_s*' ..
579 '\d PCALL end\_s*' ..
580 '\d DROP\_s*' ..
581 '\d PUSHNR 0\_s*' ..
582 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200583 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200584enddef
585
586
Bram Moolenaara26b9702020-04-18 19:53:28 +0200587def s:FuncWithForwardCall(): string
588 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100589enddef
590
591def DefinedLater(arg: string): string
592 return arg
593enddef
594
595def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200596 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200597 assert_match('FuncWithForwardCall\_s*' ..
598 'return g:DefinedLater("yes")\_s*' ..
599 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200600 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200601 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200602 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100603
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200604 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100605 assert_equal('yes', FuncWithForwardCall())
606
Bram Moolenaara26b9702020-04-18 19:53:28 +0200607 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200608 assert_match('FuncWithForwardCall\_s*' ..
609 'return g:DefinedLater("yes")\_s*' ..
610 '\d PUSHS "yes"\_s*' ..
611 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200612 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200613 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100614enddef
615
616
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100617def FuncWithDefault(arg: string = 'default'): string
618 return arg
619enddef
620
621def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200622 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200623 assert_match('FuncWithDefault\_s*' ..
624 '\d PUSHS "default"\_s*' ..
625 '\d STORE arg\[-1]\_s*' ..
626 'return arg\_s*' ..
627 '\d LOAD arg\[-1]\_s*' ..
628 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200629 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100630enddef
631
632
Bram Moolenaar158906c2020-02-06 20:39:45 +0100633def HasEval()
634 if has("eval")
635 echo "yes"
636 else
637 echo "no"
638 endif
639enddef
640
641def HasNothing()
642 if has("nothing")
643 echo "yes"
644 else
645 echo "no"
646 endif
647enddef
648
649def HasSomething()
650 if has("nothing")
651 echo "nothing"
652 elseif has("something")
653 echo "something"
654 elseif has("eval")
655 echo "eval"
656 elseif has("less")
657 echo "less"
658 endif
659enddef
660
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100661def HasGuiRunning()
662 if has("gui_running")
663 echo "yes"
664 else
665 echo "no"
666 endif
667enddef
668
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100669def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200670 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200671 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200672 assert_match('HasEval\_s*' ..
673 'if has("eval")\_s*' ..
674 'echo "yes"\_s*' ..
675 '\d PUSHS "yes"\_s*' ..
676 '\d ECHO 1\_s*' ..
677 'else\_s*' ..
678 'echo "no"\_s*' ..
679 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200680 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100681 assert_notmatch('JUMP', instr)
682
Bram Moolenaard2c61702020-09-06 15:58:36 +0200683 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100684 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200685 assert_match('HasNothing\_s*' ..
686 'if has("nothing")\_s*' ..
687 'echo "yes"\_s*' ..
688 'else\_s*' ..
689 'echo "no"\_s*' ..
690 '\d PUSHS "no"\_s*' ..
691 '\d ECHO 1\_s*' ..
692 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200693 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100694 assert_notmatch('PUSHS "yes"', instr)
695 assert_notmatch('JUMP', instr)
696
Bram Moolenaard2c61702020-09-06 15:58:36 +0200697 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100698 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200699 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200700 'if has("nothing")\_s*' ..
701 'echo "nothing"\_s*' ..
702 'elseif has("something")\_s*' ..
703 'echo "something"\_s*' ..
704 'elseif has("eval")\_s*' ..
705 'echo "eval"\_s*' ..
706 '\d PUSHS "eval"\_s*' ..
707 '\d ECHO 1\_s*' ..
708 'elseif has("less").*' ..
709 'echo "less"\_s*' ..
710 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200711 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100712 assert_notmatch('PUSHS "nothing"', instr)
713 assert_notmatch('PUSHS "something"', instr)
714 assert_notmatch('PUSHS "less"', instr)
715 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100716
717 var result: string
718 var instr_expected: string
719 if has('gui')
720 if has('gui_running')
721 # GUI already running, always returns "yes"
722 result = "\nyes"
723 instr_expected = 'HasGuiRunning.*' ..
724 'if has("gui_running")\_s*' ..
725 ' echo "yes"\_s*' ..
726 '\d PUSHS "yes"\_s*' ..
727 '\d ECHO 1\_s*' ..
728 'else\_s*' ..
729 ' echo "no"\_s*' ..
730 'endif'
731 else
732 result = "\nno"
733 if has('unix')
734 # GUI not running but can start later, call has()
735 instr_expected = 'HasGuiRunning.*' ..
736 'if has("gui_running")\_s*' ..
737 '\d PUSHS "gui_running"\_s*' ..
738 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100739 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100740 '\d JUMP_IF_FALSE -> \d\_s*' ..
741 ' echo "yes"\_s*' ..
742 '\d PUSHS "yes"\_s*' ..
743 '\d ECHO 1\_s*' ..
744 'else\_s*' ..
745 '\d JUMP -> \d\_s*' ..
746 ' echo "no"\_s*' ..
747 '\d PUSHS "no"\_s*' ..
748 '\d ECHO 1\_s*' ..
749 'endif'
750 else
751 # GUI not running, always return "no"
752 instr_expected = 'HasGuiRunning.*' ..
753 'if has("gui_running")\_s*' ..
754 ' echo "yes"\_s*' ..
755 'else\_s*' ..
756 ' echo "no"\_s*' ..
757 '\d PUSHS "no"\_s*' ..
758 '\d ECHO 1\_s*' ..
759 'endif'
760 endif
761 endif
762 else
763 # GUI not supported, always return "no"
764 result = "\nno"
765 instr_expected = 'HasGuiRunning.*' ..
766 'if has("gui_running")\_s*' ..
767 ' echo "yes"\_s*' ..
768 'else\_s*' ..
769 ' echo "no"\_s*' ..
770 '\d PUSHS "no"\_s*' ..
771 '\d ECHO 1\_s*' ..
772 'endif'
773 endif
774
775 assert_equal(result, execute('HasGuiRunning()'))
776 instr = execute('disassemble HasGuiRunning')
777 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100778enddef
779
Bram Moolenaarefd88552020-06-18 20:50:10 +0200780def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100781 if 1 < 0
782 return "maybe"
783 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200784 if g:cond
785 return "yes"
786 else
787 return "no"
788 endif
789enddef
790
791def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200792 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200793 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100794 'if 1 < 0\_s*' ..
795 ' return "maybe"\_s*' ..
796 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200797 'if g:cond\_s*' ..
798 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100799 '1 COND2BOOL\_s*' ..
800 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200801 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100802 '3 PUSHS "yes"\_s*' ..
803 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200804 'else\_s*' ..
805 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100806 '5 PUSHS "no"\_s*' ..
807 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200808 instr)
809enddef
810
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100811def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200812 var Funky1: func
813 var Funky2: func = function("len")
814 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100815enddef
816
817def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200818 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200819 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200820 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200821 '0 PUSHFUNC "\[none]"\_s*' ..
822 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200823 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200824 '2 PUSHS "len"\_s*' ..
825 '3 BCALL function(argc 1)\_s*' ..
826 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200827 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200828 '\d PUSHS "UserFunc"\_s*' ..
829 '\d BCALL funcref(argc 1)\_s*' ..
830 '\d STORE $2\_s*' ..
831 '\d PUSHNR 0\_s*' ..
832 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200833 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100834enddef
835
836if has('channel')
837 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200838 var job1: job
839 var job2: job = job_start("donothing")
840 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100841 enddef
842endif
843
844def Test_disassemble_channel()
845 CheckFeature channel
846
Bram Moolenaarac564082020-09-27 19:05:33 +0200847 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200848 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200849 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200850 '\d PUSHJOB "no process"\_s*' ..
851 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200852 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200853 '\d PUSHS "donothing"\_s*' ..
854 '\d BCALL job_start(argc 1)\_s*' ..
855 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200856 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200857 '\d PUSHCHANNEL 0\_s*' ..
858 '\d STORE $2\_s*' ..
859 '\d PUSHNR 0\_s*' ..
860 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200861 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100862enddef
863
Bram Moolenaar777770f2020-02-06 21:27:08 +0100864def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200865 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100866 return F("x")
867enddef
868
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100869def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100870 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200871 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200872 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200873 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200874 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200875 '\d STORE $0\_s*' ..
876 'return F("x")\_s*' ..
877 '\d PUSHS "x"\_s*' ..
878 '\d LOAD $0\_s*' ..
879 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200880 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200881 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200882
Bram Moolenaarac564082020-09-27 19:05:33 +0200883 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200884 instr = execute('disassemble ' .. name)
885 assert_match('<lambda>\d\+\_s*' ..
886 'return "X" .. a .. "X"\_s*' ..
887 '\d PUSHS "X"\_s*' ..
888 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200889 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200890 '\d CONCAT\_s*' ..
891 '\d PUSHS "X"\_s*' ..
892 '\d CONCAT\_s*' ..
893 '\d RETURN',
894 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100895enddef
896
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100897def LambdaWithType(): number
898 var Ref = {a: number -> a + 10}
899 return Ref(g:value)
900enddef
901
902def Test_disassemble_lambda_with_type()
903 g:value = 5
904 assert_equal(15, LambdaWithType())
905 var instr = execute('disassemble LambdaWithType')
906 assert_match('LambdaWithType\_s*' ..
907 'var Ref = {a: number -> a + 10}\_s*' ..
908 '\d FUNCREF <lambda>\d\+\_s*' ..
909 '\d STORE $0\_s*' ..
910 'return Ref(g:value)\_s*' ..
911 '\d LOADG g:value\_s*' ..
912 '\d LOAD $0\_s*' ..
913 '\d CHECKTYPE number stack\[-2\]\_s*' ..
914 '\d PCALL (argc 1)\_s*' ..
915 '\d RETURN',
916 instr)
917enddef
918
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200919def NestedOuter()
920 def g:Inner()
921 echomsg "inner"
922 enddef
923enddef
924
925def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200926 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200927 assert_match('NestedOuter\_s*' ..
928 'def g:Inner()\_s*' ..
929 'echomsg "inner"\_s*' ..
930 'enddef\_s*' ..
931 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
932 '\d PUSHNR 0\_s*' ..
933 '\d RETURN',
934 instr)
935enddef
936
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100937def NestedDefList()
938 def
939 def Info
940 def /Info
941 def /Info/
942enddef
943
944def Test_nested_def_list()
945 var instr = execute('disassemble NestedDefList')
946 assert_match('NestedDefList\_s*' ..
947 'def\_s*' ..
948 '\d DEF \_s*' ..
949 'def Info\_s*' ..
950 '\d DEF Info\_s*' ..
951 'def /Info\_s*' ..
952 '\d DEF /Info\_s*' ..
953 'def /Info/\_s*' ..
954 '\d DEF /Info/\_s*' ..
955 '\d PUSHNR 0\_s*' ..
956 '\d RETURN',
957 instr)
958enddef
959
Bram Moolenaar6e949782020-04-13 17:21:00 +0200960def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100961 if arg == 1 && arg != 2 || arg == 4
962 return 'yes'
963 endif
964 return 'no'
965enddef
966
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100967def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100968 assert_equal("yes", AndOr(1))
969 assert_equal("no", AndOr(2))
970 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200971 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200972 assert_match('AndOr\_s*' ..
973 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
974 '\d LOAD arg\[-1]\_s*' ..
975 '\d PUSHNR 1\_s*' ..
976 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200977 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200978 '\d LOAD arg\[-1]\_s*' ..
979 '\d PUSHNR 2\_s*' ..
980 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200981 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200982 '\d LOAD arg\[-1]\_s*' ..
983 '\d\+ PUSHNR 4\_s*' ..
984 '\d\+ COMPAREANY ==\_s*' ..
985 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200986 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100987enddef
988
Bram Moolenaar04d05222020-02-06 22:06:54 +0100989def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +0200990 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +0100991 for i in range(3)
992 res->add(i)
993 endfor
994 return res
995enddef
996
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100997def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +0100998 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +0200999 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001000 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001001 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001002 '\d NEWLIST size 0\_s*' ..
1003 '\d STORE $0\_s*' ..
1004 'for i in range(3)\_s*' ..
1005 '\d STORE -1 in $1\_s*' ..
1006 '\d PUSHNR 3\_s*' ..
1007 '\d BCALL range(argc 1)\_s*' ..
1008 '\d FOR $1 -> \d\+\_s*' ..
1009 '\d STORE $2\_s*' ..
1010 'res->add(i)\_s*' ..
1011 '\d LOAD $0\_s*' ..
1012 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001013 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001014 '\d\+ DROP\_s*' ..
1015 'endfor\_s*' ..
1016 '\d\+ JUMP -> \d\+\_s*' ..
1017 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001018 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001019enddef
1020
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001021def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001022 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001023 for str in eval('["one", "two"]')
1024 res ..= str
1025 endfor
1026 return res
1027enddef
1028
1029def Test_disassemble_for_loop_eval()
1030 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001031 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001032 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001033 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001034 '\d PUSHS ""\_s*' ..
1035 '\d STORE $0\_s*' ..
1036 'for str in eval(''\["one", "two"\]'')\_s*' ..
1037 '\d STORE -1 in $1\_s*' ..
1038 '\d PUSHS "\["one", "two"\]"\_s*' ..
1039 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001040 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001041 '\d FOR $1 -> \d\+\_s*' ..
1042 '\d STORE $2\_s*' ..
1043 'res ..= str\_s*' ..
1044 '\d\+ LOAD $0\_s*' ..
1045 '\d\+ LOAD $2\_s*' ..
1046 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1047 '\d\+ CONCAT\_s*' ..
1048 '\d\+ STORE $0\_s*' ..
1049 'endfor\_s*' ..
1050 '\d\+ JUMP -> 6\_s*' ..
1051 '\d\+ DROP\_s*' ..
1052 'return res\_s*' ..
1053 '\d\+ LOAD $0\_s*' ..
1054 '\d\+ RETURN',
1055 instr)
1056enddef
1057
Bram Moolenaar792f7862020-11-23 08:31:18 +01001058def ForLoopUnpack()
1059 for [x1, x2] in [[1, 2], [3, 4]]
1060 echo x1 x2
1061 endfor
1062enddef
1063
1064def Test_disassemble_for_loop_unpack()
1065 var instr = execute('disassemble ForLoopUnpack')
1066 assert_match('ForLoopUnpack\_s*' ..
1067 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1068 '\d\+ STORE -1 in $0\_s*' ..
1069 '\d\+ PUSHNR 1\_s*' ..
1070 '\d\+ PUSHNR 2\_s*' ..
1071 '\d\+ NEWLIST size 2\_s*' ..
1072 '\d\+ PUSHNR 3\_s*' ..
1073 '\d\+ PUSHNR 4\_s*' ..
1074 '\d\+ NEWLIST size 2\_s*' ..
1075 '\d\+ NEWLIST size 2\_s*' ..
1076 '\d\+ FOR $0 -> 16\_s*' ..
1077 '\d\+ UNPACK 2\_s*' ..
1078 '\d\+ STORE $1\_s*' ..
1079 '\d\+ STORE $2\_s*' ..
1080 'echo x1 x2\_s*' ..
1081 '\d\+ LOAD $1\_s*' ..
1082 '\d\+ LOAD $2\_s*' ..
1083 '\d\+ ECHO 2\_s*' ..
1084 'endfor\_s*' ..
1085 '\d\+ JUMP -> 8\_s*' ..
1086 '\d\+ DROP\_s*' ..
1087 '\d\+ PUSHNR 0\_s*' ..
1088 '\d\+ RETURN',
1089 instr)
1090enddef
1091
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001092let g:number = 42
1093
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001094def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001095 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001096enddef
1097
1098def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001099 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001100 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001101 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001102 '\d PUSHNR 23\_s*' ..
1103 '\d LOADG g:number\_s*' ..
1104 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1105 '\d NEWLIST size 2\_s*' ..
1106 '\d STORE $0\_s*' ..
1107 '\d PUSHNR 0\_s*' ..
1108 '\d RETURN\_s*',
1109 instr)
1110enddef
1111
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001112def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001113 var nr = 3
1114 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001115 nrres = nr - 7
1116 nrres = nr * 7
1117 nrres = nr / 7
1118 nrres = nr % 7
1119
Bram Moolenaarac564082020-09-27 19:05:33 +02001120 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001121 anyres = g:number - 7
1122 anyres = g:number * 7
1123 anyres = g:number / 7
1124 anyres = g:number % 7
1125
1126 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001127 var fl = 3.0
1128 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001129 flres = fl - 7.0
1130 flres = fl * 7.0
1131 flres = fl / 7.0
1132 endif
1133enddef
1134
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001135def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001136 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001137 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001138 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001139 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001140 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001141 '\d LOAD $0.*' ..
1142 '\d PUSHNR 7.*' ..
1143 '\d OPNR +.*' ..
1144 '\d STORE $1.*' ..
1145 'nrres = nr - 7.*' ..
1146 '\d OPNR -.*' ..
1147 'nrres = nr \* 7.*' ..
1148 '\d OPNR \*.*' ..
1149 'nrres = nr / 7.*' ..
1150 '\d OPNR /.*' ..
1151 'nrres = nr % 7.*' ..
1152 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001153 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001154 '\d LOADG g:number.*' ..
1155 '\d PUSHNR 7.*' ..
1156 '\d OPANY +.*' ..
1157 '\d STORE $2.*' ..
1158 'anyres = g:number - 7.*' ..
1159 '\d OPANY -.*' ..
1160 'anyres = g:number \* 7.*' ..
1161 '\d OPANY \*.*' ..
1162 'anyres = g:number / 7.*' ..
1163 '\d OPANY /.*' ..
1164 'anyres = g:number % 7.*' ..
1165 '\d OPANY %.*',
1166 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001167 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001168 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001169 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001170 '\d PUSHF 3.0.*' ..
1171 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001172 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001173 '\d LOAD $3.*' ..
1174 '\d PUSHF 7.0.*' ..
1175 '\d OPFLOAT +.*' ..
1176 '\d STORE $4.*' ..
1177 'flres = fl - 7.0.*' ..
1178 '\d OPFLOAT -.*' ..
1179 'flres = fl \* 7.0.*' ..
1180 '\d OPFLOAT \*.*' ..
1181 'flres = fl / 7.0.*' ..
1182 '\d OPFLOAT /.*',
1183 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001184 endif
1185enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001186
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001187def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001188 var reslist = [1, 2] + [3, 4]
1189 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001190enddef
1191
1192def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001193 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001194 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001195 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001196 '\d PUSHNR 1.*' ..
1197 '\d PUSHNR 2.*' ..
1198 '\d NEWLIST size 2.*' ..
1199 '\d PUSHNR 3.*' ..
1200 '\d PUSHNR 4.*' ..
1201 '\d NEWLIST size 2.*' ..
1202 '\d ADDLIST.*' ..
1203 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001204 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001205 '\d PUSHBLOB 0z1122.*' ..
1206 '\d PUSHBLOB 0z3344.*' ..
1207 '\d ADDBLOB.*' ..
1208 '\d STORE $.*',
1209 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001210enddef
1211
1212let g:aa = 'aa'
1213def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001215 return res
1216enddef
1217
1218def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001219 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001220 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001221 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001222 '\d LOADG g:aa.*' ..
1223 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001224 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001225 '\d CONCAT.*' ..
1226 '\d STORE $.*',
1227 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001228 assert_equal('aabb', ConcatString())
1229enddef
1230
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001231def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001232 var s = "abcd"
1233 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001234 return res
1235enddef
1236
1237def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001238 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001239 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001240 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001241 '\d PUSHS "abcd"\_s*' ..
1242 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001243 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001244 '\d LOAD $0\_s*' ..
1245 '\d PUSHNR 1\_s*' ..
1246 '\d STRINDEX\_s*' ..
1247 '\d STORE $1\_s*',
1248 instr)
1249 assert_equal('b', StringIndex())
1250enddef
1251
Bram Moolenaared591872020-08-15 22:14:53 +02001252def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 var s = "abcd"
1254 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001255 return res
1256enddef
1257
1258def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001259 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001260 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001261 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001262 '\d PUSHS "abcd"\_s*' ..
1263 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001264 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001265 '\d LOAD $0\_s*' ..
1266 '\d PUSHNR 1\_s*' ..
1267 '\d PUSHNR 8\_s*' ..
1268 '\d STRSLICE\_s*' ..
1269 '\d STORE $1\_s*',
1270 instr)
1271 assert_equal('bcd', StringSlice())
1272enddef
1273
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001274def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001275 var l = [1, 2, 3]
1276 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001277 return res
1278enddef
1279
1280def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001281 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001282 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001283 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001284 '\d PUSHNR 1\_s*' ..
1285 '\d PUSHNR 2\_s*' ..
1286 '\d PUSHNR 3\_s*' ..
1287 '\d NEWLIST size 3\_s*' ..
1288 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001289 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001290 '\d LOAD $0\_s*' ..
1291 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001292 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001293 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001294 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001295 assert_equal(2, ListIndex())
1296enddef
1297
Bram Moolenaared591872020-08-15 22:14:53 +02001298def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001299 var l = [1, 2, 3]
1300 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001301 return res
1302enddef
1303
1304def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001305 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001306 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001307 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001308 '\d PUSHNR 1\_s*' ..
1309 '\d PUSHNR 2\_s*' ..
1310 '\d PUSHNR 3\_s*' ..
1311 '\d NEWLIST size 3\_s*' ..
1312 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001313 'var res = l\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001314 '\d LOAD $0\_s*' ..
1315 '\d PUSHNR 1\_s*' ..
1316 '\d PUSHNR 8\_s*' ..
1317 '\d LISTSLICE\_s*' ..
1318 '\d STORE $1\_s*',
1319 instr)
1320 assert_equal([2, 3], ListSlice())
1321enddef
1322
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001323def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001324 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001325 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001326 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001327 return res
1328enddef
1329
1330def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001331 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001332 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001333 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001334 '\d PUSHS "item"\_s*' ..
1335 '\d PUSHNR 1\_s*' ..
1336 '\d NEWDICT size 1\_s*' ..
1337 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001338 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001339 '\d\+ LOAD $0\_s*' ..
1340 '\d\+ MEMBER item\_s*' ..
1341 '\d\+ STORE $1\_s*' ..
1342 'res = d\["item"\]\_s*' ..
1343 '\d\+ LOAD $0\_s*' ..
1344 '\d\+ PUSHS "item"\_s*' ..
1345 '\d\+ MEMBER\_s*' ..
1346 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001347 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001348 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001349enddef
1350
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001351let somelist = [1, 2, 3, 4, 5]
1352def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001353 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001354 return res
1355enddef
1356
1357def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001358 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001359 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001361 '\d LOADG g:somelist\_s*' ..
1362 '\d PUSHNR 2\_s*' ..
1363 '\d ANYINDEX\_s*' ..
1364 '\d STORE $0\_s*' ..
1365 'return res\_s*' ..
1366 '\d LOAD $0\_s*' ..
1367 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1368 '\d RETURN',
1369 instr)
1370 assert_equal(3, AnyIndex())
1371enddef
1372
1373def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001374 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001375 return res
1376enddef
1377
1378def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001379 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001380 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001381 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001382 '\d LOADG g:somelist\_s*' ..
1383 '\d PUSHNR 1\_s*' ..
1384 '\d PUSHNR 3\_s*' ..
1385 '\d ANYSLICE\_s*' ..
1386 '\d STORE $0\_s*' ..
1387 'return res\_s*' ..
1388 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001389 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001390 '\d RETURN',
1391 instr)
1392 assert_equal([2, 3, 4], AnySlice())
1393enddef
1394
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001395def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001396 var nr = 9
1397 var plus = +nr
1398 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001399 return res
1400enddef
1401
1402def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001404 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001405 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001406 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001407 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001408 '\d LOAD $0\_s*' ..
1409 '\d CHECKNR\_s*' ..
1410 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001411 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001412 '\d LOAD $0\_s*' ..
1413 '\d NEGATENR\_s*' ..
1414 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001415 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001416 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001417enddef
1418
1419def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001420 var flag = true
1421 var invert = !flag
1422 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001423 return res
1424enddef
1425
1426def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001427 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001428 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001429 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001430 '\d PUSH v:true\_s*' ..
1431 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001432 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001433 '\d LOAD $0\_s*' ..
1434 '\d INVERT (!val)\_s*' ..
1435 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001436 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001437 '\d LOAD $0\_s*' ..
1438 '\d 2BOOL (!!val)\_s*' ..
1439 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001440 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001441 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001442enddef
1443
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001444def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001445 var name: bool = 1 && 0 || 1
1446 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001447enddef
1448
1449def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001450 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001451 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001452 'var name: bool = 1 && 0 || 1\_s*' ..
1453 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001454 '1 2BOOL (!!val)\_s*' ..
1455 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1456 '3 PUSHNR 0\_s*' ..
1457 '4 2BOOL (!!val)\_s*' ..
1458 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1459 '6 PUSHNR 1\_s*' ..
1460 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001461 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001462 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001463 '\d\+ LOAD $0\_s*' ..
1464 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001465 instr)
1466 assert_equal(true, InvertBool())
1467enddef
1468
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001469def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001470 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001471 ['true == isFalse', 'COMPAREBOOL =='],
1472 ['true != isFalse', 'COMPAREBOOL !='],
1473 ['v:none == isNull', 'COMPARESPECIAL =='],
1474 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001475
Bram Moolenaara5565e42020-05-09 15:44:01 +02001476 ['111 == aNumber', 'COMPARENR =='],
1477 ['111 != aNumber', 'COMPARENR !='],
1478 ['111 > aNumber', 'COMPARENR >'],
1479 ['111 < aNumber', 'COMPARENR <'],
1480 ['111 >= aNumber', 'COMPARENR >='],
1481 ['111 <= aNumber', 'COMPARENR <='],
1482 ['111 =~ aNumber', 'COMPARENR =\~'],
1483 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001484
Bram Moolenaara5565e42020-05-09 15:44:01 +02001485 ['"xx" != aString', 'COMPARESTRING !='],
1486 ['"xx" > aString', 'COMPARESTRING >'],
1487 ['"xx" < aString', 'COMPARESTRING <'],
1488 ['"xx" >= aString', 'COMPARESTRING >='],
1489 ['"xx" <= aString', 'COMPARESTRING <='],
1490 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1491 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1492 ['"xx" is aString', 'COMPARESTRING is'],
1493 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001494
Bram Moolenaara5565e42020-05-09 15:44:01 +02001495 ['0z11 == aBlob', 'COMPAREBLOB =='],
1496 ['0z11 != aBlob', 'COMPAREBLOB !='],
1497 ['0z11 is aBlob', 'COMPAREBLOB is'],
1498 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001499
Bram Moolenaara5565e42020-05-09 15:44:01 +02001500 ['[1, 2] == aList', 'COMPARELIST =='],
1501 ['[1, 2] != aList', 'COMPARELIST !='],
1502 ['[1, 2] is aList', 'COMPARELIST is'],
1503 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001504
Bram Moolenaare0de1712020-12-02 17:36:54 +01001505 ['{a: 1} == aDict', 'COMPAREDICT =='],
1506 ['{a: 1} != aDict', 'COMPAREDICT !='],
1507 ['{a: 1} is aDict', 'COMPAREDICT is'],
1508 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001509
1510 ['{->33} == {->44}', 'COMPAREFUNC =='],
1511 ['{->33} != {->44}', 'COMPAREFUNC !='],
1512 ['{->33} is {->44}', 'COMPAREFUNC is'],
1513 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1514
1515 ['77 == g:xx', 'COMPAREANY =='],
1516 ['77 != g:xx', 'COMPAREANY !='],
1517 ['77 > g:xx', 'COMPAREANY >'],
1518 ['77 < g:xx', 'COMPAREANY <'],
1519 ['77 >= g:xx', 'COMPAREANY >='],
1520 ['77 <= g:xx', 'COMPAREANY <='],
1521 ['77 =~ g:xx', 'COMPAREANY =\~'],
1522 ['77 !~ g:xx', 'COMPAREANY !\~'],
1523 ['77 is g:xx', 'COMPAREANY is'],
1524 ['77 isnot g:xx', 'COMPAREANY isnot'],
1525 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001526 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001527 if has('float')
1528 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001529 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1530 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1531 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1532 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1533 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1534 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1535 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1536 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001537 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001538 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001539 endif
1540
Bram Moolenaarac564082020-09-27 19:05:33 +02001541 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001542 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001543 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001544 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001545 ' var isFalse = false',
1546 ' var isNull = v:null',
1547 ' var aNumber = 222',
1548 ' var aString = "yy"',
1549 ' var aBlob = 0z22',
1550 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001551 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001552 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001553 ' if ' .. case[0],
1554 ' echo 42'
1555 ' endif',
1556 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001557 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001558 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001559 assert_match('TestCase' .. nr .. '.*' ..
1560 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1561 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001562 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001563 '\d ' .. case[1] .. '.*' ..
1564 '\d JUMP_IF_FALSE -> \d\+.*',
1565 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001566
1567 nr += 1
1568 endfor
1569
Bram Moolenaar22da5592020-03-19 14:52:20 +01001570 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001571enddef
1572
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001573def s:FalsyOp()
1574 echo g:flag ?? "yes"
1575 echo [] ?? "empty list"
1576 echo "" ?? "empty string"
1577enddef
1578
1579def Test_dsassemble_falsy_op()
1580 var res = execute('disass s:FalsyOp')
1581 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1582 'echo g:flag ?? "yes"\_s*' ..
1583 '0 LOADG g:flag\_s*' ..
1584 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1585 '2 PUSHS "yes"\_s*' ..
1586 '3 ECHO 1\_s*' ..
1587 'echo \[\] ?? "empty list"\_s*' ..
1588 '4 NEWLIST size 0\_s*' ..
1589 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1590 '6 PUSHS "empty list"\_s*' ..
1591 '7 ECHO 1\_s*' ..
1592 'echo "" ?? "empty string"\_s*' ..
1593 '\d\+ PUSHS "empty string"\_s*' ..
1594 '\d\+ ECHO 1\_s*' ..
1595 '\d\+ PUSHNR 0\_s*' ..
1596 '\d\+ RETURN',
1597 res)
1598enddef
1599
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001600def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001601 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001602 ['"xx" == "yy"', false],
1603 ['"aa" == "aa"', true],
1604 ['has("eval") ? true : false', true],
1605 ['has("asdf") ? true : false', false],
1606 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001607
Bram Moolenaarac564082020-09-27 19:05:33 +02001608 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001609 for case in cases
1610 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001611 ' if ' .. case[0],
1612 ' echo 42'
1613 ' endif',
1614 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001615 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001616 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001617 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001618 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001619 assert_match('TestCase' .. nr .. '.*' ..
1620 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1621 '\d PUSHNR 42.*' ..
1622 '\d ECHO 1.*' ..
1623 '\d PUSHNR 0.*' ..
1624 '\d RETURN.*',
1625 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001626 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001627 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001628 assert_match('TestCase' .. nr .. '.*' ..
1629 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1630 'echo 42[ \n]*' ..
1631 'endif[ \n]*' ..
1632 '\s*\d PUSHNR 0.*' ..
1633 '\d RETURN.*',
1634 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001635 endif
1636
1637 nr += 1
1638 endfor
1639
1640 delete('Xdisassemble')
1641enddef
1642
Bram Moolenaarad39c092020-02-26 18:23:43 +01001643def s:Execute()
1644 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001645 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001646 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001647 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001648 execute 'help ' .. tag
1649enddef
1650
1651def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001652 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001653 assert_match('\<SNR>\d*_Execute\_s*' ..
1654 "execute 'help vim9.txt'\\_s*" ..
1655 '\d PUSHS "help vim9.txt"\_s*' ..
1656 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001657 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001658 '\d PUSHS "help vim9.txt"\_s*' ..
1659 '\d STORE $0\_s*' ..
1660 'execute cmd\_s*' ..
1661 '\d LOAD $0\_s*' ..
1662 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001663 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001664 '\d PUSHS "vim9.txt"\_s*' ..
1665 '\d STORE $1\_s*' ..
1666 "execute 'help ' .. tag\\_s*" ..
1667 '\d\+ PUSHS "help "\_s*' ..
1668 '\d\+ LOAD $1\_s*' ..
1669 '\d\+ CONCAT\_s*' ..
1670 '\d\+ EXECUTE 1\_s*' ..
1671 '\d\+ PUSHNR 0\_s*' ..
1672 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001673 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001674enddef
1675
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001676def s:Echomsg()
1677 echomsg 'some' 'message'
1678 echoerr 'went' .. 'wrong'
1679enddef
1680
1681def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001682 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001683 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1684 "echomsg 'some' 'message'\\_s*" ..
1685 '\d PUSHS "some"\_s*' ..
1686 '\d PUSHS "message"\_s*' ..
1687 '\d ECHOMSG 2\_s*' ..
1688 "echoerr 'went' .. 'wrong'\\_s*" ..
1689 '\d PUSHS "wentwrong"\_s*' ..
1690 '\d ECHOERR 1\_s*' ..
1691 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001692 '\d RETURN',
1693 res)
1694enddef
1695
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001696def SomeStringArg(arg: string)
1697 echo arg
1698enddef
1699
1700def SomeAnyArg(arg: any)
1701 echo arg
1702enddef
1703
1704def SomeStringArgAndReturn(arg: string): string
1705 return arg
1706enddef
1707
1708def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001709 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001710 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1711 '\d *echo arg.*' ..
1712 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001713 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001714
Bram Moolenaarac564082020-09-27 19:05:33 +02001715 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001716 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1717 '\d *echo arg\_s*' ..
1718 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001719 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001720
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001722 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1723 '\d *return arg\_s*' ..
1724 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001725 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001726enddef
1727
Bram Moolenaar09689a02020-05-09 22:50:08 +02001728def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001729 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001730 vim9script
1731 def FuncOne(): string
1732 return FuncTwo()
1733 enddef
1734 def FuncTwo(): string
1735 return 'two'
1736 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001737 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001738 END
1739 writefile(lines, 'Xdisassemble')
1740 source Xdisassemble
1741
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001742 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001743 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1744 'return FuncTwo()\_s*' ..
1745 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001746 '\d RETURN',
1747 g:res_FuncOne)
1748
1749 delete('Xdisassemble')
1750 unlet g:res_FuncOne
1751enddef
1752
Bram Moolenaar61a89812020-05-07 16:58:17 +02001753def s:ConcatStrings(): string
1754 return 'one' .. 'two' .. 'three'
1755enddef
1756
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001757def s:ComputeConst(): number
1758 return 2 + 3 * 4 / 6 + 7
1759enddef
1760
Bram Moolenaar1c747212020-05-09 18:28:34 +02001761def s:ComputeConstParen(): number
1762 return ((2 + 4) * (8 / 2)) / (3 + 4)
1763enddef
1764
Bram Moolenaar61a89812020-05-07 16:58:17 +02001765def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001766 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001767 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1768 "return 'one' .. 'two' .. 'three'\\_s*" ..
1769 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001770 '\d RETURN',
1771 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001772
1773 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001774 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1775 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1776 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001777 '\d RETURN',
1778 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001779
1780 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001781 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1782 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1783 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001784 '\d RETURN',
1785 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001786enddef
1787
Bram Moolenaar389df252020-07-09 21:20:47 +02001788def s:CallAppend()
1789 eval "some text"->append(2)
1790enddef
1791
1792def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001793 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001794 assert_match('<SNR>\d*_CallAppend\_s*' ..
1795 'eval "some text"->append(2)\_s*' ..
1796 '\d PUSHS "some text"\_s*' ..
1797 '\d PUSHNR 2\_s*' ..
1798 '\d SHUFFLE 2 up 1\_s*' ..
1799 '\d BCALL append(argc 2)\_s*' ..
1800 '\d DROP\_s*' ..
1801 '\d PUSHNR 0\_s*' ..
1802 '\d RETURN',
1803 res)
1804enddef
1805
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001806
1807def s:SilentMessage()
1808 silent echomsg "text"
1809 silent! echoerr "error"
1810enddef
1811
1812def Test_silent()
1813 var res = execute('disass s:SilentMessage')
1814 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1815 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001816 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001817 '\d PUSHS "text"\_s*' ..
1818 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001819 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001820 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001821 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001822 '\d PUSHS "error"\_s*' ..
1823 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001824 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001825 '\d PUSHNR 0\_s*' ..
1826 '\d RETURN',
1827 res)
1828enddef
1829
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001830" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker