blob: fabb8d2618f85550503b217a6f55b0ca485e8074 [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
18 echo arg
19 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020020 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010021 echo v:version
22 echo s:scriptvar
23 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020024 echo get(g:, "global")
Bram Moolenaard3aac292020-04-19 14:32:17 +020025 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020026 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010031 echo &tabstop
32 echo $ENVVAR
33 echo @z
34enddef
35
Bram Moolenaarf2460a32020-02-07 22:09:54 +010036def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010037 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020038 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010039 assert_fails('disass', 'E471:')
40 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020041 assert_fails('disass 234', 'E129:')
42 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010043
Bram Moolenaarac564082020-09-27 19:05:33 +020044 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020045 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
46 'buffers.*' ..
47 ' EXEC \+buffers.*' ..
48 ' LOAD arg\[-1\].*' ..
49 ' LOAD $0.*' ..
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020050 ' LOADOPT &lines.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020051 ' LOADV v:version.*' ..
52 ' LOADS s:scriptvar from .*test_vim9_disassemble.vim.*' ..
53 ' LOADG g:globalvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020054 'echo get(g:, "global")\_s*' ..
55 '\d\+ LOAD g:\_s*' ..
56 '\d\+ PUSHS "global"\_s*' ..
57 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020058 ' LOADB b:buffervar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020059 'echo get(b:, "buffer")\_s*' ..
60 '\d\+ LOAD b:\_s*' ..
61 '\d\+ PUSHS "buffer"\_s*' ..
62 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020063 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020064 'echo get(w:, "window")\_s*' ..
65 '\d\+ LOAD w:\_s*' ..
66 '\d\+ PUSHS "window"\_s*' ..
67 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020068 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(t:, "tab")\_s*' ..
70 '\d\+ LOAD t:\_s*' ..
71 '\d\+ PUSHS "tab"\_s*' ..
72 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020073 ' LOADENV $ENVVAR.*' ..
74 ' LOADREG @z.*',
75 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010076enddef
77
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020078def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +020079 var filename = "file"
80 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020081 edit the`=filename``=filenr`.txt
82enddef
83
84def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +020085 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020086 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +020087 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020088 '\d PUSHS "file"\_s*' ..
89 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +020090 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020091 '\d STORE 123 in $1\_s*' ..
92 ' edit the`=filename``=filenr`.txt\_s*' ..
93 '\d PUSHS "edit the"\_s*' ..
94 '\d LOAD $0\_s*' ..
95 '\d LOAD $1\_s*' ..
96 '\d 2STRING stack\[-1\]\_s*' ..
97 '\d\+ PUSHS ".txt"\_s*' ..
98 '\d\+ EXECCONCAT 4\_s*' ..
99 '\d\+ PUSHNR 0\_s*' ..
100 '\d\+ RETURN',
101 res)
102enddef
103
104def s:YankRange()
105 norm! m[jjm]
106 :'[,']yank
107enddef
108
109def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200110 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200111 assert_match('<SNR>\d*_YankRange.*' ..
112 ' norm! m\[jjm\]\_s*' ..
113 '\d EXEC norm! m\[jjm\]\_s*' ..
114 ' :''\[,''\]yank\_s*' ..
115 '\d EXEC :''\[,''\]yank\_s*' ..
116 '\d PUSHNR 0\_s*' ..
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200117 '\d RETURN',
118 res)
119enddef
120
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200121def s:PutExpr()
122 :3put ="text"
123enddef
124
125def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200126 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200127 assert_match('<SNR>\d*_PutExpr.*' ..
128 ' :3put ="text"\_s*' ..
129 '\d PUSHS "text"\_s*' ..
130 '\d PUT = 3\_s*' ..
131 '\d PUSHNR 0\_s*' ..
132 '\d RETURN',
133 res)
134enddef
135
Bram Moolenaar08597872020-12-10 19:43:40 +0100136def s:PutRange()
137 :$-2put a
138enddef
139
140def Test_disassemble_put_range()
141 var res = execute('disass s:PutRange')
142 assert_match('<SNR>\d*_PutRange.*' ..
143 ' :$-2put a\_s*' ..
144 '\d RANGE $-2\_s*' ..
145 '\d PUT a range\_s*' ..
146 '\d PUSHNR 0\_s*' ..
147 '\d RETURN',
148 res)
149enddef
150
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100151def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200152 var localbool = true
153 var localspec = v:none
154 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100155 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200156 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100157 endif
158enddef
159
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100160def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200161 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200162 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
163 'localbool = true.*' ..
164 ' PUSH v:true.*' ..
165 'localspec = v:none.*' ..
166 ' PUSH v:none.*' ..
167 'localblob = 0z1234.*' ..
168 ' PUSHBLOB 0z1234.*',
169 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100170 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200171 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
172 'localfloat = 1.234.*' ..
173 ' PUSHF 1.234.*',
174 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100175 endif
176enddef
177
178def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200179 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100180 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200181 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100182 localstr = 'xyz'
183 v:char = 'abc'
184 s:scriptvar = 'sv'
185 g:globalvar = 'gv'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200186 b:buffervar = 'bv'
187 w:windowvar = 'wv'
188 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100189 &tabstop = 8
190 $ENVVAR = 'ev'
191 @z = 'rv'
192enddef
193
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100194def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200195 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200196 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200197 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200198 'localnr = 2.*' ..
199 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200200 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200201 'localstr = ''xyz''.*' ..
202 ' STORE $1.*' ..
203 'v:char = ''abc''.*' ..
204 'STOREV v:char.*' ..
205 's:scriptvar = ''sv''.*' ..
206 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
207 'g:globalvar = ''gv''.*' ..
208 ' STOREG g:globalvar.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200209 'b:buffervar = ''bv''.*' ..
210 ' STOREB b:buffervar.*' ..
211 'w:windowvar = ''wv''.*' ..
212 ' STOREW w:windowvar.*' ..
213 't:tabpagevar = ''tv''.*' ..
214 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200215 '&tabstop = 8.*' ..
216 ' STOREOPT &tabstop.*' ..
217 '$ENVVAR = ''ev''.*' ..
218 ' STOREENV $ENVVAR.*' ..
219 '@z = ''rv''.*' ..
220 ' STOREREG @z.*',
221 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100222enddef
223
Bram Moolenaarcb790402020-05-15 20:53:00 +0200224def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200225 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200226 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200227 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200228 localdict["a"] = 456
229enddef
230
231def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200232 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200233 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200234 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200235 '\d NEWLIST size 0\_s*' ..
236 '\d STORE $0\_s*' ..
237 'locallist\[0\] = 123\_s*' ..
238 '\d PUSHNR 123\_s*' ..
239 '\d PUSHNR 0\_s*' ..
240 '\d LOAD $0\_s*' ..
241 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200242 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200243 '\d NEWDICT size 0\_s*' ..
244 '\d STORE $1\_s*' ..
245 'localdict\["a"\] = 456\_s*' ..
246 '\d\+ PUSHNR 456\_s*' ..
247 '\d\+ PUSHS "a"\_s*' ..
248 '\d\+ LOAD $1\_s*' ..
249 '\d\+ STOREDICT\_s*' ..
250 '\d\+ PUSHNR 0\_s*' ..
251 '\d\+ RETURN',
252 res)
253enddef
254
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200255def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 var x: string
257 var y: string
258 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200259 [x, y; l] = g:stringlist
260enddef
261
262def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200263 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200264 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200265 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200266 '\d PUSHS "\[NULL\]"\_s*' ..
267 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200268 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200269 '\d PUSHS "\[NULL\]"\_s*' ..
270 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200271 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200272 '\d NEWLIST size 0\_s*' ..
273 '\d STORE $2\_s*' ..
274 '\[x, y; l\] = g:stringlist\_s*' ..
275 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200276 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200277 '\d CHECKLEN >= 2\_s*' ..
278 '\d\+ ITEM 0\_s*' ..
279 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
280 '\d\+ STORE $0\_s*' ..
281 '\d\+ ITEM 1\_s*' ..
282 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
283 '\d\+ STORE $1\_s*' ..
284 '\d\+ SLICE 2\_s*' ..
285 '\d\+ STORE $2\_s*' ..
286 '\d\+ PUSHNR 0\_s*' ..
287 '\d\+ RETURN',
288 res)
289enddef
290
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200291def s:ListAdd()
292 var l: list<number> = []
293 add(l, 123)
294 add(l, g:aNumber)
295enddef
296
297def Test_disassemble_list_add()
298 var res = execute('disass s:ListAdd')
299 assert_match('<SNR>\d*_ListAdd\_s*' ..
300 'var l: list<number> = []\_s*' ..
301 '\d NEWLIST size 0\_s*' ..
302 '\d STORE $0\_s*' ..
303 'add(l, 123)\_s*' ..
304 '\d LOAD $0\_s*' ..
305 '\d PUSHNR 123\_s*' ..
306 '\d LISTAPPEND\_s*' ..
307 '\d DROP\_s*' ..
308 'add(l, g:aNumber)\_s*' ..
309 '\d LOAD $0\_s*' ..
310 '\d\+ LOADG g:aNumber\_s*' ..
311 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
312 '\d\+ LISTAPPEND\_s*' ..
313 '\d\+ DROP\_s*' ..
314 '\d\+ PUSHNR 0\_s*' ..
315 '\d\+ RETURN',
316 res)
317enddef
318
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200319def s:BlobAdd()
320 var b: blob = 0z
321 add(b, 123)
322 add(b, g:aNumber)
323enddef
324
325def Test_disassemble_blob_add()
326 var res = execute('disass s:BlobAdd')
327 assert_match('<SNR>\d*_BlobAdd\_s*' ..
328 'var b: blob = 0z\_s*' ..
329 '\d PUSHBLOB 0z\_s*' ..
330 '\d STORE $0\_s*' ..
331 'add(b, 123)\_s*' ..
332 '\d LOAD $0\_s*' ..
333 '\d PUSHNR 123\_s*' ..
334 '\d BLOBAPPEND\_s*' ..
335 '\d DROP\_s*' ..
336 'add(b, g:aNumber)\_s*' ..
337 '\d LOAD $0\_s*' ..
338 '\d\+ LOADG g:aNumber\_s*' ..
339 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
340 '\d\+ BLOBAPPEND\_s*' ..
341 '\d\+ DROP\_s*' ..
342 '\d\+ PUSHNR 0\_s*' ..
343 '\d\+ RETURN',
344 res)
345enddef
346
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200347def s:ScriptFuncUnlet()
348 g:somevar = "value"
349 unlet g:somevar
350 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200351 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200352enddef
353
354def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200355 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200356 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
357 'g:somevar = "value"\_s*' ..
358 '\d PUSHS "value"\_s*' ..
359 '\d STOREG g:somevar\_s*' ..
360 'unlet g:somevar\_s*' ..
361 '\d UNLET g:somevar\_s*' ..
362 'unlet! g:somevar\_s*' ..
363 '\d UNLET! g:somevar\_s*' ..
364 'unlet $SOMEVAR\_s*' ..
365 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200366 res)
367enddef
368
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100369def s:ScriptFuncTry()
370 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200371 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100372 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200373 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100374 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200375 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100376 endtry
377enddef
378
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100379def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200380 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200381 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
382 'try\_s*' ..
383 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
384 'echo "yes"\_s*' ..
385 '\d PUSHS "yes"\_s*' ..
386 '\d ECHO 1\_s*' ..
387 'catch /fail/\_s*' ..
388 '\d JUMP -> \d\+\_s*' ..
389 '\d PUSH v:exception\_s*' ..
390 '\d PUSHS "fail"\_s*' ..
391 '\d COMPARESTRING =\~\_s*' ..
392 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
393 '\d CATCH\_s*' ..
394 'echo "no"\_s*' ..
395 '\d\+ PUSHS "no"\_s*' ..
396 '\d\+ ECHO 1\_s*' ..
397 'finally\_s*' ..
398 'throw "end"\_s*' ..
399 '\d\+ PUSHS "end"\_s*' ..
400 '\d\+ THROW\_s*' ..
401 'endtry\_s*' ..
402 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200403 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100404enddef
405
406def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200407 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100408 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100409enddef
410
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100411def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200412 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200413 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200414 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200415 '\d PUSHNR 1\_s*' ..
416 '\d PUSHS "two"\_s*' ..
417 '\d PUSHNR 333\_s*' ..
418 '\d NEWLIST size 3\_s*' ..
419 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100420 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200421 '\d PUSHS "one"\_s*' ..
422 '\d PUSHNR 1\_s*' ..
423 '\d PUSHS "two"\_s*' ..
424 '\d PUSHS "val"\_s*' ..
425 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200426 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100427enddef
428
Bram Moolenaar6e949782020-04-13 17:21:00 +0200429def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100430 echo arg
431enddef
432
433func UserFunc()
434 echo 'nothing'
435endfunc
436
437func UserFuncWithArg(arg)
438 echo a:arg
439endfunc
440
441def s:ScriptFuncCall(): string
442 changenr()
443 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100444 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100445 FuncWithArg(343)
446 ScriptFuncNew()
447 s:ScriptFuncNew()
448 UserFunc()
449 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200450 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100451 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200452 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100453 FuncRefWithArg("bar")
454 return "yes"
455enddef
456
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100457def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200458 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200459 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
460 'changenr()\_s*' ..
461 '\d BCALL changenr(argc 0)\_s*' ..
462 '\d DROP\_s*' ..
463 'char2nr("abc")\_s*' ..
464 '\d PUSHS "abc"\_s*' ..
465 '\d BCALL char2nr(argc 1)\_s*' ..
466 '\d DROP\_s*' ..
467 'Test_disassemble_new()\_s*' ..
468 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
469 '\d DROP\_s*' ..
470 'FuncWithArg(343)\_s*' ..
471 '\d\+ PUSHNR 343\_s*' ..
472 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
473 '\d\+ DROP\_s*' ..
474 'ScriptFuncNew()\_s*' ..
475 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
476 '\d\+ DROP\_s*' ..
477 's:ScriptFuncNew()\_s*' ..
478 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
479 '\d\+ DROP\_s*' ..
480 'UserFunc()\_s*' ..
481 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
482 '\d\+ DROP\_s*' ..
483 'UserFuncWithArg("foo")\_s*' ..
484 '\d\+ PUSHS "foo"\_s*' ..
485 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
486 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200487 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200488 '\d\+ PUSHS "UserFunc"\_s*' ..
489 '\d\+ BCALL function(argc 1)\_s*' ..
490 '\d\+ STORE $0\_s*' ..
491 'FuncRef()\_s*' ..
492 '\d\+ LOAD $\d\_s*' ..
493 '\d\+ PCALL (argc 0)\_s*' ..
494 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200495 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200496 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
497 '\d\+ BCALL function(argc 1)\_s*' ..
498 '\d\+ STORE $1\_s*' ..
499 'FuncRefWithArg("bar")\_s*' ..
500 '\d\+ PUSHS "bar"\_s*' ..
501 '\d\+ LOAD $\d\_s*' ..
502 '\d\+ PCALL (argc 1)\_s*' ..
503 '\d\+ DROP\_s*' ..
504 'return "yes"\_s*' ..
505 '\d\+ PUSHS "yes"\_s*' ..
506 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200507 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100508enddef
509
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200510
511def s:CreateRefs()
512 var local = 'a'
513 def Append(arg: string)
514 local ..= arg
515 enddef
516 g:Append = Append
517 def Get(): string
518 return local
519 enddef
520 g:Get = Get
521enddef
522
523def Test_disassemble_closure()
524 CreateRefs()
525 var res = execute('disass g:Append')
526 assert_match('<lambda>\d\_s*' ..
527 'local ..= arg\_s*' ..
528 '\d LOADOUTER $0\_s*' ..
529 '\d LOAD arg\[-1\]\_s*' ..
530 '\d CONCAT\_s*' ..
531 '\d STOREOUTER $0\_s*' ..
532 '\d PUSHNR 0\_s*' ..
533 '\d RETURN',
534 res)
535
536 res = execute('disass g:Get')
537 assert_match('<lambda>\d\_s*' ..
538 'return local\_s*' ..
539 '\d LOADOUTER $0\_s*' ..
540 '\d RETURN',
541 res)
542
543 unlet g:Append
544 unlet g:Get
545enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200546
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100547
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200548def EchoArg(arg: string): string
549 return arg
550enddef
551def RefThis(): func
552 return function('EchoArg')
553enddef
554def s:ScriptPCall()
555 RefThis()("text")
556enddef
557
558def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200559 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200560 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
561 'RefThis()("text")\_s*' ..
562 '\d DCALL RefThis(argc 0)\_s*' ..
563 '\d PUSHS "text"\_s*' ..
564 '\d PCALL top (argc 1)\_s*' ..
565 '\d PCALL end\_s*' ..
566 '\d DROP\_s*' ..
567 '\d PUSHNR 0\_s*' ..
568 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200569 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200570enddef
571
572
Bram Moolenaara26b9702020-04-18 19:53:28 +0200573def s:FuncWithForwardCall(): string
574 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100575enddef
576
577def DefinedLater(arg: string): string
578 return arg
579enddef
580
581def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200582 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200583 assert_match('FuncWithForwardCall\_s*' ..
584 'return g:DefinedLater("yes")\_s*' ..
585 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200586 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200587 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200588 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100589
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200590 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100591 assert_equal('yes', FuncWithForwardCall())
592
Bram Moolenaara26b9702020-04-18 19:53:28 +0200593 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200594 assert_match('FuncWithForwardCall\_s*' ..
595 'return g:DefinedLater("yes")\_s*' ..
596 '\d PUSHS "yes"\_s*' ..
597 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200598 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200599 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100600enddef
601
602
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100603def FuncWithDefault(arg: string = 'default'): string
604 return arg
605enddef
606
607def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200608 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200609 assert_match('FuncWithDefault\_s*' ..
610 '\d PUSHS "default"\_s*' ..
611 '\d STORE arg\[-1]\_s*' ..
612 'return arg\_s*' ..
613 '\d LOAD arg\[-1]\_s*' ..
614 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200615 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100616enddef
617
618
Bram Moolenaar158906c2020-02-06 20:39:45 +0100619def HasEval()
620 if has("eval")
621 echo "yes"
622 else
623 echo "no"
624 endif
625enddef
626
627def HasNothing()
628 if has("nothing")
629 echo "yes"
630 else
631 echo "no"
632 endif
633enddef
634
635def HasSomething()
636 if has("nothing")
637 echo "nothing"
638 elseif has("something")
639 echo "something"
640 elseif has("eval")
641 echo "eval"
642 elseif has("less")
643 echo "less"
644 endif
645enddef
646
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100647def HasGuiRunning()
648 if has("gui_running")
649 echo "yes"
650 else
651 echo "no"
652 endif
653enddef
654
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100655def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200656 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200657 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200658 assert_match('HasEval\_s*' ..
659 'if has("eval")\_s*' ..
660 'echo "yes"\_s*' ..
661 '\d PUSHS "yes"\_s*' ..
662 '\d ECHO 1\_s*' ..
663 'else\_s*' ..
664 'echo "no"\_s*' ..
665 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200666 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100667 assert_notmatch('JUMP', instr)
668
Bram Moolenaard2c61702020-09-06 15:58:36 +0200669 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100670 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200671 assert_match('HasNothing\_s*' ..
672 'if has("nothing")\_s*' ..
673 'echo "yes"\_s*' ..
674 'else\_s*' ..
675 'echo "no"\_s*' ..
676 '\d PUSHS "no"\_s*' ..
677 '\d ECHO 1\_s*' ..
678 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200679 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100680 assert_notmatch('PUSHS "yes"', instr)
681 assert_notmatch('JUMP', instr)
682
Bram Moolenaard2c61702020-09-06 15:58:36 +0200683 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100684 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200685 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200686 'if has("nothing")\_s*' ..
687 'echo "nothing"\_s*' ..
688 'elseif has("something")\_s*' ..
689 'echo "something"\_s*' ..
690 'elseif has("eval")\_s*' ..
691 'echo "eval"\_s*' ..
692 '\d PUSHS "eval"\_s*' ..
693 '\d ECHO 1\_s*' ..
694 'elseif has("less").*' ..
695 'echo "less"\_s*' ..
696 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200697 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100698 assert_notmatch('PUSHS "nothing"', instr)
699 assert_notmatch('PUSHS "something"', instr)
700 assert_notmatch('PUSHS "less"', instr)
701 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100702
703 var result: string
704 var instr_expected: string
705 if has('gui')
706 if has('gui_running')
707 # GUI already running, always returns "yes"
708 result = "\nyes"
709 instr_expected = 'HasGuiRunning.*' ..
710 'if has("gui_running")\_s*' ..
711 ' echo "yes"\_s*' ..
712 '\d PUSHS "yes"\_s*' ..
713 '\d ECHO 1\_s*' ..
714 'else\_s*' ..
715 ' echo "no"\_s*' ..
716 'endif'
717 else
718 result = "\nno"
719 if has('unix')
720 # GUI not running but can start later, call has()
721 instr_expected = 'HasGuiRunning.*' ..
722 'if has("gui_running")\_s*' ..
723 '\d PUSHS "gui_running"\_s*' ..
724 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100725 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100726 '\d JUMP_IF_FALSE -> \d\_s*' ..
727 ' echo "yes"\_s*' ..
728 '\d PUSHS "yes"\_s*' ..
729 '\d ECHO 1\_s*' ..
730 'else\_s*' ..
731 '\d JUMP -> \d\_s*' ..
732 ' echo "no"\_s*' ..
733 '\d PUSHS "no"\_s*' ..
734 '\d ECHO 1\_s*' ..
735 'endif'
736 else
737 # GUI not running, always return "no"
738 instr_expected = 'HasGuiRunning.*' ..
739 'if has("gui_running")\_s*' ..
740 ' echo "yes"\_s*' ..
741 'else\_s*' ..
742 ' echo "no"\_s*' ..
743 '\d PUSHS "no"\_s*' ..
744 '\d ECHO 1\_s*' ..
745 'endif'
746 endif
747 endif
748 else
749 # GUI not supported, always return "no"
750 result = "\nno"
751 instr_expected = 'HasGuiRunning.*' ..
752 'if has("gui_running")\_s*' ..
753 ' echo "yes"\_s*' ..
754 'else\_s*' ..
755 ' echo "no"\_s*' ..
756 '\d PUSHS "no"\_s*' ..
757 '\d ECHO 1\_s*' ..
758 'endif'
759 endif
760
761 assert_equal(result, execute('HasGuiRunning()'))
762 instr = execute('disassemble HasGuiRunning')
763 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100764enddef
765
Bram Moolenaarefd88552020-06-18 20:50:10 +0200766def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100767 if 1 < 0
768 return "maybe"
769 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200770 if g:cond
771 return "yes"
772 else
773 return "no"
774 endif
775enddef
776
777def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200778 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200779 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100780 'if 1 < 0\_s*' ..
781 ' return "maybe"\_s*' ..
782 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200783 'if g:cond\_s*' ..
784 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100785 '1 COND2BOOL\_s*' ..
786 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200787 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100788 '3 PUSHS "yes"\_s*' ..
789 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200790 'else\_s*' ..
791 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100792 '5 PUSHS "no"\_s*' ..
793 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200794 instr)
795enddef
796
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100797def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200798 var Funky1: func
799 var Funky2: func = function("len")
800 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100801enddef
802
803def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200804 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200805 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200806 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200807 '0 PUSHFUNC "\[none]"\_s*' ..
808 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200809 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200810 '2 PUSHS "len"\_s*' ..
811 '3 BCALL function(argc 1)\_s*' ..
812 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200813 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200814 '\d PUSHS "UserFunc"\_s*' ..
815 '\d BCALL funcref(argc 1)\_s*' ..
816 '\d STORE $2\_s*' ..
817 '\d PUSHNR 0\_s*' ..
818 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200819 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100820enddef
821
822if has('channel')
823 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200824 var job1: job
825 var job2: job = job_start("donothing")
826 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100827 enddef
828endif
829
830def Test_disassemble_channel()
831 CheckFeature channel
832
Bram Moolenaarac564082020-09-27 19:05:33 +0200833 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200834 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200835 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200836 '\d PUSHJOB "no process"\_s*' ..
837 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200838 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200839 '\d PUSHS "donothing"\_s*' ..
840 '\d BCALL job_start(argc 1)\_s*' ..
841 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200842 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200843 '\d PUSHCHANNEL 0\_s*' ..
844 '\d STORE $2\_s*' ..
845 '\d PUSHNR 0\_s*' ..
846 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200847 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100848enddef
849
Bram Moolenaar777770f2020-02-06 21:27:08 +0100850def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200851 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100852 return F("x")
853enddef
854
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100855def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100856 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200857 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200859 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200860 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200861 '\d STORE $0\_s*' ..
862 'return F("x")\_s*' ..
863 '\d PUSHS "x"\_s*' ..
864 '\d LOAD $0\_s*' ..
865 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200866 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200867 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200868
Bram Moolenaarac564082020-09-27 19:05:33 +0200869 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200870 instr = execute('disassemble ' .. name)
871 assert_match('<lambda>\d\+\_s*' ..
872 'return "X" .. a .. "X"\_s*' ..
873 '\d PUSHS "X"\_s*' ..
874 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200875 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200876 '\d CONCAT\_s*' ..
877 '\d PUSHS "X"\_s*' ..
878 '\d CONCAT\_s*' ..
879 '\d RETURN',
880 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100881enddef
882
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100883def LambdaWithType(): number
884 var Ref = {a: number -> a + 10}
885 return Ref(g:value)
886enddef
887
888def Test_disassemble_lambda_with_type()
889 g:value = 5
890 assert_equal(15, LambdaWithType())
891 var instr = execute('disassemble LambdaWithType')
892 assert_match('LambdaWithType\_s*' ..
893 'var Ref = {a: number -> a + 10}\_s*' ..
894 '\d FUNCREF <lambda>\d\+\_s*' ..
895 '\d STORE $0\_s*' ..
896 'return Ref(g:value)\_s*' ..
897 '\d LOADG g:value\_s*' ..
898 '\d LOAD $0\_s*' ..
899 '\d CHECKTYPE number stack\[-2\]\_s*' ..
900 '\d PCALL (argc 1)\_s*' ..
901 '\d RETURN',
902 instr)
903enddef
904
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200905def NestedOuter()
906 def g:Inner()
907 echomsg "inner"
908 enddef
909enddef
910
911def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200912 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200913 assert_match('NestedOuter\_s*' ..
914 'def g:Inner()\_s*' ..
915 'echomsg "inner"\_s*' ..
916 'enddef\_s*' ..
917 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
918 '\d PUSHNR 0\_s*' ..
919 '\d RETURN',
920 instr)
921enddef
922
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100923def NestedDefList()
924 def
925 def Info
926 def /Info
927 def /Info/
928enddef
929
930def Test_nested_def_list()
931 var instr = execute('disassemble NestedDefList')
932 assert_match('NestedDefList\_s*' ..
933 'def\_s*' ..
934 '\d DEF \_s*' ..
935 'def Info\_s*' ..
936 '\d DEF Info\_s*' ..
937 'def /Info\_s*' ..
938 '\d DEF /Info\_s*' ..
939 'def /Info/\_s*' ..
940 '\d DEF /Info/\_s*' ..
941 '\d PUSHNR 0\_s*' ..
942 '\d RETURN',
943 instr)
944enddef
945
Bram Moolenaar6e949782020-04-13 17:21:00 +0200946def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100947 if arg == 1 && arg != 2 || arg == 4
948 return 'yes'
949 endif
950 return 'no'
951enddef
952
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100953def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100954 assert_equal("yes", AndOr(1))
955 assert_equal("no", AndOr(2))
956 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200957 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200958 assert_match('AndOr\_s*' ..
959 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
960 '\d LOAD arg\[-1]\_s*' ..
961 '\d PUSHNR 1\_s*' ..
962 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200963 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200964 '\d LOAD arg\[-1]\_s*' ..
965 '\d PUSHNR 2\_s*' ..
966 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200967 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200968 '\d LOAD arg\[-1]\_s*' ..
969 '\d\+ PUSHNR 4\_s*' ..
970 '\d\+ COMPAREANY ==\_s*' ..
971 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200972 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100973enddef
974
Bram Moolenaar04d05222020-02-06 22:06:54 +0100975def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +0200976 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +0100977 for i in range(3)
978 res->add(i)
979 endfor
980 return res
981enddef
982
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100983def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +0100984 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +0200985 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200986 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200987 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200988 '\d NEWLIST size 0\_s*' ..
989 '\d STORE $0\_s*' ..
990 'for i in range(3)\_s*' ..
991 '\d STORE -1 in $1\_s*' ..
992 '\d PUSHNR 3\_s*' ..
993 '\d BCALL range(argc 1)\_s*' ..
994 '\d FOR $1 -> \d\+\_s*' ..
995 '\d STORE $2\_s*' ..
996 'res->add(i)\_s*' ..
997 '\d LOAD $0\_s*' ..
998 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200999 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001000 '\d\+ DROP\_s*' ..
1001 'endfor\_s*' ..
1002 '\d\+ JUMP -> \d\+\_s*' ..
1003 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001004 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001005enddef
1006
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001007def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001008 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001009 for str in eval('["one", "two"]')
1010 res ..= str
1011 endfor
1012 return res
1013enddef
1014
1015def Test_disassemble_for_loop_eval()
1016 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001017 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001018 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001019 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001020 '\d PUSHS ""\_s*' ..
1021 '\d STORE $0\_s*' ..
1022 'for str in eval(''\["one", "two"\]'')\_s*' ..
1023 '\d STORE -1 in $1\_s*' ..
1024 '\d PUSHS "\["one", "two"\]"\_s*' ..
1025 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001026 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001027 '\d FOR $1 -> \d\+\_s*' ..
1028 '\d STORE $2\_s*' ..
1029 'res ..= str\_s*' ..
1030 '\d\+ LOAD $0\_s*' ..
1031 '\d\+ LOAD $2\_s*' ..
1032 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1033 '\d\+ CONCAT\_s*' ..
1034 '\d\+ STORE $0\_s*' ..
1035 'endfor\_s*' ..
1036 '\d\+ JUMP -> 6\_s*' ..
1037 '\d\+ DROP\_s*' ..
1038 'return res\_s*' ..
1039 '\d\+ LOAD $0\_s*' ..
1040 '\d\+ RETURN',
1041 instr)
1042enddef
1043
Bram Moolenaar792f7862020-11-23 08:31:18 +01001044def ForLoopUnpack()
1045 for [x1, x2] in [[1, 2], [3, 4]]
1046 echo x1 x2
1047 endfor
1048enddef
1049
1050def Test_disassemble_for_loop_unpack()
1051 var instr = execute('disassemble ForLoopUnpack')
1052 assert_match('ForLoopUnpack\_s*' ..
1053 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1054 '\d\+ STORE -1 in $0\_s*' ..
1055 '\d\+ PUSHNR 1\_s*' ..
1056 '\d\+ PUSHNR 2\_s*' ..
1057 '\d\+ NEWLIST size 2\_s*' ..
1058 '\d\+ PUSHNR 3\_s*' ..
1059 '\d\+ PUSHNR 4\_s*' ..
1060 '\d\+ NEWLIST size 2\_s*' ..
1061 '\d\+ NEWLIST size 2\_s*' ..
1062 '\d\+ FOR $0 -> 16\_s*' ..
1063 '\d\+ UNPACK 2\_s*' ..
1064 '\d\+ STORE $1\_s*' ..
1065 '\d\+ STORE $2\_s*' ..
1066 'echo x1 x2\_s*' ..
1067 '\d\+ LOAD $1\_s*' ..
1068 '\d\+ LOAD $2\_s*' ..
1069 '\d\+ ECHO 2\_s*' ..
1070 'endfor\_s*' ..
1071 '\d\+ JUMP -> 8\_s*' ..
1072 '\d\+ DROP\_s*' ..
1073 '\d\+ PUSHNR 0\_s*' ..
1074 '\d\+ RETURN',
1075 instr)
1076enddef
1077
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001078let g:number = 42
1079
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001080def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001081 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001082enddef
1083
1084def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001085 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001086 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001087 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001088 '\d PUSHNR 23\_s*' ..
1089 '\d LOADG g:number\_s*' ..
1090 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1091 '\d NEWLIST size 2\_s*' ..
1092 '\d STORE $0\_s*' ..
1093 '\d PUSHNR 0\_s*' ..
1094 '\d RETURN\_s*',
1095 instr)
1096enddef
1097
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001098def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001099 var nr = 3
1100 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001101 nrres = nr - 7
1102 nrres = nr * 7
1103 nrres = nr / 7
1104 nrres = nr % 7
1105
Bram Moolenaarac564082020-09-27 19:05:33 +02001106 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001107 anyres = g:number - 7
1108 anyres = g:number * 7
1109 anyres = g:number / 7
1110 anyres = g:number % 7
1111
1112 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001113 var fl = 3.0
1114 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001115 flres = fl - 7.0
1116 flres = fl * 7.0
1117 flres = fl / 7.0
1118 endif
1119enddef
1120
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001121def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001122 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001123 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001124 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001125 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001126 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001127 '\d LOAD $0.*' ..
1128 '\d PUSHNR 7.*' ..
1129 '\d OPNR +.*' ..
1130 '\d STORE $1.*' ..
1131 'nrres = nr - 7.*' ..
1132 '\d OPNR -.*' ..
1133 'nrres = nr \* 7.*' ..
1134 '\d OPNR \*.*' ..
1135 'nrres = nr / 7.*' ..
1136 '\d OPNR /.*' ..
1137 'nrres = nr % 7.*' ..
1138 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001139 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001140 '\d LOADG g:number.*' ..
1141 '\d PUSHNR 7.*' ..
1142 '\d OPANY +.*' ..
1143 '\d STORE $2.*' ..
1144 'anyres = g:number - 7.*' ..
1145 '\d OPANY -.*' ..
1146 'anyres = g:number \* 7.*' ..
1147 '\d OPANY \*.*' ..
1148 'anyres = g:number / 7.*' ..
1149 '\d OPANY /.*' ..
1150 'anyres = g:number % 7.*' ..
1151 '\d OPANY %.*',
1152 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001153 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001154 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001155 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001156 '\d PUSHF 3.0.*' ..
1157 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001158 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001159 '\d LOAD $3.*' ..
1160 '\d PUSHF 7.0.*' ..
1161 '\d OPFLOAT +.*' ..
1162 '\d STORE $4.*' ..
1163 'flres = fl - 7.0.*' ..
1164 '\d OPFLOAT -.*' ..
1165 'flres = fl \* 7.0.*' ..
1166 '\d OPFLOAT \*.*' ..
1167 'flres = fl / 7.0.*' ..
1168 '\d OPFLOAT /.*',
1169 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001170 endif
1171enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001172
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001173def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001174 var reslist = [1, 2] + [3, 4]
1175 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001176enddef
1177
1178def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001179 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001180 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001181 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001182 '\d PUSHNR 1.*' ..
1183 '\d PUSHNR 2.*' ..
1184 '\d NEWLIST size 2.*' ..
1185 '\d PUSHNR 3.*' ..
1186 '\d PUSHNR 4.*' ..
1187 '\d NEWLIST size 2.*' ..
1188 '\d ADDLIST.*' ..
1189 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001190 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001191 '\d PUSHBLOB 0z1122.*' ..
1192 '\d PUSHBLOB 0z3344.*' ..
1193 '\d ADDBLOB.*' ..
1194 '\d STORE $.*',
1195 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001196enddef
1197
1198let g:aa = 'aa'
1199def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001200 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001201 return res
1202enddef
1203
1204def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001205 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001206 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001207 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001208 '\d LOADG g:aa.*' ..
1209 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001210 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001211 '\d CONCAT.*' ..
1212 '\d STORE $.*',
1213 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001214 assert_equal('aabb', ConcatString())
1215enddef
1216
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001217def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001218 var s = "abcd"
1219 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001220 return res
1221enddef
1222
1223def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001224 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001225 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001226 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001227 '\d PUSHS "abcd"\_s*' ..
1228 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001229 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001230 '\d LOAD $0\_s*' ..
1231 '\d PUSHNR 1\_s*' ..
1232 '\d STRINDEX\_s*' ..
1233 '\d STORE $1\_s*',
1234 instr)
1235 assert_equal('b', StringIndex())
1236enddef
1237
Bram Moolenaared591872020-08-15 22:14:53 +02001238def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001239 var s = "abcd"
1240 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001241 return res
1242enddef
1243
1244def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001245 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001246 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001247 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001248 '\d PUSHS "abcd"\_s*' ..
1249 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001250 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001251 '\d LOAD $0\_s*' ..
1252 '\d PUSHNR 1\_s*' ..
1253 '\d PUSHNR 8\_s*' ..
1254 '\d STRSLICE\_s*' ..
1255 '\d STORE $1\_s*',
1256 instr)
1257 assert_equal('bcd', StringSlice())
1258enddef
1259
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001260def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001261 var l = [1, 2, 3]
1262 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001263 return res
1264enddef
1265
1266def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001267 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001268 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001269 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001270 '\d PUSHNR 1\_s*' ..
1271 '\d PUSHNR 2\_s*' ..
1272 '\d PUSHNR 3\_s*' ..
1273 '\d NEWLIST size 3\_s*' ..
1274 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001275 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001276 '\d LOAD $0\_s*' ..
1277 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001278 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001279 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001280 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001281 assert_equal(2, ListIndex())
1282enddef
1283
Bram Moolenaared591872020-08-15 22:14:53 +02001284def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001285 var l = [1, 2, 3]
1286 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001287 return res
1288enddef
1289
1290def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001291 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001292 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001293 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001294 '\d PUSHNR 1\_s*' ..
1295 '\d PUSHNR 2\_s*' ..
1296 '\d PUSHNR 3\_s*' ..
1297 '\d NEWLIST size 3\_s*' ..
1298 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001299 'var res = l\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001300 '\d LOAD $0\_s*' ..
1301 '\d PUSHNR 1\_s*' ..
1302 '\d PUSHNR 8\_s*' ..
1303 '\d LISTSLICE\_s*' ..
1304 '\d STORE $1\_s*',
1305 instr)
1306 assert_equal([2, 3], ListSlice())
1307enddef
1308
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001309def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001310 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001311 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001312 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001313 return res
1314enddef
1315
1316def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001318 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001319 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001320 '\d PUSHS "item"\_s*' ..
1321 '\d PUSHNR 1\_s*' ..
1322 '\d NEWDICT size 1\_s*' ..
1323 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001324 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001325 '\d\+ LOAD $0\_s*' ..
1326 '\d\+ MEMBER item\_s*' ..
1327 '\d\+ STORE $1\_s*' ..
1328 'res = d\["item"\]\_s*' ..
1329 '\d\+ LOAD $0\_s*' ..
1330 '\d\+ PUSHS "item"\_s*' ..
1331 '\d\+ MEMBER\_s*' ..
1332 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001333 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001334 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001335enddef
1336
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001337let somelist = [1, 2, 3, 4, 5]
1338def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001339 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001340 return res
1341enddef
1342
1343def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001344 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001345 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001346 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001347 '\d LOADG g:somelist\_s*' ..
1348 '\d PUSHNR 2\_s*' ..
1349 '\d ANYINDEX\_s*' ..
1350 '\d STORE $0\_s*' ..
1351 'return res\_s*' ..
1352 '\d LOAD $0\_s*' ..
1353 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1354 '\d RETURN',
1355 instr)
1356 assert_equal(3, AnyIndex())
1357enddef
1358
1359def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001361 return res
1362enddef
1363
1364def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001365 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001366 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001367 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001368 '\d LOADG g:somelist\_s*' ..
1369 '\d PUSHNR 1\_s*' ..
1370 '\d PUSHNR 3\_s*' ..
1371 '\d ANYSLICE\_s*' ..
1372 '\d STORE $0\_s*' ..
1373 'return res\_s*' ..
1374 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001375 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001376 '\d RETURN',
1377 instr)
1378 assert_equal([2, 3, 4], AnySlice())
1379enddef
1380
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001381def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001382 var nr = 9
1383 var plus = +nr
1384 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001385 return res
1386enddef
1387
1388def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001389 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001390 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001391 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001392 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001393 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001394 '\d LOAD $0\_s*' ..
1395 '\d CHECKNR\_s*' ..
1396 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001397 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001398 '\d LOAD $0\_s*' ..
1399 '\d NEGATENR\_s*' ..
1400 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001401 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001402 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001403enddef
1404
1405def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001406 var flag = true
1407 var invert = !flag
1408 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001409 return res
1410enddef
1411
1412def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001413 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001414 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001415 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001416 '\d PUSH v:true\_s*' ..
1417 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001418 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001419 '\d LOAD $0\_s*' ..
1420 '\d INVERT (!val)\_s*' ..
1421 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001422 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001423 '\d LOAD $0\_s*' ..
1424 '\d 2BOOL (!!val)\_s*' ..
1425 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001426 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001427 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001428enddef
1429
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001430def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001431 var name: bool = 1 && 0 || 1
1432 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001433enddef
1434
1435def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001436 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001437 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001438 'var name: bool = 1 && 0 || 1\_s*' ..
1439 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001440 '1 2BOOL (!!val)\_s*' ..
1441 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1442 '3 PUSHNR 0\_s*' ..
1443 '4 2BOOL (!!val)\_s*' ..
1444 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1445 '6 PUSHNR 1\_s*' ..
1446 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001447 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001448 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001449 '\d\+ LOAD $0\_s*' ..
1450 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001451 instr)
1452 assert_equal(true, InvertBool())
1453enddef
1454
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001455def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001456 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001457 ['true == isFalse', 'COMPAREBOOL =='],
1458 ['true != isFalse', 'COMPAREBOOL !='],
1459 ['v:none == isNull', 'COMPARESPECIAL =='],
1460 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001461
Bram Moolenaara5565e42020-05-09 15:44:01 +02001462 ['111 == aNumber', 'COMPARENR =='],
1463 ['111 != aNumber', 'COMPARENR !='],
1464 ['111 > aNumber', 'COMPARENR >'],
1465 ['111 < aNumber', 'COMPARENR <'],
1466 ['111 >= aNumber', 'COMPARENR >='],
1467 ['111 <= aNumber', 'COMPARENR <='],
1468 ['111 =~ aNumber', 'COMPARENR =\~'],
1469 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001470
Bram Moolenaara5565e42020-05-09 15:44:01 +02001471 ['"xx" != aString', 'COMPARESTRING !='],
1472 ['"xx" > aString', 'COMPARESTRING >'],
1473 ['"xx" < aString', 'COMPARESTRING <'],
1474 ['"xx" >= aString', 'COMPARESTRING >='],
1475 ['"xx" <= aString', 'COMPARESTRING <='],
1476 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1477 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1478 ['"xx" is aString', 'COMPARESTRING is'],
1479 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001480
Bram Moolenaara5565e42020-05-09 15:44:01 +02001481 ['0z11 == aBlob', 'COMPAREBLOB =='],
1482 ['0z11 != aBlob', 'COMPAREBLOB !='],
1483 ['0z11 is aBlob', 'COMPAREBLOB is'],
1484 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001485
Bram Moolenaara5565e42020-05-09 15:44:01 +02001486 ['[1, 2] == aList', 'COMPARELIST =='],
1487 ['[1, 2] != aList', 'COMPARELIST !='],
1488 ['[1, 2] is aList', 'COMPARELIST is'],
1489 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001490
Bram Moolenaare0de1712020-12-02 17:36:54 +01001491 ['{a: 1} == aDict', 'COMPAREDICT =='],
1492 ['{a: 1} != aDict', 'COMPAREDICT !='],
1493 ['{a: 1} is aDict', 'COMPAREDICT is'],
1494 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001495
1496 ['{->33} == {->44}', 'COMPAREFUNC =='],
1497 ['{->33} != {->44}', 'COMPAREFUNC !='],
1498 ['{->33} is {->44}', 'COMPAREFUNC is'],
1499 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1500
1501 ['77 == g:xx', 'COMPAREANY =='],
1502 ['77 != g:xx', 'COMPAREANY !='],
1503 ['77 > g:xx', 'COMPAREANY >'],
1504 ['77 < g:xx', 'COMPAREANY <'],
1505 ['77 >= g:xx', 'COMPAREANY >='],
1506 ['77 <= g:xx', 'COMPAREANY <='],
1507 ['77 =~ g:xx', 'COMPAREANY =\~'],
1508 ['77 !~ g:xx', 'COMPAREANY !\~'],
1509 ['77 is g:xx', 'COMPAREANY is'],
1510 ['77 isnot g:xx', 'COMPAREANY isnot'],
1511 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001512 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001513 if has('float')
1514 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001515 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1516 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1517 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1518 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1519 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1520 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1521 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1522 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001523 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001524 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001525 endif
1526
Bram Moolenaarac564082020-09-27 19:05:33 +02001527 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001528 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001529 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001530 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001531 ' var isFalse = false',
1532 ' var isNull = v:null',
1533 ' var aNumber = 222',
1534 ' var aString = "yy"',
1535 ' var aBlob = 0z22',
1536 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001537 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001538 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001539 ' if ' .. case[0],
1540 ' echo 42'
1541 ' endif',
1542 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001543 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001544 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001545 assert_match('TestCase' .. nr .. '.*' ..
1546 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1547 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001548 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001549 '\d ' .. case[1] .. '.*' ..
1550 '\d JUMP_IF_FALSE -> \d\+.*',
1551 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001552
1553 nr += 1
1554 endfor
1555
Bram Moolenaar22da5592020-03-19 14:52:20 +01001556 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001557enddef
1558
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001559def s:FalsyOp()
1560 echo g:flag ?? "yes"
1561 echo [] ?? "empty list"
1562 echo "" ?? "empty string"
1563enddef
1564
1565def Test_dsassemble_falsy_op()
1566 var res = execute('disass s:FalsyOp')
1567 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1568 'echo g:flag ?? "yes"\_s*' ..
1569 '0 LOADG g:flag\_s*' ..
1570 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1571 '2 PUSHS "yes"\_s*' ..
1572 '3 ECHO 1\_s*' ..
1573 'echo \[\] ?? "empty list"\_s*' ..
1574 '4 NEWLIST size 0\_s*' ..
1575 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1576 '6 PUSHS "empty list"\_s*' ..
1577 '7 ECHO 1\_s*' ..
1578 'echo "" ?? "empty string"\_s*' ..
1579 '\d\+ PUSHS "empty string"\_s*' ..
1580 '\d\+ ECHO 1\_s*' ..
1581 '\d\+ PUSHNR 0\_s*' ..
1582 '\d\+ RETURN',
1583 res)
1584enddef
1585
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001586def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001587 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001588 ['"xx" == "yy"', false],
1589 ['"aa" == "aa"', true],
1590 ['has("eval") ? true : false', true],
1591 ['has("asdf") ? true : false', false],
1592 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001593
Bram Moolenaarac564082020-09-27 19:05:33 +02001594 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001595 for case in cases
1596 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001597 ' if ' .. case[0],
1598 ' echo 42'
1599 ' endif',
1600 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001601 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001602 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001603 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001604 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001605 assert_match('TestCase' .. nr .. '.*' ..
1606 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1607 '\d PUSHNR 42.*' ..
1608 '\d ECHO 1.*' ..
1609 '\d PUSHNR 0.*' ..
1610 '\d RETURN.*',
1611 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001612 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001613 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001614 assert_match('TestCase' .. nr .. '.*' ..
1615 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1616 'echo 42[ \n]*' ..
1617 'endif[ \n]*' ..
1618 '\s*\d PUSHNR 0.*' ..
1619 '\d RETURN.*',
1620 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001621 endif
1622
1623 nr += 1
1624 endfor
1625
1626 delete('Xdisassemble')
1627enddef
1628
Bram Moolenaarad39c092020-02-26 18:23:43 +01001629def s:Execute()
1630 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001631 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001632 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001633 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001634 execute 'help ' .. tag
1635enddef
1636
1637def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001638 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001639 assert_match('\<SNR>\d*_Execute\_s*' ..
1640 "execute 'help vim9.txt'\\_s*" ..
1641 '\d PUSHS "help vim9.txt"\_s*' ..
1642 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001643 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001644 '\d PUSHS "help vim9.txt"\_s*' ..
1645 '\d STORE $0\_s*' ..
1646 'execute cmd\_s*' ..
1647 '\d LOAD $0\_s*' ..
1648 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001649 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001650 '\d PUSHS "vim9.txt"\_s*' ..
1651 '\d STORE $1\_s*' ..
1652 "execute 'help ' .. tag\\_s*" ..
1653 '\d\+ PUSHS "help "\_s*' ..
1654 '\d\+ LOAD $1\_s*' ..
1655 '\d\+ CONCAT\_s*' ..
1656 '\d\+ EXECUTE 1\_s*' ..
1657 '\d\+ PUSHNR 0\_s*' ..
1658 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001659 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001660enddef
1661
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001662def s:Echomsg()
1663 echomsg 'some' 'message'
1664 echoerr 'went' .. 'wrong'
1665enddef
1666
1667def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001668 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001669 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1670 "echomsg 'some' 'message'\\_s*" ..
1671 '\d PUSHS "some"\_s*' ..
1672 '\d PUSHS "message"\_s*' ..
1673 '\d ECHOMSG 2\_s*' ..
1674 "echoerr 'went' .. 'wrong'\\_s*" ..
1675 '\d PUSHS "wentwrong"\_s*' ..
1676 '\d ECHOERR 1\_s*' ..
1677 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001678 '\d RETURN',
1679 res)
1680enddef
1681
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001682def SomeStringArg(arg: string)
1683 echo arg
1684enddef
1685
1686def SomeAnyArg(arg: any)
1687 echo arg
1688enddef
1689
1690def SomeStringArgAndReturn(arg: string): string
1691 return arg
1692enddef
1693
1694def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001695 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001696 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1697 '\d *echo arg.*' ..
1698 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001699 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001700
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001702 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1703 '\d *echo arg\_s*' ..
1704 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001705 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001706
Bram Moolenaarac564082020-09-27 19:05:33 +02001707 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001708 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1709 '\d *return arg\_s*' ..
1710 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001711 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001712enddef
1713
Bram Moolenaar09689a02020-05-09 22:50:08 +02001714def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001715 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001716 vim9script
1717 def FuncOne(): string
1718 return FuncTwo()
1719 enddef
1720 def FuncTwo(): string
1721 return 'two'
1722 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001723 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001724 END
1725 writefile(lines, 'Xdisassemble')
1726 source Xdisassemble
1727
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001728 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001729 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1730 'return FuncTwo()\_s*' ..
1731 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001732 '\d RETURN',
1733 g:res_FuncOne)
1734
1735 delete('Xdisassemble')
1736 unlet g:res_FuncOne
1737enddef
1738
Bram Moolenaar61a89812020-05-07 16:58:17 +02001739def s:ConcatStrings(): string
1740 return 'one' .. 'two' .. 'three'
1741enddef
1742
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001743def s:ComputeConst(): number
1744 return 2 + 3 * 4 / 6 + 7
1745enddef
1746
Bram Moolenaar1c747212020-05-09 18:28:34 +02001747def s:ComputeConstParen(): number
1748 return ((2 + 4) * (8 / 2)) / (3 + 4)
1749enddef
1750
Bram Moolenaar61a89812020-05-07 16:58:17 +02001751def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001752 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001753 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1754 "return 'one' .. 'two' .. 'three'\\_s*" ..
1755 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001756 '\d RETURN',
1757 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001758
1759 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001760 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1761 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1762 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001763 '\d RETURN',
1764 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001765
1766 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001767 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1768 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1769 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001770 '\d RETURN',
1771 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001772enddef
1773
Bram Moolenaar389df252020-07-09 21:20:47 +02001774def s:CallAppend()
1775 eval "some text"->append(2)
1776enddef
1777
1778def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001779 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001780 assert_match('<SNR>\d*_CallAppend\_s*' ..
1781 'eval "some text"->append(2)\_s*' ..
1782 '\d PUSHS "some text"\_s*' ..
1783 '\d PUSHNR 2\_s*' ..
1784 '\d SHUFFLE 2 up 1\_s*' ..
1785 '\d BCALL append(argc 2)\_s*' ..
1786 '\d DROP\_s*' ..
1787 '\d PUSHNR 0\_s*' ..
1788 '\d RETURN',
1789 res)
1790enddef
1791
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001792
1793def s:SilentMessage()
1794 silent echomsg "text"
1795 silent! echoerr "error"
1796enddef
1797
1798def Test_silent()
1799 var res = execute('disass s:SilentMessage')
1800 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1801 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001802 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001803 '\d PUSHS "text"\_s*' ..
1804 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001805 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001806 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001807 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001808 '\d PUSHS "error"\_s*' ..
1809 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001810 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001811 '\d PUSHNR 0\_s*' ..
1812 '\d RETURN',
1813 res)
1814enddef
1815
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001816" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker