blob: baac5871fbb7b0fdbfab1907b6b334fa959e8d97 [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
120 '\d\+ PUSHNR 0\_s*' ..
121 '\d\+ RETURN',
122 res)
123enddef
124
125def s:YankRange()
126 norm! m[jjm]
127 :'[,']yank
128enddef
129
130def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200131 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200132 assert_match('<SNR>\d*_YankRange.*' ..
133 ' norm! m\[jjm\]\_s*' ..
134 '\d EXEC norm! m\[jjm\]\_s*' ..
135 ' :''\[,''\]yank\_s*' ..
136 '\d EXEC :''\[,''\]yank\_s*' ..
137 '\d PUSHNR 0\_s*' ..
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200138 '\d RETURN',
139 res)
140enddef
141
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200142def s:PutExpr()
143 :3put ="text"
144enddef
145
146def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200147 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200148 assert_match('<SNR>\d*_PutExpr.*' ..
149 ' :3put ="text"\_s*' ..
150 '\d PUSHS "text"\_s*' ..
151 '\d PUT = 3\_s*' ..
152 '\d PUSHNR 0\_s*' ..
153 '\d RETURN',
154 res)
155enddef
156
Bram Moolenaar08597872020-12-10 19:43:40 +0100157def s:PutRange()
158 :$-2put a
159enddef
160
161def Test_disassemble_put_range()
162 var res = execute('disass s:PutRange')
163 assert_match('<SNR>\d*_PutRange.*' ..
164 ' :$-2put a\_s*' ..
165 '\d RANGE $-2\_s*' ..
166 '\d PUT a range\_s*' ..
167 '\d PUSHNR 0\_s*' ..
168 '\d RETURN',
169 res)
170enddef
171
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100172def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200173 var localbool = true
174 var localspec = v:none
175 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100176 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200177 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100178 endif
179enddef
180
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100181def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200182 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200183 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
184 'localbool = true.*' ..
185 ' PUSH v:true.*' ..
186 'localspec = v:none.*' ..
187 ' PUSH v:none.*' ..
188 'localblob = 0z1234.*' ..
189 ' PUSHBLOB 0z1234.*',
190 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100191 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200192 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
193 'localfloat = 1.234.*' ..
194 ' PUSHF 1.234.*',
195 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100196 endif
197enddef
198
199def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200200 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100201 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200202 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100203 localstr = 'xyz'
204 v:char = 'abc'
205 s:scriptvar = 'sv'
206 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100207 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200208 b:buffervar = 'bv'
209 w:windowvar = 'wv'
210 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100211 &tabstop = 8
212 $ENVVAR = 'ev'
213 @z = 'rv'
214enddef
215
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100216def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200217 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200218 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200219 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200220 'localnr = 2.*' ..
221 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200222 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200223 'localstr = ''xyz''.*' ..
224 ' STORE $1.*' ..
225 'v:char = ''abc''.*' ..
226 'STOREV v:char.*' ..
227 's:scriptvar = ''sv''.*' ..
228 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
229 'g:globalvar = ''gv''.*' ..
230 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100231 'g:auto#var = ''av''.*' ..
232 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200233 'b:buffervar = ''bv''.*' ..
234 ' STOREB b:buffervar.*' ..
235 'w:windowvar = ''wv''.*' ..
236 ' STOREW w:windowvar.*' ..
237 't:tabpagevar = ''tv''.*' ..
238 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200239 '&tabstop = 8.*' ..
240 ' STOREOPT &tabstop.*' ..
241 '$ENVVAR = ''ev''.*' ..
242 ' STOREENV $ENVVAR.*' ..
243 '@z = ''rv''.*' ..
244 ' STOREREG @z.*',
245 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100246enddef
247
Bram Moolenaarcb790402020-05-15 20:53:00 +0200248def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200249 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200250 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200251 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200252 localdict["a"] = 456
253enddef
254
255def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200257 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200258 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200259 '\d NEWLIST size 0\_s*' ..
260 '\d STORE $0\_s*' ..
261 'locallist\[0\] = 123\_s*' ..
262 '\d PUSHNR 123\_s*' ..
263 '\d PUSHNR 0\_s*' ..
264 '\d LOAD $0\_s*' ..
265 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200266 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200267 '\d NEWDICT size 0\_s*' ..
268 '\d STORE $1\_s*' ..
269 'localdict\["a"\] = 456\_s*' ..
270 '\d\+ PUSHNR 456\_s*' ..
271 '\d\+ PUSHS "a"\_s*' ..
272 '\d\+ LOAD $1\_s*' ..
273 '\d\+ STOREDICT\_s*' ..
274 '\d\+ PUSHNR 0\_s*' ..
275 '\d\+ RETURN',
276 res)
277enddef
278
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100279def s:ScriptFuncStoreIndex()
280 var d = {dd: {}}
281 d.dd[0] = 0
282enddef
283
284def Test_disassemble_store_index()
285 var res = execute('disass s:ScriptFuncStoreIndex')
286 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
287 'var d = {dd: {}}\_s*' ..
288 '\d PUSHS "dd"\_s*' ..
289 '\d NEWDICT size 0\_s*' ..
290 '\d NEWDICT size 1\_s*' ..
291 '\d STORE $0\_s*' ..
292 'd.dd\[0\] = 0\_s*' ..
293 '\d PUSHNR 0\_s*' ..
294 '\d PUSHNR 0\_s*' ..
295 '\d LOAD $0\_s*' ..
296 '\d MEMBER dd\_s*' ..
297 '\d STOREINDEX\_s*' ..
298 '\d\+ PUSHNR 0\_s*' ..
299 '\d\+ RETURN',
300 res)
301enddef
302
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200303def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200304 var x: string
305 var y: string
306 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200307 [x, y; l] = g:stringlist
308enddef
309
310def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200311 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200312 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200313 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200314 '\d PUSHS "\[NULL\]"\_s*' ..
315 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200316 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200317 '\d PUSHS "\[NULL\]"\_s*' ..
318 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200319 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200320 '\d NEWLIST size 0\_s*' ..
321 '\d STORE $2\_s*' ..
322 '\[x, y; l\] = g:stringlist\_s*' ..
323 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200324 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200325 '\d CHECKLEN >= 2\_s*' ..
326 '\d\+ ITEM 0\_s*' ..
327 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
328 '\d\+ STORE $0\_s*' ..
329 '\d\+ ITEM 1\_s*' ..
330 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
331 '\d\+ STORE $1\_s*' ..
332 '\d\+ SLICE 2\_s*' ..
333 '\d\+ STORE $2\_s*' ..
334 '\d\+ PUSHNR 0\_s*' ..
335 '\d\+ RETURN',
336 res)
337enddef
338
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200339def s:ListAdd()
340 var l: list<number> = []
341 add(l, 123)
342 add(l, g:aNumber)
343enddef
344
345def Test_disassemble_list_add()
346 var res = execute('disass s:ListAdd')
347 assert_match('<SNR>\d*_ListAdd\_s*' ..
348 'var l: list<number> = []\_s*' ..
349 '\d NEWLIST size 0\_s*' ..
350 '\d STORE $0\_s*' ..
351 'add(l, 123)\_s*' ..
352 '\d LOAD $0\_s*' ..
353 '\d PUSHNR 123\_s*' ..
354 '\d LISTAPPEND\_s*' ..
355 '\d DROP\_s*' ..
356 'add(l, g:aNumber)\_s*' ..
357 '\d LOAD $0\_s*' ..
358 '\d\+ LOADG g:aNumber\_s*' ..
359 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
360 '\d\+ LISTAPPEND\_s*' ..
361 '\d\+ DROP\_s*' ..
362 '\d\+ PUSHNR 0\_s*' ..
363 '\d\+ RETURN',
364 res)
365enddef
366
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200367def s:BlobAdd()
368 var b: blob = 0z
369 add(b, 123)
370 add(b, g:aNumber)
371enddef
372
373def Test_disassemble_blob_add()
374 var res = execute('disass s:BlobAdd')
375 assert_match('<SNR>\d*_BlobAdd\_s*' ..
376 'var b: blob = 0z\_s*' ..
377 '\d PUSHBLOB 0z\_s*' ..
378 '\d STORE $0\_s*' ..
379 'add(b, 123)\_s*' ..
380 '\d LOAD $0\_s*' ..
381 '\d PUSHNR 123\_s*' ..
382 '\d BLOBAPPEND\_s*' ..
383 '\d DROP\_s*' ..
384 'add(b, g:aNumber)\_s*' ..
385 '\d LOAD $0\_s*' ..
386 '\d\+ LOADG g:aNumber\_s*' ..
387 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
388 '\d\+ BLOBAPPEND\_s*' ..
389 '\d\+ DROP\_s*' ..
390 '\d\+ PUSHNR 0\_s*' ..
391 '\d\+ RETURN',
392 res)
393enddef
394
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200395def s:ScriptFuncUnlet()
396 g:somevar = "value"
397 unlet g:somevar
398 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200399 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200400enddef
401
402def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200403 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200404 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
405 'g:somevar = "value"\_s*' ..
406 '\d PUSHS "value"\_s*' ..
407 '\d STOREG g:somevar\_s*' ..
408 'unlet g:somevar\_s*' ..
409 '\d UNLET g:somevar\_s*' ..
410 'unlet! g:somevar\_s*' ..
411 '\d UNLET! g:somevar\_s*' ..
412 'unlet $SOMEVAR\_s*' ..
413 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200414 res)
415enddef
416
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100417def s:ScriptFuncTry()
418 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200419 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100420 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200421 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100422 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200423 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100424 endtry
425enddef
426
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100427def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200428 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200429 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
430 'try\_s*' ..
431 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
432 'echo "yes"\_s*' ..
433 '\d PUSHS "yes"\_s*' ..
434 '\d ECHO 1\_s*' ..
435 'catch /fail/\_s*' ..
436 '\d JUMP -> \d\+\_s*' ..
437 '\d PUSH v:exception\_s*' ..
438 '\d PUSHS "fail"\_s*' ..
439 '\d COMPARESTRING =\~\_s*' ..
440 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
441 '\d CATCH\_s*' ..
442 'echo "no"\_s*' ..
443 '\d\+ PUSHS "no"\_s*' ..
444 '\d\+ ECHO 1\_s*' ..
445 'finally\_s*' ..
446 'throw "end"\_s*' ..
447 '\d\+ PUSHS "end"\_s*' ..
448 '\d\+ THROW\_s*' ..
449 'endtry\_s*' ..
450 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200451 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100452enddef
453
454def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200455 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100456 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100457enddef
458
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100459def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200460 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200461 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200462 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200463 '\d PUSHNR 1\_s*' ..
464 '\d PUSHS "two"\_s*' ..
465 '\d PUSHNR 333\_s*' ..
466 '\d NEWLIST size 3\_s*' ..
467 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100468 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200469 '\d PUSHS "one"\_s*' ..
470 '\d PUSHNR 1\_s*' ..
471 '\d PUSHS "two"\_s*' ..
472 '\d PUSHS "val"\_s*' ..
473 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200474 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100475enddef
476
Bram Moolenaar6e949782020-04-13 17:21:00 +0200477def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100478 echo arg
479enddef
480
481func UserFunc()
482 echo 'nothing'
483endfunc
484
485func UserFuncWithArg(arg)
486 echo a:arg
487endfunc
488
489def s:ScriptFuncCall(): string
490 changenr()
491 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100492 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100493 FuncWithArg(343)
494 ScriptFuncNew()
495 s:ScriptFuncNew()
496 UserFunc()
497 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200498 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100499 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200500 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100501 FuncRefWithArg("bar")
502 return "yes"
503enddef
504
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100505def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200506 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200507 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
508 'changenr()\_s*' ..
509 '\d BCALL changenr(argc 0)\_s*' ..
510 '\d DROP\_s*' ..
511 'char2nr("abc")\_s*' ..
512 '\d PUSHS "abc"\_s*' ..
513 '\d BCALL char2nr(argc 1)\_s*' ..
514 '\d DROP\_s*' ..
515 'Test_disassemble_new()\_s*' ..
516 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
517 '\d DROP\_s*' ..
518 'FuncWithArg(343)\_s*' ..
519 '\d\+ PUSHNR 343\_s*' ..
520 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
521 '\d\+ DROP\_s*' ..
522 'ScriptFuncNew()\_s*' ..
523 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
524 '\d\+ DROP\_s*' ..
525 's:ScriptFuncNew()\_s*' ..
526 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
527 '\d\+ DROP\_s*' ..
528 'UserFunc()\_s*' ..
529 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
530 '\d\+ DROP\_s*' ..
531 'UserFuncWithArg("foo")\_s*' ..
532 '\d\+ PUSHS "foo"\_s*' ..
533 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
534 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200535 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200536 '\d\+ PUSHS "UserFunc"\_s*' ..
537 '\d\+ BCALL function(argc 1)\_s*' ..
538 '\d\+ STORE $0\_s*' ..
539 'FuncRef()\_s*' ..
540 '\d\+ LOAD $\d\_s*' ..
541 '\d\+ PCALL (argc 0)\_s*' ..
542 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200543 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200544 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
545 '\d\+ BCALL function(argc 1)\_s*' ..
546 '\d\+ STORE $1\_s*' ..
547 'FuncRefWithArg("bar")\_s*' ..
548 '\d\+ PUSHS "bar"\_s*' ..
549 '\d\+ LOAD $\d\_s*' ..
550 '\d\+ PCALL (argc 1)\_s*' ..
551 '\d\+ DROP\_s*' ..
552 'return "yes"\_s*' ..
553 '\d\+ PUSHS "yes"\_s*' ..
554 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200555 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100556enddef
557
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200558
559def s:CreateRefs()
560 var local = 'a'
561 def Append(arg: string)
562 local ..= arg
563 enddef
564 g:Append = Append
565 def Get(): string
566 return local
567 enddef
568 g:Get = Get
569enddef
570
571def Test_disassemble_closure()
572 CreateRefs()
573 var res = execute('disass g:Append')
574 assert_match('<lambda>\d\_s*' ..
575 'local ..= arg\_s*' ..
576 '\d LOADOUTER $0\_s*' ..
577 '\d LOAD arg\[-1\]\_s*' ..
578 '\d CONCAT\_s*' ..
579 '\d STOREOUTER $0\_s*' ..
580 '\d PUSHNR 0\_s*' ..
581 '\d RETURN',
582 res)
583
584 res = execute('disass g:Get')
585 assert_match('<lambda>\d\_s*' ..
586 'return local\_s*' ..
587 '\d LOADOUTER $0\_s*' ..
588 '\d RETURN',
589 res)
590
591 unlet g:Append
592 unlet g:Get
593enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200594
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100595
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200596def EchoArg(arg: string): string
597 return arg
598enddef
599def RefThis(): func
600 return function('EchoArg')
601enddef
602def s:ScriptPCall()
603 RefThis()("text")
604enddef
605
606def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200607 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200608 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
609 'RefThis()("text")\_s*' ..
610 '\d DCALL RefThis(argc 0)\_s*' ..
611 '\d PUSHS "text"\_s*' ..
612 '\d PCALL top (argc 1)\_s*' ..
613 '\d PCALL end\_s*' ..
614 '\d DROP\_s*' ..
615 '\d PUSHNR 0\_s*' ..
616 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200617 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200618enddef
619
620
Bram Moolenaara26b9702020-04-18 19:53:28 +0200621def s:FuncWithForwardCall(): string
622 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100623enddef
624
625def DefinedLater(arg: string): string
626 return arg
627enddef
628
629def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200630 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200631 assert_match('FuncWithForwardCall\_s*' ..
632 'return g:DefinedLater("yes")\_s*' ..
633 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200634 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200635 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200636 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100637
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200638 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100639 assert_equal('yes', FuncWithForwardCall())
640
Bram Moolenaara26b9702020-04-18 19:53:28 +0200641 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200642 assert_match('FuncWithForwardCall\_s*' ..
643 'return g:DefinedLater("yes")\_s*' ..
644 '\d PUSHS "yes"\_s*' ..
645 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200646 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200647 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100648enddef
649
650
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100651def FuncWithDefault(arg: string = 'default'): string
652 return arg
653enddef
654
655def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200656 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200657 assert_match('FuncWithDefault\_s*' ..
658 '\d PUSHS "default"\_s*' ..
659 '\d STORE arg\[-1]\_s*' ..
660 'return arg\_s*' ..
661 '\d LOAD arg\[-1]\_s*' ..
662 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200663 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100664enddef
665
666
Bram Moolenaar158906c2020-02-06 20:39:45 +0100667def HasEval()
668 if has("eval")
669 echo "yes"
670 else
671 echo "no"
672 endif
673enddef
674
675def HasNothing()
676 if has("nothing")
677 echo "yes"
678 else
679 echo "no"
680 endif
681enddef
682
683def HasSomething()
684 if has("nothing")
685 echo "nothing"
686 elseif has("something")
687 echo "something"
688 elseif has("eval")
689 echo "eval"
690 elseif has("less")
691 echo "less"
692 endif
693enddef
694
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100695def HasGuiRunning()
696 if has("gui_running")
697 echo "yes"
698 else
699 echo "no"
700 endif
701enddef
702
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100703def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200704 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200705 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200706 assert_match('HasEval\_s*' ..
707 'if has("eval")\_s*' ..
708 'echo "yes"\_s*' ..
709 '\d PUSHS "yes"\_s*' ..
710 '\d ECHO 1\_s*' ..
711 'else\_s*' ..
712 'echo "no"\_s*' ..
713 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200714 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100715 assert_notmatch('JUMP', instr)
716
Bram Moolenaard2c61702020-09-06 15:58:36 +0200717 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100718 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200719 assert_match('HasNothing\_s*' ..
720 'if has("nothing")\_s*' ..
721 'echo "yes"\_s*' ..
722 'else\_s*' ..
723 'echo "no"\_s*' ..
724 '\d PUSHS "no"\_s*' ..
725 '\d ECHO 1\_s*' ..
726 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200727 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100728 assert_notmatch('PUSHS "yes"', instr)
729 assert_notmatch('JUMP', instr)
730
Bram Moolenaard2c61702020-09-06 15:58:36 +0200731 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100732 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200733 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200734 'if has("nothing")\_s*' ..
735 'echo "nothing"\_s*' ..
736 'elseif has("something")\_s*' ..
737 'echo "something"\_s*' ..
738 'elseif has("eval")\_s*' ..
739 'echo "eval"\_s*' ..
740 '\d PUSHS "eval"\_s*' ..
741 '\d ECHO 1\_s*' ..
742 'elseif has("less").*' ..
743 'echo "less"\_s*' ..
744 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200745 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100746 assert_notmatch('PUSHS "nothing"', instr)
747 assert_notmatch('PUSHS "something"', instr)
748 assert_notmatch('PUSHS "less"', instr)
749 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100750
751 var result: string
752 var instr_expected: string
753 if has('gui')
754 if has('gui_running')
755 # GUI already running, always returns "yes"
756 result = "\nyes"
757 instr_expected = 'HasGuiRunning.*' ..
758 'if has("gui_running")\_s*' ..
759 ' echo "yes"\_s*' ..
760 '\d PUSHS "yes"\_s*' ..
761 '\d ECHO 1\_s*' ..
762 'else\_s*' ..
763 ' echo "no"\_s*' ..
764 'endif'
765 else
766 result = "\nno"
767 if has('unix')
768 # GUI not running but can start later, call has()
769 instr_expected = 'HasGuiRunning.*' ..
770 'if has("gui_running")\_s*' ..
771 '\d PUSHS "gui_running"\_s*' ..
772 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100773 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100774 '\d JUMP_IF_FALSE -> \d\_s*' ..
775 ' echo "yes"\_s*' ..
776 '\d PUSHS "yes"\_s*' ..
777 '\d ECHO 1\_s*' ..
778 'else\_s*' ..
779 '\d JUMP -> \d\_s*' ..
780 ' echo "no"\_s*' ..
781 '\d PUSHS "no"\_s*' ..
782 '\d ECHO 1\_s*' ..
783 'endif'
784 else
785 # GUI not running, always return "no"
786 instr_expected = 'HasGuiRunning.*' ..
787 'if has("gui_running")\_s*' ..
788 ' echo "yes"\_s*' ..
789 'else\_s*' ..
790 ' echo "no"\_s*' ..
791 '\d PUSHS "no"\_s*' ..
792 '\d ECHO 1\_s*' ..
793 'endif'
794 endif
795 endif
796 else
797 # GUI not supported, always return "no"
798 result = "\nno"
799 instr_expected = 'HasGuiRunning.*' ..
800 'if has("gui_running")\_s*' ..
801 ' echo "yes"\_s*' ..
802 'else\_s*' ..
803 ' echo "no"\_s*' ..
804 '\d PUSHS "no"\_s*' ..
805 '\d ECHO 1\_s*' ..
806 'endif'
807 endif
808
809 assert_equal(result, execute('HasGuiRunning()'))
810 instr = execute('disassemble HasGuiRunning')
811 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100812enddef
813
Bram Moolenaarefd88552020-06-18 20:50:10 +0200814def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100815 if 1 < 0
816 return "maybe"
817 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200818 if g:cond
819 return "yes"
820 else
821 return "no"
822 endif
823enddef
824
825def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200826 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200827 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100828 'if 1 < 0\_s*' ..
829 ' return "maybe"\_s*' ..
830 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200831 'if g:cond\_s*' ..
832 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100833 '1 COND2BOOL\_s*' ..
834 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200835 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100836 '3 PUSHS "yes"\_s*' ..
837 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200838 'else\_s*' ..
839 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100840 '5 PUSHS "no"\_s*' ..
841 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200842 instr)
843enddef
844
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100845def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200846 var Funky1: func
847 var Funky2: func = function("len")
848 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100849enddef
850
851def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200852 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200853 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200855 '0 PUSHFUNC "\[none]"\_s*' ..
856 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200857 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 '2 PUSHS "len"\_s*' ..
859 '3 BCALL function(argc 1)\_s*' ..
860 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200861 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200862 '\d PUSHS "UserFunc"\_s*' ..
863 '\d BCALL funcref(argc 1)\_s*' ..
864 '\d STORE $2\_s*' ..
865 '\d PUSHNR 0\_s*' ..
866 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200867 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100868enddef
869
870if has('channel')
871 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200872 var job1: job
873 var job2: job = job_start("donothing")
874 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100875 enddef
876endif
877
878def Test_disassemble_channel()
879 CheckFeature channel
880
Bram Moolenaarac564082020-09-27 19:05:33 +0200881 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200882 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200883 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200884 '\d PUSHJOB "no process"\_s*' ..
885 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200886 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200887 '\d PUSHS "donothing"\_s*' ..
888 '\d BCALL job_start(argc 1)\_s*' ..
889 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200890 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200891 '\d PUSHCHANNEL 0\_s*' ..
892 '\d STORE $2\_s*' ..
893 '\d PUSHNR 0\_s*' ..
894 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200895 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100896enddef
897
Bram Moolenaar777770f2020-02-06 21:27:08 +0100898def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100899 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100900 return F("x")
901enddef
902
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100903def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100904 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200905 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200906 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100907 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200908 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200909 '\d STORE $0\_s*' ..
910 'return F("x")\_s*' ..
911 '\d PUSHS "x"\_s*' ..
912 '\d LOAD $0\_s*' ..
913 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200914 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200915 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200916
Bram Moolenaarac564082020-09-27 19:05:33 +0200917 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200918 instr = execute('disassemble ' .. name)
919 assert_match('<lambda>\d\+\_s*' ..
920 'return "X" .. a .. "X"\_s*' ..
921 '\d PUSHS "X"\_s*' ..
922 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200923 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200924 '\d CONCAT\_s*' ..
925 '\d PUSHS "X"\_s*' ..
926 '\d CONCAT\_s*' ..
927 '\d RETURN',
928 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100929enddef
930
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100931def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100932 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100933 return Ref(g:value)
934enddef
935
936def Test_disassemble_lambda_with_type()
937 g:value = 5
938 assert_equal(15, LambdaWithType())
939 var instr = execute('disassemble LambdaWithType')
940 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100941 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100942 '\d FUNCREF <lambda>\d\+\_s*' ..
943 '\d STORE $0\_s*' ..
944 'return Ref(g:value)\_s*' ..
945 '\d LOADG g:value\_s*' ..
946 '\d LOAD $0\_s*' ..
947 '\d CHECKTYPE number stack\[-2\]\_s*' ..
948 '\d PCALL (argc 1)\_s*' ..
949 '\d RETURN',
950 instr)
951enddef
952
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200953def NestedOuter()
954 def g:Inner()
955 echomsg "inner"
956 enddef
957enddef
958
959def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200960 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200961 assert_match('NestedOuter\_s*' ..
962 'def g:Inner()\_s*' ..
963 'echomsg "inner"\_s*' ..
964 'enddef\_s*' ..
965 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
966 '\d PUSHNR 0\_s*' ..
967 '\d RETURN',
968 instr)
969enddef
970
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100971def NestedDefList()
972 def
973 def Info
974 def /Info
975 def /Info/
976enddef
977
978def Test_nested_def_list()
979 var instr = execute('disassemble NestedDefList')
980 assert_match('NestedDefList\_s*' ..
981 'def\_s*' ..
982 '\d DEF \_s*' ..
983 'def Info\_s*' ..
984 '\d DEF Info\_s*' ..
985 'def /Info\_s*' ..
986 '\d DEF /Info\_s*' ..
987 'def /Info/\_s*' ..
988 '\d DEF /Info/\_s*' ..
989 '\d PUSHNR 0\_s*' ..
990 '\d RETURN',
991 instr)
992enddef
993
Bram Moolenaar6e949782020-04-13 17:21:00 +0200994def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100995 if arg == 1 && arg != 2 || arg == 4
996 return 'yes'
997 endif
998 return 'no'
999enddef
1000
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001001def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001002 assert_equal("yes", AndOr(1))
1003 assert_equal("no", AndOr(2))
1004 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001005 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001006 assert_match('AndOr\_s*' ..
1007 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1008 '\d LOAD arg\[-1]\_s*' ..
1009 '\d PUSHNR 1\_s*' ..
1010 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001011 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001012 '\d LOAD arg\[-1]\_s*' ..
1013 '\d PUSHNR 2\_s*' ..
1014 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001015 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001016 '\d LOAD arg\[-1]\_s*' ..
1017 '\d\+ PUSHNR 4\_s*' ..
1018 '\d\+ COMPAREANY ==\_s*' ..
1019 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001020 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001021enddef
1022
Bram Moolenaar04d05222020-02-06 22:06:54 +01001023def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001024 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001025 for i in range(3)
1026 res->add(i)
1027 endfor
1028 return res
1029enddef
1030
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001031def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001032 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001033 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001034 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001035 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001036 '\d NEWLIST size 0\_s*' ..
1037 '\d STORE $0\_s*' ..
1038 'for i in range(3)\_s*' ..
1039 '\d STORE -1 in $1\_s*' ..
1040 '\d PUSHNR 3\_s*' ..
1041 '\d BCALL range(argc 1)\_s*' ..
1042 '\d FOR $1 -> \d\+\_s*' ..
1043 '\d STORE $2\_s*' ..
1044 'res->add(i)\_s*' ..
1045 '\d LOAD $0\_s*' ..
1046 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001047 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001048 '\d\+ DROP\_s*' ..
1049 'endfor\_s*' ..
1050 '\d\+ JUMP -> \d\+\_s*' ..
1051 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001052 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001053enddef
1054
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001055def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001056 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001057 for str in eval('["one", "two"]')
1058 res ..= str
1059 endfor
1060 return res
1061enddef
1062
1063def Test_disassemble_for_loop_eval()
1064 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001065 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001066 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001067 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001068 '\d PUSHS ""\_s*' ..
1069 '\d STORE $0\_s*' ..
1070 'for str in eval(''\["one", "two"\]'')\_s*' ..
1071 '\d STORE -1 in $1\_s*' ..
1072 '\d PUSHS "\["one", "two"\]"\_s*' ..
1073 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001074 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001075 '\d FOR $1 -> \d\+\_s*' ..
1076 '\d STORE $2\_s*' ..
1077 'res ..= str\_s*' ..
1078 '\d\+ LOAD $0\_s*' ..
1079 '\d\+ LOAD $2\_s*' ..
1080 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1081 '\d\+ CONCAT\_s*' ..
1082 '\d\+ STORE $0\_s*' ..
1083 'endfor\_s*' ..
1084 '\d\+ JUMP -> 6\_s*' ..
1085 '\d\+ DROP\_s*' ..
1086 'return res\_s*' ..
1087 '\d\+ LOAD $0\_s*' ..
1088 '\d\+ RETURN',
1089 instr)
1090enddef
1091
Bram Moolenaar792f7862020-11-23 08:31:18 +01001092def ForLoopUnpack()
1093 for [x1, x2] in [[1, 2], [3, 4]]
1094 echo x1 x2
1095 endfor
1096enddef
1097
1098def Test_disassemble_for_loop_unpack()
1099 var instr = execute('disassemble ForLoopUnpack')
1100 assert_match('ForLoopUnpack\_s*' ..
1101 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1102 '\d\+ STORE -1 in $0\_s*' ..
1103 '\d\+ PUSHNR 1\_s*' ..
1104 '\d\+ PUSHNR 2\_s*' ..
1105 '\d\+ NEWLIST size 2\_s*' ..
1106 '\d\+ PUSHNR 3\_s*' ..
1107 '\d\+ PUSHNR 4\_s*' ..
1108 '\d\+ NEWLIST size 2\_s*' ..
1109 '\d\+ NEWLIST size 2\_s*' ..
1110 '\d\+ FOR $0 -> 16\_s*' ..
1111 '\d\+ UNPACK 2\_s*' ..
1112 '\d\+ STORE $1\_s*' ..
1113 '\d\+ STORE $2\_s*' ..
1114 'echo x1 x2\_s*' ..
1115 '\d\+ LOAD $1\_s*' ..
1116 '\d\+ LOAD $2\_s*' ..
1117 '\d\+ ECHO 2\_s*' ..
1118 'endfor\_s*' ..
1119 '\d\+ JUMP -> 8\_s*' ..
1120 '\d\+ DROP\_s*' ..
1121 '\d\+ PUSHNR 0\_s*' ..
1122 '\d\+ RETURN',
1123 instr)
1124enddef
1125
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001126let g:number = 42
1127
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001128def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001129 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001130enddef
1131
1132def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001133 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001134 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001135 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001136 '\d PUSHNR 23\_s*' ..
1137 '\d LOADG g:number\_s*' ..
1138 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1139 '\d NEWLIST size 2\_s*' ..
1140 '\d STORE $0\_s*' ..
1141 '\d PUSHNR 0\_s*' ..
1142 '\d RETURN\_s*',
1143 instr)
1144enddef
1145
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001146def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001147 var nr = 3
1148 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001149 nrres = nr - 7
1150 nrres = nr * 7
1151 nrres = nr / 7
1152 nrres = nr % 7
1153
Bram Moolenaarac564082020-09-27 19:05:33 +02001154 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001155 anyres = g:number - 7
1156 anyres = g:number * 7
1157 anyres = g:number / 7
1158 anyres = g:number % 7
1159
1160 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001161 var fl = 3.0
1162 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001163 flres = fl - 7.0
1164 flres = fl * 7.0
1165 flres = fl / 7.0
1166 endif
1167enddef
1168
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001169def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001170 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001171 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001172 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001173 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001174 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001175 '\d LOAD $0.*' ..
1176 '\d PUSHNR 7.*' ..
1177 '\d OPNR +.*' ..
1178 '\d STORE $1.*' ..
1179 'nrres = nr - 7.*' ..
1180 '\d OPNR -.*' ..
1181 'nrres = nr \* 7.*' ..
1182 '\d OPNR \*.*' ..
1183 'nrres = nr / 7.*' ..
1184 '\d OPNR /.*' ..
1185 'nrres = nr % 7.*' ..
1186 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001187 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001188 '\d LOADG g:number.*' ..
1189 '\d PUSHNR 7.*' ..
1190 '\d OPANY +.*' ..
1191 '\d STORE $2.*' ..
1192 'anyres = g:number - 7.*' ..
1193 '\d OPANY -.*' ..
1194 'anyres = g:number \* 7.*' ..
1195 '\d OPANY \*.*' ..
1196 'anyres = g:number / 7.*' ..
1197 '\d OPANY /.*' ..
1198 'anyres = g:number % 7.*' ..
1199 '\d OPANY %.*',
1200 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001201 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001202 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001203 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001204 '\d PUSHF 3.0.*' ..
1205 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001206 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001207 '\d LOAD $3.*' ..
1208 '\d PUSHF 7.0.*' ..
1209 '\d OPFLOAT +.*' ..
1210 '\d STORE $4.*' ..
1211 'flres = fl - 7.0.*' ..
1212 '\d OPFLOAT -.*' ..
1213 'flres = fl \* 7.0.*' ..
1214 '\d OPFLOAT \*.*' ..
1215 'flres = fl / 7.0.*' ..
1216 '\d OPFLOAT /.*',
1217 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001218 endif
1219enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001220
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001221def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001222 var reslist = [1, 2] + [3, 4]
1223 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001224enddef
1225
1226def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001227 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001228 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001229 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001230 '\d PUSHNR 1.*' ..
1231 '\d PUSHNR 2.*' ..
1232 '\d NEWLIST size 2.*' ..
1233 '\d PUSHNR 3.*' ..
1234 '\d PUSHNR 4.*' ..
1235 '\d NEWLIST size 2.*' ..
1236 '\d ADDLIST.*' ..
1237 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001238 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001239 '\d PUSHBLOB 0z1122.*' ..
1240 '\d PUSHBLOB 0z3344.*' ..
1241 '\d ADDBLOB.*' ..
1242 '\d STORE $.*',
1243 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001244enddef
1245
1246let g:aa = 'aa'
1247def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001248 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001249 return res
1250enddef
1251
1252def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001254 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001255 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001256 '\d LOADG g:aa.*' ..
1257 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001258 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001259 '\d CONCAT.*' ..
1260 '\d STORE $.*',
1261 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001262 assert_equal('aabb', ConcatString())
1263enddef
1264
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001265def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001266 var s = "abcd"
1267 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001268 return res
1269enddef
1270
1271def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001272 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001273 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001274 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001275 '\d PUSHS "abcd"\_s*' ..
1276 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001277 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001278 '\d LOAD $0\_s*' ..
1279 '\d PUSHNR 1\_s*' ..
1280 '\d STRINDEX\_s*' ..
1281 '\d STORE $1\_s*',
1282 instr)
1283 assert_equal('b', StringIndex())
1284enddef
1285
Bram Moolenaared591872020-08-15 22:14:53 +02001286def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001287 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001288 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001289 return res
1290enddef
1291
1292def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001293 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001294 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001295 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001296 '\d PUSHS "abcd"\_s*' ..
1297 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001298 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001299 '\d LOAD $0\_s*' ..
1300 '\d PUSHNR 1\_s*' ..
1301 '\d PUSHNR 8\_s*' ..
1302 '\d STRSLICE\_s*' ..
1303 '\d STORE $1\_s*',
1304 instr)
1305 assert_equal('bcd', StringSlice())
1306enddef
1307
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001308def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001309 var l = [1, 2, 3]
1310 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001311 return res
1312enddef
1313
1314def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001315 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001316 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001318 '\d PUSHNR 1\_s*' ..
1319 '\d PUSHNR 2\_s*' ..
1320 '\d PUSHNR 3\_s*' ..
1321 '\d NEWLIST size 3\_s*' ..
1322 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001323 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001324 '\d LOAD $0\_s*' ..
1325 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001326 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001327 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001328 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001329 assert_equal(2, ListIndex())
1330enddef
1331
Bram Moolenaared591872020-08-15 22:14:53 +02001332def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001333 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001334 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001335 return res
1336enddef
1337
1338def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001339 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001340 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001341 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001342 '\d PUSHNR 1\_s*' ..
1343 '\d PUSHNR 2\_s*' ..
1344 '\d PUSHNR 3\_s*' ..
1345 '\d NEWLIST size 3\_s*' ..
1346 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001347 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001348 '\d LOAD $0\_s*' ..
1349 '\d PUSHNR 1\_s*' ..
1350 '\d PUSHNR 8\_s*' ..
1351 '\d LISTSLICE\_s*' ..
1352 '\d STORE $1\_s*',
1353 instr)
1354 assert_equal([2, 3], ListSlice())
1355enddef
1356
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001357def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001358 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001359 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001360 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001361 return res
1362enddef
1363
1364def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001365 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001366 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001367 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001368 '\d PUSHS "item"\_s*' ..
1369 '\d PUSHNR 1\_s*' ..
1370 '\d NEWDICT size 1\_s*' ..
1371 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001372 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001373 '\d\+ LOAD $0\_s*' ..
1374 '\d\+ MEMBER item\_s*' ..
1375 '\d\+ STORE $1\_s*' ..
1376 'res = d\["item"\]\_s*' ..
1377 '\d\+ LOAD $0\_s*' ..
1378 '\d\+ PUSHS "item"\_s*' ..
1379 '\d\+ MEMBER\_s*' ..
1380 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001381 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001382 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001383enddef
1384
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001385let somelist = [1, 2, 3, 4, 5]
1386def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001387 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001388 return res
1389enddef
1390
1391def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001392 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001393 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001394 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001395 '\d LOADG g:somelist\_s*' ..
1396 '\d PUSHNR 2\_s*' ..
1397 '\d ANYINDEX\_s*' ..
1398 '\d STORE $0\_s*' ..
1399 'return res\_s*' ..
1400 '\d LOAD $0\_s*' ..
1401 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1402 '\d RETURN',
1403 instr)
1404 assert_equal(3, AnyIndex())
1405enddef
1406
1407def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001408 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001409 return res
1410enddef
1411
1412def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001413 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001414 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001415 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001416 '\d LOADG g:somelist\_s*' ..
1417 '\d PUSHNR 1\_s*' ..
1418 '\d PUSHNR 3\_s*' ..
1419 '\d ANYSLICE\_s*' ..
1420 '\d STORE $0\_s*' ..
1421 'return res\_s*' ..
1422 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001423 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001424 '\d RETURN',
1425 instr)
1426 assert_equal([2, 3, 4], AnySlice())
1427enddef
1428
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001429def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 var nr = 9
1431 var plus = +nr
1432 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001433 return res
1434enddef
1435
1436def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001437 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001438 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001440 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001441 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001442 '\d LOAD $0\_s*' ..
1443 '\d CHECKNR\_s*' ..
1444 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001445 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001446 '\d LOAD $0\_s*' ..
1447 '\d NEGATENR\_s*' ..
1448 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001449 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001450 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001451enddef
1452
1453def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001454 var flag = true
1455 var invert = !flag
1456 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001457 return res
1458enddef
1459
1460def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001461 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001462 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001463 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001464 '\d PUSH v:true\_s*' ..
1465 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001466 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001467 '\d LOAD $0\_s*' ..
1468 '\d INVERT (!val)\_s*' ..
1469 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001470 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001471 '\d LOAD $0\_s*' ..
1472 '\d 2BOOL (!!val)\_s*' ..
1473 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001474 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001475 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001476enddef
1477
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001478def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001479 var name: bool = 1 && 0 || 1
1480 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001481enddef
1482
1483def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001484 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001485 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001486 'var name: bool = 1 && 0 || 1\_s*' ..
1487 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001488 '1 2BOOL (!!val)\_s*' ..
1489 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1490 '3 PUSHNR 0\_s*' ..
1491 '4 2BOOL (!!val)\_s*' ..
1492 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1493 '6 PUSHNR 1\_s*' ..
1494 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001495 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001496 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001497 '\d\+ LOAD $0\_s*' ..
1498 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001499 instr)
1500 assert_equal(true, InvertBool())
1501enddef
1502
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001503def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001504 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001505 ['true == isFalse', 'COMPAREBOOL =='],
1506 ['true != isFalse', 'COMPAREBOOL !='],
1507 ['v:none == isNull', 'COMPARESPECIAL =='],
1508 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001509
Bram Moolenaara5565e42020-05-09 15:44:01 +02001510 ['111 == aNumber', 'COMPARENR =='],
1511 ['111 != aNumber', 'COMPARENR !='],
1512 ['111 > aNumber', 'COMPARENR >'],
1513 ['111 < aNumber', 'COMPARENR <'],
1514 ['111 >= aNumber', 'COMPARENR >='],
1515 ['111 <= aNumber', 'COMPARENR <='],
1516 ['111 =~ aNumber', 'COMPARENR =\~'],
1517 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001518
Bram Moolenaara5565e42020-05-09 15:44:01 +02001519 ['"xx" != aString', 'COMPARESTRING !='],
1520 ['"xx" > aString', 'COMPARESTRING >'],
1521 ['"xx" < aString', 'COMPARESTRING <'],
1522 ['"xx" >= aString', 'COMPARESTRING >='],
1523 ['"xx" <= aString', 'COMPARESTRING <='],
1524 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1525 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1526 ['"xx" is aString', 'COMPARESTRING is'],
1527 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001528
Bram Moolenaara5565e42020-05-09 15:44:01 +02001529 ['0z11 == aBlob', 'COMPAREBLOB =='],
1530 ['0z11 != aBlob', 'COMPAREBLOB !='],
1531 ['0z11 is aBlob', 'COMPAREBLOB is'],
1532 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001533
Bram Moolenaara5565e42020-05-09 15:44:01 +02001534 ['[1, 2] == aList', 'COMPARELIST =='],
1535 ['[1, 2] != aList', 'COMPARELIST !='],
1536 ['[1, 2] is aList', 'COMPARELIST is'],
1537 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001538
Bram Moolenaare0de1712020-12-02 17:36:54 +01001539 ['{a: 1} == aDict', 'COMPAREDICT =='],
1540 ['{a: 1} != aDict', 'COMPAREDICT !='],
1541 ['{a: 1} is aDict', 'COMPAREDICT is'],
1542 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001543
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001544 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1545 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1546 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1547 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001548
1549 ['77 == g:xx', 'COMPAREANY =='],
1550 ['77 != g:xx', 'COMPAREANY !='],
1551 ['77 > g:xx', 'COMPAREANY >'],
1552 ['77 < g:xx', 'COMPAREANY <'],
1553 ['77 >= g:xx', 'COMPAREANY >='],
1554 ['77 <= g:xx', 'COMPAREANY <='],
1555 ['77 =~ g:xx', 'COMPAREANY =\~'],
1556 ['77 !~ g:xx', 'COMPAREANY !\~'],
1557 ['77 is g:xx', 'COMPAREANY is'],
1558 ['77 isnot g:xx', 'COMPAREANY isnot'],
1559 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001560 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001561 if has('float')
1562 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001563 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1564 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1565 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1566 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1567 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1568 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1569 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1570 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001571 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001572 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001573 endif
1574
Bram Moolenaarac564082020-09-27 19:05:33 +02001575 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001576 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001577 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001578 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 ' var isFalse = false',
1580 ' var isNull = v:null',
1581 ' var aNumber = 222',
1582 ' var aString = "yy"',
1583 ' var aBlob = 0z22',
1584 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001585 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001586 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001587 ' if ' .. case[0],
1588 ' echo 42'
1589 ' endif',
1590 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001591 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001592 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001593 assert_match('TestCase' .. nr .. '.*' ..
1594 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1595 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001596 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001597 '\d ' .. case[1] .. '.*' ..
1598 '\d JUMP_IF_FALSE -> \d\+.*',
1599 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001600
1601 nr += 1
1602 endfor
1603
Bram Moolenaar22da5592020-03-19 14:52:20 +01001604 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001605enddef
1606
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001607def s:FalsyOp()
1608 echo g:flag ?? "yes"
1609 echo [] ?? "empty list"
1610 echo "" ?? "empty string"
1611enddef
1612
1613def Test_dsassemble_falsy_op()
1614 var res = execute('disass s:FalsyOp')
1615 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1616 'echo g:flag ?? "yes"\_s*' ..
1617 '0 LOADG g:flag\_s*' ..
1618 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1619 '2 PUSHS "yes"\_s*' ..
1620 '3 ECHO 1\_s*' ..
1621 'echo \[\] ?? "empty list"\_s*' ..
1622 '4 NEWLIST size 0\_s*' ..
1623 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1624 '6 PUSHS "empty list"\_s*' ..
1625 '7 ECHO 1\_s*' ..
1626 'echo "" ?? "empty string"\_s*' ..
1627 '\d\+ PUSHS "empty string"\_s*' ..
1628 '\d\+ ECHO 1\_s*' ..
1629 '\d\+ PUSHNR 0\_s*' ..
1630 '\d\+ RETURN',
1631 res)
1632enddef
1633
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001634def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001635 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001636 ['"xx" == "yy"', false],
1637 ['"aa" == "aa"', true],
1638 ['has("eval") ? true : false', true],
1639 ['has("asdf") ? true : false', false],
1640 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001641
Bram Moolenaarac564082020-09-27 19:05:33 +02001642 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001643 for case in cases
1644 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001645 ' if ' .. case[0],
1646 ' echo 42'
1647 ' endif',
1648 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001649 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001650 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001651 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001652 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001653 assert_match('TestCase' .. nr .. '.*' ..
1654 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1655 '\d PUSHNR 42.*' ..
1656 '\d ECHO 1.*' ..
1657 '\d PUSHNR 0.*' ..
1658 '\d RETURN.*',
1659 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001660 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001661 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001662 assert_match('TestCase' .. nr .. '.*' ..
1663 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1664 'echo 42[ \n]*' ..
1665 'endif[ \n]*' ..
1666 '\s*\d PUSHNR 0.*' ..
1667 '\d RETURN.*',
1668 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001669 endif
1670
1671 nr += 1
1672 endfor
1673
1674 delete('Xdisassemble')
1675enddef
1676
Bram Moolenaarad39c092020-02-26 18:23:43 +01001677def s:Execute()
1678 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001679 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001680 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001681 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001682 execute 'help ' .. tag
1683enddef
1684
1685def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001687 assert_match('\<SNR>\d*_Execute\_s*' ..
1688 "execute 'help vim9.txt'\\_s*" ..
1689 '\d PUSHS "help vim9.txt"\_s*' ..
1690 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001691 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001692 '\d PUSHS "help vim9.txt"\_s*' ..
1693 '\d STORE $0\_s*' ..
1694 'execute cmd\_s*' ..
1695 '\d LOAD $0\_s*' ..
1696 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001697 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001698 '\d PUSHS "vim9.txt"\_s*' ..
1699 '\d STORE $1\_s*' ..
1700 "execute 'help ' .. tag\\_s*" ..
1701 '\d\+ PUSHS "help "\_s*' ..
1702 '\d\+ LOAD $1\_s*' ..
1703 '\d\+ CONCAT\_s*' ..
1704 '\d\+ EXECUTE 1\_s*' ..
1705 '\d\+ PUSHNR 0\_s*' ..
1706 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001707 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001708enddef
1709
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001710def s:Echomsg()
1711 echomsg 'some' 'message'
1712 echoerr 'went' .. 'wrong'
1713enddef
1714
1715def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001717 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1718 "echomsg 'some' 'message'\\_s*" ..
1719 '\d PUSHS "some"\_s*' ..
1720 '\d PUSHS "message"\_s*' ..
1721 '\d ECHOMSG 2\_s*' ..
1722 "echoerr 'went' .. 'wrong'\\_s*" ..
1723 '\d PUSHS "wentwrong"\_s*' ..
1724 '\d ECHOERR 1\_s*' ..
1725 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001726 '\d RETURN',
1727 res)
1728enddef
1729
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001730def SomeStringArg(arg: string)
1731 echo arg
1732enddef
1733
1734def SomeAnyArg(arg: any)
1735 echo arg
1736enddef
1737
1738def SomeStringArgAndReturn(arg: string): string
1739 return arg
1740enddef
1741
1742def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001743 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001744 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1745 '\d *echo arg.*' ..
1746 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001747 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001748
Bram Moolenaarac564082020-09-27 19:05:33 +02001749 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001750 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1751 '\d *echo arg\_s*' ..
1752 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001753 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001754
Bram Moolenaarac564082020-09-27 19:05:33 +02001755 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001756 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1757 '\d *return arg\_s*' ..
1758 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001759 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001760enddef
1761
Bram Moolenaar09689a02020-05-09 22:50:08 +02001762def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001763 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001764 vim9script
1765 def FuncOne(): string
1766 return FuncTwo()
1767 enddef
1768 def FuncTwo(): string
1769 return 'two'
1770 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001771 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001772 END
1773 writefile(lines, 'Xdisassemble')
1774 source Xdisassemble
1775
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001776 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001777 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1778 'return FuncTwo()\_s*' ..
1779 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001780 '\d RETURN',
1781 g:res_FuncOne)
1782
1783 delete('Xdisassemble')
1784 unlet g:res_FuncOne
1785enddef
1786
Bram Moolenaar61a89812020-05-07 16:58:17 +02001787def s:ConcatStrings(): string
1788 return 'one' .. 'two' .. 'three'
1789enddef
1790
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001791def s:ComputeConst(): number
1792 return 2 + 3 * 4 / 6 + 7
1793enddef
1794
Bram Moolenaar1c747212020-05-09 18:28:34 +02001795def s:ComputeConstParen(): number
1796 return ((2 + 4) * (8 / 2)) / (3 + 4)
1797enddef
1798
Bram Moolenaar61a89812020-05-07 16:58:17 +02001799def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001800 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001801 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1802 "return 'one' .. 'two' .. 'three'\\_s*" ..
1803 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001804 '\d RETURN',
1805 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001806
1807 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001808 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1809 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1810 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001811 '\d RETURN',
1812 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001813
1814 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001815 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1816 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1817 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001818 '\d RETURN',
1819 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001820enddef
1821
Bram Moolenaar389df252020-07-09 21:20:47 +02001822def s:CallAppend()
1823 eval "some text"->append(2)
1824enddef
1825
1826def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001827 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001828 assert_match('<SNR>\d*_CallAppend\_s*' ..
1829 'eval "some text"->append(2)\_s*' ..
1830 '\d PUSHS "some text"\_s*' ..
1831 '\d PUSHNR 2\_s*' ..
1832 '\d SHUFFLE 2 up 1\_s*' ..
1833 '\d BCALL append(argc 2)\_s*' ..
1834 '\d DROP\_s*' ..
1835 '\d PUSHNR 0\_s*' ..
1836 '\d RETURN',
1837 res)
1838enddef
1839
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001840
1841def s:SilentMessage()
1842 silent echomsg "text"
1843 silent! echoerr "error"
1844enddef
1845
1846def Test_silent()
1847 var res = execute('disass s:SilentMessage')
1848 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1849 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001850 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001851 '\d PUSHS "text"\_s*' ..
1852 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001853 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001854 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001855 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001856 '\d PUSHS "error"\_s*' ..
1857 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001858 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001859 '\d PUSHNR 0\_s*' ..
1860 '\d RETURN',
1861 res)
1862enddef
1863
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001864" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker