blob: 1d1730e00426ecc6036f68b80e4e0a2b44eb3e13 [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*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200120 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
Bram Moolenaar20677332021-06-06 17:02:53 +0200124if has('python3')
125 def s:PyHeredoc()
126 python3 << EOF
127 print('hello')
128EOF
129 enddef
130
131 def Test_disassemble_python_heredoc()
132 var res = execute('disass s:PyHeredoc')
133 assert_match('<SNR>\d*_PyHeredoc.*' ..
134 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
135 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200136 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200137 res)
138 enddef
139endif
140
Bram Moolenaar4c137212021-04-19 16:48:48 +0200141def s:Substitute()
142 var expr = "abc"
143 :%s/a/\=expr/&g#c
144enddef
145
146def Test_disassemble_substitute()
147 var res = execute('disass s:Substitute')
148 assert_match('<SNR>\d*_Substitute.*' ..
149 ' var expr = "abc"\_s*' ..
150 '\d PUSHS "abc"\_s*' ..
151 '\d STORE $0\_s*' ..
152 ' :%s/a/\\=expr/&g#c\_s*' ..
153 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
154 ' 0 LOAD $0\_s*' ..
155 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200156 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200157 res)
158enddef
159
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200160
161def s:SearchPair()
162 var col = 8
163 searchpair("{", "", "}", "", "col('.') > col")
164enddef
165
166def Test_disassemble_seachpair()
167 var res = execute('disass s:SearchPair')
168 assert_match('<SNR>\d*_SearchPair.*' ..
169 ' var col = 8\_s*' ..
170 '\d STORE 8 in $0\_s*' ..
171 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
172 '\d PUSHS "{"\_s*' ..
173 '\d PUSHS ""\_s*' ..
174 '\d PUSHS "}"\_s*' ..
175 '\d PUSHS ""\_s*' ..
176 '\d INSTR\_s*' ..
177 ' 0 PUSHS "."\_s*' ..
178 ' 1 BCALL col(argc 1)\_s*' ..
179 ' 2 LOAD $0\_s*' ..
180 ' 3 COMPARENR >\_s*' ..
181 ' -------------\_s*' ..
182 '\d BCALL searchpair(argc 5)\_s*' ..
183 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200184 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200185 res)
186enddef
187
188
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200189def s:RedirVar()
190 var result: string
191 redir =>> result
192 echo "text"
193 redir END
194enddef
195
196def Test_disassemble_redir_var()
197 var res = execute('disass s:RedirVar')
198 assert_match('<SNR>\d*_RedirVar.*' ..
199 ' var result: string\_s*' ..
200 '\d PUSHS "\[NULL\]"\_s*' ..
201 '\d STORE $0\_s*' ..
202 ' redir =>> result\_s*' ..
203 '\d REDIR\_s*' ..
204 ' echo "text"\_s*' ..
205 '\d PUSHS "text"\_s*' ..
206 '\d ECHO 1\_s*' ..
207 ' redir END\_s*' ..
208 '\d LOAD $0\_s*' ..
209 '\d REDIR END\_s*' ..
210 '\d CONCAT\_s*' ..
211 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200212 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200213 res)
214enddef
215
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200216def s:Cexpr()
217 var errors = "list of errors"
218 cexpr errors
219enddef
220
221def Test_disassemble_cexpr()
222 var res = execute('disass s:Cexpr')
223 assert_match('<SNR>\d*_Cexpr.*' ..
224 ' var errors = "list of errors"\_s*' ..
225 '\d PUSHS "list of errors"\_s*' ..
226 '\d STORE $0\_s*' ..
227 ' cexpr errors\_s*' ..
228 '\d CEXPR pre cexpr\_s*' ..
229 '\d LOAD $0\_s*' ..
230 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200231 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200232 res)
233enddef
234
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200235def s:YankRange()
236 norm! m[jjm]
237 :'[,']yank
238enddef
239
240def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200241 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200242 assert_match('<SNR>\d*_YankRange.*' ..
243 ' norm! m\[jjm\]\_s*' ..
244 '\d EXEC norm! m\[jjm\]\_s*' ..
245 ' :''\[,''\]yank\_s*' ..
246 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200247 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200248 res)
249enddef
250
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200251def s:PutExpr()
252 :3put ="text"
253enddef
254
255def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200257 assert_match('<SNR>\d*_PutExpr.*' ..
258 ' :3put ="text"\_s*' ..
259 '\d PUSHS "text"\_s*' ..
260 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200261 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200262 res)
263enddef
264
Bram Moolenaar08597872020-12-10 19:43:40 +0100265def s:PutRange()
266 :$-2put a
267enddef
268
269def Test_disassemble_put_range()
270 var res = execute('disass s:PutRange')
271 assert_match('<SNR>\d*_PutRange.*' ..
272 ' :$-2put a\_s*' ..
273 '\d RANGE $-2\_s*' ..
274 '\d PUT a range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200275 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100276 res)
277enddef
278
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100279def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200280 var localbool = true
281 var localspec = v:none
282 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100283 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200284 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100285 endif
286enddef
287
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100288def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200289 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200290 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
291 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100292 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200293 'localspec = v:none.*' ..
294 ' PUSH v:none.*' ..
295 'localblob = 0z1234.*' ..
296 ' PUSHBLOB 0z1234.*',
297 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100298 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200299 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
300 'localfloat = 1.234.*' ..
301 ' PUSHF 1.234.*',
302 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100303 endif
304enddef
305
306def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200307 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100308 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100310 localstr = 'xyz'
311 v:char = 'abc'
312 s:scriptvar = 'sv'
313 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100314 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200315 b:buffervar = 'bv'
316 w:windowvar = 'wv'
317 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100318 &tabstop = 8
319 $ENVVAR = 'ev'
320 @z = 'rv'
321enddef
322
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100323def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200324 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200325 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200326 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200327 'localnr = 2.*' ..
328 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200329 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200330 'localstr = ''xyz''.*' ..
331 ' STORE $1.*' ..
332 'v:char = ''abc''.*' ..
333 'STOREV v:char.*' ..
334 's:scriptvar = ''sv''.*' ..
335 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
336 'g:globalvar = ''gv''.*' ..
337 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100338 'g:auto#var = ''av''.*' ..
339 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200340 'b:buffervar = ''bv''.*' ..
341 ' STOREB b:buffervar.*' ..
342 'w:windowvar = ''wv''.*' ..
343 ' STOREW w:windowvar.*' ..
344 't:tabpagevar = ''tv''.*' ..
345 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200346 '&tabstop = 8.*' ..
347 ' STOREOPT &tabstop.*' ..
348 '$ENVVAR = ''ev''.*' ..
349 ' STOREENV $ENVVAR.*' ..
350 '@z = ''rv''.*' ..
351 ' STOREREG @z.*',
352 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100353enddef
354
Bram Moolenaarcb790402020-05-15 20:53:00 +0200355def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200356 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200357 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200358 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200359 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200360 var localblob: blob = 0z1122
361 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200362enddef
363
364def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200365 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200366 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200367 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200368 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100369 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200370 '\d STORE $0\_s*' ..
371 'locallist\[0\] = 123\_s*' ..
372 '\d PUSHNR 123\_s*' ..
373 '\d PUSHNR 0\_s*' ..
374 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200375 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200376 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200377 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100378 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200379 '\d STORE $1\_s*' ..
380 'localdict\["a"\] = 456\_s*' ..
381 '\d\+ PUSHNR 456\_s*' ..
382 '\d\+ PUSHS "a"\_s*' ..
383 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200384 '\d\+ STOREINDEX dict\_s*' ..
385 'var localblob: blob = 0z1122\_s*' ..
386 '\d\+ PUSHBLOB 0z1122\_s*' ..
387 '\d\+ STORE $2\_s*' ..
388 'localblob\[1\] = 33\_s*' ..
389 '\d\+ PUSHNR 33\_s*' ..
390 '\d\+ PUSHNR 1\_s*' ..
391 '\d\+ LOAD $2\_s*' ..
392 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200393 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200394 res)
395enddef
396
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100397def s:ScriptFuncStoreIndex()
398 var d = {dd: {}}
399 d.dd[0] = 0
400enddef
401
402def Test_disassemble_store_index()
403 var res = execute('disass s:ScriptFuncStoreIndex')
404 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
405 'var d = {dd: {}}\_s*' ..
406 '\d PUSHS "dd"\_s*' ..
407 '\d NEWDICT size 0\_s*' ..
408 '\d NEWDICT size 1\_s*' ..
409 '\d STORE $0\_s*' ..
410 'd.dd\[0\] = 0\_s*' ..
411 '\d PUSHNR 0\_s*' ..
412 '\d PUSHNR 0\_s*' ..
413 '\d LOAD $0\_s*' ..
414 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200415 '\d STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200416 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100417 res)
418enddef
419
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200420def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200421 var x: string
422 var y: string
423 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200424 [x, y; l] = g:stringlist
425enddef
426
427def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200428 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200429 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200430 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200431 '\d PUSHS "\[NULL\]"\_s*' ..
432 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200433 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200434 '\d PUSHS "\[NULL\]"\_s*' ..
435 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200436 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200437 '\d NEWLIST size 0\_s*' ..
Bram Moolenaar6e48b842021-08-10 22:52:02 +0200438 '\d SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200439 '\d STORE $2\_s*' ..
440 '\[x, y; l\] = g:stringlist\_s*' ..
441 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200442 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200443 '\d CHECKLEN >= 2\_s*' ..
444 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200445 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200446 '\d\+ STORE $0\_s*' ..
447 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200448 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200449 '\d\+ STORE $1\_s*' ..
450 '\d\+ SLICE 2\_s*' ..
451 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200452 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200453 res)
454enddef
455
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200456def s:ListAssignWithOp()
457 var a = 2
458 var b = 3
459 [a, b] += [4, 5]
460enddef
461
462def Test_disassemble_list_assign_with_op()
463 var res = execute('disass s:ListAssignWithOp')
464 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
465 'var a = 2\_s*' ..
466 '\d STORE 2 in $0\_s*' ..
467 'var b = 3\_s*' ..
468 '\d STORE 3 in $1\_s*' ..
469 '\[a, b\] += \[4, 5\]\_s*' ..
470 '\d\+ PUSHNR 4\_s*' ..
471 '\d\+ PUSHNR 5\_s*' ..
472 '\d\+ NEWLIST size 2\_s*' ..
473 '\d\+ CHECKLEN 2\_s*' ..
474 '\d\+ LOAD $0\_s*' ..
475 '\d\+ ITEM 0 with op\_s*' ..
476 '\d\+ OPNR +\_s*' ..
477 '\d\+ STORE $0\_s*' ..
478 '\d\+ LOAD $1\_s*' ..
479 '\d\+ ITEM 1 with op\_s*' ..
480 '\d\+ OPNR +\_s*' ..
481 '\d\+ STORE $1\_s*' ..
482 '\d\+ DROP\_s*' ..
483 '\d\+ RETURN void',
484 res)
485enddef
486
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200487def s:ListAdd()
488 var l: list<number> = []
489 add(l, 123)
490 add(l, g:aNumber)
491enddef
492
493def Test_disassemble_list_add()
494 var res = execute('disass s:ListAdd')
495 assert_match('<SNR>\d*_ListAdd\_s*' ..
496 'var l: list<number> = []\_s*' ..
497 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100498 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200499 '\d STORE $0\_s*' ..
500 'add(l, 123)\_s*' ..
501 '\d LOAD $0\_s*' ..
502 '\d PUSHNR 123\_s*' ..
503 '\d LISTAPPEND\_s*' ..
504 '\d DROP\_s*' ..
505 'add(l, g:aNumber)\_s*' ..
506 '\d LOAD $0\_s*' ..
507 '\d\+ LOADG g:aNumber\_s*' ..
508 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
509 '\d\+ LISTAPPEND\_s*' ..
510 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200511 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200512 res)
513enddef
514
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200515def s:BlobAdd()
516 var b: blob = 0z
517 add(b, 123)
518 add(b, g:aNumber)
519enddef
520
521def Test_disassemble_blob_add()
522 var res = execute('disass s:BlobAdd')
523 assert_match('<SNR>\d*_BlobAdd\_s*' ..
524 'var b: blob = 0z\_s*' ..
525 '\d PUSHBLOB 0z\_s*' ..
526 '\d STORE $0\_s*' ..
527 'add(b, 123)\_s*' ..
528 '\d LOAD $0\_s*' ..
529 '\d PUSHNR 123\_s*' ..
530 '\d BLOBAPPEND\_s*' ..
531 '\d DROP\_s*' ..
532 'add(b, g:aNumber)\_s*' ..
533 '\d LOAD $0\_s*' ..
534 '\d\+ LOADG g:aNumber\_s*' ..
535 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
536 '\d\+ BLOBAPPEND\_s*' ..
537 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200538 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200539 res)
540enddef
541
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200542def s:BlobIndexSlice()
543 var b: blob = 0z112233
544 echo b[1]
545 echo b[1 : 2]
546enddef
547
548def Test_disassemble_blob_index_slice()
549 var res = execute('disass s:BlobIndexSlice')
550 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
551 'var b: blob = 0z112233\_s*' ..
552 '\d PUSHBLOB 0z112233\_s*' ..
553 '\d STORE $0\_s*' ..
554 'echo b\[1\]\_s*' ..
555 '\d LOAD $0\_s*' ..
556 '\d PUSHNR 1\_s*' ..
557 '\d BLOBINDEX\_s*' ..
558 '\d ECHO 1\_s*' ..
559 'echo b\[1 : 2\]\_s*' ..
560 '\d LOAD $0\_s*' ..
561 '\d PUSHNR 1\_s*' ..
562 '\d\+ PUSHNR 2\_s*' ..
563 '\d\+ BLOBSLICE\_s*' ..
564 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200565 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200566 res)
567enddef
568
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200569def s:ScriptFuncUnlet()
570 g:somevar = "value"
571 unlet g:somevar
572 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200573 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200574enddef
575
576def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200577 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200578 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
579 'g:somevar = "value"\_s*' ..
580 '\d PUSHS "value"\_s*' ..
581 '\d STOREG g:somevar\_s*' ..
582 'unlet g:somevar\_s*' ..
583 '\d UNLET g:somevar\_s*' ..
584 'unlet! g:somevar\_s*' ..
585 '\d UNLET! g:somevar\_s*' ..
586 'unlet $SOMEVAR\_s*' ..
587 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200588 res)
589enddef
590
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100591def s:ScriptFuncTry()
592 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200593 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100594 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200595 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100596 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200597 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100598 endtry
599enddef
600
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100601def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200602 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200603 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
604 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100605 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200606 'echo "yes"\_s*' ..
607 '\d PUSHS "yes"\_s*' ..
608 '\d ECHO 1\_s*' ..
609 'catch /fail/\_s*' ..
610 '\d JUMP -> \d\+\_s*' ..
611 '\d PUSH v:exception\_s*' ..
612 '\d PUSHS "fail"\_s*' ..
613 '\d COMPARESTRING =\~\_s*' ..
614 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
615 '\d CATCH\_s*' ..
616 'echo "no"\_s*' ..
617 '\d\+ PUSHS "no"\_s*' ..
618 '\d\+ ECHO 1\_s*' ..
619 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100620 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200621 'throw "end"\_s*' ..
622 '\d\+ PUSHS "end"\_s*' ..
623 '\d\+ THROW\_s*' ..
624 'endtry\_s*' ..
625 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200626 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100627enddef
628
629def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200630 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100631 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100632enddef
633
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100634def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200635 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200636 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200637 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200638 '\d PUSHNR 1\_s*' ..
639 '\d PUSHS "two"\_s*' ..
640 '\d PUSHNR 333\_s*' ..
641 '\d NEWLIST size 3\_s*' ..
642 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100643 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200644 '\d PUSHS "one"\_s*' ..
645 '\d PUSHNR 1\_s*' ..
646 '\d PUSHS "two"\_s*' ..
647 '\d PUSHS "val"\_s*' ..
648 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200649 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100650enddef
651
Bram Moolenaar6e949782020-04-13 17:21:00 +0200652def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100653 echo arg
654enddef
655
656func UserFunc()
657 echo 'nothing'
658endfunc
659
660func UserFuncWithArg(arg)
661 echo a:arg
662endfunc
663
664def s:ScriptFuncCall(): string
665 changenr()
666 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100667 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100668 FuncWithArg(343)
669 ScriptFuncNew()
670 s:ScriptFuncNew()
671 UserFunc()
672 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200673 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100674 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200675 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100676 FuncRefWithArg("bar")
677 return "yes"
678enddef
679
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100680def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200681 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200682 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
683 'changenr()\_s*' ..
684 '\d BCALL changenr(argc 0)\_s*' ..
685 '\d DROP\_s*' ..
686 'char2nr("abc")\_s*' ..
687 '\d PUSHS "abc"\_s*' ..
688 '\d BCALL char2nr(argc 1)\_s*' ..
689 '\d DROP\_s*' ..
690 'Test_disassemble_new()\_s*' ..
691 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
692 '\d DROP\_s*' ..
693 'FuncWithArg(343)\_s*' ..
694 '\d\+ PUSHNR 343\_s*' ..
695 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
696 '\d\+ DROP\_s*' ..
697 'ScriptFuncNew()\_s*' ..
698 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
699 '\d\+ DROP\_s*' ..
700 's:ScriptFuncNew()\_s*' ..
701 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
702 '\d\+ DROP\_s*' ..
703 'UserFunc()\_s*' ..
704 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
705 '\d\+ DROP\_s*' ..
706 'UserFuncWithArg("foo")\_s*' ..
707 '\d\+ PUSHS "foo"\_s*' ..
708 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
709 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200710 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200711 '\d\+ PUSHS "UserFunc"\_s*' ..
712 '\d\+ BCALL function(argc 1)\_s*' ..
713 '\d\+ STORE $0\_s*' ..
714 'FuncRef()\_s*' ..
715 '\d\+ LOAD $\d\_s*' ..
716 '\d\+ PCALL (argc 0)\_s*' ..
717 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200718 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200719 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
720 '\d\+ BCALL function(argc 1)\_s*' ..
721 '\d\+ STORE $1\_s*' ..
722 'FuncRefWithArg("bar")\_s*' ..
723 '\d\+ PUSHS "bar"\_s*' ..
724 '\d\+ LOAD $\d\_s*' ..
725 '\d\+ PCALL (argc 1)\_s*' ..
726 '\d\+ DROP\_s*' ..
727 'return "yes"\_s*' ..
728 '\d\+ PUSHS "yes"\_s*' ..
729 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200730 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100731enddef
732
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200733
734def s:CreateRefs()
735 var local = 'a'
736 def Append(arg: string)
737 local ..= arg
738 enddef
739 g:Append = Append
740 def Get(): string
741 return local
742 enddef
743 g:Get = Get
744enddef
745
746def Test_disassemble_closure()
747 CreateRefs()
748 var res = execute('disass g:Append')
749 assert_match('<lambda>\d\_s*' ..
750 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100751 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200752 '\d LOAD arg\[-1\]\_s*' ..
753 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100754 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200755 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200756 res)
757
758 res = execute('disass g:Get')
759 assert_match('<lambda>\d\_s*' ..
760 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100761 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200762 '\d RETURN',
763 res)
764
765 unlet g:Append
766 unlet g:Get
767enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200768
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100769
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200770def EchoArg(arg: string): string
771 return arg
772enddef
773def RefThis(): func
774 return function('EchoArg')
775enddef
776def s:ScriptPCall()
777 RefThis()("text")
778enddef
779
780def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200781 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200782 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
783 'RefThis()("text")\_s*' ..
784 '\d DCALL RefThis(argc 0)\_s*' ..
785 '\d PUSHS "text"\_s*' ..
786 '\d PCALL top (argc 1)\_s*' ..
787 '\d PCALL end\_s*' ..
788 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200789 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200790 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200791enddef
792
793
Bram Moolenaara26b9702020-04-18 19:53:28 +0200794def s:FuncWithForwardCall(): string
795 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100796enddef
797
798def DefinedLater(arg: string): string
799 return arg
800enddef
801
802def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200803 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200804 assert_match('FuncWithForwardCall\_s*' ..
805 'return g:DefinedLater("yes")\_s*' ..
806 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200807 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200808 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200809 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100810
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200811 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100812 assert_equal('yes', FuncWithForwardCall())
813
Bram Moolenaara26b9702020-04-18 19:53:28 +0200814 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200815 assert_match('FuncWithForwardCall\_s*' ..
816 'return g:DefinedLater("yes")\_s*' ..
817 '\d PUSHS "yes"\_s*' ..
818 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200819 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200820 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100821enddef
822
823
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200824def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200825 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100826enddef
827
828def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200829 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200830 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200831 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200832 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200833 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200834 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200835 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200836 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
837 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200838 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200839 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200840 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200841 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200842 '\d 2STRING stack\[-1]\_s*' ..
843 '\d\+ CONCAT\_s*' ..
844 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200845 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100846enddef
847
848
Bram Moolenaar158906c2020-02-06 20:39:45 +0100849def HasEval()
850 if has("eval")
851 echo "yes"
852 else
853 echo "no"
854 endif
855enddef
856
857def HasNothing()
858 if has("nothing")
859 echo "yes"
860 else
861 echo "no"
862 endif
863enddef
864
865def HasSomething()
866 if has("nothing")
867 echo "nothing"
868 elseif has("something")
869 echo "something"
870 elseif has("eval")
871 echo "eval"
872 elseif has("less")
873 echo "less"
874 endif
875enddef
876
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100877def HasGuiRunning()
878 if has("gui_running")
879 echo "yes"
880 else
881 echo "no"
882 endif
883enddef
884
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100885def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200886 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200887 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200888 assert_match('HasEval\_s*' ..
889 'if has("eval")\_s*' ..
890 'echo "yes"\_s*' ..
891 '\d PUSHS "yes"\_s*' ..
892 '\d ECHO 1\_s*' ..
893 'else\_s*' ..
894 'echo "no"\_s*' ..
895 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200896 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100897 assert_notmatch('JUMP', instr)
898
Bram Moolenaard2c61702020-09-06 15:58:36 +0200899 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100900 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200901 assert_match('HasNothing\_s*' ..
902 'if has("nothing")\_s*' ..
903 'echo "yes"\_s*' ..
904 'else\_s*' ..
905 'echo "no"\_s*' ..
906 '\d PUSHS "no"\_s*' ..
907 '\d ECHO 1\_s*' ..
908 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200909 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100910 assert_notmatch('PUSHS "yes"', instr)
911 assert_notmatch('JUMP', instr)
912
Bram Moolenaard2c61702020-09-06 15:58:36 +0200913 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100914 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200915 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200916 'if has("nothing")\_s*' ..
917 'echo "nothing"\_s*' ..
918 'elseif has("something")\_s*' ..
919 'echo "something"\_s*' ..
920 'elseif has("eval")\_s*' ..
921 'echo "eval"\_s*' ..
922 '\d PUSHS "eval"\_s*' ..
923 '\d ECHO 1\_s*' ..
924 'elseif has("less").*' ..
925 'echo "less"\_s*' ..
926 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200927 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100928 assert_notmatch('PUSHS "nothing"', instr)
929 assert_notmatch('PUSHS "something"', instr)
930 assert_notmatch('PUSHS "less"', instr)
931 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100932
933 var result: string
934 var instr_expected: string
935 if has('gui')
936 if has('gui_running')
937 # GUI already running, always returns "yes"
938 result = "\nyes"
939 instr_expected = 'HasGuiRunning.*' ..
940 'if has("gui_running")\_s*' ..
941 ' echo "yes"\_s*' ..
942 '\d PUSHS "yes"\_s*' ..
943 '\d ECHO 1\_s*' ..
944 'else\_s*' ..
945 ' echo "no"\_s*' ..
946 'endif'
947 else
948 result = "\nno"
949 if has('unix')
950 # GUI not running but can start later, call has()
951 instr_expected = 'HasGuiRunning.*' ..
952 'if has("gui_running")\_s*' ..
953 '\d PUSHS "gui_running"\_s*' ..
954 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200955 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100956 '\d JUMP_IF_FALSE -> \d\_s*' ..
957 ' echo "yes"\_s*' ..
958 '\d PUSHS "yes"\_s*' ..
959 '\d ECHO 1\_s*' ..
960 'else\_s*' ..
961 '\d JUMP -> \d\_s*' ..
962 ' echo "no"\_s*' ..
963 '\d PUSHS "no"\_s*' ..
964 '\d ECHO 1\_s*' ..
965 'endif'
966 else
967 # GUI not running, always return "no"
968 instr_expected = 'HasGuiRunning.*' ..
969 'if has("gui_running")\_s*' ..
970 ' echo "yes"\_s*' ..
971 'else\_s*' ..
972 ' echo "no"\_s*' ..
973 '\d PUSHS "no"\_s*' ..
974 '\d ECHO 1\_s*' ..
975 'endif'
976 endif
977 endif
978 else
979 # GUI not supported, always return "no"
980 result = "\nno"
981 instr_expected = 'HasGuiRunning.*' ..
982 'if has("gui_running")\_s*' ..
983 ' echo "yes"\_s*' ..
984 'else\_s*' ..
985 ' echo "no"\_s*' ..
986 '\d PUSHS "no"\_s*' ..
987 '\d ECHO 1\_s*' ..
988 'endif'
989 endif
990
991 assert_equal(result, execute('HasGuiRunning()'))
992 instr = execute('disassemble HasGuiRunning')
993 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100994enddef
995
Bram Moolenaarefd88552020-06-18 20:50:10 +0200996def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100997 if 1 < 0
998 return "maybe"
999 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001000 if g:cond
1001 return "yes"
1002 else
1003 return "no"
1004 endif
1005enddef
1006
1007def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001008 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001009 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001010 'if 1 < 0\_s*' ..
1011 ' return "maybe"\_s*' ..
1012 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001013 'if g:cond\_s*' ..
1014 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001015 '1 COND2BOOL\_s*' ..
1016 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001017 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001018 '3 PUSHS "yes"\_s*' ..
1019 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001020 'else\_s*' ..
1021 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001022 '5 PUSHS "no"\_s*' ..
1023 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001024 instr)
1025enddef
1026
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001027def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001028 var Funky1: func
1029 var Funky2: func = function("len")
1030 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001031enddef
1032
1033def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001034 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001035 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001036 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001037 '0 PUSHFUNC "\[none]"\_s*' ..
1038 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001039 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001040 '2 PUSHS "len"\_s*' ..
1041 '3 BCALL function(argc 1)\_s*' ..
1042 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001043 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001044 '\d PUSHS "UserFunc"\_s*' ..
1045 '\d BCALL funcref(argc 1)\_s*' ..
1046 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001047 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001048 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001049enddef
1050
1051if has('channel')
1052 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001053 var job1: job
1054 var job2: job = job_start("donothing")
1055 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001056 enddef
1057endif
1058
1059def Test_disassemble_channel()
1060 CheckFeature channel
1061
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001063 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001064 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001065 '\d PUSHJOB "no process"\_s*' ..
1066 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001067 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001068 '\d PUSHS "donothing"\_s*' ..
1069 '\d BCALL job_start(argc 1)\_s*' ..
1070 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001071 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001072 '\d PUSHCHANNEL 0\_s*' ..
1073 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001074 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001075 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001076enddef
1077
Bram Moolenaar777770f2020-02-06 21:27:08 +01001078def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001079 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001080 return F("x")
1081enddef
1082
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001083def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001084 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001085 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001086 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001087 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001088 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001089 '\d STORE $0\_s*' ..
1090 'return F("x")\_s*' ..
1091 '\d PUSHS "x"\_s*' ..
1092 '\d LOAD $0\_s*' ..
1093 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001094 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001095 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001096
Bram Moolenaarac564082020-09-27 19:05:33 +02001097 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001098 instr = execute('disassemble ' .. name)
1099 assert_match('<lambda>\d\+\_s*' ..
1100 'return "X" .. a .. "X"\_s*' ..
1101 '\d PUSHS "X"\_s*' ..
1102 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001103 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001104 '\d CONCAT\_s*' ..
1105 '\d PUSHS "X"\_s*' ..
1106 '\d CONCAT\_s*' ..
1107 '\d RETURN',
1108 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001109enddef
1110
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001111def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001112 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001113 return Ref(g:value)
1114enddef
1115
1116def Test_disassemble_lambda_with_type()
1117 g:value = 5
1118 assert_equal(15, LambdaWithType())
1119 var instr = execute('disassemble LambdaWithType')
1120 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001121 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001122 '\d FUNCREF <lambda>\d\+\_s*' ..
1123 '\d STORE $0\_s*' ..
1124 'return Ref(g:value)\_s*' ..
1125 '\d LOADG g:value\_s*' ..
1126 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001127 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001128 '\d PCALL (argc 1)\_s*' ..
1129 '\d RETURN',
1130 instr)
1131enddef
1132
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001133def NestedOuter()
1134 def g:Inner()
1135 echomsg "inner"
1136 enddef
1137enddef
1138
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001139def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001140 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001141 assert_match('NestedOuter\_s*' ..
1142 'def g:Inner()\_s*' ..
1143 'echomsg "inner"\_s*' ..
1144 'enddef\_s*' ..
1145 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001146 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001147 instr)
1148enddef
1149
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001150def NestedDefList()
1151 def
1152 def Info
1153 def /Info
1154 def /Info/
1155enddef
1156
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001157def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001158 var instr = execute('disassemble NestedDefList')
1159 assert_match('NestedDefList\_s*' ..
1160 'def\_s*' ..
1161 '\d DEF \_s*' ..
1162 'def Info\_s*' ..
1163 '\d DEF Info\_s*' ..
1164 'def /Info\_s*' ..
1165 '\d DEF /Info\_s*' ..
1166 'def /Info/\_s*' ..
1167 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001168 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001169 instr)
1170enddef
1171
Bram Moolenaar6e949782020-04-13 17:21:00 +02001172def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001173 if arg == 1 && arg != 2 || arg == 4
1174 return 'yes'
1175 endif
1176 return 'no'
1177enddef
1178
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001179def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001180 assert_equal("yes", AndOr(1))
1181 assert_equal("no", AndOr(2))
1182 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001183 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001184 assert_match('AndOr\_s*' ..
1185 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1186 '\d LOAD arg\[-1]\_s*' ..
1187 '\d PUSHNR 1\_s*' ..
1188 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001189 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001190 '\d LOAD arg\[-1]\_s*' ..
1191 '\d PUSHNR 2\_s*' ..
1192 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001193 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001194 '\d LOAD arg\[-1]\_s*' ..
1195 '\d\+ PUSHNR 4\_s*' ..
1196 '\d\+ COMPAREANY ==\_s*' ..
1197 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001198 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001199enddef
1200
Bram Moolenaar04d05222020-02-06 22:06:54 +01001201def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001202 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001203 for i in range(3)
1204 res->add(i)
1205 endfor
1206 return res
1207enddef
1208
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001209def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001210 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001211 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001212 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001213 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001214 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001215 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001216 '\d STORE $0\_s*' ..
1217 'for i in range(3)\_s*' ..
1218 '\d STORE -1 in $1\_s*' ..
1219 '\d PUSHNR 3\_s*' ..
1220 '\d BCALL range(argc 1)\_s*' ..
1221 '\d FOR $1 -> \d\+\_s*' ..
1222 '\d STORE $2\_s*' ..
1223 'res->add(i)\_s*' ..
1224 '\d LOAD $0\_s*' ..
1225 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001226 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001227 '\d\+ DROP\_s*' ..
1228 'endfor\_s*' ..
1229 '\d\+ JUMP -> \d\+\_s*' ..
1230 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001231 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001232enddef
1233
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001234def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001235 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001236 for str in eval('["one", "two"]')
1237 res ..= str
1238 endfor
1239 return res
1240enddef
1241
1242def Test_disassemble_for_loop_eval()
1243 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001244 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001245 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001246 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001247 '\d PUSHS ""\_s*' ..
1248 '\d STORE $0\_s*' ..
1249 'for str in eval(''\["one", "two"\]'')\_s*' ..
1250 '\d STORE -1 in $1\_s*' ..
1251 '\d PUSHS "\["one", "two"\]"\_s*' ..
1252 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001253 '\d FOR $1 -> \d\+\_s*' ..
1254 '\d STORE $2\_s*' ..
1255 'res ..= str\_s*' ..
1256 '\d\+ LOAD $0\_s*' ..
1257 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001258 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001259 '\d\+ CONCAT\_s*' ..
1260 '\d\+ STORE $0\_s*' ..
1261 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001262 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001263 '\d\+ DROP\_s*' ..
1264 'return res\_s*' ..
1265 '\d\+ LOAD $0\_s*' ..
1266 '\d\+ RETURN',
1267 instr)
1268enddef
1269
Bram Moolenaar792f7862020-11-23 08:31:18 +01001270def ForLoopUnpack()
1271 for [x1, x2] in [[1, 2], [3, 4]]
1272 echo x1 x2
1273 endfor
1274enddef
1275
1276def Test_disassemble_for_loop_unpack()
1277 var instr = execute('disassemble ForLoopUnpack')
1278 assert_match('ForLoopUnpack\_s*' ..
1279 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1280 '\d\+ STORE -1 in $0\_s*' ..
1281 '\d\+ PUSHNR 1\_s*' ..
1282 '\d\+ PUSHNR 2\_s*' ..
1283 '\d\+ NEWLIST size 2\_s*' ..
1284 '\d\+ PUSHNR 3\_s*' ..
1285 '\d\+ PUSHNR 4\_s*' ..
1286 '\d\+ NEWLIST size 2\_s*' ..
1287 '\d\+ NEWLIST size 2\_s*' ..
1288 '\d\+ FOR $0 -> 16\_s*' ..
1289 '\d\+ UNPACK 2\_s*' ..
1290 '\d\+ STORE $1\_s*' ..
1291 '\d\+ STORE $2\_s*' ..
1292 'echo x1 x2\_s*' ..
1293 '\d\+ LOAD $1\_s*' ..
1294 '\d\+ LOAD $2\_s*' ..
1295 '\d\+ ECHO 2\_s*' ..
1296 'endfor\_s*' ..
1297 '\d\+ JUMP -> 8\_s*' ..
1298 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001299 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001300 instr)
1301enddef
1302
Bram Moolenaarc150c092021-02-13 15:02:46 +01001303def ForLoopContinue()
1304 for nr in [1, 2]
1305 try
1306 echo "ok"
1307 try
1308 echo "deeper"
1309 catch
1310 continue
1311 endtry
1312 catch
1313 echo "not ok"
1314 endtry
1315 endfor
1316enddef
1317
1318def Test_disassemble_for_loop_continue()
1319 var instr = execute('disassemble ForLoopContinue')
1320 assert_match('ForLoopContinue\_s*' ..
1321 'for nr in \[1, 2]\_s*' ..
1322 '0 STORE -1 in $0\_s*' ..
1323 '1 PUSHNR 1\_s*' ..
1324 '2 PUSHNR 2\_s*' ..
1325 '3 NEWLIST size 2\_s*' ..
1326 '4 FOR $0 -> 22\_s*' ..
1327 '5 STORE $1\_s*' ..
1328 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001329 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001330 'echo "ok"\_s*' ..
1331 '7 PUSHS "ok"\_s*' ..
1332 '8 ECHO 1\_s*' ..
1333 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001334 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001335 'echo "deeper"\_s*' ..
1336 '10 PUSHS "deeper"\_s*' ..
1337 '11 ECHO 1\_s*' ..
1338 'catch\_s*' ..
1339 '12 JUMP -> 15\_s*' ..
1340 '13 CATCH\_s*' ..
1341 'continue\_s*' ..
1342 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1343 'endtry\_s*' ..
1344 '15 ENDTRY\_s*' ..
1345 'catch\_s*' ..
1346 '16 JUMP -> 20\_s*' ..
1347 '17 CATCH\_s*' ..
1348 'echo "not ok"\_s*' ..
1349 '18 PUSHS "not ok"\_s*' ..
1350 '19 ECHO 1\_s*' ..
1351 'endtry\_s*' ..
1352 '20 ENDTRY\_s*' ..
1353 'endfor\_s*' ..
1354 '21 JUMP -> 4\_s*' ..
1355 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001356 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001357 instr)
1358enddef
1359
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001360let g:number = 42
1361
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001362def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001363 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001364enddef
1365
1366def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001367 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001368 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001369 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001370 '\d PUSHNR 23\_s*' ..
1371 '\d LOADG g:number\_s*' ..
1372 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1373 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001374 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001375 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001376 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001377 instr)
1378enddef
1379
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001380def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001381 var nr = 3
1382 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001383 nrres = nr - 7
1384 nrres = nr * 7
1385 nrres = nr / 7
1386 nrres = nr % 7
1387
Bram Moolenaarac564082020-09-27 19:05:33 +02001388 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001389 anyres = g:number - 7
1390 anyres = g:number * 7
1391 anyres = g:number / 7
1392 anyres = g:number % 7
1393
1394 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001395 var fl = 3.0
1396 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001397 flres = fl - 7.0
1398 flres = fl * 7.0
1399 flres = fl / 7.0
1400 endif
1401enddef
1402
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001403def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001404 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001405 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001406 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001407 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001408 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001409 '\d LOAD $0.*' ..
1410 '\d PUSHNR 7.*' ..
1411 '\d OPNR +.*' ..
1412 '\d STORE $1.*' ..
1413 'nrres = nr - 7.*' ..
1414 '\d OPNR -.*' ..
1415 'nrres = nr \* 7.*' ..
1416 '\d OPNR \*.*' ..
1417 'nrres = nr / 7.*' ..
1418 '\d OPNR /.*' ..
1419 'nrres = nr % 7.*' ..
1420 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001421 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001422 '\d LOADG g:number.*' ..
1423 '\d PUSHNR 7.*' ..
1424 '\d OPANY +.*' ..
1425 '\d STORE $2.*' ..
1426 'anyres = g:number - 7.*' ..
1427 '\d OPANY -.*' ..
1428 'anyres = g:number \* 7.*' ..
1429 '\d OPANY \*.*' ..
1430 'anyres = g:number / 7.*' ..
1431 '\d OPANY /.*' ..
1432 'anyres = g:number % 7.*' ..
1433 '\d OPANY %.*',
1434 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001435 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001436 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001437 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001438 '\d PUSHF 3.0.*' ..
1439 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001441 '\d LOAD $3.*' ..
1442 '\d PUSHF 7.0.*' ..
1443 '\d OPFLOAT +.*' ..
1444 '\d STORE $4.*' ..
1445 'flres = fl - 7.0.*' ..
1446 '\d OPFLOAT -.*' ..
1447 'flres = fl \* 7.0.*' ..
1448 '\d OPFLOAT \*.*' ..
1449 'flres = fl / 7.0.*' ..
1450 '\d OPFLOAT /.*',
1451 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001452 endif
1453enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001454
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001455def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001456 var reslist = [1, 2] + [3, 4]
1457 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001458enddef
1459
1460def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001461 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001462 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001463 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001464 '\d PUSHNR 1.*' ..
1465 '\d PUSHNR 2.*' ..
1466 '\d NEWLIST size 2.*' ..
1467 '\d PUSHNR 3.*' ..
1468 '\d PUSHNR 4.*' ..
1469 '\d NEWLIST size 2.*' ..
1470 '\d ADDLIST.*' ..
1471 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001472 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001473 '\d PUSHBLOB 0z1122.*' ..
1474 '\d PUSHBLOB 0z3344.*' ..
1475 '\d ADDBLOB.*' ..
1476 '\d STORE $.*',
1477 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001478enddef
1479
1480let g:aa = 'aa'
1481def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001482 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001483 return res
1484enddef
1485
1486def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001487 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001488 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001489 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001490 '\d LOADG g:aa.*' ..
1491 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001492 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001493 '\d CONCAT.*' ..
1494 '\d STORE $.*',
1495 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001496 assert_equal('aabb', ConcatString())
1497enddef
1498
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001499def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001500 var s = "abcd"
1501 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001502 return res
1503enddef
1504
1505def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001506 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001507 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001508 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001509 '\d PUSHS "abcd"\_s*' ..
1510 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001511 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001512 '\d LOAD $0\_s*' ..
1513 '\d PUSHNR 1\_s*' ..
1514 '\d STRINDEX\_s*' ..
1515 '\d STORE $1\_s*',
1516 instr)
1517 assert_equal('b', StringIndex())
1518enddef
1519
Bram Moolenaared591872020-08-15 22:14:53 +02001520def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001521 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001522 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001523 return res
1524enddef
1525
1526def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001527 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001528 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001530 '\d PUSHS "abcd"\_s*' ..
1531 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001532 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001533 '\d LOAD $0\_s*' ..
1534 '\d PUSHNR 1\_s*' ..
1535 '\d PUSHNR 8\_s*' ..
1536 '\d STRSLICE\_s*' ..
1537 '\d STORE $1\_s*',
1538 instr)
1539 assert_equal('bcd', StringSlice())
1540enddef
1541
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001542def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001543 var l = [1, 2, 3]
1544 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001545 return res
1546enddef
1547
1548def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001549 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001550 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001551 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001552 '\d PUSHNR 1\_s*' ..
1553 '\d PUSHNR 2\_s*' ..
1554 '\d PUSHNR 3\_s*' ..
1555 '\d NEWLIST size 3\_s*' ..
1556 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001557 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001558 '\d LOAD $0\_s*' ..
1559 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001560 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001561 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001562 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001563 assert_equal(2, ListIndex())
1564enddef
1565
Bram Moolenaared591872020-08-15 22:14:53 +02001566def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001567 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001568 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001569 return res
1570enddef
1571
1572def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001573 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001574 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001575 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001576 '\d PUSHNR 1\_s*' ..
1577 '\d PUSHNR 2\_s*' ..
1578 '\d PUSHNR 3\_s*' ..
1579 '\d NEWLIST size 3\_s*' ..
1580 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001581 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001582 '\d LOAD $0\_s*' ..
1583 '\d PUSHNR 1\_s*' ..
1584 '\d PUSHNR 8\_s*' ..
1585 '\d LISTSLICE\_s*' ..
1586 '\d STORE $1\_s*',
1587 instr)
1588 assert_equal([2, 3], ListSlice())
1589enddef
1590
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001591def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001592 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001593 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001594 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001595 return res
1596enddef
1597
1598def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001599 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001600 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001601 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001602 '\d PUSHS "item"\_s*' ..
1603 '\d PUSHNR 1\_s*' ..
1604 '\d NEWDICT size 1\_s*' ..
1605 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001606 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001607 '\d\+ LOAD $0\_s*' ..
1608 '\d\+ MEMBER item\_s*' ..
1609 '\d\+ STORE $1\_s*' ..
1610 'res = d\["item"\]\_s*' ..
1611 '\d\+ LOAD $0\_s*' ..
1612 '\d\+ PUSHS "item"\_s*' ..
1613 '\d\+ MEMBER\_s*' ..
1614 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001615 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001616 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001617enddef
1618
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001619let somelist = [1, 2, 3, 4, 5]
1620def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001621 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001622 return res
1623enddef
1624
1625def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001626 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001627 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001628 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001629 '\d LOADG g:somelist\_s*' ..
1630 '\d PUSHNR 2\_s*' ..
1631 '\d ANYINDEX\_s*' ..
1632 '\d STORE $0\_s*' ..
1633 'return res\_s*' ..
1634 '\d LOAD $0\_s*' ..
1635 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1636 '\d RETURN',
1637 instr)
1638 assert_equal(3, AnyIndex())
1639enddef
1640
1641def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001642 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001643 return res
1644enddef
1645
1646def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001647 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001648 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001649 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001650 '\d LOADG g:somelist\_s*' ..
1651 '\d PUSHNR 1\_s*' ..
1652 '\d PUSHNR 3\_s*' ..
1653 '\d ANYSLICE\_s*' ..
1654 '\d STORE $0\_s*' ..
1655 'return res\_s*' ..
1656 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001657 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001658 '\d RETURN',
1659 instr)
1660 assert_equal([2, 3, 4], AnySlice())
1661enddef
1662
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001663def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001664 var nr = 9
1665 var plus = +nr
1666 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001667 return res
1668enddef
1669
1670def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001671 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001672 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001673 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001674 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001675 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001676 '\d LOAD $0\_s*' ..
1677 '\d CHECKNR\_s*' ..
1678 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001679 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001680 '\d LOAD $0\_s*' ..
1681 '\d NEGATENR\_s*' ..
1682 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001683 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001684 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001685enddef
1686
1687def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001688 var flag = true
1689 var invert = !flag
1690 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001691 return res
1692enddef
1693
1694def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001695 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001696 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001697 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001698 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001699 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001700 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001701 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001702 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001703 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001704 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001705 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001706 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001707 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001708 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001709 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001710enddef
1711
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001712def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001713 var name: bool = 1 && 0 || 1
1714 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001715enddef
1716
1717def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001718 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001719 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001720 'var name: bool = 1 && 0 || 1\_s*' ..
1721 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001722 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001723 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1724 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001725 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001726 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1727 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001728 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001729 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001730 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001731 '\d\+ LOAD $0\_s*' ..
1732 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001733 instr)
1734 assert_equal(true, InvertBool())
1735enddef
1736
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001737def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001738 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001739 ['true == isFalse', 'COMPAREBOOL =='],
1740 ['true != isFalse', 'COMPAREBOOL !='],
1741 ['v:none == isNull', 'COMPARESPECIAL =='],
1742 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001743
Bram Moolenaara5565e42020-05-09 15:44:01 +02001744 ['111 == aNumber', 'COMPARENR =='],
1745 ['111 != aNumber', 'COMPARENR !='],
1746 ['111 > aNumber', 'COMPARENR >'],
1747 ['111 < aNumber', 'COMPARENR <'],
1748 ['111 >= aNumber', 'COMPARENR >='],
1749 ['111 <= aNumber', 'COMPARENR <='],
1750 ['111 =~ aNumber', 'COMPARENR =\~'],
1751 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001752
Bram Moolenaara5565e42020-05-09 15:44:01 +02001753 ['"xx" != aString', 'COMPARESTRING !='],
1754 ['"xx" > aString', 'COMPARESTRING >'],
1755 ['"xx" < aString', 'COMPARESTRING <'],
1756 ['"xx" >= aString', 'COMPARESTRING >='],
1757 ['"xx" <= aString', 'COMPARESTRING <='],
1758 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1759 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1760 ['"xx" is aString', 'COMPARESTRING is'],
1761 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001762
Bram Moolenaara5565e42020-05-09 15:44:01 +02001763 ['0z11 == aBlob', 'COMPAREBLOB =='],
1764 ['0z11 != aBlob', 'COMPAREBLOB !='],
1765 ['0z11 is aBlob', 'COMPAREBLOB is'],
1766 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001767
Bram Moolenaara5565e42020-05-09 15:44:01 +02001768 ['[1, 2] == aList', 'COMPARELIST =='],
1769 ['[1, 2] != aList', 'COMPARELIST !='],
1770 ['[1, 2] is aList', 'COMPARELIST is'],
1771 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001772
Bram Moolenaare0de1712020-12-02 17:36:54 +01001773 ['{a: 1} == aDict', 'COMPAREDICT =='],
1774 ['{a: 1} != aDict', 'COMPAREDICT !='],
1775 ['{a: 1} is aDict', 'COMPAREDICT is'],
1776 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001777
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001778 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1779 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1780 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1781 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001782
1783 ['77 == g:xx', 'COMPAREANY =='],
1784 ['77 != g:xx', 'COMPAREANY !='],
1785 ['77 > g:xx', 'COMPAREANY >'],
1786 ['77 < g:xx', 'COMPAREANY <'],
1787 ['77 >= g:xx', 'COMPAREANY >='],
1788 ['77 <= g:xx', 'COMPAREANY <='],
1789 ['77 =~ g:xx', 'COMPAREANY =\~'],
1790 ['77 !~ g:xx', 'COMPAREANY !\~'],
1791 ['77 is g:xx', 'COMPAREANY is'],
1792 ['77 isnot g:xx', 'COMPAREANY isnot'],
1793 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001794 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001795 if has('float')
1796 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001797 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1798 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1799 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1800 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1801 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1802 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1803 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1804 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001805 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001806 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001807 endif
1808
Bram Moolenaarac564082020-09-27 19:05:33 +02001809 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001810 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001811 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001812 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001813 ' var isFalse = false',
1814 ' var isNull = v:null',
1815 ' var aNumber = 222',
1816 ' var aString = "yy"',
1817 ' var aBlob = 0z22',
1818 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001819 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001820 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001821 ' if ' .. case[0],
1822 ' echo 42'
1823 ' endif',
1824 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001825 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001826 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001827 assert_match('TestCase' .. nr .. '.*' ..
1828 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1829 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001830 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001831 '\d ' .. case[1] .. '.*' ..
1832 '\d JUMP_IF_FALSE -> \d\+.*',
1833 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001834
1835 nr += 1
1836 endfor
1837
Bram Moolenaar22da5592020-03-19 14:52:20 +01001838 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001839enddef
1840
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001841def s:FalsyOp()
1842 echo g:flag ?? "yes"
1843 echo [] ?? "empty list"
1844 echo "" ?? "empty string"
1845enddef
1846
1847def Test_dsassemble_falsy_op()
1848 var res = execute('disass s:FalsyOp')
1849 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1850 'echo g:flag ?? "yes"\_s*' ..
1851 '0 LOADG g:flag\_s*' ..
1852 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1853 '2 PUSHS "yes"\_s*' ..
1854 '3 ECHO 1\_s*' ..
1855 'echo \[\] ?? "empty list"\_s*' ..
1856 '4 NEWLIST size 0\_s*' ..
1857 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1858 '6 PUSHS "empty list"\_s*' ..
1859 '7 ECHO 1\_s*' ..
1860 'echo "" ?? "empty string"\_s*' ..
1861 '\d\+ PUSHS "empty string"\_s*' ..
1862 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001863 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001864 res)
1865enddef
1866
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001867def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001868 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001869 ['"xx" == "yy"', false],
1870 ['"aa" == "aa"', true],
1871 ['has("eval") ? true : false', true],
1872 ['has("asdf") ? true : false', false],
1873 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001874
Bram Moolenaarac564082020-09-27 19:05:33 +02001875 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001876 for case in cases
1877 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001878 ' if ' .. case[0],
1879 ' echo 42'
1880 ' endif',
1881 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001882 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001883 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001884 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001885 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001886 assert_match('TestCase' .. nr .. '.*' ..
1887 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1888 '\d PUSHNR 42.*' ..
1889 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001890 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001891 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001892 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001893 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001894 assert_match('TestCase' .. nr .. '.*' ..
1895 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1896 'echo 42[ \n]*' ..
1897 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001898 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001899 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001900 endif
1901
1902 nr += 1
1903 endfor
1904
1905 delete('Xdisassemble')
1906enddef
1907
Bram Moolenaarad39c092020-02-26 18:23:43 +01001908def s:Execute()
1909 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001910 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001911 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001912 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001913 execute 'help ' .. tag
1914enddef
1915
1916def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001917 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001918 assert_match('\<SNR>\d*_Execute\_s*' ..
1919 "execute 'help vim9.txt'\\_s*" ..
1920 '\d PUSHS "help vim9.txt"\_s*' ..
1921 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001922 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001923 '\d PUSHS "help vim9.txt"\_s*' ..
1924 '\d STORE $0\_s*' ..
1925 'execute cmd\_s*' ..
1926 '\d LOAD $0\_s*' ..
1927 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001928 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001929 '\d PUSHS "vim9.txt"\_s*' ..
1930 '\d STORE $1\_s*' ..
1931 "execute 'help ' .. tag\\_s*" ..
1932 '\d\+ PUSHS "help "\_s*' ..
1933 '\d\+ LOAD $1\_s*' ..
1934 '\d\+ CONCAT\_s*' ..
1935 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001936 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001937 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001938enddef
1939
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001940def s:Echomsg()
1941 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02001942 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001943 echoerr 'went' .. 'wrong'
1944enddef
1945
1946def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001947 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001948 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1949 "echomsg 'some' 'message'\\_s*" ..
1950 '\d PUSHS "some"\_s*' ..
1951 '\d PUSHS "message"\_s*' ..
1952 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02001953 "echoconsole 'nothing'\\_s*" ..
1954 '\d PUSHS "nothing"\_s*' ..
1955 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001956 "echoerr 'went' .. 'wrong'\\_s*" ..
1957 '\d PUSHS "wentwrong"\_s*' ..
1958 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001959 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001960 res)
1961enddef
1962
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001963def SomeStringArg(arg: string)
1964 echo arg
1965enddef
1966
1967def SomeAnyArg(arg: any)
1968 echo arg
1969enddef
1970
1971def SomeStringArgAndReturn(arg: string): string
1972 return arg
1973enddef
1974
1975def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001976 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001977 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1978 '\d *echo arg.*' ..
1979 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001980 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001981
Bram Moolenaarac564082020-09-27 19:05:33 +02001982 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001983 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1984 '\d *echo arg\_s*' ..
1985 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001986 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001987
Bram Moolenaarac564082020-09-27 19:05:33 +02001988 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001989 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1990 '\d *return arg\_s*' ..
1991 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001992 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001993enddef
1994
Bram Moolenaar09689a02020-05-09 22:50:08 +02001995def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001996 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001997 vim9script
1998 def FuncOne(): string
1999 return FuncTwo()
2000 enddef
2001 def FuncTwo(): string
2002 return 'two'
2003 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002004 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002005 END
2006 writefile(lines, 'Xdisassemble')
2007 source Xdisassemble
2008
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002009 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002010 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2011 'return FuncTwo()\_s*' ..
2012 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002013 '\d RETURN',
2014 g:res_FuncOne)
2015
2016 delete('Xdisassemble')
2017 unlet g:res_FuncOne
2018enddef
2019
Bram Moolenaar61a89812020-05-07 16:58:17 +02002020def s:ConcatStrings(): string
2021 return 'one' .. 'two' .. 'three'
2022enddef
2023
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002024def s:ComputeConst(): number
2025 return 2 + 3 * 4 / 6 + 7
2026enddef
2027
Bram Moolenaar1c747212020-05-09 18:28:34 +02002028def s:ComputeConstParen(): number
2029 return ((2 + 4) * (8 / 2)) / (3 + 4)
2030enddef
2031
Bram Moolenaar61a89812020-05-07 16:58:17 +02002032def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002033 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002034 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2035 "return 'one' .. 'two' .. 'three'\\_s*" ..
2036 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002037 '\d RETURN',
2038 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002039
2040 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002041 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2042 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2043 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002044 '\d RETURN',
2045 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002046
2047 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002048 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2049 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2050 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002051 '\d RETURN',
2052 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002053enddef
2054
Bram Moolenaar389df252020-07-09 21:20:47 +02002055def s:CallAppend()
2056 eval "some text"->append(2)
2057enddef
2058
2059def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002060 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002061 assert_match('<SNR>\d*_CallAppend\_s*' ..
2062 'eval "some text"->append(2)\_s*' ..
2063 '\d PUSHS "some text"\_s*' ..
2064 '\d PUSHNR 2\_s*' ..
2065 '\d SHUFFLE 2 up 1\_s*' ..
2066 '\d BCALL append(argc 2)\_s*' ..
2067 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002068 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002069 res)
2070enddef
2071
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002072
2073def s:SilentMessage()
2074 silent echomsg "text"
2075 silent! echoerr "error"
2076enddef
2077
2078def Test_silent()
2079 var res = execute('disass s:SilentMessage')
2080 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2081 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002082 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002083 '\d PUSHS "text"\_s*' ..
2084 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002085 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002086 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002087 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002088 '\d PUSHS "error"\_s*' ..
2089 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002090 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002091 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002092 res)
2093enddef
2094
2095def s:SilentIf()
2096 silent if 4 == g:five
2097 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002098 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002099enddef
2100
2101def Test_silent_if()
2102 var res = execute('disass s:SilentIf')
2103 assert_match('<SNR>\d*_SilentIf\_s*' ..
2104 'silent if 4 == g:five\_s*' ..
2105 '\d\+ CMDMOD silent\_s*' ..
2106 '\d\+ PUSHNR 4\_s*' ..
2107 '\d\+ LOADG g:five\_s*' ..
2108 '\d\+ COMPAREANY ==\_s*' ..
2109 '\d\+ CMDMOD_REV\_s*' ..
2110 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2111 'silent elseif 4 == g:five\_s*' ..
2112 '\d\+ JUMP -> \d\+\_s*' ..
2113 '\d\+ CMDMOD silent\_s*' ..
2114 '\d\+ PUSHNR 4\_s*' ..
2115 '\d\+ LOADG g:five\_s*' ..
2116 '\d\+ COMPAREANY ==\_s*' ..
2117 '\d\+ CMDMOD_REV\_s*' ..
2118 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002119 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002120 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002121 res)
2122enddef
2123
2124def s:SilentFor()
2125 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002126 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002127enddef
2128
2129def Test_silent_for()
2130 var res = execute('disass s:SilentFor')
2131 assert_match('<SNR>\d*_SilentFor\_s*' ..
2132 'silent for i in \[0\]\_s*' ..
2133 '\d CMDMOD silent\_s*' ..
2134 '\d STORE -1 in $0\_s*' ..
2135 '\d PUSHNR 0\_s*' ..
2136 '\d NEWLIST size 1\_s*' ..
2137 '\d CMDMOD_REV\_s*' ..
2138 '5 FOR $0 -> 8\_s*' ..
2139 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002140 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002141 '\d JUMP -> 5\_s*' ..
2142 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002143 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002144 res)
2145enddef
2146
2147def s:SilentWhile()
2148 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002149 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002150enddef
2151
2152def Test_silent_while()
2153 var res = execute('disass s:SilentWhile')
2154 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2155 'silent while g:not\_s*' ..
2156 '0 CMDMOD silent\_s*' ..
2157 '\d LOADG g:not\_s*' ..
2158 '\d COND2BOOL\_s*' ..
2159 '\d CMDMOD_REV\_s*' ..
2160 '\d JUMP_IF_FALSE -> 6\_s*' ..
2161
Bram Moolenaarfa984412021-03-25 22:15:28 +01002162 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002163 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002164 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002165 res)
2166enddef
2167
2168def s:SilentReturn(): string
2169 silent return "done"
2170enddef
2171
2172def Test_silent_return()
2173 var res = execute('disass s:SilentReturn')
2174 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2175 'silent return "done"\_s*' ..
2176 '\d CMDMOD silent\_s*' ..
2177 '\d PUSHS "done"\_s*' ..
2178 '\d CMDMOD_REV\_s*' ..
2179 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002180 res)
2181enddef
2182
Bram Moolenaarb2049902021-01-24 12:53:53 +01002183def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002184 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002185 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002186 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002187 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002188 return "done"
2189enddef
2190
2191def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002192 if !has('profile')
2193 MissingFeature 'profile'
2194 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002195 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002196 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002197 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002198 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002199 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002200 '\d PUSHS "profiled"\_s*' ..
2201 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002202 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002203 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002204 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002205 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002206 '\d PUSHS "some text"\_s*' ..
2207 '\d STORE $0\_s*' ..
2208 'return "done"\_s*' ..
2209 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002210 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002211 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002212 '\d\+ RETURN\_s*' ..
2213 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002214 res)
2215enddef
2216
Bram Moolenaare99d4222021-06-13 14:01:26 +02002217def Test_debugged()
2218 var res = execute('disass debug s:Profiled')
2219 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002220 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002221 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002222 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002223 '\d PUSHS "profiled"\_s*' ..
2224 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002225 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002226 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002227 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002228 '\d PUSHS "some text"\_s*' ..
2229 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002230 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002231 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002232 '\d PUSHS "done"\_s*' ..
2233 '\d RETURN\_s*',
2234 res)
2235enddef
2236
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002237def s:EchoMessages()
2238 echohl ErrorMsg | echom v:exception | echohl NONE
2239enddef
2240
2241def Test_disassemble_nextcmd()
2242 # splitting commands and removing trailing blanks should not change the line
2243 var res = execute('disass s:EchoMessages')
2244 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2245 'echohl ErrorMsg | echom v:exception | echohl NONE',
2246 res)
2247enddef
2248
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002249def Test_disassemble_after_reload()
2250 var lines =<< trim END
2251 vim9script
2252 if exists('g:ThisFunc')
2253 finish
2254 endif
2255 var name: any
2256 def g:ThisFunc(): number
2257 g:name = name
2258 return 0
2259 enddef
2260 def g:ThatFunc(): number
2261 name = g:name
2262 return 0
2263 enddef
2264 END
2265 lines->writefile('Xreload.vim')
2266
2267 source Xreload.vim
2268 g:ThisFunc()
2269 g:ThatFunc()
2270
2271 source Xreload.vim
2272 var res = execute('disass g:ThisFunc')
2273 assert_match('ThisFunc\_s*' ..
2274 'g:name = name\_s*' ..
2275 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2276 '\d STOREG g:name\_s*' ..
2277 'return 0\_s*' ..
2278 '\d PUSHNR 0\_s*' ..
2279 '\d RETURN\_s*',
2280 res)
2281
2282 res = execute('disass g:ThatFunc')
2283 assert_match('ThatFunc\_s*' ..
2284 'name = g:name\_s*' ..
2285 '\d LOADG g:name\_s*' ..
2286 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2287 'return 0\_s*' ..
2288 '\d PUSHNR 0\_s*' ..
2289 '\d RETURN\_s*',
2290 res)
2291
2292 delete('Xreload.vim')
2293 delfunc g:ThisFunc
2294 delfunc g:ThatFunc
2295enddef
2296
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002297
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002298" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker