blob: e7445d3860131508d9eccafb5dbb0786196c5f00 [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 Moolenaar5cab73f2020-02-06 19:25:19 +0100136def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200137 var localbool = true
138 var localspec = v:none
139 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100140 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200141 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100142 endif
143enddef
144
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100145def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200146 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200147 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
148 'localbool = true.*' ..
149 ' PUSH v:true.*' ..
150 'localspec = v:none.*' ..
151 ' PUSH v:none.*' ..
152 'localblob = 0z1234.*' ..
153 ' PUSHBLOB 0z1234.*',
154 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100155 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200156 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
157 'localfloat = 1.234.*' ..
158 ' PUSHF 1.234.*',
159 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100160 endif
161enddef
162
163def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200164 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100165 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200166 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100167 localstr = 'xyz'
168 v:char = 'abc'
169 s:scriptvar = 'sv'
170 g:globalvar = 'gv'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200171 b:buffervar = 'bv'
172 w:windowvar = 'wv'
173 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100174 &tabstop = 8
175 $ENVVAR = 'ev'
176 @z = 'rv'
177enddef
178
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100179def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200180 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200181 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200182 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200183 'localnr = 2.*' ..
184 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200185 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200186 'localstr = ''xyz''.*' ..
187 ' STORE $1.*' ..
188 'v:char = ''abc''.*' ..
189 'STOREV v:char.*' ..
190 's:scriptvar = ''sv''.*' ..
191 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
192 'g:globalvar = ''gv''.*' ..
193 ' STOREG g:globalvar.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200194 'b:buffervar = ''bv''.*' ..
195 ' STOREB b:buffervar.*' ..
196 'w:windowvar = ''wv''.*' ..
197 ' STOREW w:windowvar.*' ..
198 't:tabpagevar = ''tv''.*' ..
199 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200200 '&tabstop = 8.*' ..
201 ' STOREOPT &tabstop.*' ..
202 '$ENVVAR = ''ev''.*' ..
203 ' STOREENV $ENVVAR.*' ..
204 '@z = ''rv''.*' ..
205 ' STOREREG @z.*',
206 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100207enddef
208
Bram Moolenaarcb790402020-05-15 20:53:00 +0200209def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200210 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200211 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200212 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200213 localdict["a"] = 456
214enddef
215
216def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200217 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200218 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200219 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200220 '\d NEWLIST size 0\_s*' ..
221 '\d STORE $0\_s*' ..
222 'locallist\[0\] = 123\_s*' ..
223 '\d PUSHNR 123\_s*' ..
224 '\d PUSHNR 0\_s*' ..
225 '\d LOAD $0\_s*' ..
226 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200227 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200228 '\d NEWDICT size 0\_s*' ..
229 '\d STORE $1\_s*' ..
230 'localdict\["a"\] = 456\_s*' ..
231 '\d\+ PUSHNR 456\_s*' ..
232 '\d\+ PUSHS "a"\_s*' ..
233 '\d\+ LOAD $1\_s*' ..
234 '\d\+ STOREDICT\_s*' ..
235 '\d\+ PUSHNR 0\_s*' ..
236 '\d\+ RETURN',
237 res)
238enddef
239
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200240def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200241 var x: string
242 var y: string
243 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200244 [x, y; l] = g:stringlist
245enddef
246
247def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200248 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200249 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200250 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200251 '\d PUSHS "\[NULL\]"\_s*' ..
252 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200253 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200254 '\d PUSHS "\[NULL\]"\_s*' ..
255 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200257 '\d NEWLIST size 0\_s*' ..
258 '\d STORE $2\_s*' ..
259 '\[x, y; l\] = g:stringlist\_s*' ..
260 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200261 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200262 '\d CHECKLEN >= 2\_s*' ..
263 '\d\+ ITEM 0\_s*' ..
264 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
265 '\d\+ STORE $0\_s*' ..
266 '\d\+ ITEM 1\_s*' ..
267 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
268 '\d\+ STORE $1\_s*' ..
269 '\d\+ SLICE 2\_s*' ..
270 '\d\+ STORE $2\_s*' ..
271 '\d\+ PUSHNR 0\_s*' ..
272 '\d\+ RETURN',
273 res)
274enddef
275
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200276def s:ListAdd()
277 var l: list<number> = []
278 add(l, 123)
279 add(l, g:aNumber)
280enddef
281
282def Test_disassemble_list_add()
283 var res = execute('disass s:ListAdd')
284 assert_match('<SNR>\d*_ListAdd\_s*' ..
285 'var l: list<number> = []\_s*' ..
286 '\d NEWLIST size 0\_s*' ..
287 '\d STORE $0\_s*' ..
288 'add(l, 123)\_s*' ..
289 '\d LOAD $0\_s*' ..
290 '\d PUSHNR 123\_s*' ..
291 '\d LISTAPPEND\_s*' ..
292 '\d DROP\_s*' ..
293 'add(l, g:aNumber)\_s*' ..
294 '\d LOAD $0\_s*' ..
295 '\d\+ LOADG g:aNumber\_s*' ..
296 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
297 '\d\+ LISTAPPEND\_s*' ..
298 '\d\+ DROP\_s*' ..
299 '\d\+ PUSHNR 0\_s*' ..
300 '\d\+ RETURN',
301 res)
302enddef
303
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200304def s:BlobAdd()
305 var b: blob = 0z
306 add(b, 123)
307 add(b, g:aNumber)
308enddef
309
310def Test_disassemble_blob_add()
311 var res = execute('disass s:BlobAdd')
312 assert_match('<SNR>\d*_BlobAdd\_s*' ..
313 'var b: blob = 0z\_s*' ..
314 '\d PUSHBLOB 0z\_s*' ..
315 '\d STORE $0\_s*' ..
316 'add(b, 123)\_s*' ..
317 '\d LOAD $0\_s*' ..
318 '\d PUSHNR 123\_s*' ..
319 '\d BLOBAPPEND\_s*' ..
320 '\d DROP\_s*' ..
321 'add(b, g:aNumber)\_s*' ..
322 '\d LOAD $0\_s*' ..
323 '\d\+ LOADG g:aNumber\_s*' ..
324 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
325 '\d\+ BLOBAPPEND\_s*' ..
326 '\d\+ DROP\_s*' ..
327 '\d\+ PUSHNR 0\_s*' ..
328 '\d\+ RETURN',
329 res)
330enddef
331
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200332def s:ScriptFuncUnlet()
333 g:somevar = "value"
334 unlet g:somevar
335 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200336 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200337enddef
338
339def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200340 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200341 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
342 'g:somevar = "value"\_s*' ..
343 '\d PUSHS "value"\_s*' ..
344 '\d STOREG g:somevar\_s*' ..
345 'unlet g:somevar\_s*' ..
346 '\d UNLET g:somevar\_s*' ..
347 'unlet! g:somevar\_s*' ..
348 '\d UNLET! g:somevar\_s*' ..
349 'unlet $SOMEVAR\_s*' ..
350 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200351 res)
352enddef
353
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100354def s:ScriptFuncTry()
355 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200356 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100357 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200358 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100359 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200360 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100361 endtry
362enddef
363
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100364def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200365 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200366 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
367 'try\_s*' ..
368 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
369 'echo "yes"\_s*' ..
370 '\d PUSHS "yes"\_s*' ..
371 '\d ECHO 1\_s*' ..
372 'catch /fail/\_s*' ..
373 '\d JUMP -> \d\+\_s*' ..
374 '\d PUSH v:exception\_s*' ..
375 '\d PUSHS "fail"\_s*' ..
376 '\d COMPARESTRING =\~\_s*' ..
377 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
378 '\d CATCH\_s*' ..
379 'echo "no"\_s*' ..
380 '\d\+ PUSHS "no"\_s*' ..
381 '\d\+ ECHO 1\_s*' ..
382 'finally\_s*' ..
383 'throw "end"\_s*' ..
384 '\d\+ PUSHS "end"\_s*' ..
385 '\d\+ THROW\_s*' ..
386 'endtry\_s*' ..
387 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200388 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100389enddef
390
391def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200392 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100393 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100394enddef
395
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100396def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200397 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200398 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200399 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200400 '\d PUSHNR 1\_s*' ..
401 '\d PUSHS "two"\_s*' ..
402 '\d PUSHNR 333\_s*' ..
403 '\d NEWLIST size 3\_s*' ..
404 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100405 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200406 '\d PUSHS "one"\_s*' ..
407 '\d PUSHNR 1\_s*' ..
408 '\d PUSHS "two"\_s*' ..
409 '\d PUSHS "val"\_s*' ..
410 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200411 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100412enddef
413
Bram Moolenaar6e949782020-04-13 17:21:00 +0200414def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100415 echo arg
416enddef
417
418func UserFunc()
419 echo 'nothing'
420endfunc
421
422func UserFuncWithArg(arg)
423 echo a:arg
424endfunc
425
426def s:ScriptFuncCall(): string
427 changenr()
428 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100429 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100430 FuncWithArg(343)
431 ScriptFuncNew()
432 s:ScriptFuncNew()
433 UserFunc()
434 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200435 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100436 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200437 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100438 FuncRefWithArg("bar")
439 return "yes"
440enddef
441
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100442def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200443 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200444 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
445 'changenr()\_s*' ..
446 '\d BCALL changenr(argc 0)\_s*' ..
447 '\d DROP\_s*' ..
448 'char2nr("abc")\_s*' ..
449 '\d PUSHS "abc"\_s*' ..
450 '\d BCALL char2nr(argc 1)\_s*' ..
451 '\d DROP\_s*' ..
452 'Test_disassemble_new()\_s*' ..
453 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
454 '\d DROP\_s*' ..
455 'FuncWithArg(343)\_s*' ..
456 '\d\+ PUSHNR 343\_s*' ..
457 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
458 '\d\+ DROP\_s*' ..
459 'ScriptFuncNew()\_s*' ..
460 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
461 '\d\+ DROP\_s*' ..
462 's:ScriptFuncNew()\_s*' ..
463 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
464 '\d\+ DROP\_s*' ..
465 'UserFunc()\_s*' ..
466 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
467 '\d\+ DROP\_s*' ..
468 'UserFuncWithArg("foo")\_s*' ..
469 '\d\+ PUSHS "foo"\_s*' ..
470 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
471 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200472 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200473 '\d\+ PUSHS "UserFunc"\_s*' ..
474 '\d\+ BCALL function(argc 1)\_s*' ..
475 '\d\+ STORE $0\_s*' ..
476 'FuncRef()\_s*' ..
477 '\d\+ LOAD $\d\_s*' ..
478 '\d\+ PCALL (argc 0)\_s*' ..
479 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200480 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200481 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
482 '\d\+ BCALL function(argc 1)\_s*' ..
483 '\d\+ STORE $1\_s*' ..
484 'FuncRefWithArg("bar")\_s*' ..
485 '\d\+ PUSHS "bar"\_s*' ..
486 '\d\+ LOAD $\d\_s*' ..
487 '\d\+ PCALL (argc 1)\_s*' ..
488 '\d\+ DROP\_s*' ..
489 'return "yes"\_s*' ..
490 '\d\+ PUSHS "yes"\_s*' ..
491 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200492 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100493enddef
494
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200495
496def s:CreateRefs()
497 var local = 'a'
498 def Append(arg: string)
499 local ..= arg
500 enddef
501 g:Append = Append
502 def Get(): string
503 return local
504 enddef
505 g:Get = Get
506enddef
507
508def Test_disassemble_closure()
509 CreateRefs()
510 var res = execute('disass g:Append')
511 assert_match('<lambda>\d\_s*' ..
512 'local ..= arg\_s*' ..
513 '\d LOADOUTER $0\_s*' ..
514 '\d LOAD arg\[-1\]\_s*' ..
515 '\d CONCAT\_s*' ..
516 '\d STOREOUTER $0\_s*' ..
517 '\d PUSHNR 0\_s*' ..
518 '\d RETURN',
519 res)
520
521 res = execute('disass g:Get')
522 assert_match('<lambda>\d\_s*' ..
523 'return local\_s*' ..
524 '\d LOADOUTER $0\_s*' ..
525 '\d RETURN',
526 res)
527
528 unlet g:Append
529 unlet g:Get
530enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200531
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100532
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200533def EchoArg(arg: string): string
534 return arg
535enddef
536def RefThis(): func
537 return function('EchoArg')
538enddef
539def s:ScriptPCall()
540 RefThis()("text")
541enddef
542
543def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200544 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200545 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
546 'RefThis()("text")\_s*' ..
547 '\d DCALL RefThis(argc 0)\_s*' ..
548 '\d PUSHS "text"\_s*' ..
549 '\d PCALL top (argc 1)\_s*' ..
550 '\d PCALL end\_s*' ..
551 '\d DROP\_s*' ..
552 '\d PUSHNR 0\_s*' ..
553 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200554 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200555enddef
556
557
Bram Moolenaara26b9702020-04-18 19:53:28 +0200558def s:FuncWithForwardCall(): string
559 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100560enddef
561
562def DefinedLater(arg: string): string
563 return arg
564enddef
565
566def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200567 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200568 assert_match('FuncWithForwardCall\_s*' ..
569 'return g:DefinedLater("yes")\_s*' ..
570 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200571 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200572 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200573 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100574
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200575 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100576 assert_equal('yes', FuncWithForwardCall())
577
Bram Moolenaara26b9702020-04-18 19:53:28 +0200578 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200579 assert_match('FuncWithForwardCall\_s*' ..
580 'return g:DefinedLater("yes")\_s*' ..
581 '\d PUSHS "yes"\_s*' ..
582 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200583 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200584 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100585enddef
586
587
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100588def FuncWithDefault(arg: string = 'default'): string
589 return arg
590enddef
591
592def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200593 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200594 assert_match('FuncWithDefault\_s*' ..
595 '\d PUSHS "default"\_s*' ..
596 '\d STORE arg\[-1]\_s*' ..
597 'return arg\_s*' ..
598 '\d LOAD arg\[-1]\_s*' ..
599 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200600 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100601enddef
602
603
Bram Moolenaar158906c2020-02-06 20:39:45 +0100604def HasEval()
605 if has("eval")
606 echo "yes"
607 else
608 echo "no"
609 endif
610enddef
611
612def HasNothing()
613 if has("nothing")
614 echo "yes"
615 else
616 echo "no"
617 endif
618enddef
619
620def HasSomething()
621 if has("nothing")
622 echo "nothing"
623 elseif has("something")
624 echo "something"
625 elseif has("eval")
626 echo "eval"
627 elseif has("less")
628 echo "less"
629 endif
630enddef
631
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100632def HasGuiRunning()
633 if has("gui_running")
634 echo "yes"
635 else
636 echo "no"
637 endif
638enddef
639
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100640def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200641 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200642 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200643 assert_match('HasEval\_s*' ..
644 'if has("eval")\_s*' ..
645 'echo "yes"\_s*' ..
646 '\d PUSHS "yes"\_s*' ..
647 '\d ECHO 1\_s*' ..
648 'else\_s*' ..
649 'echo "no"\_s*' ..
650 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200651 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100652 assert_notmatch('JUMP', instr)
653
Bram Moolenaard2c61702020-09-06 15:58:36 +0200654 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100655 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200656 assert_match('HasNothing\_s*' ..
657 'if has("nothing")\_s*' ..
658 'echo "yes"\_s*' ..
659 'else\_s*' ..
660 'echo "no"\_s*' ..
661 '\d PUSHS "no"\_s*' ..
662 '\d ECHO 1\_s*' ..
663 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200664 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100665 assert_notmatch('PUSHS "yes"', instr)
666 assert_notmatch('JUMP', instr)
667
Bram Moolenaard2c61702020-09-06 15:58:36 +0200668 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100669 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200670 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200671 'if has("nothing")\_s*' ..
672 'echo "nothing"\_s*' ..
673 'elseif has("something")\_s*' ..
674 'echo "something"\_s*' ..
675 'elseif has("eval")\_s*' ..
676 'echo "eval"\_s*' ..
677 '\d PUSHS "eval"\_s*' ..
678 '\d ECHO 1\_s*' ..
679 'elseif has("less").*' ..
680 'echo "less"\_s*' ..
681 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200682 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100683 assert_notmatch('PUSHS "nothing"', instr)
684 assert_notmatch('PUSHS "something"', instr)
685 assert_notmatch('PUSHS "less"', instr)
686 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100687
688 var result: string
689 var instr_expected: string
690 if has('gui')
691 if has('gui_running')
692 # GUI already running, always returns "yes"
693 result = "\nyes"
694 instr_expected = 'HasGuiRunning.*' ..
695 'if has("gui_running")\_s*' ..
696 ' echo "yes"\_s*' ..
697 '\d PUSHS "yes"\_s*' ..
698 '\d ECHO 1\_s*' ..
699 'else\_s*' ..
700 ' echo "no"\_s*' ..
701 'endif'
702 else
703 result = "\nno"
704 if has('unix')
705 # GUI not running but can start later, call has()
706 instr_expected = 'HasGuiRunning.*' ..
707 'if has("gui_running")\_s*' ..
708 '\d PUSHS "gui_running"\_s*' ..
709 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100710 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100711 '\d JUMP_IF_FALSE -> \d\_s*' ..
712 ' echo "yes"\_s*' ..
713 '\d PUSHS "yes"\_s*' ..
714 '\d ECHO 1\_s*' ..
715 'else\_s*' ..
716 '\d JUMP -> \d\_s*' ..
717 ' echo "no"\_s*' ..
718 '\d PUSHS "no"\_s*' ..
719 '\d ECHO 1\_s*' ..
720 'endif'
721 else
722 # GUI not running, always return "no"
723 instr_expected = 'HasGuiRunning.*' ..
724 'if has("gui_running")\_s*' ..
725 ' echo "yes"\_s*' ..
726 'else\_s*' ..
727 ' echo "no"\_s*' ..
728 '\d PUSHS "no"\_s*' ..
729 '\d ECHO 1\_s*' ..
730 'endif'
731 endif
732 endif
733 else
734 # GUI not supported, always return "no"
735 result = "\nno"
736 instr_expected = 'HasGuiRunning.*' ..
737 'if has("gui_running")\_s*' ..
738 ' echo "yes"\_s*' ..
739 'else\_s*' ..
740 ' echo "no"\_s*' ..
741 '\d PUSHS "no"\_s*' ..
742 '\d ECHO 1\_s*' ..
743 'endif'
744 endif
745
746 assert_equal(result, execute('HasGuiRunning()'))
747 instr = execute('disassemble HasGuiRunning')
748 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100749enddef
750
Bram Moolenaarefd88552020-06-18 20:50:10 +0200751def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100752 if 1 < 0
753 return "maybe"
754 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200755 if g:cond
756 return "yes"
757 else
758 return "no"
759 endif
760enddef
761
762def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200763 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200764 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100765 'if 1 < 0\_s*' ..
766 ' return "maybe"\_s*' ..
767 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200768 'if g:cond\_s*' ..
769 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100770 '1 COND2BOOL\_s*' ..
771 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200772 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100773 '3 PUSHS "yes"\_s*' ..
774 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200775 'else\_s*' ..
776 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100777 '5 PUSHS "no"\_s*' ..
778 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200779 instr)
780enddef
781
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100782def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200783 var Funky1: func
784 var Funky2: func = function("len")
785 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100786enddef
787
788def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200789 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200790 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200791 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200792 '0 PUSHFUNC "\[none]"\_s*' ..
793 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200794 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200795 '2 PUSHS "len"\_s*' ..
796 '3 BCALL function(argc 1)\_s*' ..
797 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200798 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200799 '\d PUSHS "UserFunc"\_s*' ..
800 '\d BCALL funcref(argc 1)\_s*' ..
801 '\d STORE $2\_s*' ..
802 '\d PUSHNR 0\_s*' ..
803 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200804 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100805enddef
806
807if has('channel')
808 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200809 var job1: job
810 var job2: job = job_start("donothing")
811 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100812 enddef
813endif
814
815def Test_disassemble_channel()
816 CheckFeature channel
817
Bram Moolenaarac564082020-09-27 19:05:33 +0200818 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200819 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200820 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200821 '\d PUSHJOB "no process"\_s*' ..
822 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200823 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200824 '\d PUSHS "donothing"\_s*' ..
825 '\d BCALL job_start(argc 1)\_s*' ..
826 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200827 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200828 '\d PUSHCHANNEL 0\_s*' ..
829 '\d STORE $2\_s*' ..
830 '\d PUSHNR 0\_s*' ..
831 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200832 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100833enddef
834
Bram Moolenaar777770f2020-02-06 21:27:08 +0100835def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200836 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100837 return F("x")
838enddef
839
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100840def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100841 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200842 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200843 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200844 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200845 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200846 '\d STORE $0\_s*' ..
847 'return F("x")\_s*' ..
848 '\d PUSHS "x"\_s*' ..
849 '\d LOAD $0\_s*' ..
850 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200851 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200852 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200853
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200855 instr = execute('disassemble ' .. name)
856 assert_match('<lambda>\d\+\_s*' ..
857 'return "X" .. a .. "X"\_s*' ..
858 '\d PUSHS "X"\_s*' ..
859 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200860 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200861 '\d CONCAT\_s*' ..
862 '\d PUSHS "X"\_s*' ..
863 '\d CONCAT\_s*' ..
864 '\d RETURN',
865 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100866enddef
867
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100868def LambdaWithType(): number
869 var Ref = {a: number -> a + 10}
870 return Ref(g:value)
871enddef
872
873def Test_disassemble_lambda_with_type()
874 g:value = 5
875 assert_equal(15, LambdaWithType())
876 var instr = execute('disassemble LambdaWithType')
877 assert_match('LambdaWithType\_s*' ..
878 'var Ref = {a: number -> a + 10}\_s*' ..
879 '\d FUNCREF <lambda>\d\+\_s*' ..
880 '\d STORE $0\_s*' ..
881 'return Ref(g:value)\_s*' ..
882 '\d LOADG g:value\_s*' ..
883 '\d LOAD $0\_s*' ..
884 '\d CHECKTYPE number stack\[-2\]\_s*' ..
885 '\d PCALL (argc 1)\_s*' ..
886 '\d RETURN',
887 instr)
888enddef
889
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200890def NestedOuter()
891 def g:Inner()
892 echomsg "inner"
893 enddef
894enddef
895
896def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200897 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200898 assert_match('NestedOuter\_s*' ..
899 'def g:Inner()\_s*' ..
900 'echomsg "inner"\_s*' ..
901 'enddef\_s*' ..
902 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
903 '\d PUSHNR 0\_s*' ..
904 '\d RETURN',
905 instr)
906enddef
907
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100908def NestedDefList()
909 def
910 def Info
911 def /Info
912 def /Info/
913enddef
914
915def Test_nested_def_list()
916 var instr = execute('disassemble NestedDefList')
917 assert_match('NestedDefList\_s*' ..
918 'def\_s*' ..
919 '\d DEF \_s*' ..
920 'def Info\_s*' ..
921 '\d DEF Info\_s*' ..
922 'def /Info\_s*' ..
923 '\d DEF /Info\_s*' ..
924 'def /Info/\_s*' ..
925 '\d DEF /Info/\_s*' ..
926 '\d PUSHNR 0\_s*' ..
927 '\d RETURN',
928 instr)
929enddef
930
Bram Moolenaar6e949782020-04-13 17:21:00 +0200931def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100932 if arg == 1 && arg != 2 || arg == 4
933 return 'yes'
934 endif
935 return 'no'
936enddef
937
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100938def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100939 assert_equal("yes", AndOr(1))
940 assert_equal("no", AndOr(2))
941 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200942 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200943 assert_match('AndOr\_s*' ..
944 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
945 '\d LOAD arg\[-1]\_s*' ..
946 '\d PUSHNR 1\_s*' ..
947 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200948 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200949 '\d LOAD arg\[-1]\_s*' ..
950 '\d PUSHNR 2\_s*' ..
951 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200952 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200953 '\d LOAD arg\[-1]\_s*' ..
954 '\d\+ PUSHNR 4\_s*' ..
955 '\d\+ COMPAREANY ==\_s*' ..
956 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200957 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100958enddef
959
Bram Moolenaar04d05222020-02-06 22:06:54 +0100960def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +0200961 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +0100962 for i in range(3)
963 res->add(i)
964 endfor
965 return res
966enddef
967
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100968def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +0100969 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +0200970 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200971 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200972 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200973 '\d NEWLIST size 0\_s*' ..
974 '\d STORE $0\_s*' ..
975 'for i in range(3)\_s*' ..
976 '\d STORE -1 in $1\_s*' ..
977 '\d PUSHNR 3\_s*' ..
978 '\d BCALL range(argc 1)\_s*' ..
979 '\d FOR $1 -> \d\+\_s*' ..
980 '\d STORE $2\_s*' ..
981 'res->add(i)\_s*' ..
982 '\d LOAD $0\_s*' ..
983 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200984 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200985 '\d\+ DROP\_s*' ..
986 'endfor\_s*' ..
987 '\d\+ JUMP -> \d\+\_s*' ..
988 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200989 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +0100990enddef
991
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200992def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200993 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200994 for str in eval('["one", "two"]')
995 res ..= str
996 endfor
997 return res
998enddef
999
1000def Test_disassemble_for_loop_eval()
1001 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001002 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001003 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001004 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001005 '\d PUSHS ""\_s*' ..
1006 '\d STORE $0\_s*' ..
1007 'for str in eval(''\["one", "two"\]'')\_s*' ..
1008 '\d STORE -1 in $1\_s*' ..
1009 '\d PUSHS "\["one", "two"\]"\_s*' ..
1010 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001011 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001012 '\d FOR $1 -> \d\+\_s*' ..
1013 '\d STORE $2\_s*' ..
1014 'res ..= str\_s*' ..
1015 '\d\+ LOAD $0\_s*' ..
1016 '\d\+ LOAD $2\_s*' ..
1017 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1018 '\d\+ CONCAT\_s*' ..
1019 '\d\+ STORE $0\_s*' ..
1020 'endfor\_s*' ..
1021 '\d\+ JUMP -> 6\_s*' ..
1022 '\d\+ DROP\_s*' ..
1023 'return res\_s*' ..
1024 '\d\+ LOAD $0\_s*' ..
1025 '\d\+ RETURN',
1026 instr)
1027enddef
1028
Bram Moolenaar792f7862020-11-23 08:31:18 +01001029def ForLoopUnpack()
1030 for [x1, x2] in [[1, 2], [3, 4]]
1031 echo x1 x2
1032 endfor
1033enddef
1034
1035def Test_disassemble_for_loop_unpack()
1036 var instr = execute('disassemble ForLoopUnpack')
1037 assert_match('ForLoopUnpack\_s*' ..
1038 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1039 '\d\+ STORE -1 in $0\_s*' ..
1040 '\d\+ PUSHNR 1\_s*' ..
1041 '\d\+ PUSHNR 2\_s*' ..
1042 '\d\+ NEWLIST size 2\_s*' ..
1043 '\d\+ PUSHNR 3\_s*' ..
1044 '\d\+ PUSHNR 4\_s*' ..
1045 '\d\+ NEWLIST size 2\_s*' ..
1046 '\d\+ NEWLIST size 2\_s*' ..
1047 '\d\+ FOR $0 -> 16\_s*' ..
1048 '\d\+ UNPACK 2\_s*' ..
1049 '\d\+ STORE $1\_s*' ..
1050 '\d\+ STORE $2\_s*' ..
1051 'echo x1 x2\_s*' ..
1052 '\d\+ LOAD $1\_s*' ..
1053 '\d\+ LOAD $2\_s*' ..
1054 '\d\+ ECHO 2\_s*' ..
1055 'endfor\_s*' ..
1056 '\d\+ JUMP -> 8\_s*' ..
1057 '\d\+ DROP\_s*' ..
1058 '\d\+ PUSHNR 0\_s*' ..
1059 '\d\+ RETURN',
1060 instr)
1061enddef
1062
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001063let g:number = 42
1064
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001065def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001066 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001067enddef
1068
1069def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001070 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001071 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001072 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001073 '\d PUSHNR 23\_s*' ..
1074 '\d LOADG g:number\_s*' ..
1075 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1076 '\d NEWLIST size 2\_s*' ..
1077 '\d STORE $0\_s*' ..
1078 '\d PUSHNR 0\_s*' ..
1079 '\d RETURN\_s*',
1080 instr)
1081enddef
1082
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001083def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001084 var nr = 3
1085 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001086 nrres = nr - 7
1087 nrres = nr * 7
1088 nrres = nr / 7
1089 nrres = nr % 7
1090
Bram Moolenaarac564082020-09-27 19:05:33 +02001091 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001092 anyres = g:number - 7
1093 anyres = g:number * 7
1094 anyres = g:number / 7
1095 anyres = g:number % 7
1096
1097 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001098 var fl = 3.0
1099 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001100 flres = fl - 7.0
1101 flres = fl * 7.0
1102 flres = fl / 7.0
1103 endif
1104enddef
1105
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001106def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001107 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001108 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001109 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001110 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001111 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001112 '\d LOAD $0.*' ..
1113 '\d PUSHNR 7.*' ..
1114 '\d OPNR +.*' ..
1115 '\d STORE $1.*' ..
1116 'nrres = nr - 7.*' ..
1117 '\d OPNR -.*' ..
1118 'nrres = nr \* 7.*' ..
1119 '\d OPNR \*.*' ..
1120 'nrres = nr / 7.*' ..
1121 '\d OPNR /.*' ..
1122 'nrres = nr % 7.*' ..
1123 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001124 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001125 '\d LOADG g:number.*' ..
1126 '\d PUSHNR 7.*' ..
1127 '\d OPANY +.*' ..
1128 '\d STORE $2.*' ..
1129 'anyres = g:number - 7.*' ..
1130 '\d OPANY -.*' ..
1131 'anyres = g:number \* 7.*' ..
1132 '\d OPANY \*.*' ..
1133 'anyres = g:number / 7.*' ..
1134 '\d OPANY /.*' ..
1135 'anyres = g:number % 7.*' ..
1136 '\d OPANY %.*',
1137 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001138 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001139 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001140 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001141 '\d PUSHF 3.0.*' ..
1142 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001143 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001144 '\d LOAD $3.*' ..
1145 '\d PUSHF 7.0.*' ..
1146 '\d OPFLOAT +.*' ..
1147 '\d STORE $4.*' ..
1148 'flres = fl - 7.0.*' ..
1149 '\d OPFLOAT -.*' ..
1150 'flres = fl \* 7.0.*' ..
1151 '\d OPFLOAT \*.*' ..
1152 'flres = fl / 7.0.*' ..
1153 '\d OPFLOAT /.*',
1154 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001155 endif
1156enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001157
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001158def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001159 var reslist = [1, 2] + [3, 4]
1160 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001161enddef
1162
1163def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001164 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001165 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001167 '\d PUSHNR 1.*' ..
1168 '\d PUSHNR 2.*' ..
1169 '\d NEWLIST size 2.*' ..
1170 '\d PUSHNR 3.*' ..
1171 '\d PUSHNR 4.*' ..
1172 '\d NEWLIST size 2.*' ..
1173 '\d ADDLIST.*' ..
1174 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001175 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001176 '\d PUSHBLOB 0z1122.*' ..
1177 '\d PUSHBLOB 0z3344.*' ..
1178 '\d ADDBLOB.*' ..
1179 '\d STORE $.*',
1180 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001181enddef
1182
1183let g:aa = 'aa'
1184def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001185 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001186 return res
1187enddef
1188
1189def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001190 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001191 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001192 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001193 '\d LOADG g:aa.*' ..
1194 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001195 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001196 '\d CONCAT.*' ..
1197 '\d STORE $.*',
1198 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001199 assert_equal('aabb', ConcatString())
1200enddef
1201
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001202def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001203 var s = "abcd"
1204 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001205 return res
1206enddef
1207
1208def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001209 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001210 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001211 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001212 '\d PUSHS "abcd"\_s*' ..
1213 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001215 '\d LOAD $0\_s*' ..
1216 '\d PUSHNR 1\_s*' ..
1217 '\d STRINDEX\_s*' ..
1218 '\d STORE $1\_s*',
1219 instr)
1220 assert_equal('b', StringIndex())
1221enddef
1222
Bram Moolenaared591872020-08-15 22:14:53 +02001223def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001224 var s = "abcd"
1225 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001226 return res
1227enddef
1228
1229def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001230 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001231 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001232 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001233 '\d PUSHS "abcd"\_s*' ..
1234 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001235 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001236 '\d LOAD $0\_s*' ..
1237 '\d PUSHNR 1\_s*' ..
1238 '\d PUSHNR 8\_s*' ..
1239 '\d STRSLICE\_s*' ..
1240 '\d STORE $1\_s*',
1241 instr)
1242 assert_equal('bcd', StringSlice())
1243enddef
1244
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001245def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001246 var l = [1, 2, 3]
1247 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001248 return res
1249enddef
1250
1251def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001252 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001253 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001254 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001255 '\d PUSHNR 1\_s*' ..
1256 '\d PUSHNR 2\_s*' ..
1257 '\d PUSHNR 3\_s*' ..
1258 '\d NEWLIST size 3\_s*' ..
1259 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001260 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001261 '\d LOAD $0\_s*' ..
1262 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001263 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001264 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001265 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001266 assert_equal(2, ListIndex())
1267enddef
1268
Bram Moolenaared591872020-08-15 22:14:53 +02001269def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001270 var l = [1, 2, 3]
1271 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001272 return res
1273enddef
1274
1275def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001276 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001277 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001278 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001279 '\d PUSHNR 1\_s*' ..
1280 '\d PUSHNR 2\_s*' ..
1281 '\d PUSHNR 3\_s*' ..
1282 '\d NEWLIST size 3\_s*' ..
1283 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 'var res = l\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001285 '\d LOAD $0\_s*' ..
1286 '\d PUSHNR 1\_s*' ..
1287 '\d PUSHNR 8\_s*' ..
1288 '\d LISTSLICE\_s*' ..
1289 '\d STORE $1\_s*',
1290 instr)
1291 assert_equal([2, 3], ListSlice())
1292enddef
1293
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001294def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001295 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001296 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001297 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001298 return res
1299enddef
1300
1301def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001302 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001303 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001304 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001305 '\d PUSHS "item"\_s*' ..
1306 '\d PUSHNR 1\_s*' ..
1307 '\d NEWDICT size 1\_s*' ..
1308 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001309 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001310 '\d\+ LOAD $0\_s*' ..
1311 '\d\+ MEMBER item\_s*' ..
1312 '\d\+ STORE $1\_s*' ..
1313 'res = d\["item"\]\_s*' ..
1314 '\d\+ LOAD $0\_s*' ..
1315 '\d\+ PUSHS "item"\_s*' ..
1316 '\d\+ MEMBER\_s*' ..
1317 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001318 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001319 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001320enddef
1321
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001322let somelist = [1, 2, 3, 4, 5]
1323def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001324 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001325 return res
1326enddef
1327
1328def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001329 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001330 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001331 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001332 '\d LOADG g:somelist\_s*' ..
1333 '\d PUSHNR 2\_s*' ..
1334 '\d ANYINDEX\_s*' ..
1335 '\d STORE $0\_s*' ..
1336 'return res\_s*' ..
1337 '\d LOAD $0\_s*' ..
1338 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1339 '\d RETURN',
1340 instr)
1341 assert_equal(3, AnyIndex())
1342enddef
1343
1344def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001345 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001346 return res
1347enddef
1348
1349def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001350 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001351 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001352 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001353 '\d LOADG g:somelist\_s*' ..
1354 '\d PUSHNR 1\_s*' ..
1355 '\d PUSHNR 3\_s*' ..
1356 '\d ANYSLICE\_s*' ..
1357 '\d STORE $0\_s*' ..
1358 'return res\_s*' ..
1359 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001360 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001361 '\d RETURN',
1362 instr)
1363 assert_equal([2, 3, 4], AnySlice())
1364enddef
1365
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001366def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001367 var nr = 9
1368 var plus = +nr
1369 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001370 return res
1371enddef
1372
1373def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001374 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001375 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001376 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001377 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001378 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001379 '\d LOAD $0\_s*' ..
1380 '\d CHECKNR\_s*' ..
1381 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001382 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001383 '\d LOAD $0\_s*' ..
1384 '\d NEGATENR\_s*' ..
1385 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001386 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001387 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001388enddef
1389
1390def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001391 var flag = true
1392 var invert = !flag
1393 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001394 return res
1395enddef
1396
1397def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001398 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001399 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001400 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001401 '\d PUSH v:true\_s*' ..
1402 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001404 '\d LOAD $0\_s*' ..
1405 '\d INVERT (!val)\_s*' ..
1406 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001407 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001408 '\d LOAD $0\_s*' ..
1409 '\d 2BOOL (!!val)\_s*' ..
1410 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001411 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001412 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001413enddef
1414
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001415def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001416 var name: bool = 1 && 0 || 1
1417 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001418enddef
1419
1420def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001421 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001422 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001423 'var name: bool = 1 && 0 || 1\_s*' ..
1424 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001425 '1 2BOOL (!!val)\_s*' ..
1426 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1427 '3 PUSHNR 0\_s*' ..
1428 '4 2BOOL (!!val)\_s*' ..
1429 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1430 '6 PUSHNR 1\_s*' ..
1431 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001432 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001433 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001434 '\d\+ LOAD $0\_s*' ..
1435 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001436 instr)
1437 assert_equal(true, InvertBool())
1438enddef
1439
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001440def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001441 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001442 ['true == isFalse', 'COMPAREBOOL =='],
1443 ['true != isFalse', 'COMPAREBOOL !='],
1444 ['v:none == isNull', 'COMPARESPECIAL =='],
1445 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001446
Bram Moolenaara5565e42020-05-09 15:44:01 +02001447 ['111 == aNumber', 'COMPARENR =='],
1448 ['111 != aNumber', 'COMPARENR !='],
1449 ['111 > aNumber', 'COMPARENR >'],
1450 ['111 < aNumber', 'COMPARENR <'],
1451 ['111 >= aNumber', 'COMPARENR >='],
1452 ['111 <= aNumber', 'COMPARENR <='],
1453 ['111 =~ aNumber', 'COMPARENR =\~'],
1454 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001455
Bram Moolenaara5565e42020-05-09 15:44:01 +02001456 ['"xx" != aString', 'COMPARESTRING !='],
1457 ['"xx" > aString', 'COMPARESTRING >'],
1458 ['"xx" < aString', 'COMPARESTRING <'],
1459 ['"xx" >= aString', 'COMPARESTRING >='],
1460 ['"xx" <= aString', 'COMPARESTRING <='],
1461 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1462 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1463 ['"xx" is aString', 'COMPARESTRING is'],
1464 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001465
Bram Moolenaara5565e42020-05-09 15:44:01 +02001466 ['0z11 == aBlob', 'COMPAREBLOB =='],
1467 ['0z11 != aBlob', 'COMPAREBLOB !='],
1468 ['0z11 is aBlob', 'COMPAREBLOB is'],
1469 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001470
Bram Moolenaara5565e42020-05-09 15:44:01 +02001471 ['[1, 2] == aList', 'COMPARELIST =='],
1472 ['[1, 2] != aList', 'COMPARELIST !='],
1473 ['[1, 2] is aList', 'COMPARELIST is'],
1474 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001475
Bram Moolenaare0de1712020-12-02 17:36:54 +01001476 ['{a: 1} == aDict', 'COMPAREDICT =='],
1477 ['{a: 1} != aDict', 'COMPAREDICT !='],
1478 ['{a: 1} is aDict', 'COMPAREDICT is'],
1479 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001480
1481 ['{->33} == {->44}', 'COMPAREFUNC =='],
1482 ['{->33} != {->44}', 'COMPAREFUNC !='],
1483 ['{->33} is {->44}', 'COMPAREFUNC is'],
1484 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1485
1486 ['77 == g:xx', 'COMPAREANY =='],
1487 ['77 != g:xx', 'COMPAREANY !='],
1488 ['77 > g:xx', 'COMPAREANY >'],
1489 ['77 < g:xx', 'COMPAREANY <'],
1490 ['77 >= g:xx', 'COMPAREANY >='],
1491 ['77 <= g:xx', 'COMPAREANY <='],
1492 ['77 =~ g:xx', 'COMPAREANY =\~'],
1493 ['77 !~ g:xx', 'COMPAREANY !\~'],
1494 ['77 is g:xx', 'COMPAREANY is'],
1495 ['77 isnot g:xx', 'COMPAREANY isnot'],
1496 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001497 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001498 if has('float')
1499 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001500 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1501 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1502 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1503 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1504 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1505 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1506 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1507 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001508 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001509 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001510 endif
1511
Bram Moolenaarac564082020-09-27 19:05:33 +02001512 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001513 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001514 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001515 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001516 ' var isFalse = false',
1517 ' var isNull = v:null',
1518 ' var aNumber = 222',
1519 ' var aString = "yy"',
1520 ' var aBlob = 0z22',
1521 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001522 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001523 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001524 ' if ' .. case[0],
1525 ' echo 42'
1526 ' endif',
1527 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001528 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001530 assert_match('TestCase' .. nr .. '.*' ..
1531 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1532 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001533 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001534 '\d ' .. case[1] .. '.*' ..
1535 '\d JUMP_IF_FALSE -> \d\+.*',
1536 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001537
1538 nr += 1
1539 endfor
1540
Bram Moolenaar22da5592020-03-19 14:52:20 +01001541 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001542enddef
1543
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001544def s:FalsyOp()
1545 echo g:flag ?? "yes"
1546 echo [] ?? "empty list"
1547 echo "" ?? "empty string"
1548enddef
1549
1550def Test_dsassemble_falsy_op()
1551 var res = execute('disass s:FalsyOp')
1552 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1553 'echo g:flag ?? "yes"\_s*' ..
1554 '0 LOADG g:flag\_s*' ..
1555 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1556 '2 PUSHS "yes"\_s*' ..
1557 '3 ECHO 1\_s*' ..
1558 'echo \[\] ?? "empty list"\_s*' ..
1559 '4 NEWLIST size 0\_s*' ..
1560 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1561 '6 PUSHS "empty list"\_s*' ..
1562 '7 ECHO 1\_s*' ..
1563 'echo "" ?? "empty string"\_s*' ..
1564 '\d\+ PUSHS "empty string"\_s*' ..
1565 '\d\+ ECHO 1\_s*' ..
1566 '\d\+ PUSHNR 0\_s*' ..
1567 '\d\+ RETURN',
1568 res)
1569enddef
1570
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001571def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001572 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001573 ['"xx" == "yy"', false],
1574 ['"aa" == "aa"', true],
1575 ['has("eval") ? true : false', true],
1576 ['has("asdf") ? true : false', false],
1577 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001578
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001580 for case in cases
1581 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001582 ' if ' .. case[0],
1583 ' echo 42'
1584 ' endif',
1585 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001586 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001587 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001588 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001589 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001590 assert_match('TestCase' .. nr .. '.*' ..
1591 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1592 '\d PUSHNR 42.*' ..
1593 '\d ECHO 1.*' ..
1594 '\d PUSHNR 0.*' ..
1595 '\d RETURN.*',
1596 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001597 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001598 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001599 assert_match('TestCase' .. nr .. '.*' ..
1600 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1601 'echo 42[ \n]*' ..
1602 'endif[ \n]*' ..
1603 '\s*\d PUSHNR 0.*' ..
1604 '\d RETURN.*',
1605 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001606 endif
1607
1608 nr += 1
1609 endfor
1610
1611 delete('Xdisassemble')
1612enddef
1613
Bram Moolenaarad39c092020-02-26 18:23:43 +01001614def s:Execute()
1615 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001616 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001617 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001618 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001619 execute 'help ' .. tag
1620enddef
1621
1622def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001623 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001624 assert_match('\<SNR>\d*_Execute\_s*' ..
1625 "execute 'help vim9.txt'\\_s*" ..
1626 '\d PUSHS "help vim9.txt"\_s*' ..
1627 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001628 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001629 '\d PUSHS "help vim9.txt"\_s*' ..
1630 '\d STORE $0\_s*' ..
1631 'execute cmd\_s*' ..
1632 '\d LOAD $0\_s*' ..
1633 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001634 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001635 '\d PUSHS "vim9.txt"\_s*' ..
1636 '\d STORE $1\_s*' ..
1637 "execute 'help ' .. tag\\_s*" ..
1638 '\d\+ PUSHS "help "\_s*' ..
1639 '\d\+ LOAD $1\_s*' ..
1640 '\d\+ CONCAT\_s*' ..
1641 '\d\+ EXECUTE 1\_s*' ..
1642 '\d\+ PUSHNR 0\_s*' ..
1643 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001644 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001645enddef
1646
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001647def s:Echomsg()
1648 echomsg 'some' 'message'
1649 echoerr 'went' .. 'wrong'
1650enddef
1651
1652def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001653 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001654 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1655 "echomsg 'some' 'message'\\_s*" ..
1656 '\d PUSHS "some"\_s*' ..
1657 '\d PUSHS "message"\_s*' ..
1658 '\d ECHOMSG 2\_s*' ..
1659 "echoerr 'went' .. 'wrong'\\_s*" ..
1660 '\d PUSHS "wentwrong"\_s*' ..
1661 '\d ECHOERR 1\_s*' ..
1662 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001663 '\d RETURN',
1664 res)
1665enddef
1666
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001667def SomeStringArg(arg: string)
1668 echo arg
1669enddef
1670
1671def SomeAnyArg(arg: any)
1672 echo arg
1673enddef
1674
1675def SomeStringArgAndReturn(arg: string): string
1676 return arg
1677enddef
1678
1679def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001680 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001681 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1682 '\d *echo arg.*' ..
1683 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001684 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001685
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001687 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1688 '\d *echo arg\_s*' ..
1689 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001690 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001691
Bram Moolenaarac564082020-09-27 19:05:33 +02001692 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001693 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1694 '\d *return arg\_s*' ..
1695 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001696 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001697enddef
1698
Bram Moolenaar09689a02020-05-09 22:50:08 +02001699def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001700 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001701 vim9script
1702 def FuncOne(): string
1703 return FuncTwo()
1704 enddef
1705 def FuncTwo(): string
1706 return 'two'
1707 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001708 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001709 END
1710 writefile(lines, 'Xdisassemble')
1711 source Xdisassemble
1712
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001713 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001714 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1715 'return FuncTwo()\_s*' ..
1716 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001717 '\d RETURN',
1718 g:res_FuncOne)
1719
1720 delete('Xdisassemble')
1721 unlet g:res_FuncOne
1722enddef
1723
Bram Moolenaar61a89812020-05-07 16:58:17 +02001724def s:ConcatStrings(): string
1725 return 'one' .. 'two' .. 'three'
1726enddef
1727
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001728def s:ComputeConst(): number
1729 return 2 + 3 * 4 / 6 + 7
1730enddef
1731
Bram Moolenaar1c747212020-05-09 18:28:34 +02001732def s:ComputeConstParen(): number
1733 return ((2 + 4) * (8 / 2)) / (3 + 4)
1734enddef
1735
Bram Moolenaar61a89812020-05-07 16:58:17 +02001736def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001737 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001738 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1739 "return 'one' .. 'two' .. 'three'\\_s*" ..
1740 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001741 '\d RETURN',
1742 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001743
1744 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001745 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1746 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1747 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001748 '\d RETURN',
1749 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001750
1751 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001752 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1753 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1754 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001755 '\d RETURN',
1756 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001757enddef
1758
Bram Moolenaar389df252020-07-09 21:20:47 +02001759def s:CallAppend()
1760 eval "some text"->append(2)
1761enddef
1762
1763def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001764 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001765 assert_match('<SNR>\d*_CallAppend\_s*' ..
1766 'eval "some text"->append(2)\_s*' ..
1767 '\d PUSHS "some text"\_s*' ..
1768 '\d PUSHNR 2\_s*' ..
1769 '\d SHUFFLE 2 up 1\_s*' ..
1770 '\d BCALL append(argc 2)\_s*' ..
1771 '\d DROP\_s*' ..
1772 '\d PUSHNR 0\_s*' ..
1773 '\d RETURN',
1774 res)
1775enddef
1776
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001777
1778def s:SilentMessage()
1779 silent echomsg "text"
1780 silent! echoerr "error"
1781enddef
1782
1783def Test_silent()
1784 var res = execute('disass s:SilentMessage')
1785 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1786 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001787 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001788 '\d PUSHS "text"\_s*' ..
1789 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001790 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001791 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001792 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001793 '\d PUSHS "error"\_s*' ..
1794 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001795 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001796 '\d PUSHNR 0\_s*' ..
1797 '\d RETURN',
1798 res)
1799enddef
1800
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001801" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker