blob: 15a68dd502da2fbf78ad9d58a3476486a983dce7 [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 Moolenaaraacc9662021-08-13 19:40:51 +0200591def s:LockLocal()
592 var d = {a: 1}
593 lockvar d.a
594enddef
595
596def Test_disassemble_locl_local()
597 var res = execute('disass s:LockLocal')
598 assert_match('<SNR>\d*_LockLocal\_s*' ..
599 'var d = {a: 1}\_s*' ..
600 '\d PUSHS "a"\_s*' ..
601 '\d PUSHNR 1\_s*' ..
602 '\d NEWDICT size 1\_s*' ..
603 '\d STORE $0\_s*' ..
604 'lockvar d.a\_s*' ..
605 '\d LOAD $0\_s*' ..
606 '\d LOCKUNLOCK lockvar d.a\_s*',
607 res)
608enddef
609
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100610def s:ScriptFuncTry()
611 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200612 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100613 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200614 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100615 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200616 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100617 endtry
618enddef
619
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100620def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200621 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200622 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
623 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100624 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200625 'echo "yes"\_s*' ..
626 '\d PUSHS "yes"\_s*' ..
627 '\d ECHO 1\_s*' ..
628 'catch /fail/\_s*' ..
629 '\d JUMP -> \d\+\_s*' ..
630 '\d PUSH v:exception\_s*' ..
631 '\d PUSHS "fail"\_s*' ..
632 '\d COMPARESTRING =\~\_s*' ..
633 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
634 '\d CATCH\_s*' ..
635 'echo "no"\_s*' ..
636 '\d\+ PUSHS "no"\_s*' ..
637 '\d\+ ECHO 1\_s*' ..
638 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100639 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200640 'throw "end"\_s*' ..
641 '\d\+ PUSHS "end"\_s*' ..
642 '\d\+ THROW\_s*' ..
643 'endtry\_s*' ..
644 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200645 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100646enddef
647
648def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200649 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100650 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100651enddef
652
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100653def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200654 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200655 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200656 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200657 '\d PUSHNR 1\_s*' ..
658 '\d PUSHS "two"\_s*' ..
659 '\d PUSHNR 333\_s*' ..
660 '\d NEWLIST size 3\_s*' ..
661 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100662 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200663 '\d PUSHS "one"\_s*' ..
664 '\d PUSHNR 1\_s*' ..
665 '\d PUSHS "two"\_s*' ..
666 '\d PUSHS "val"\_s*' ..
667 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200668 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100669enddef
670
Bram Moolenaar6e949782020-04-13 17:21:00 +0200671def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100672 echo arg
673enddef
674
675func UserFunc()
676 echo 'nothing'
677endfunc
678
679func UserFuncWithArg(arg)
680 echo a:arg
681endfunc
682
683def s:ScriptFuncCall(): string
684 changenr()
685 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100686 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100687 FuncWithArg(343)
688 ScriptFuncNew()
689 s:ScriptFuncNew()
690 UserFunc()
691 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200692 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100693 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200694 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100695 FuncRefWithArg("bar")
696 return "yes"
697enddef
698
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100699def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200700 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200701 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
702 'changenr()\_s*' ..
703 '\d BCALL changenr(argc 0)\_s*' ..
704 '\d DROP\_s*' ..
705 'char2nr("abc")\_s*' ..
706 '\d PUSHS "abc"\_s*' ..
707 '\d BCALL char2nr(argc 1)\_s*' ..
708 '\d DROP\_s*' ..
709 'Test_disassemble_new()\_s*' ..
710 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
711 '\d DROP\_s*' ..
712 'FuncWithArg(343)\_s*' ..
713 '\d\+ PUSHNR 343\_s*' ..
714 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
715 '\d\+ DROP\_s*' ..
716 'ScriptFuncNew()\_s*' ..
717 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
718 '\d\+ DROP\_s*' ..
719 's:ScriptFuncNew()\_s*' ..
720 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
721 '\d\+ DROP\_s*' ..
722 'UserFunc()\_s*' ..
723 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
724 '\d\+ DROP\_s*' ..
725 'UserFuncWithArg("foo")\_s*' ..
726 '\d\+ PUSHS "foo"\_s*' ..
727 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
728 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200729 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200730 '\d\+ PUSHS "UserFunc"\_s*' ..
731 '\d\+ BCALL function(argc 1)\_s*' ..
732 '\d\+ STORE $0\_s*' ..
733 'FuncRef()\_s*' ..
734 '\d\+ LOAD $\d\_s*' ..
735 '\d\+ PCALL (argc 0)\_s*' ..
736 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200737 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200738 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
739 '\d\+ BCALL function(argc 1)\_s*' ..
740 '\d\+ STORE $1\_s*' ..
741 'FuncRefWithArg("bar")\_s*' ..
742 '\d\+ PUSHS "bar"\_s*' ..
743 '\d\+ LOAD $\d\_s*' ..
744 '\d\+ PCALL (argc 1)\_s*' ..
745 '\d\+ DROP\_s*' ..
746 'return "yes"\_s*' ..
747 '\d\+ PUSHS "yes"\_s*' ..
748 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200749 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100750enddef
751
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200752
753def s:CreateRefs()
754 var local = 'a'
755 def Append(arg: string)
756 local ..= arg
757 enddef
758 g:Append = Append
759 def Get(): string
760 return local
761 enddef
762 g:Get = Get
763enddef
764
765def Test_disassemble_closure()
766 CreateRefs()
767 var res = execute('disass g:Append')
768 assert_match('<lambda>\d\_s*' ..
769 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100770 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200771 '\d LOAD arg\[-1\]\_s*' ..
772 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100773 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200774 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200775 res)
776
777 res = execute('disass g:Get')
778 assert_match('<lambda>\d\_s*' ..
779 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100780 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200781 '\d RETURN',
782 res)
783
784 unlet g:Append
785 unlet g:Get
786enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200787
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100788
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200789def EchoArg(arg: string): string
790 return arg
791enddef
792def RefThis(): func
793 return function('EchoArg')
794enddef
795def s:ScriptPCall()
796 RefThis()("text")
797enddef
798
799def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200800 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200801 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
802 'RefThis()("text")\_s*' ..
803 '\d DCALL RefThis(argc 0)\_s*' ..
804 '\d PUSHS "text"\_s*' ..
805 '\d PCALL top (argc 1)\_s*' ..
806 '\d PCALL end\_s*' ..
807 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200808 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200809 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200810enddef
811
812
Bram Moolenaara26b9702020-04-18 19:53:28 +0200813def s:FuncWithForwardCall(): string
814 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100815enddef
816
817def DefinedLater(arg: string): string
818 return arg
819enddef
820
821def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 assert_match('FuncWithForwardCall\_s*' ..
824 'return g:DefinedLater("yes")\_s*' ..
825 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200826 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200827 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200828 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100829
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200830 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100831 assert_equal('yes', FuncWithForwardCall())
832
Bram Moolenaara26b9702020-04-18 19:53:28 +0200833 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200834 assert_match('FuncWithForwardCall\_s*' ..
835 'return g:DefinedLater("yes")\_s*' ..
836 '\d PUSHS "yes"\_s*' ..
837 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200838 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200839 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100840enddef
841
842
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200843def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200844 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100845enddef
846
847def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200848 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200849 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200850 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200851 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200852 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200853 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200854 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200855 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
856 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200857 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200858 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200859 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200860 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200861 '\d 2STRING stack\[-1]\_s*' ..
862 '\d\+ CONCAT\_s*' ..
863 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200864 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100865enddef
866
867
Bram Moolenaar158906c2020-02-06 20:39:45 +0100868def HasEval()
869 if has("eval")
870 echo "yes"
871 else
872 echo "no"
873 endif
874enddef
875
876def HasNothing()
877 if has("nothing")
878 echo "yes"
879 else
880 echo "no"
881 endif
882enddef
883
884def HasSomething()
885 if has("nothing")
886 echo "nothing"
887 elseif has("something")
888 echo "something"
889 elseif has("eval")
890 echo "eval"
891 elseif has("less")
892 echo "less"
893 endif
894enddef
895
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100896def HasGuiRunning()
897 if has("gui_running")
898 echo "yes"
899 else
900 echo "no"
901 endif
902enddef
903
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100904def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200905 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200906 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200907 assert_match('HasEval\_s*' ..
908 'if has("eval")\_s*' ..
909 'echo "yes"\_s*' ..
910 '\d PUSHS "yes"\_s*' ..
911 '\d ECHO 1\_s*' ..
912 'else\_s*' ..
913 'echo "no"\_s*' ..
914 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200915 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100916 assert_notmatch('JUMP', instr)
917
Bram Moolenaard2c61702020-09-06 15:58:36 +0200918 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100919 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200920 assert_match('HasNothing\_s*' ..
921 'if has("nothing")\_s*' ..
922 'echo "yes"\_s*' ..
923 'else\_s*' ..
924 'echo "no"\_s*' ..
925 '\d PUSHS "no"\_s*' ..
926 '\d ECHO 1\_s*' ..
927 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200928 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100929 assert_notmatch('PUSHS "yes"', instr)
930 assert_notmatch('JUMP', instr)
931
Bram Moolenaard2c61702020-09-06 15:58:36 +0200932 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100933 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200934 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200935 'if has("nothing")\_s*' ..
936 'echo "nothing"\_s*' ..
937 'elseif has("something")\_s*' ..
938 'echo "something"\_s*' ..
939 'elseif has("eval")\_s*' ..
940 'echo "eval"\_s*' ..
941 '\d PUSHS "eval"\_s*' ..
942 '\d ECHO 1\_s*' ..
943 'elseif has("less").*' ..
944 'echo "less"\_s*' ..
945 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200946 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100947 assert_notmatch('PUSHS "nothing"', instr)
948 assert_notmatch('PUSHS "something"', instr)
949 assert_notmatch('PUSHS "less"', instr)
950 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100951
952 var result: string
953 var instr_expected: string
954 if has('gui')
955 if has('gui_running')
956 # GUI already running, always returns "yes"
957 result = "\nyes"
958 instr_expected = 'HasGuiRunning.*' ..
959 'if has("gui_running")\_s*' ..
960 ' echo "yes"\_s*' ..
961 '\d PUSHS "yes"\_s*' ..
962 '\d ECHO 1\_s*' ..
963 'else\_s*' ..
964 ' echo "no"\_s*' ..
965 'endif'
966 else
967 result = "\nno"
968 if has('unix')
969 # GUI not running but can start later, call has()
970 instr_expected = 'HasGuiRunning.*' ..
971 'if has("gui_running")\_s*' ..
972 '\d PUSHS "gui_running"\_s*' ..
973 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200974 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100975 '\d JUMP_IF_FALSE -> \d\_s*' ..
976 ' echo "yes"\_s*' ..
977 '\d PUSHS "yes"\_s*' ..
978 '\d ECHO 1\_s*' ..
979 'else\_s*' ..
980 '\d JUMP -> \d\_s*' ..
981 ' echo "no"\_s*' ..
982 '\d PUSHS "no"\_s*' ..
983 '\d ECHO 1\_s*' ..
984 'endif'
985 else
986 # GUI not running, always return "no"
987 instr_expected = 'HasGuiRunning.*' ..
988 'if has("gui_running")\_s*' ..
989 ' echo "yes"\_s*' ..
990 'else\_s*' ..
991 ' echo "no"\_s*' ..
992 '\d PUSHS "no"\_s*' ..
993 '\d ECHO 1\_s*' ..
994 'endif'
995 endif
996 endif
997 else
998 # GUI not supported, always return "no"
999 result = "\nno"
1000 instr_expected = 'HasGuiRunning.*' ..
1001 'if has("gui_running")\_s*' ..
1002 ' echo "yes"\_s*' ..
1003 'else\_s*' ..
1004 ' echo "no"\_s*' ..
1005 '\d PUSHS "no"\_s*' ..
1006 '\d ECHO 1\_s*' ..
1007 'endif'
1008 endif
1009
1010 assert_equal(result, execute('HasGuiRunning()'))
1011 instr = execute('disassemble HasGuiRunning')
1012 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001013enddef
1014
Bram Moolenaarefd88552020-06-18 20:50:10 +02001015def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001016 if 1 < 0
1017 return "maybe"
1018 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001019 if g:cond
1020 return "yes"
1021 else
1022 return "no"
1023 endif
1024enddef
1025
1026def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001027 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001028 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001029 'if 1 < 0\_s*' ..
1030 ' return "maybe"\_s*' ..
1031 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001032 'if g:cond\_s*' ..
1033 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001034 '1 COND2BOOL\_s*' ..
1035 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001036 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001037 '3 PUSHS "yes"\_s*' ..
1038 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001039 'else\_s*' ..
1040 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001041 '5 PUSHS "no"\_s*' ..
1042 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001043 instr)
1044enddef
1045
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001046def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001047 var Funky1: func
1048 var Funky2: func = function("len")
1049 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001050enddef
1051
1052def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001053 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001054 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001055 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001056 '0 PUSHFUNC "\[none]"\_s*' ..
1057 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001058 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001059 '2 PUSHS "len"\_s*' ..
1060 '3 BCALL function(argc 1)\_s*' ..
1061 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001063 '\d PUSHS "UserFunc"\_s*' ..
1064 '\d BCALL funcref(argc 1)\_s*' ..
1065 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001066 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001067 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001068enddef
1069
1070if has('channel')
1071 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001072 var job1: job
1073 var job2: job = job_start("donothing")
1074 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001075 enddef
1076endif
1077
1078def Test_disassemble_channel()
1079 CheckFeature channel
1080
Bram Moolenaarac564082020-09-27 19:05:33 +02001081 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001082 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001083 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001084 '\d PUSHJOB "no process"\_s*' ..
1085 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001086 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001087 '\d PUSHS "donothing"\_s*' ..
1088 '\d BCALL job_start(argc 1)\_s*' ..
1089 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001090 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001091 '\d PUSHCHANNEL 0\_s*' ..
1092 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001093 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001094 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001095enddef
1096
Bram Moolenaar777770f2020-02-06 21:27:08 +01001097def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001098 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001099 return F("x")
1100enddef
1101
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001102def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001103 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001104 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001105 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001106 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001107 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001108 '\d STORE $0\_s*' ..
1109 'return F("x")\_s*' ..
1110 '\d PUSHS "x"\_s*' ..
1111 '\d LOAD $0\_s*' ..
1112 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001113 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001114 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001115
Bram Moolenaarac564082020-09-27 19:05:33 +02001116 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001117 instr = execute('disassemble ' .. name)
1118 assert_match('<lambda>\d\+\_s*' ..
1119 'return "X" .. a .. "X"\_s*' ..
1120 '\d PUSHS "X"\_s*' ..
1121 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001122 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001123 '\d CONCAT\_s*' ..
1124 '\d PUSHS "X"\_s*' ..
1125 '\d CONCAT\_s*' ..
1126 '\d RETURN',
1127 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001128enddef
1129
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001130def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001131 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001132 return Ref(g:value)
1133enddef
1134
1135def Test_disassemble_lambda_with_type()
1136 g:value = 5
1137 assert_equal(15, LambdaWithType())
1138 var instr = execute('disassemble LambdaWithType')
1139 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001140 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001141 '\d FUNCREF <lambda>\d\+\_s*' ..
1142 '\d STORE $0\_s*' ..
1143 'return Ref(g:value)\_s*' ..
1144 '\d LOADG g:value\_s*' ..
1145 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001146 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001147 '\d PCALL (argc 1)\_s*' ..
1148 '\d RETURN',
1149 instr)
1150enddef
1151
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001152def NestedOuter()
1153 def g:Inner()
1154 echomsg "inner"
1155 enddef
1156enddef
1157
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001158def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001159 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001160 assert_match('NestedOuter\_s*' ..
1161 'def g:Inner()\_s*' ..
1162 'echomsg "inner"\_s*' ..
1163 'enddef\_s*' ..
1164 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001165 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001166 instr)
1167enddef
1168
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001169def NestedDefList()
1170 def
1171 def Info
1172 def /Info
1173 def /Info/
1174enddef
1175
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001176def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001177 var instr = execute('disassemble NestedDefList')
1178 assert_match('NestedDefList\_s*' ..
1179 'def\_s*' ..
1180 '\d DEF \_s*' ..
1181 'def Info\_s*' ..
1182 '\d DEF Info\_s*' ..
1183 'def /Info\_s*' ..
1184 '\d DEF /Info\_s*' ..
1185 'def /Info/\_s*' ..
1186 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001187 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001188 instr)
1189enddef
1190
Bram Moolenaar6e949782020-04-13 17:21:00 +02001191def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001192 if arg == 1 && arg != 2 || arg == 4
1193 return 'yes'
1194 endif
1195 return 'no'
1196enddef
1197
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001198def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001199 assert_equal("yes", AndOr(1))
1200 assert_equal("no", AndOr(2))
1201 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001202 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001203 assert_match('AndOr\_s*' ..
1204 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1205 '\d LOAD arg\[-1]\_s*' ..
1206 '\d PUSHNR 1\_s*' ..
1207 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001208 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001209 '\d LOAD arg\[-1]\_s*' ..
1210 '\d PUSHNR 2\_s*' ..
1211 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001212 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001213 '\d LOAD arg\[-1]\_s*' ..
1214 '\d\+ PUSHNR 4\_s*' ..
1215 '\d\+ COMPAREANY ==\_s*' ..
1216 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001217 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001218enddef
1219
Bram Moolenaar04d05222020-02-06 22:06:54 +01001220def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001221 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001222 for i in range(3)
1223 res->add(i)
1224 endfor
1225 return res
1226enddef
1227
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001228def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001229 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001230 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001231 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001232 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001233 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001234 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001235 '\d STORE $0\_s*' ..
1236 'for i in range(3)\_s*' ..
1237 '\d STORE -1 in $1\_s*' ..
1238 '\d PUSHNR 3\_s*' ..
1239 '\d BCALL range(argc 1)\_s*' ..
1240 '\d FOR $1 -> \d\+\_s*' ..
1241 '\d STORE $2\_s*' ..
1242 'res->add(i)\_s*' ..
1243 '\d LOAD $0\_s*' ..
1244 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001245 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001246 '\d\+ DROP\_s*' ..
1247 'endfor\_s*' ..
1248 '\d\+ JUMP -> \d\+\_s*' ..
1249 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001250 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001251enddef
1252
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001253def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001254 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001255 for str in eval('["one", "two"]')
1256 res ..= str
1257 endfor
1258 return res
1259enddef
1260
1261def Test_disassemble_for_loop_eval()
1262 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001263 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001264 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001265 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001266 '\d PUSHS ""\_s*' ..
1267 '\d STORE $0\_s*' ..
1268 'for str in eval(''\["one", "two"\]'')\_s*' ..
1269 '\d STORE -1 in $1\_s*' ..
1270 '\d PUSHS "\["one", "two"\]"\_s*' ..
1271 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001272 '\d FOR $1 -> \d\+\_s*' ..
1273 '\d STORE $2\_s*' ..
1274 'res ..= str\_s*' ..
1275 '\d\+ LOAD $0\_s*' ..
1276 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001277 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001278 '\d\+ CONCAT\_s*' ..
1279 '\d\+ STORE $0\_s*' ..
1280 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001281 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001282 '\d\+ DROP\_s*' ..
1283 'return res\_s*' ..
1284 '\d\+ LOAD $0\_s*' ..
1285 '\d\+ RETURN',
1286 instr)
1287enddef
1288
Bram Moolenaar792f7862020-11-23 08:31:18 +01001289def ForLoopUnpack()
1290 for [x1, x2] in [[1, 2], [3, 4]]
1291 echo x1 x2
1292 endfor
1293enddef
1294
1295def Test_disassemble_for_loop_unpack()
1296 var instr = execute('disassemble ForLoopUnpack')
1297 assert_match('ForLoopUnpack\_s*' ..
1298 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1299 '\d\+ STORE -1 in $0\_s*' ..
1300 '\d\+ PUSHNR 1\_s*' ..
1301 '\d\+ PUSHNR 2\_s*' ..
1302 '\d\+ NEWLIST size 2\_s*' ..
1303 '\d\+ PUSHNR 3\_s*' ..
1304 '\d\+ PUSHNR 4\_s*' ..
1305 '\d\+ NEWLIST size 2\_s*' ..
1306 '\d\+ NEWLIST size 2\_s*' ..
1307 '\d\+ FOR $0 -> 16\_s*' ..
1308 '\d\+ UNPACK 2\_s*' ..
1309 '\d\+ STORE $1\_s*' ..
1310 '\d\+ STORE $2\_s*' ..
1311 'echo x1 x2\_s*' ..
1312 '\d\+ LOAD $1\_s*' ..
1313 '\d\+ LOAD $2\_s*' ..
1314 '\d\+ ECHO 2\_s*' ..
1315 'endfor\_s*' ..
1316 '\d\+ JUMP -> 8\_s*' ..
1317 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001318 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001319 instr)
1320enddef
1321
Bram Moolenaarc150c092021-02-13 15:02:46 +01001322def ForLoopContinue()
1323 for nr in [1, 2]
1324 try
1325 echo "ok"
1326 try
1327 echo "deeper"
1328 catch
1329 continue
1330 endtry
1331 catch
1332 echo "not ok"
1333 endtry
1334 endfor
1335enddef
1336
1337def Test_disassemble_for_loop_continue()
1338 var instr = execute('disassemble ForLoopContinue')
1339 assert_match('ForLoopContinue\_s*' ..
1340 'for nr in \[1, 2]\_s*' ..
1341 '0 STORE -1 in $0\_s*' ..
1342 '1 PUSHNR 1\_s*' ..
1343 '2 PUSHNR 2\_s*' ..
1344 '3 NEWLIST size 2\_s*' ..
1345 '4 FOR $0 -> 22\_s*' ..
1346 '5 STORE $1\_s*' ..
1347 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001348 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001349 'echo "ok"\_s*' ..
1350 '7 PUSHS "ok"\_s*' ..
1351 '8 ECHO 1\_s*' ..
1352 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001353 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001354 'echo "deeper"\_s*' ..
1355 '10 PUSHS "deeper"\_s*' ..
1356 '11 ECHO 1\_s*' ..
1357 'catch\_s*' ..
1358 '12 JUMP -> 15\_s*' ..
1359 '13 CATCH\_s*' ..
1360 'continue\_s*' ..
1361 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1362 'endtry\_s*' ..
1363 '15 ENDTRY\_s*' ..
1364 'catch\_s*' ..
1365 '16 JUMP -> 20\_s*' ..
1366 '17 CATCH\_s*' ..
1367 'echo "not ok"\_s*' ..
1368 '18 PUSHS "not ok"\_s*' ..
1369 '19 ECHO 1\_s*' ..
1370 'endtry\_s*' ..
1371 '20 ENDTRY\_s*' ..
1372 'endfor\_s*' ..
1373 '21 JUMP -> 4\_s*' ..
1374 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001375 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001376 instr)
1377enddef
1378
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001379let g:number = 42
1380
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001381def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001382 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001383enddef
1384
1385def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001386 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001387 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001388 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001389 '\d PUSHNR 23\_s*' ..
1390 '\d LOADG g:number\_s*' ..
1391 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1392 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001393 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001394 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001395 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001396 instr)
1397enddef
1398
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001399def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001400 var nr = 3
1401 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001402 nrres = nr - 7
1403 nrres = nr * 7
1404 nrres = nr / 7
1405 nrres = nr % 7
1406
Bram Moolenaarac564082020-09-27 19:05:33 +02001407 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001408 anyres = g:number - 7
1409 anyres = g:number * 7
1410 anyres = g:number / 7
1411 anyres = g:number % 7
1412
1413 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001414 var fl = 3.0
1415 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001416 flres = fl - 7.0
1417 flres = fl * 7.0
1418 flres = fl / 7.0
1419 endif
1420enddef
1421
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001422def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001423 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001424 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001425 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001426 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001427 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001428 '\d LOAD $0.*' ..
1429 '\d PUSHNR 7.*' ..
1430 '\d OPNR +.*' ..
1431 '\d STORE $1.*' ..
1432 'nrres = nr - 7.*' ..
1433 '\d OPNR -.*' ..
1434 'nrres = nr \* 7.*' ..
1435 '\d OPNR \*.*' ..
1436 'nrres = nr / 7.*' ..
1437 '\d OPNR /.*' ..
1438 'nrres = nr % 7.*' ..
1439 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001441 '\d LOADG g:number.*' ..
1442 '\d PUSHNR 7.*' ..
1443 '\d OPANY +.*' ..
1444 '\d STORE $2.*' ..
1445 'anyres = g:number - 7.*' ..
1446 '\d OPANY -.*' ..
1447 'anyres = g:number \* 7.*' ..
1448 '\d OPANY \*.*' ..
1449 'anyres = g:number / 7.*' ..
1450 '\d OPANY /.*' ..
1451 'anyres = g:number % 7.*' ..
1452 '\d OPANY %.*',
1453 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001454 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001455 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001456 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001457 '\d PUSHF 3.0.*' ..
1458 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001459 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001460 '\d LOAD $3.*' ..
1461 '\d PUSHF 7.0.*' ..
1462 '\d OPFLOAT +.*' ..
1463 '\d STORE $4.*' ..
1464 'flres = fl - 7.0.*' ..
1465 '\d OPFLOAT -.*' ..
1466 'flres = fl \* 7.0.*' ..
1467 '\d OPFLOAT \*.*' ..
1468 'flres = fl / 7.0.*' ..
1469 '\d OPFLOAT /.*',
1470 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001471 endif
1472enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001473
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001474def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001475 var reslist = [1, 2] + [3, 4]
1476 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001477enddef
1478
1479def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001480 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001481 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001482 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001483 '\d PUSHNR 1.*' ..
1484 '\d PUSHNR 2.*' ..
1485 '\d NEWLIST size 2.*' ..
1486 '\d PUSHNR 3.*' ..
1487 '\d PUSHNR 4.*' ..
1488 '\d NEWLIST size 2.*' ..
1489 '\d ADDLIST.*' ..
1490 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001491 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001492 '\d PUSHBLOB 0z1122.*' ..
1493 '\d PUSHBLOB 0z3344.*' ..
1494 '\d ADDBLOB.*' ..
1495 '\d STORE $.*',
1496 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001497enddef
1498
1499let g:aa = 'aa'
1500def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001501 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001502 return res
1503enddef
1504
1505def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001506 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001507 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001508 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001509 '\d LOADG g:aa.*' ..
1510 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001511 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001512 '\d CONCAT.*' ..
1513 '\d STORE $.*',
1514 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001515 assert_equal('aabb', ConcatString())
1516enddef
1517
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001518def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001519 var s = "abcd"
1520 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001521 return res
1522enddef
1523
1524def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001525 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001526 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001527 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001528 '\d PUSHS "abcd"\_s*' ..
1529 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001530 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001531 '\d LOAD $0\_s*' ..
1532 '\d PUSHNR 1\_s*' ..
1533 '\d STRINDEX\_s*' ..
1534 '\d STORE $1\_s*',
1535 instr)
1536 assert_equal('b', StringIndex())
1537enddef
1538
Bram Moolenaared591872020-08-15 22:14:53 +02001539def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001540 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001541 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001542 return res
1543enddef
1544
1545def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001546 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001547 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001548 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001549 '\d PUSHS "abcd"\_s*' ..
1550 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001551 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001552 '\d LOAD $0\_s*' ..
1553 '\d PUSHNR 1\_s*' ..
1554 '\d PUSHNR 8\_s*' ..
1555 '\d STRSLICE\_s*' ..
1556 '\d STORE $1\_s*',
1557 instr)
1558 assert_equal('bcd', StringSlice())
1559enddef
1560
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001561def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001562 var l = [1, 2, 3]
1563 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001564 return res
1565enddef
1566
1567def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001568 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001569 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001570 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001571 '\d PUSHNR 1\_s*' ..
1572 '\d PUSHNR 2\_s*' ..
1573 '\d PUSHNR 3\_s*' ..
1574 '\d NEWLIST size 3\_s*' ..
1575 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001576 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001577 '\d LOAD $0\_s*' ..
1578 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001579 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001580 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001581 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001582 assert_equal(2, ListIndex())
1583enddef
1584
Bram Moolenaared591872020-08-15 22:14:53 +02001585def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001586 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001587 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001588 return res
1589enddef
1590
1591def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001592 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001593 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001594 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001595 '\d PUSHNR 1\_s*' ..
1596 '\d PUSHNR 2\_s*' ..
1597 '\d PUSHNR 3\_s*' ..
1598 '\d NEWLIST size 3\_s*' ..
1599 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001600 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001601 '\d LOAD $0\_s*' ..
1602 '\d PUSHNR 1\_s*' ..
1603 '\d PUSHNR 8\_s*' ..
1604 '\d LISTSLICE\_s*' ..
1605 '\d STORE $1\_s*',
1606 instr)
1607 assert_equal([2, 3], ListSlice())
1608enddef
1609
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001610def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001611 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001612 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001613 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001614 return res
1615enddef
1616
1617def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001618 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001619 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001620 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001621 '\d PUSHS "item"\_s*' ..
1622 '\d PUSHNR 1\_s*' ..
1623 '\d NEWDICT size 1\_s*' ..
1624 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001625 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001626 '\d\+ LOAD $0\_s*' ..
1627 '\d\+ MEMBER item\_s*' ..
1628 '\d\+ STORE $1\_s*' ..
1629 'res = d\["item"\]\_s*' ..
1630 '\d\+ LOAD $0\_s*' ..
1631 '\d\+ PUSHS "item"\_s*' ..
1632 '\d\+ MEMBER\_s*' ..
1633 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001634 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001635 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001636enddef
1637
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001638let somelist = [1, 2, 3, 4, 5]
1639def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001640 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001641 return res
1642enddef
1643
1644def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001645 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001646 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001647 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001648 '\d LOADG g:somelist\_s*' ..
1649 '\d PUSHNR 2\_s*' ..
1650 '\d ANYINDEX\_s*' ..
1651 '\d STORE $0\_s*' ..
1652 'return res\_s*' ..
1653 '\d LOAD $0\_s*' ..
1654 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1655 '\d RETURN',
1656 instr)
1657 assert_equal(3, AnyIndex())
1658enddef
1659
1660def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001661 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001662 return res
1663enddef
1664
1665def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001666 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001667 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001668 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001669 '\d LOADG g:somelist\_s*' ..
1670 '\d PUSHNR 1\_s*' ..
1671 '\d PUSHNR 3\_s*' ..
1672 '\d ANYSLICE\_s*' ..
1673 '\d STORE $0\_s*' ..
1674 'return res\_s*' ..
1675 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001676 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001677 '\d RETURN',
1678 instr)
1679 assert_equal([2, 3, 4], AnySlice())
1680enddef
1681
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001682def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001683 var nr = 9
1684 var plus = +nr
1685 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001686 return res
1687enddef
1688
1689def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001690 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001691 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001692 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001693 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001694 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001695 '\d LOAD $0\_s*' ..
1696 '\d CHECKNR\_s*' ..
1697 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001698 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001699 '\d LOAD $0\_s*' ..
1700 '\d NEGATENR\_s*' ..
1701 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001702 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001703 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001704enddef
1705
1706def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001707 var flag = true
1708 var invert = !flag
1709 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001710 return res
1711enddef
1712
1713def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001714 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001715 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001717 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001718 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001719 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001720 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001721 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001722 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001723 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001724 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001725 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001726 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001727 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001728 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001729enddef
1730
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001731def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001732 var name: bool = 1 && 0 || 1
1733 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001734enddef
1735
1736def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001737 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001738 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001739 'var name: bool = 1 && 0 || 1\_s*' ..
1740 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001741 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001742 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1743 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001744 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001745 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1746 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001747 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001748 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001749 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001750 '\d\+ LOAD $0\_s*' ..
1751 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001752 instr)
1753 assert_equal(true, InvertBool())
1754enddef
1755
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001756def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001758 ['true == isFalse', 'COMPAREBOOL =='],
1759 ['true != isFalse', 'COMPAREBOOL !='],
1760 ['v:none == isNull', 'COMPARESPECIAL =='],
1761 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001762
Bram Moolenaara5565e42020-05-09 15:44:01 +02001763 ['111 == aNumber', 'COMPARENR =='],
1764 ['111 != aNumber', 'COMPARENR !='],
1765 ['111 > aNumber', 'COMPARENR >'],
1766 ['111 < aNumber', 'COMPARENR <'],
1767 ['111 >= aNumber', 'COMPARENR >='],
1768 ['111 <= aNumber', 'COMPARENR <='],
1769 ['111 =~ aNumber', 'COMPARENR =\~'],
1770 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001771
Bram Moolenaara5565e42020-05-09 15:44:01 +02001772 ['"xx" != aString', 'COMPARESTRING !='],
1773 ['"xx" > aString', 'COMPARESTRING >'],
1774 ['"xx" < aString', 'COMPARESTRING <'],
1775 ['"xx" >= aString', 'COMPARESTRING >='],
1776 ['"xx" <= aString', 'COMPARESTRING <='],
1777 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1778 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1779 ['"xx" is aString', 'COMPARESTRING is'],
1780 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001781
Bram Moolenaara5565e42020-05-09 15:44:01 +02001782 ['0z11 == aBlob', 'COMPAREBLOB =='],
1783 ['0z11 != aBlob', 'COMPAREBLOB !='],
1784 ['0z11 is aBlob', 'COMPAREBLOB is'],
1785 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001786
Bram Moolenaara5565e42020-05-09 15:44:01 +02001787 ['[1, 2] == aList', 'COMPARELIST =='],
1788 ['[1, 2] != aList', 'COMPARELIST !='],
1789 ['[1, 2] is aList', 'COMPARELIST is'],
1790 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001791
Bram Moolenaare0de1712020-12-02 17:36:54 +01001792 ['{a: 1} == aDict', 'COMPAREDICT =='],
1793 ['{a: 1} != aDict', 'COMPAREDICT !='],
1794 ['{a: 1} is aDict', 'COMPAREDICT is'],
1795 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001796
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001797 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1798 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1799 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1800 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001801
1802 ['77 == g:xx', 'COMPAREANY =='],
1803 ['77 != g:xx', 'COMPAREANY !='],
1804 ['77 > g:xx', 'COMPAREANY >'],
1805 ['77 < g:xx', 'COMPAREANY <'],
1806 ['77 >= g:xx', 'COMPAREANY >='],
1807 ['77 <= g:xx', 'COMPAREANY <='],
1808 ['77 =~ g:xx', 'COMPAREANY =\~'],
1809 ['77 !~ g:xx', 'COMPAREANY !\~'],
1810 ['77 is g:xx', 'COMPAREANY is'],
1811 ['77 isnot g:xx', 'COMPAREANY isnot'],
1812 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001813 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001814 if has('float')
1815 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001816 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1817 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1818 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1819 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1820 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1821 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1822 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1823 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001824 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001825 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001826 endif
1827
Bram Moolenaarac564082020-09-27 19:05:33 +02001828 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001829 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001830 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001831 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001832 ' var isFalse = false',
1833 ' var isNull = v:null',
1834 ' var aNumber = 222',
1835 ' var aString = "yy"',
1836 ' var aBlob = 0z22',
1837 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001838 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001839 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001840 ' if ' .. case[0],
1841 ' echo 42'
1842 ' endif',
1843 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001844 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001845 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001846 assert_match('TestCase' .. nr .. '.*' ..
1847 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1848 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001849 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001850 '\d ' .. case[1] .. '.*' ..
1851 '\d JUMP_IF_FALSE -> \d\+.*',
1852 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001853
1854 nr += 1
1855 endfor
1856
Bram Moolenaar22da5592020-03-19 14:52:20 +01001857 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001858enddef
1859
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001860def s:FalsyOp()
1861 echo g:flag ?? "yes"
1862 echo [] ?? "empty list"
1863 echo "" ?? "empty string"
1864enddef
1865
1866def Test_dsassemble_falsy_op()
1867 var res = execute('disass s:FalsyOp')
1868 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1869 'echo g:flag ?? "yes"\_s*' ..
1870 '0 LOADG g:flag\_s*' ..
1871 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1872 '2 PUSHS "yes"\_s*' ..
1873 '3 ECHO 1\_s*' ..
1874 'echo \[\] ?? "empty list"\_s*' ..
1875 '4 NEWLIST size 0\_s*' ..
1876 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1877 '6 PUSHS "empty list"\_s*' ..
1878 '7 ECHO 1\_s*' ..
1879 'echo "" ?? "empty string"\_s*' ..
1880 '\d\+ PUSHS "empty string"\_s*' ..
1881 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001882 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001883 res)
1884enddef
1885
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001886def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001887 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001888 ['"xx" == "yy"', false],
1889 ['"aa" == "aa"', true],
1890 ['has("eval") ? true : false', true],
1891 ['has("asdf") ? true : false', false],
1892 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001893
Bram Moolenaarac564082020-09-27 19:05:33 +02001894 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001895 for case in cases
1896 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001897 ' if ' .. case[0],
1898 ' echo 42'
1899 ' endif',
1900 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001901 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001902 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001903 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001904 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001905 assert_match('TestCase' .. nr .. '.*' ..
1906 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1907 '\d PUSHNR 42.*' ..
1908 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001909 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001910 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001911 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001912 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001913 assert_match('TestCase' .. nr .. '.*' ..
1914 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1915 'echo 42[ \n]*' ..
1916 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001917 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001918 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001919 endif
1920
1921 nr += 1
1922 endfor
1923
1924 delete('Xdisassemble')
1925enddef
1926
Bram Moolenaarad39c092020-02-26 18:23:43 +01001927def s:Execute()
1928 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001929 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001930 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001931 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001932 execute 'help ' .. tag
1933enddef
1934
1935def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001936 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001937 assert_match('\<SNR>\d*_Execute\_s*' ..
1938 "execute 'help vim9.txt'\\_s*" ..
1939 '\d PUSHS "help vim9.txt"\_s*' ..
1940 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001941 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001942 '\d PUSHS "help vim9.txt"\_s*' ..
1943 '\d STORE $0\_s*' ..
1944 'execute cmd\_s*' ..
1945 '\d LOAD $0\_s*' ..
1946 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001947 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001948 '\d PUSHS "vim9.txt"\_s*' ..
1949 '\d STORE $1\_s*' ..
1950 "execute 'help ' .. tag\\_s*" ..
1951 '\d\+ PUSHS "help "\_s*' ..
1952 '\d\+ LOAD $1\_s*' ..
1953 '\d\+ CONCAT\_s*' ..
1954 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001955 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001956 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001957enddef
1958
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001959def s:Echomsg()
1960 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02001961 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001962 echoerr 'went' .. 'wrong'
1963enddef
1964
1965def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001966 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001967 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1968 "echomsg 'some' 'message'\\_s*" ..
1969 '\d PUSHS "some"\_s*' ..
1970 '\d PUSHS "message"\_s*' ..
1971 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02001972 "echoconsole 'nothing'\\_s*" ..
1973 '\d PUSHS "nothing"\_s*' ..
1974 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001975 "echoerr 'went' .. 'wrong'\\_s*" ..
1976 '\d PUSHS "wentwrong"\_s*' ..
1977 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001978 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001979 res)
1980enddef
1981
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001982def SomeStringArg(arg: string)
1983 echo arg
1984enddef
1985
1986def SomeAnyArg(arg: any)
1987 echo arg
1988enddef
1989
1990def SomeStringArgAndReturn(arg: string): string
1991 return arg
1992enddef
1993
1994def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001995 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001996 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1997 '\d *echo arg.*' ..
1998 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001999 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002000
Bram Moolenaarac564082020-09-27 19:05:33 +02002001 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002002 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2003 '\d *echo arg\_s*' ..
2004 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002005 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002006
Bram Moolenaarac564082020-09-27 19:05:33 +02002007 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002008 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2009 '\d *return arg\_s*' ..
2010 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002011 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002012enddef
2013
Bram Moolenaar09689a02020-05-09 22:50:08 +02002014def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002015 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002016 vim9script
2017 def FuncOne(): string
2018 return FuncTwo()
2019 enddef
2020 def FuncTwo(): string
2021 return 'two'
2022 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002023 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002024 END
2025 writefile(lines, 'Xdisassemble')
2026 source Xdisassemble
2027
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002028 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002029 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2030 'return FuncTwo()\_s*' ..
2031 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002032 '\d RETURN',
2033 g:res_FuncOne)
2034
2035 delete('Xdisassemble')
2036 unlet g:res_FuncOne
2037enddef
2038
Bram Moolenaar61a89812020-05-07 16:58:17 +02002039def s:ConcatStrings(): string
2040 return 'one' .. 'two' .. 'three'
2041enddef
2042
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002043def s:ComputeConst(): number
2044 return 2 + 3 * 4 / 6 + 7
2045enddef
2046
Bram Moolenaar1c747212020-05-09 18:28:34 +02002047def s:ComputeConstParen(): number
2048 return ((2 + 4) * (8 / 2)) / (3 + 4)
2049enddef
2050
Bram Moolenaar61a89812020-05-07 16:58:17 +02002051def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002052 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002053 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2054 "return 'one' .. 'two' .. 'three'\\_s*" ..
2055 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002056 '\d RETURN',
2057 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002058
2059 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002060 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2061 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2062 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002063 '\d RETURN',
2064 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002065
2066 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002067 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2068 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2069 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002070 '\d RETURN',
2071 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002072enddef
2073
Bram Moolenaar389df252020-07-09 21:20:47 +02002074def s:CallAppend()
2075 eval "some text"->append(2)
2076enddef
2077
2078def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002079 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002080 assert_match('<SNR>\d*_CallAppend\_s*' ..
2081 'eval "some text"->append(2)\_s*' ..
2082 '\d PUSHS "some text"\_s*' ..
2083 '\d PUSHNR 2\_s*' ..
2084 '\d SHUFFLE 2 up 1\_s*' ..
2085 '\d BCALL append(argc 2)\_s*' ..
2086 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002087 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002088 res)
2089enddef
2090
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002091
2092def s:SilentMessage()
2093 silent echomsg "text"
2094 silent! echoerr "error"
2095enddef
2096
2097def Test_silent()
2098 var res = execute('disass s:SilentMessage')
2099 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2100 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002101 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002102 '\d PUSHS "text"\_s*' ..
2103 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002104 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002105 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002106 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002107 '\d PUSHS "error"\_s*' ..
2108 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002109 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002110 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002111 res)
2112enddef
2113
2114def s:SilentIf()
2115 silent if 4 == g:five
2116 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002117 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002118enddef
2119
2120def Test_silent_if()
2121 var res = execute('disass s:SilentIf')
2122 assert_match('<SNR>\d*_SilentIf\_s*' ..
2123 'silent if 4 == g:five\_s*' ..
2124 '\d\+ CMDMOD silent\_s*' ..
2125 '\d\+ PUSHNR 4\_s*' ..
2126 '\d\+ LOADG g:five\_s*' ..
2127 '\d\+ COMPAREANY ==\_s*' ..
2128 '\d\+ CMDMOD_REV\_s*' ..
2129 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2130 'silent elseif 4 == g:five\_s*' ..
2131 '\d\+ JUMP -> \d\+\_s*' ..
2132 '\d\+ CMDMOD silent\_s*' ..
2133 '\d\+ PUSHNR 4\_s*' ..
2134 '\d\+ LOADG g:five\_s*' ..
2135 '\d\+ COMPAREANY ==\_s*' ..
2136 '\d\+ CMDMOD_REV\_s*' ..
2137 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002138 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002139 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002140 res)
2141enddef
2142
2143def s:SilentFor()
2144 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002145 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002146enddef
2147
2148def Test_silent_for()
2149 var res = execute('disass s:SilentFor')
2150 assert_match('<SNR>\d*_SilentFor\_s*' ..
2151 'silent for i in \[0\]\_s*' ..
2152 '\d CMDMOD silent\_s*' ..
2153 '\d STORE -1 in $0\_s*' ..
2154 '\d PUSHNR 0\_s*' ..
2155 '\d NEWLIST size 1\_s*' ..
2156 '\d CMDMOD_REV\_s*' ..
2157 '5 FOR $0 -> 8\_s*' ..
2158 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002159 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002160 '\d JUMP -> 5\_s*' ..
2161 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002162 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002163 res)
2164enddef
2165
2166def s:SilentWhile()
2167 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002168 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002169enddef
2170
2171def Test_silent_while()
2172 var res = execute('disass s:SilentWhile')
2173 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2174 'silent while g:not\_s*' ..
2175 '0 CMDMOD silent\_s*' ..
2176 '\d LOADG g:not\_s*' ..
2177 '\d COND2BOOL\_s*' ..
2178 '\d CMDMOD_REV\_s*' ..
2179 '\d JUMP_IF_FALSE -> 6\_s*' ..
2180
Bram Moolenaarfa984412021-03-25 22:15:28 +01002181 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002182 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002183 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002184 res)
2185enddef
2186
2187def s:SilentReturn(): string
2188 silent return "done"
2189enddef
2190
2191def Test_silent_return()
2192 var res = execute('disass s:SilentReturn')
2193 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2194 'silent return "done"\_s*' ..
2195 '\d CMDMOD silent\_s*' ..
2196 '\d PUSHS "done"\_s*' ..
2197 '\d CMDMOD_REV\_s*' ..
2198 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002199 res)
2200enddef
2201
Bram Moolenaarb2049902021-01-24 12:53:53 +01002202def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002203 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002204 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002205 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002206 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002207 return "done"
2208enddef
2209
2210def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002211 if !has('profile')
2212 MissingFeature 'profile'
2213 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002214 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002215 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002216 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002217 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002218 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002219 '\d PUSHS "profiled"\_s*' ..
2220 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002221 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002222 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002223 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002224 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002225 '\d PUSHS "some text"\_s*' ..
2226 '\d STORE $0\_s*' ..
2227 'return "done"\_s*' ..
2228 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002229 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002230 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002231 '\d\+ RETURN\_s*' ..
2232 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002233 res)
2234enddef
2235
Bram Moolenaare99d4222021-06-13 14:01:26 +02002236def Test_debugged()
2237 var res = execute('disass debug s:Profiled')
2238 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002239 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002240 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002241 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002242 '\d PUSHS "profiled"\_s*' ..
2243 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002244 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002245 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002246 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002247 '\d PUSHS "some text"\_s*' ..
2248 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002249 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002250 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002251 '\d PUSHS "done"\_s*' ..
2252 '\d RETURN\_s*',
2253 res)
2254enddef
2255
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002256def s:EchoMessages()
2257 echohl ErrorMsg | echom v:exception | echohl NONE
2258enddef
2259
2260def Test_disassemble_nextcmd()
2261 # splitting commands and removing trailing blanks should not change the line
2262 var res = execute('disass s:EchoMessages')
2263 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2264 'echohl ErrorMsg | echom v:exception | echohl NONE',
2265 res)
2266enddef
2267
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002268def Test_disassemble_after_reload()
2269 var lines =<< trim END
2270 vim9script
2271 if exists('g:ThisFunc')
2272 finish
2273 endif
2274 var name: any
2275 def g:ThisFunc(): number
2276 g:name = name
2277 return 0
2278 enddef
2279 def g:ThatFunc(): number
2280 name = g:name
2281 return 0
2282 enddef
2283 END
2284 lines->writefile('Xreload.vim')
2285
2286 source Xreload.vim
2287 g:ThisFunc()
2288 g:ThatFunc()
2289
2290 source Xreload.vim
2291 var res = execute('disass g:ThisFunc')
2292 assert_match('ThisFunc\_s*' ..
2293 'g:name = name\_s*' ..
2294 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2295 '\d STOREG g:name\_s*' ..
2296 'return 0\_s*' ..
2297 '\d PUSHNR 0\_s*' ..
2298 '\d RETURN\_s*',
2299 res)
2300
2301 res = execute('disass g:ThatFunc')
2302 assert_match('ThatFunc\_s*' ..
2303 'name = g:name\_s*' ..
2304 '\d LOADG g:name\_s*' ..
2305 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2306 'return 0\_s*' ..
2307 '\d PUSHNR 0\_s*' ..
2308 '\d RETURN\_s*',
2309 res)
2310
2311 delete('Xreload.vim')
2312 delfunc g:ThisFunc
2313 delfunc g:ThatFunc
2314enddef
2315
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002316
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002317" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker