blob: d936bc29a408e3820c96cab5bb43738f48b43a8a [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 Moolenaar0779fab2020-06-18 22:18:18 +0200279def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200280 var x: string
281 var y: string
282 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200283 [x, y; l] = g:stringlist
284enddef
285
286def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200287 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200288 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200289 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200290 '\d PUSHS "\[NULL\]"\_s*' ..
291 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200292 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200293 '\d PUSHS "\[NULL\]"\_s*' ..
294 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200295 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200296 '\d NEWLIST size 0\_s*' ..
297 '\d STORE $2\_s*' ..
298 '\[x, y; l\] = g:stringlist\_s*' ..
299 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200300 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200301 '\d CHECKLEN >= 2\_s*' ..
302 '\d\+ ITEM 0\_s*' ..
303 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
304 '\d\+ STORE $0\_s*' ..
305 '\d\+ ITEM 1\_s*' ..
306 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
307 '\d\+ STORE $1\_s*' ..
308 '\d\+ SLICE 2\_s*' ..
309 '\d\+ STORE $2\_s*' ..
310 '\d\+ PUSHNR 0\_s*' ..
311 '\d\+ RETURN',
312 res)
313enddef
314
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200315def s:ListAdd()
316 var l: list<number> = []
317 add(l, 123)
318 add(l, g:aNumber)
319enddef
320
321def Test_disassemble_list_add()
322 var res = execute('disass s:ListAdd')
323 assert_match('<SNR>\d*_ListAdd\_s*' ..
324 'var l: list<number> = []\_s*' ..
325 '\d NEWLIST size 0\_s*' ..
326 '\d STORE $0\_s*' ..
327 'add(l, 123)\_s*' ..
328 '\d LOAD $0\_s*' ..
329 '\d PUSHNR 123\_s*' ..
330 '\d LISTAPPEND\_s*' ..
331 '\d DROP\_s*' ..
332 'add(l, g:aNumber)\_s*' ..
333 '\d LOAD $0\_s*' ..
334 '\d\+ LOADG g:aNumber\_s*' ..
335 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
336 '\d\+ LISTAPPEND\_s*' ..
337 '\d\+ DROP\_s*' ..
338 '\d\+ PUSHNR 0\_s*' ..
339 '\d\+ RETURN',
340 res)
341enddef
342
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200343def s:BlobAdd()
344 var b: blob = 0z
345 add(b, 123)
346 add(b, g:aNumber)
347enddef
348
349def Test_disassemble_blob_add()
350 var res = execute('disass s:BlobAdd')
351 assert_match('<SNR>\d*_BlobAdd\_s*' ..
352 'var b: blob = 0z\_s*' ..
353 '\d PUSHBLOB 0z\_s*' ..
354 '\d STORE $0\_s*' ..
355 'add(b, 123)\_s*' ..
356 '\d LOAD $0\_s*' ..
357 '\d PUSHNR 123\_s*' ..
358 '\d BLOBAPPEND\_s*' ..
359 '\d DROP\_s*' ..
360 'add(b, g:aNumber)\_s*' ..
361 '\d LOAD $0\_s*' ..
362 '\d\+ LOADG g:aNumber\_s*' ..
363 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
364 '\d\+ BLOBAPPEND\_s*' ..
365 '\d\+ DROP\_s*' ..
366 '\d\+ PUSHNR 0\_s*' ..
367 '\d\+ RETURN',
368 res)
369enddef
370
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200371def s:ScriptFuncUnlet()
372 g:somevar = "value"
373 unlet g:somevar
374 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200375 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200376enddef
377
378def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200379 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200380 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
381 'g:somevar = "value"\_s*' ..
382 '\d PUSHS "value"\_s*' ..
383 '\d STOREG g:somevar\_s*' ..
384 'unlet g:somevar\_s*' ..
385 '\d UNLET g:somevar\_s*' ..
386 'unlet! g:somevar\_s*' ..
387 '\d UNLET! g:somevar\_s*' ..
388 'unlet $SOMEVAR\_s*' ..
389 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200390 res)
391enddef
392
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100393def s:ScriptFuncTry()
394 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200395 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100396 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200397 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100398 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200399 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100400 endtry
401enddef
402
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100403def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200404 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200405 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
406 'try\_s*' ..
407 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
408 'echo "yes"\_s*' ..
409 '\d PUSHS "yes"\_s*' ..
410 '\d ECHO 1\_s*' ..
411 'catch /fail/\_s*' ..
412 '\d JUMP -> \d\+\_s*' ..
413 '\d PUSH v:exception\_s*' ..
414 '\d PUSHS "fail"\_s*' ..
415 '\d COMPARESTRING =\~\_s*' ..
416 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
417 '\d CATCH\_s*' ..
418 'echo "no"\_s*' ..
419 '\d\+ PUSHS "no"\_s*' ..
420 '\d\+ ECHO 1\_s*' ..
421 'finally\_s*' ..
422 'throw "end"\_s*' ..
423 '\d\+ PUSHS "end"\_s*' ..
424 '\d\+ THROW\_s*' ..
425 'endtry\_s*' ..
426 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200427 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100428enddef
429
430def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100432 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100433enddef
434
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100435def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200436 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200437 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200438 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200439 '\d PUSHNR 1\_s*' ..
440 '\d PUSHS "two"\_s*' ..
441 '\d PUSHNR 333\_s*' ..
442 '\d NEWLIST size 3\_s*' ..
443 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100444 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200445 '\d PUSHS "one"\_s*' ..
446 '\d PUSHNR 1\_s*' ..
447 '\d PUSHS "two"\_s*' ..
448 '\d PUSHS "val"\_s*' ..
449 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200450 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100451enddef
452
Bram Moolenaar6e949782020-04-13 17:21:00 +0200453def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100454 echo arg
455enddef
456
457func UserFunc()
458 echo 'nothing'
459endfunc
460
461func UserFuncWithArg(arg)
462 echo a:arg
463endfunc
464
465def s:ScriptFuncCall(): string
466 changenr()
467 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100468 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100469 FuncWithArg(343)
470 ScriptFuncNew()
471 s:ScriptFuncNew()
472 UserFunc()
473 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200474 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100475 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200476 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100477 FuncRefWithArg("bar")
478 return "yes"
479enddef
480
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100481def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200482 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200483 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
484 'changenr()\_s*' ..
485 '\d BCALL changenr(argc 0)\_s*' ..
486 '\d DROP\_s*' ..
487 'char2nr("abc")\_s*' ..
488 '\d PUSHS "abc"\_s*' ..
489 '\d BCALL char2nr(argc 1)\_s*' ..
490 '\d DROP\_s*' ..
491 'Test_disassemble_new()\_s*' ..
492 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
493 '\d DROP\_s*' ..
494 'FuncWithArg(343)\_s*' ..
495 '\d\+ PUSHNR 343\_s*' ..
496 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
497 '\d\+ DROP\_s*' ..
498 'ScriptFuncNew()\_s*' ..
499 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
500 '\d\+ DROP\_s*' ..
501 's:ScriptFuncNew()\_s*' ..
502 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
503 '\d\+ DROP\_s*' ..
504 'UserFunc()\_s*' ..
505 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
506 '\d\+ DROP\_s*' ..
507 'UserFuncWithArg("foo")\_s*' ..
508 '\d\+ PUSHS "foo"\_s*' ..
509 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
510 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200511 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200512 '\d\+ PUSHS "UserFunc"\_s*' ..
513 '\d\+ BCALL function(argc 1)\_s*' ..
514 '\d\+ STORE $0\_s*' ..
515 'FuncRef()\_s*' ..
516 '\d\+ LOAD $\d\_s*' ..
517 '\d\+ PCALL (argc 0)\_s*' ..
518 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200519 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200520 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
521 '\d\+ BCALL function(argc 1)\_s*' ..
522 '\d\+ STORE $1\_s*' ..
523 'FuncRefWithArg("bar")\_s*' ..
524 '\d\+ PUSHS "bar"\_s*' ..
525 '\d\+ LOAD $\d\_s*' ..
526 '\d\+ PCALL (argc 1)\_s*' ..
527 '\d\+ DROP\_s*' ..
528 'return "yes"\_s*' ..
529 '\d\+ PUSHS "yes"\_s*' ..
530 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200531 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100532enddef
533
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200534
535def s:CreateRefs()
536 var local = 'a'
537 def Append(arg: string)
538 local ..= arg
539 enddef
540 g:Append = Append
541 def Get(): string
542 return local
543 enddef
544 g:Get = Get
545enddef
546
547def Test_disassemble_closure()
548 CreateRefs()
549 var res = execute('disass g:Append')
550 assert_match('<lambda>\d\_s*' ..
551 'local ..= arg\_s*' ..
552 '\d LOADOUTER $0\_s*' ..
553 '\d LOAD arg\[-1\]\_s*' ..
554 '\d CONCAT\_s*' ..
555 '\d STOREOUTER $0\_s*' ..
556 '\d PUSHNR 0\_s*' ..
557 '\d RETURN',
558 res)
559
560 res = execute('disass g:Get')
561 assert_match('<lambda>\d\_s*' ..
562 'return local\_s*' ..
563 '\d LOADOUTER $0\_s*' ..
564 '\d RETURN',
565 res)
566
567 unlet g:Append
568 unlet g:Get
569enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200570
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100571
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200572def EchoArg(arg: string): string
573 return arg
574enddef
575def RefThis(): func
576 return function('EchoArg')
577enddef
578def s:ScriptPCall()
579 RefThis()("text")
580enddef
581
582def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200583 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200584 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
585 'RefThis()("text")\_s*' ..
586 '\d DCALL RefThis(argc 0)\_s*' ..
587 '\d PUSHS "text"\_s*' ..
588 '\d PCALL top (argc 1)\_s*' ..
589 '\d PCALL end\_s*' ..
590 '\d DROP\_s*' ..
591 '\d PUSHNR 0\_s*' ..
592 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200593 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200594enddef
595
596
Bram Moolenaara26b9702020-04-18 19:53:28 +0200597def s:FuncWithForwardCall(): string
598 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100599enddef
600
601def DefinedLater(arg: string): string
602 return arg
603enddef
604
605def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200606 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200607 assert_match('FuncWithForwardCall\_s*' ..
608 'return g:DefinedLater("yes")\_s*' ..
609 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200610 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200611 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200612 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100613
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200614 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100615 assert_equal('yes', FuncWithForwardCall())
616
Bram Moolenaara26b9702020-04-18 19:53:28 +0200617 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200618 assert_match('FuncWithForwardCall\_s*' ..
619 'return g:DefinedLater("yes")\_s*' ..
620 '\d PUSHS "yes"\_s*' ..
621 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200622 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200623 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100624enddef
625
626
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100627def FuncWithDefault(arg: string = 'default'): string
628 return arg
629enddef
630
631def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200632 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200633 assert_match('FuncWithDefault\_s*' ..
634 '\d PUSHS "default"\_s*' ..
635 '\d STORE arg\[-1]\_s*' ..
636 'return arg\_s*' ..
637 '\d LOAD arg\[-1]\_s*' ..
638 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200639 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100640enddef
641
642
Bram Moolenaar158906c2020-02-06 20:39:45 +0100643def HasEval()
644 if has("eval")
645 echo "yes"
646 else
647 echo "no"
648 endif
649enddef
650
651def HasNothing()
652 if has("nothing")
653 echo "yes"
654 else
655 echo "no"
656 endif
657enddef
658
659def HasSomething()
660 if has("nothing")
661 echo "nothing"
662 elseif has("something")
663 echo "something"
664 elseif has("eval")
665 echo "eval"
666 elseif has("less")
667 echo "less"
668 endif
669enddef
670
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100671def HasGuiRunning()
672 if has("gui_running")
673 echo "yes"
674 else
675 echo "no"
676 endif
677enddef
678
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100679def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200680 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200681 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200682 assert_match('HasEval\_s*' ..
683 'if has("eval")\_s*' ..
684 'echo "yes"\_s*' ..
685 '\d PUSHS "yes"\_s*' ..
686 '\d ECHO 1\_s*' ..
687 'else\_s*' ..
688 'echo "no"\_s*' ..
689 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200690 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100691 assert_notmatch('JUMP', instr)
692
Bram Moolenaard2c61702020-09-06 15:58:36 +0200693 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100694 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200695 assert_match('HasNothing\_s*' ..
696 'if has("nothing")\_s*' ..
697 'echo "yes"\_s*' ..
698 'else\_s*' ..
699 'echo "no"\_s*' ..
700 '\d PUSHS "no"\_s*' ..
701 '\d ECHO 1\_s*' ..
702 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200703 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100704 assert_notmatch('PUSHS "yes"', instr)
705 assert_notmatch('JUMP', instr)
706
Bram Moolenaard2c61702020-09-06 15:58:36 +0200707 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100708 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200709 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200710 'if has("nothing")\_s*' ..
711 'echo "nothing"\_s*' ..
712 'elseif has("something")\_s*' ..
713 'echo "something"\_s*' ..
714 'elseif has("eval")\_s*' ..
715 'echo "eval"\_s*' ..
716 '\d PUSHS "eval"\_s*' ..
717 '\d ECHO 1\_s*' ..
718 'elseif has("less").*' ..
719 'echo "less"\_s*' ..
720 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200721 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100722 assert_notmatch('PUSHS "nothing"', instr)
723 assert_notmatch('PUSHS "something"', instr)
724 assert_notmatch('PUSHS "less"', instr)
725 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100726
727 var result: string
728 var instr_expected: string
729 if has('gui')
730 if has('gui_running')
731 # GUI already running, always returns "yes"
732 result = "\nyes"
733 instr_expected = 'HasGuiRunning.*' ..
734 'if has("gui_running")\_s*' ..
735 ' echo "yes"\_s*' ..
736 '\d PUSHS "yes"\_s*' ..
737 '\d ECHO 1\_s*' ..
738 'else\_s*' ..
739 ' echo "no"\_s*' ..
740 'endif'
741 else
742 result = "\nno"
743 if has('unix')
744 # GUI not running but can start later, call has()
745 instr_expected = 'HasGuiRunning.*' ..
746 'if has("gui_running")\_s*' ..
747 '\d PUSHS "gui_running"\_s*' ..
748 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100749 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100750 '\d JUMP_IF_FALSE -> \d\_s*' ..
751 ' echo "yes"\_s*' ..
752 '\d PUSHS "yes"\_s*' ..
753 '\d ECHO 1\_s*' ..
754 'else\_s*' ..
755 '\d JUMP -> \d\_s*' ..
756 ' echo "no"\_s*' ..
757 '\d PUSHS "no"\_s*' ..
758 '\d ECHO 1\_s*' ..
759 'endif'
760 else
761 # GUI not running, always return "no"
762 instr_expected = 'HasGuiRunning.*' ..
763 'if has("gui_running")\_s*' ..
764 ' echo "yes"\_s*' ..
765 'else\_s*' ..
766 ' echo "no"\_s*' ..
767 '\d PUSHS "no"\_s*' ..
768 '\d ECHO 1\_s*' ..
769 'endif'
770 endif
771 endif
772 else
773 # GUI not supported, always return "no"
774 result = "\nno"
775 instr_expected = 'HasGuiRunning.*' ..
776 'if has("gui_running")\_s*' ..
777 ' echo "yes"\_s*' ..
778 'else\_s*' ..
779 ' echo "no"\_s*' ..
780 '\d PUSHS "no"\_s*' ..
781 '\d ECHO 1\_s*' ..
782 'endif'
783 endif
784
785 assert_equal(result, execute('HasGuiRunning()'))
786 instr = execute('disassemble HasGuiRunning')
787 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100788enddef
789
Bram Moolenaarefd88552020-06-18 20:50:10 +0200790def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100791 if 1 < 0
792 return "maybe"
793 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200794 if g:cond
795 return "yes"
796 else
797 return "no"
798 endif
799enddef
800
801def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200802 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200803 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100804 'if 1 < 0\_s*' ..
805 ' return "maybe"\_s*' ..
806 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200807 'if g:cond\_s*' ..
808 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100809 '1 COND2BOOL\_s*' ..
810 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200811 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100812 '3 PUSHS "yes"\_s*' ..
813 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200814 'else\_s*' ..
815 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100816 '5 PUSHS "no"\_s*' ..
817 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200818 instr)
819enddef
820
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100821def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 var Funky1: func
823 var Funky2: func = function("len")
824 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100825enddef
826
827def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200828 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200829 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200830 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200831 '0 PUSHFUNC "\[none]"\_s*' ..
832 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200833 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200834 '2 PUSHS "len"\_s*' ..
835 '3 BCALL function(argc 1)\_s*' ..
836 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200837 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200838 '\d PUSHS "UserFunc"\_s*' ..
839 '\d BCALL funcref(argc 1)\_s*' ..
840 '\d STORE $2\_s*' ..
841 '\d PUSHNR 0\_s*' ..
842 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200843 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100844enddef
845
846if has('channel')
847 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200848 var job1: job
849 var job2: job = job_start("donothing")
850 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100851 enddef
852endif
853
854def Test_disassemble_channel()
855 CheckFeature channel
856
Bram Moolenaarac564082020-09-27 19:05:33 +0200857 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200859 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200860 '\d PUSHJOB "no process"\_s*' ..
861 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200862 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200863 '\d PUSHS "donothing"\_s*' ..
864 '\d BCALL job_start(argc 1)\_s*' ..
865 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200866 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200867 '\d PUSHCHANNEL 0\_s*' ..
868 '\d STORE $2\_s*' ..
869 '\d PUSHNR 0\_s*' ..
870 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200871 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100872enddef
873
Bram Moolenaar777770f2020-02-06 21:27:08 +0100874def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200875 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100876 return F("x")
877enddef
878
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100879def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100880 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200881 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200882 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200883 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200884 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200885 '\d STORE $0\_s*' ..
886 'return F("x")\_s*' ..
887 '\d PUSHS "x"\_s*' ..
888 '\d LOAD $0\_s*' ..
889 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200890 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200891 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200892
Bram Moolenaarac564082020-09-27 19:05:33 +0200893 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200894 instr = execute('disassemble ' .. name)
895 assert_match('<lambda>\d\+\_s*' ..
896 'return "X" .. a .. "X"\_s*' ..
897 '\d PUSHS "X"\_s*' ..
898 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200899 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200900 '\d CONCAT\_s*' ..
901 '\d PUSHS "X"\_s*' ..
902 '\d CONCAT\_s*' ..
903 '\d RETURN',
904 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100905enddef
906
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100907def LambdaWithType(): number
908 var Ref = {a: number -> a + 10}
909 return Ref(g:value)
910enddef
911
912def Test_disassemble_lambda_with_type()
913 g:value = 5
914 assert_equal(15, LambdaWithType())
915 var instr = execute('disassemble LambdaWithType')
916 assert_match('LambdaWithType\_s*' ..
917 'var Ref = {a: number -> a + 10}\_s*' ..
918 '\d FUNCREF <lambda>\d\+\_s*' ..
919 '\d STORE $0\_s*' ..
920 'return Ref(g:value)\_s*' ..
921 '\d LOADG g:value\_s*' ..
922 '\d LOAD $0\_s*' ..
923 '\d CHECKTYPE number stack\[-2\]\_s*' ..
924 '\d PCALL (argc 1)\_s*' ..
925 '\d RETURN',
926 instr)
927enddef
928
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200929def NestedOuter()
930 def g:Inner()
931 echomsg "inner"
932 enddef
933enddef
934
935def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200936 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200937 assert_match('NestedOuter\_s*' ..
938 'def g:Inner()\_s*' ..
939 'echomsg "inner"\_s*' ..
940 'enddef\_s*' ..
941 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
942 '\d PUSHNR 0\_s*' ..
943 '\d RETURN',
944 instr)
945enddef
946
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100947def NestedDefList()
948 def
949 def Info
950 def /Info
951 def /Info/
952enddef
953
954def Test_nested_def_list()
955 var instr = execute('disassemble NestedDefList')
956 assert_match('NestedDefList\_s*' ..
957 'def\_s*' ..
958 '\d DEF \_s*' ..
959 'def Info\_s*' ..
960 '\d DEF Info\_s*' ..
961 'def /Info\_s*' ..
962 '\d DEF /Info\_s*' ..
963 'def /Info/\_s*' ..
964 '\d DEF /Info/\_s*' ..
965 '\d PUSHNR 0\_s*' ..
966 '\d RETURN',
967 instr)
968enddef
969
Bram Moolenaar6e949782020-04-13 17:21:00 +0200970def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100971 if arg == 1 && arg != 2 || arg == 4
972 return 'yes'
973 endif
974 return 'no'
975enddef
976
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100977def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100978 assert_equal("yes", AndOr(1))
979 assert_equal("no", AndOr(2))
980 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200981 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200982 assert_match('AndOr\_s*' ..
983 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
984 '\d LOAD arg\[-1]\_s*' ..
985 '\d PUSHNR 1\_s*' ..
986 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200987 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200988 '\d LOAD arg\[-1]\_s*' ..
989 '\d PUSHNR 2\_s*' ..
990 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200991 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200992 '\d LOAD arg\[-1]\_s*' ..
993 '\d\+ PUSHNR 4\_s*' ..
994 '\d\+ COMPAREANY ==\_s*' ..
995 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200996 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100997enddef
998
Bram Moolenaar04d05222020-02-06 22:06:54 +0100999def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001000 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001001 for i in range(3)
1002 res->add(i)
1003 endfor
1004 return res
1005enddef
1006
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001007def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001008 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001009 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001010 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001011 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001012 '\d NEWLIST size 0\_s*' ..
1013 '\d STORE $0\_s*' ..
1014 'for i in range(3)\_s*' ..
1015 '\d STORE -1 in $1\_s*' ..
1016 '\d PUSHNR 3\_s*' ..
1017 '\d BCALL range(argc 1)\_s*' ..
1018 '\d FOR $1 -> \d\+\_s*' ..
1019 '\d STORE $2\_s*' ..
1020 'res->add(i)\_s*' ..
1021 '\d LOAD $0\_s*' ..
1022 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001023 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001024 '\d\+ DROP\_s*' ..
1025 'endfor\_s*' ..
1026 '\d\+ JUMP -> \d\+\_s*' ..
1027 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001028 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001029enddef
1030
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001031def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001032 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001033 for str in eval('["one", "two"]')
1034 res ..= str
1035 endfor
1036 return res
1037enddef
1038
1039def Test_disassemble_for_loop_eval()
1040 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001041 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001042 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001043 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001044 '\d PUSHS ""\_s*' ..
1045 '\d STORE $0\_s*' ..
1046 'for str in eval(''\["one", "two"\]'')\_s*' ..
1047 '\d STORE -1 in $1\_s*' ..
1048 '\d PUSHS "\["one", "two"\]"\_s*' ..
1049 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001050 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001051 '\d FOR $1 -> \d\+\_s*' ..
1052 '\d STORE $2\_s*' ..
1053 'res ..= str\_s*' ..
1054 '\d\+ LOAD $0\_s*' ..
1055 '\d\+ LOAD $2\_s*' ..
1056 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1057 '\d\+ CONCAT\_s*' ..
1058 '\d\+ STORE $0\_s*' ..
1059 'endfor\_s*' ..
1060 '\d\+ JUMP -> 6\_s*' ..
1061 '\d\+ DROP\_s*' ..
1062 'return res\_s*' ..
1063 '\d\+ LOAD $0\_s*' ..
1064 '\d\+ RETURN',
1065 instr)
1066enddef
1067
Bram Moolenaar792f7862020-11-23 08:31:18 +01001068def ForLoopUnpack()
1069 for [x1, x2] in [[1, 2], [3, 4]]
1070 echo x1 x2
1071 endfor
1072enddef
1073
1074def Test_disassemble_for_loop_unpack()
1075 var instr = execute('disassemble ForLoopUnpack')
1076 assert_match('ForLoopUnpack\_s*' ..
1077 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1078 '\d\+ STORE -1 in $0\_s*' ..
1079 '\d\+ PUSHNR 1\_s*' ..
1080 '\d\+ PUSHNR 2\_s*' ..
1081 '\d\+ NEWLIST size 2\_s*' ..
1082 '\d\+ PUSHNR 3\_s*' ..
1083 '\d\+ PUSHNR 4\_s*' ..
1084 '\d\+ NEWLIST size 2\_s*' ..
1085 '\d\+ NEWLIST size 2\_s*' ..
1086 '\d\+ FOR $0 -> 16\_s*' ..
1087 '\d\+ UNPACK 2\_s*' ..
1088 '\d\+ STORE $1\_s*' ..
1089 '\d\+ STORE $2\_s*' ..
1090 'echo x1 x2\_s*' ..
1091 '\d\+ LOAD $1\_s*' ..
1092 '\d\+ LOAD $2\_s*' ..
1093 '\d\+ ECHO 2\_s*' ..
1094 'endfor\_s*' ..
1095 '\d\+ JUMP -> 8\_s*' ..
1096 '\d\+ DROP\_s*' ..
1097 '\d\+ PUSHNR 0\_s*' ..
1098 '\d\+ RETURN',
1099 instr)
1100enddef
1101
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001102let g:number = 42
1103
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001104def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001105 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001106enddef
1107
1108def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001109 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001110 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001111 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001112 '\d PUSHNR 23\_s*' ..
1113 '\d LOADG g:number\_s*' ..
1114 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1115 '\d NEWLIST size 2\_s*' ..
1116 '\d STORE $0\_s*' ..
1117 '\d PUSHNR 0\_s*' ..
1118 '\d RETURN\_s*',
1119 instr)
1120enddef
1121
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001122def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001123 var nr = 3
1124 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001125 nrres = nr - 7
1126 nrres = nr * 7
1127 nrres = nr / 7
1128 nrres = nr % 7
1129
Bram Moolenaarac564082020-09-27 19:05:33 +02001130 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001131 anyres = g:number - 7
1132 anyres = g:number * 7
1133 anyres = g:number / 7
1134 anyres = g:number % 7
1135
1136 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001137 var fl = 3.0
1138 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001139 flres = fl - 7.0
1140 flres = fl * 7.0
1141 flres = fl / 7.0
1142 endif
1143enddef
1144
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001145def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001146 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001147 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001148 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001149 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001150 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001151 '\d LOAD $0.*' ..
1152 '\d PUSHNR 7.*' ..
1153 '\d OPNR +.*' ..
1154 '\d STORE $1.*' ..
1155 'nrres = nr - 7.*' ..
1156 '\d OPNR -.*' ..
1157 'nrres = nr \* 7.*' ..
1158 '\d OPNR \*.*' ..
1159 'nrres = nr / 7.*' ..
1160 '\d OPNR /.*' ..
1161 'nrres = nr % 7.*' ..
1162 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001163 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001164 '\d LOADG g:number.*' ..
1165 '\d PUSHNR 7.*' ..
1166 '\d OPANY +.*' ..
1167 '\d STORE $2.*' ..
1168 'anyres = g:number - 7.*' ..
1169 '\d OPANY -.*' ..
1170 'anyres = g:number \* 7.*' ..
1171 '\d OPANY \*.*' ..
1172 'anyres = g:number / 7.*' ..
1173 '\d OPANY /.*' ..
1174 'anyres = g:number % 7.*' ..
1175 '\d OPANY %.*',
1176 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001177 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001178 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001179 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001180 '\d PUSHF 3.0.*' ..
1181 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001182 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001183 '\d LOAD $3.*' ..
1184 '\d PUSHF 7.0.*' ..
1185 '\d OPFLOAT +.*' ..
1186 '\d STORE $4.*' ..
1187 'flres = fl - 7.0.*' ..
1188 '\d OPFLOAT -.*' ..
1189 'flres = fl \* 7.0.*' ..
1190 '\d OPFLOAT \*.*' ..
1191 'flres = fl / 7.0.*' ..
1192 '\d OPFLOAT /.*',
1193 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001194 endif
1195enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001196
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001197def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001198 var reslist = [1, 2] + [3, 4]
1199 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001200enddef
1201
1202def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001203 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001204 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001205 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001206 '\d PUSHNR 1.*' ..
1207 '\d PUSHNR 2.*' ..
1208 '\d NEWLIST size 2.*' ..
1209 '\d PUSHNR 3.*' ..
1210 '\d PUSHNR 4.*' ..
1211 '\d NEWLIST size 2.*' ..
1212 '\d ADDLIST.*' ..
1213 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001215 '\d PUSHBLOB 0z1122.*' ..
1216 '\d PUSHBLOB 0z3344.*' ..
1217 '\d ADDBLOB.*' ..
1218 '\d STORE $.*',
1219 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001220enddef
1221
1222let g:aa = 'aa'
1223def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001224 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001225 return res
1226enddef
1227
1228def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001229 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001230 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001231 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001232 '\d LOADG g:aa.*' ..
1233 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001234 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001235 '\d CONCAT.*' ..
1236 '\d STORE $.*',
1237 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001238 assert_equal('aabb', ConcatString())
1239enddef
1240
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001241def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001242 var s = "abcd"
1243 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001244 return res
1245enddef
1246
1247def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001248 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001249 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001250 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001251 '\d PUSHS "abcd"\_s*' ..
1252 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001254 '\d LOAD $0\_s*' ..
1255 '\d PUSHNR 1\_s*' ..
1256 '\d STRINDEX\_s*' ..
1257 '\d STORE $1\_s*',
1258 instr)
1259 assert_equal('b', StringIndex())
1260enddef
1261
Bram Moolenaared591872020-08-15 22:14:53 +02001262def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001263 var s = "abcd"
1264 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001265 return res
1266enddef
1267
1268def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001269 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001270 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001271 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001272 '\d PUSHS "abcd"\_s*' ..
1273 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001274 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001275 '\d LOAD $0\_s*' ..
1276 '\d PUSHNR 1\_s*' ..
1277 '\d PUSHNR 8\_s*' ..
1278 '\d STRSLICE\_s*' ..
1279 '\d STORE $1\_s*',
1280 instr)
1281 assert_equal('bcd', StringSlice())
1282enddef
1283
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001284def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001285 var l = [1, 2, 3]
1286 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001287 return res
1288enddef
1289
1290def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001291 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001292 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001293 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001294 '\d PUSHNR 1\_s*' ..
1295 '\d PUSHNR 2\_s*' ..
1296 '\d PUSHNR 3\_s*' ..
1297 '\d NEWLIST size 3\_s*' ..
1298 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001299 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001300 '\d LOAD $0\_s*' ..
1301 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001302 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001303 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001304 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001305 assert_equal(2, ListIndex())
1306enddef
1307
Bram Moolenaared591872020-08-15 22:14:53 +02001308def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001309 var l = [1, 2, 3]
1310 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001311 return res
1312enddef
1313
1314def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001315 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001316 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +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:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001324 '\d LOAD $0\_s*' ..
1325 '\d PUSHNR 1\_s*' ..
1326 '\d PUSHNR 8\_s*' ..
1327 '\d LISTSLICE\_s*' ..
1328 '\d STORE $1\_s*',
1329 instr)
1330 assert_equal([2, 3], ListSlice())
1331enddef
1332
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001333def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001334 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001335 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001336 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001337 return res
1338enddef
1339
1340def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001341 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001342 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001343 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001344 '\d PUSHS "item"\_s*' ..
1345 '\d PUSHNR 1\_s*' ..
1346 '\d NEWDICT size 1\_s*' ..
1347 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001348 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001349 '\d\+ LOAD $0\_s*' ..
1350 '\d\+ MEMBER item\_s*' ..
1351 '\d\+ STORE $1\_s*' ..
1352 'res = d\["item"\]\_s*' ..
1353 '\d\+ LOAD $0\_s*' ..
1354 '\d\+ PUSHS "item"\_s*' ..
1355 '\d\+ MEMBER\_s*' ..
1356 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001357 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001358 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001359enddef
1360
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001361let somelist = [1, 2, 3, 4, 5]
1362def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001363 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001364 return res
1365enddef
1366
1367def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001368 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001369 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001370 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001371 '\d LOADG g:somelist\_s*' ..
1372 '\d PUSHNR 2\_s*' ..
1373 '\d ANYINDEX\_s*' ..
1374 '\d STORE $0\_s*' ..
1375 'return res\_s*' ..
1376 '\d LOAD $0\_s*' ..
1377 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1378 '\d RETURN',
1379 instr)
1380 assert_equal(3, AnyIndex())
1381enddef
1382
1383def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001384 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001385 return res
1386enddef
1387
1388def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001389 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001390 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001391 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001392 '\d LOADG g:somelist\_s*' ..
1393 '\d PUSHNR 1\_s*' ..
1394 '\d PUSHNR 3\_s*' ..
1395 '\d ANYSLICE\_s*' ..
1396 '\d STORE $0\_s*' ..
1397 'return res\_s*' ..
1398 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001399 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001400 '\d RETURN',
1401 instr)
1402 assert_equal([2, 3, 4], AnySlice())
1403enddef
1404
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001405def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001406 var nr = 9
1407 var plus = +nr
1408 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001409 return res
1410enddef
1411
1412def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001413 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001414 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001415 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001416 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001417 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001418 '\d LOAD $0\_s*' ..
1419 '\d CHECKNR\_s*' ..
1420 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001421 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001422 '\d LOAD $0\_s*' ..
1423 '\d NEGATENR\_s*' ..
1424 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001425 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001426 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001427enddef
1428
1429def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 var flag = true
1431 var invert = !flag
1432 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001433 return res
1434enddef
1435
1436def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001437 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001438 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001440 '\d PUSH v:true\_s*' ..
1441 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001442 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001443 '\d LOAD $0\_s*' ..
1444 '\d INVERT (!val)\_s*' ..
1445 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001446 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001447 '\d LOAD $0\_s*' ..
1448 '\d 2BOOL (!!val)\_s*' ..
1449 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001450 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001451 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001452enddef
1453
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001454def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001455 var name: bool = 1 && 0 || 1
1456 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001457enddef
1458
1459def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001460 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001461 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001462 'var name: bool = 1 && 0 || 1\_s*' ..
1463 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001464 '1 2BOOL (!!val)\_s*' ..
1465 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1466 '3 PUSHNR 0\_s*' ..
1467 '4 2BOOL (!!val)\_s*' ..
1468 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1469 '6 PUSHNR 1\_s*' ..
1470 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001471 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001472 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001473 '\d\+ LOAD $0\_s*' ..
1474 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001475 instr)
1476 assert_equal(true, InvertBool())
1477enddef
1478
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001479def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001480 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001481 ['true == isFalse', 'COMPAREBOOL =='],
1482 ['true != isFalse', 'COMPAREBOOL !='],
1483 ['v:none == isNull', 'COMPARESPECIAL =='],
1484 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001485
Bram Moolenaara5565e42020-05-09 15:44:01 +02001486 ['111 == aNumber', 'COMPARENR =='],
1487 ['111 != aNumber', 'COMPARENR !='],
1488 ['111 > aNumber', 'COMPARENR >'],
1489 ['111 < aNumber', 'COMPARENR <'],
1490 ['111 >= aNumber', 'COMPARENR >='],
1491 ['111 <= aNumber', 'COMPARENR <='],
1492 ['111 =~ aNumber', 'COMPARENR =\~'],
1493 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001494
Bram Moolenaara5565e42020-05-09 15:44:01 +02001495 ['"xx" != aString', 'COMPARESTRING !='],
1496 ['"xx" > aString', 'COMPARESTRING >'],
1497 ['"xx" < aString', 'COMPARESTRING <'],
1498 ['"xx" >= aString', 'COMPARESTRING >='],
1499 ['"xx" <= aString', 'COMPARESTRING <='],
1500 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1501 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1502 ['"xx" is aString', 'COMPARESTRING is'],
1503 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001504
Bram Moolenaara5565e42020-05-09 15:44:01 +02001505 ['0z11 == aBlob', 'COMPAREBLOB =='],
1506 ['0z11 != aBlob', 'COMPAREBLOB !='],
1507 ['0z11 is aBlob', 'COMPAREBLOB is'],
1508 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001509
Bram Moolenaara5565e42020-05-09 15:44:01 +02001510 ['[1, 2] == aList', 'COMPARELIST =='],
1511 ['[1, 2] != aList', 'COMPARELIST !='],
1512 ['[1, 2] is aList', 'COMPARELIST is'],
1513 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001514
Bram Moolenaare0de1712020-12-02 17:36:54 +01001515 ['{a: 1} == aDict', 'COMPAREDICT =='],
1516 ['{a: 1} != aDict', 'COMPAREDICT !='],
1517 ['{a: 1} is aDict', 'COMPAREDICT is'],
1518 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001519
1520 ['{->33} == {->44}', 'COMPAREFUNC =='],
1521 ['{->33} != {->44}', 'COMPAREFUNC !='],
1522 ['{->33} is {->44}', 'COMPAREFUNC is'],
1523 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1524
1525 ['77 == g:xx', 'COMPAREANY =='],
1526 ['77 != g:xx', 'COMPAREANY !='],
1527 ['77 > g:xx', 'COMPAREANY >'],
1528 ['77 < g:xx', 'COMPAREANY <'],
1529 ['77 >= g:xx', 'COMPAREANY >='],
1530 ['77 <= g:xx', 'COMPAREANY <='],
1531 ['77 =~ g:xx', 'COMPAREANY =\~'],
1532 ['77 !~ g:xx', 'COMPAREANY !\~'],
1533 ['77 is g:xx', 'COMPAREANY is'],
1534 ['77 isnot g:xx', 'COMPAREANY isnot'],
1535 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001536 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001537 if has('float')
1538 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001539 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1540 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1541 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1542 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1543 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1544 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1545 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1546 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001547 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001548 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001549 endif
1550
Bram Moolenaarac564082020-09-27 19:05:33 +02001551 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001552 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001553 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001554 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001555 ' var isFalse = false',
1556 ' var isNull = v:null',
1557 ' var aNumber = 222',
1558 ' var aString = "yy"',
1559 ' var aBlob = 0z22',
1560 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001561 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001562 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001563 ' if ' .. case[0],
1564 ' echo 42'
1565 ' endif',
1566 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001567 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001568 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001569 assert_match('TestCase' .. nr .. '.*' ..
1570 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1571 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001572 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001573 '\d ' .. case[1] .. '.*' ..
1574 '\d JUMP_IF_FALSE -> \d\+.*',
1575 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001576
1577 nr += 1
1578 endfor
1579
Bram Moolenaar22da5592020-03-19 14:52:20 +01001580 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001581enddef
1582
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001583def s:FalsyOp()
1584 echo g:flag ?? "yes"
1585 echo [] ?? "empty list"
1586 echo "" ?? "empty string"
1587enddef
1588
1589def Test_dsassemble_falsy_op()
1590 var res = execute('disass s:FalsyOp')
1591 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1592 'echo g:flag ?? "yes"\_s*' ..
1593 '0 LOADG g:flag\_s*' ..
1594 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1595 '2 PUSHS "yes"\_s*' ..
1596 '3 ECHO 1\_s*' ..
1597 'echo \[\] ?? "empty list"\_s*' ..
1598 '4 NEWLIST size 0\_s*' ..
1599 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1600 '6 PUSHS "empty list"\_s*' ..
1601 '7 ECHO 1\_s*' ..
1602 'echo "" ?? "empty string"\_s*' ..
1603 '\d\+ PUSHS "empty string"\_s*' ..
1604 '\d\+ ECHO 1\_s*' ..
1605 '\d\+ PUSHNR 0\_s*' ..
1606 '\d\+ RETURN',
1607 res)
1608enddef
1609
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001610def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001611 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001612 ['"xx" == "yy"', false],
1613 ['"aa" == "aa"', true],
1614 ['has("eval") ? true : false', true],
1615 ['has("asdf") ? true : false', false],
1616 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001617
Bram Moolenaarac564082020-09-27 19:05:33 +02001618 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001619 for case in cases
1620 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001621 ' if ' .. case[0],
1622 ' echo 42'
1623 ' endif',
1624 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001625 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001626 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001627 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001628 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001629 assert_match('TestCase' .. nr .. '.*' ..
1630 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1631 '\d PUSHNR 42.*' ..
1632 '\d ECHO 1.*' ..
1633 '\d PUSHNR 0.*' ..
1634 '\d RETURN.*',
1635 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001636 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001637 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001638 assert_match('TestCase' .. nr .. '.*' ..
1639 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1640 'echo 42[ \n]*' ..
1641 'endif[ \n]*' ..
1642 '\s*\d PUSHNR 0.*' ..
1643 '\d RETURN.*',
1644 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001645 endif
1646
1647 nr += 1
1648 endfor
1649
1650 delete('Xdisassemble')
1651enddef
1652
Bram Moolenaarad39c092020-02-26 18:23:43 +01001653def s:Execute()
1654 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001655 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001656 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001657 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001658 execute 'help ' .. tag
1659enddef
1660
1661def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001662 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001663 assert_match('\<SNR>\d*_Execute\_s*' ..
1664 "execute 'help vim9.txt'\\_s*" ..
1665 '\d PUSHS "help vim9.txt"\_s*' ..
1666 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001667 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001668 '\d PUSHS "help vim9.txt"\_s*' ..
1669 '\d STORE $0\_s*' ..
1670 'execute cmd\_s*' ..
1671 '\d LOAD $0\_s*' ..
1672 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001673 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001674 '\d PUSHS "vim9.txt"\_s*' ..
1675 '\d STORE $1\_s*' ..
1676 "execute 'help ' .. tag\\_s*" ..
1677 '\d\+ PUSHS "help "\_s*' ..
1678 '\d\+ LOAD $1\_s*' ..
1679 '\d\+ CONCAT\_s*' ..
1680 '\d\+ EXECUTE 1\_s*' ..
1681 '\d\+ PUSHNR 0\_s*' ..
1682 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001683 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001684enddef
1685
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001686def s:Echomsg()
1687 echomsg 'some' 'message'
1688 echoerr 'went' .. 'wrong'
1689enddef
1690
1691def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001692 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001693 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1694 "echomsg 'some' 'message'\\_s*" ..
1695 '\d PUSHS "some"\_s*' ..
1696 '\d PUSHS "message"\_s*' ..
1697 '\d ECHOMSG 2\_s*' ..
1698 "echoerr 'went' .. 'wrong'\\_s*" ..
1699 '\d PUSHS "wentwrong"\_s*' ..
1700 '\d ECHOERR 1\_s*' ..
1701 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001702 '\d RETURN',
1703 res)
1704enddef
1705
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001706def SomeStringArg(arg: string)
1707 echo arg
1708enddef
1709
1710def SomeAnyArg(arg: any)
1711 echo arg
1712enddef
1713
1714def SomeStringArgAndReturn(arg: string): string
1715 return arg
1716enddef
1717
1718def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001719 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001720 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1721 '\d *echo arg.*' ..
1722 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001723 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001724
Bram Moolenaarac564082020-09-27 19:05:33 +02001725 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001726 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1727 '\d *echo arg\_s*' ..
1728 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001729 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001730
Bram Moolenaarac564082020-09-27 19:05:33 +02001731 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001732 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1733 '\d *return arg\_s*' ..
1734 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001735 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001736enddef
1737
Bram Moolenaar09689a02020-05-09 22:50:08 +02001738def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001739 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001740 vim9script
1741 def FuncOne(): string
1742 return FuncTwo()
1743 enddef
1744 def FuncTwo(): string
1745 return 'two'
1746 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001747 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001748 END
1749 writefile(lines, 'Xdisassemble')
1750 source Xdisassemble
1751
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001752 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001753 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1754 'return FuncTwo()\_s*' ..
1755 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001756 '\d RETURN',
1757 g:res_FuncOne)
1758
1759 delete('Xdisassemble')
1760 unlet g:res_FuncOne
1761enddef
1762
Bram Moolenaar61a89812020-05-07 16:58:17 +02001763def s:ConcatStrings(): string
1764 return 'one' .. 'two' .. 'three'
1765enddef
1766
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001767def s:ComputeConst(): number
1768 return 2 + 3 * 4 / 6 + 7
1769enddef
1770
Bram Moolenaar1c747212020-05-09 18:28:34 +02001771def s:ComputeConstParen(): number
1772 return ((2 + 4) * (8 / 2)) / (3 + 4)
1773enddef
1774
Bram Moolenaar61a89812020-05-07 16:58:17 +02001775def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001776 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001777 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1778 "return 'one' .. 'two' .. 'three'\\_s*" ..
1779 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001780 '\d RETURN',
1781 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001782
1783 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001784 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1785 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1786 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001787 '\d RETURN',
1788 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001789
1790 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001791 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1792 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1793 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001794 '\d RETURN',
1795 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001796enddef
1797
Bram Moolenaar389df252020-07-09 21:20:47 +02001798def s:CallAppend()
1799 eval "some text"->append(2)
1800enddef
1801
1802def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001803 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001804 assert_match('<SNR>\d*_CallAppend\_s*' ..
1805 'eval "some text"->append(2)\_s*' ..
1806 '\d PUSHS "some text"\_s*' ..
1807 '\d PUSHNR 2\_s*' ..
1808 '\d SHUFFLE 2 up 1\_s*' ..
1809 '\d BCALL append(argc 2)\_s*' ..
1810 '\d DROP\_s*' ..
1811 '\d PUSHNR 0\_s*' ..
1812 '\d RETURN',
1813 res)
1814enddef
1815
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001816
1817def s:SilentMessage()
1818 silent echomsg "text"
1819 silent! echoerr "error"
1820enddef
1821
1822def Test_silent()
1823 var res = execute('disass s:SilentMessage')
1824 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1825 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001826 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001827 '\d PUSHS "text"\_s*' ..
1828 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001829 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001830 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001831 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001832 '\d PUSHS "error"\_s*' ..
1833 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001834 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001835 '\d PUSHNR 0\_s*' ..
1836 '\d RETURN',
1837 res)
1838enddef
1839
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001840" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker