blob: e7c574673fc4b33e2a2f42482901cc6037afda56 [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 Moolenaarcd6b4f32021-08-15 20:36:28 +02001683 g:nr = 9
1684 var plus = +g:nr
1685 var minus = -g:nr
1686 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001687enddef
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 Moolenaarcd6b4f32021-08-15 20:36:28 +02001692 'g:nr = 9\_s*' ..
1693 '\d PUSHNR 9\_s*' ..
1694 '\d STOREG g:nr\_s*' ..
1695 'var plus = +g:nr\_s*' ..
1696 '\d LOADG g:nr\_s*' ..
1697 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1698 '\d STORE $0\_s*' ..
1699 'var minus = -g:nr\_s*' ..
1700 '\d LOADG g:nr\_s*' ..
1701 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001702 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001703 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001704 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001705 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001706enddef
1707
1708def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001709 var flag = true
1710 var invert = !flag
1711 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001712 return res
1713enddef
1714
1715def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001717 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001718 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001719 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001720 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001722 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001723 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001724 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001725 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001726 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001727 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001728 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001729 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001730 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001731enddef
1732
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001733def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001734 var name: bool = 1 && 0 || 1
1735 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001736enddef
1737
1738def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001739 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001740 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001741 'var name: bool = 1 && 0 || 1\_s*' ..
1742 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001743 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001744 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1745 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001746 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001747 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1748 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001749 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001750 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001751 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001752 '\d\+ LOAD $0\_s*' ..
1753 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001754 instr)
1755 assert_equal(true, InvertBool())
1756enddef
1757
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001758def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001759 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001760 ['true == isFalse', 'COMPAREBOOL =='],
1761 ['true != isFalse', 'COMPAREBOOL !='],
1762 ['v:none == isNull', 'COMPARESPECIAL =='],
1763 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001764
Bram Moolenaara5565e42020-05-09 15:44:01 +02001765 ['111 == aNumber', 'COMPARENR =='],
1766 ['111 != aNumber', 'COMPARENR !='],
1767 ['111 > aNumber', 'COMPARENR >'],
1768 ['111 < aNumber', 'COMPARENR <'],
1769 ['111 >= aNumber', 'COMPARENR >='],
1770 ['111 <= aNumber', 'COMPARENR <='],
1771 ['111 =~ aNumber', 'COMPARENR =\~'],
1772 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001773
Bram Moolenaara5565e42020-05-09 15:44:01 +02001774 ['"xx" != aString', 'COMPARESTRING !='],
1775 ['"xx" > aString', 'COMPARESTRING >'],
1776 ['"xx" < aString', 'COMPARESTRING <'],
1777 ['"xx" >= aString', 'COMPARESTRING >='],
1778 ['"xx" <= aString', 'COMPARESTRING <='],
1779 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1780 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1781 ['"xx" is aString', 'COMPARESTRING is'],
1782 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001783
Bram Moolenaara5565e42020-05-09 15:44:01 +02001784 ['0z11 == aBlob', 'COMPAREBLOB =='],
1785 ['0z11 != aBlob', 'COMPAREBLOB !='],
1786 ['0z11 is aBlob', 'COMPAREBLOB is'],
1787 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001788
Bram Moolenaara5565e42020-05-09 15:44:01 +02001789 ['[1, 2] == aList', 'COMPARELIST =='],
1790 ['[1, 2] != aList', 'COMPARELIST !='],
1791 ['[1, 2] is aList', 'COMPARELIST is'],
1792 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001793
Bram Moolenaare0de1712020-12-02 17:36:54 +01001794 ['{a: 1} == aDict', 'COMPAREDICT =='],
1795 ['{a: 1} != aDict', 'COMPAREDICT !='],
1796 ['{a: 1} is aDict', 'COMPAREDICT is'],
1797 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001798
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001799 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1800 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1801 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1802 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001803
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 =~ g:xx', 'COMPAREANY =\~'],
1811 ['77 !~ g:xx', 'COMPAREANY !\~'],
1812 ['77 is g:xx', 'COMPAREANY is'],
1813 ['77 isnot g:xx', 'COMPAREANY isnot'],
1814 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001815 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001816 if has('float')
1817 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001818 ['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 <='],
1824 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1825 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001826 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001827 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001828 endif
1829
Bram Moolenaarac564082020-09-27 19:05:33 +02001830 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001831 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001832 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001833 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001834 ' var isFalse = false',
1835 ' var isNull = v:null',
1836 ' var aNumber = 222',
1837 ' var aString = "yy"',
1838 ' var aBlob = 0z22',
1839 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001840 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001841 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001842 ' if ' .. case[0],
1843 ' echo 42'
1844 ' endif',
1845 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001846 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001847 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001848 assert_match('TestCase' .. nr .. '.*' ..
1849 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1850 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001851 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001852 '\d ' .. case[1] .. '.*' ..
1853 '\d JUMP_IF_FALSE -> \d\+.*',
1854 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001855
1856 nr += 1
1857 endfor
1858
Bram Moolenaar22da5592020-03-19 14:52:20 +01001859 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001860enddef
1861
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001862def s:FalsyOp()
1863 echo g:flag ?? "yes"
1864 echo [] ?? "empty list"
1865 echo "" ?? "empty string"
1866enddef
1867
1868def Test_dsassemble_falsy_op()
1869 var res = execute('disass s:FalsyOp')
1870 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1871 'echo g:flag ?? "yes"\_s*' ..
1872 '0 LOADG g:flag\_s*' ..
1873 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1874 '2 PUSHS "yes"\_s*' ..
1875 '3 ECHO 1\_s*' ..
1876 'echo \[\] ?? "empty list"\_s*' ..
1877 '4 NEWLIST size 0\_s*' ..
1878 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1879 '6 PUSHS "empty list"\_s*' ..
1880 '7 ECHO 1\_s*' ..
1881 'echo "" ?? "empty string"\_s*' ..
1882 '\d\+ PUSHS "empty string"\_s*' ..
1883 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001884 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001885 res)
1886enddef
1887
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001888def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001889 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001890 ['"xx" == "yy"', false],
1891 ['"aa" == "aa"', true],
1892 ['has("eval") ? true : false', true],
1893 ['has("asdf") ? true : false', false],
1894 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001895
Bram Moolenaarac564082020-09-27 19:05:33 +02001896 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001897 for case in cases
1898 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001899 ' if ' .. case[0],
1900 ' echo 42'
1901 ' endif',
1902 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001903 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001904 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001905 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001906 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001907 assert_match('TestCase' .. nr .. '.*' ..
1908 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1909 '\d PUSHNR 42.*' ..
1910 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001911 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001912 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001913 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001914 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001915 assert_match('TestCase' .. nr .. '.*' ..
1916 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1917 'echo 42[ \n]*' ..
1918 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001919 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001920 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001921 endif
1922
1923 nr += 1
1924 endfor
1925
1926 delete('Xdisassemble')
1927enddef
1928
Bram Moolenaarad39c092020-02-26 18:23:43 +01001929def s:Execute()
1930 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001931 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001932 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001933 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001934 execute 'help ' .. tag
1935enddef
1936
1937def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001938 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001939 assert_match('\<SNR>\d*_Execute\_s*' ..
1940 "execute 'help vim9.txt'\\_s*" ..
1941 '\d PUSHS "help vim9.txt"\_s*' ..
1942 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001943 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001944 '\d PUSHS "help vim9.txt"\_s*' ..
1945 '\d STORE $0\_s*' ..
1946 'execute cmd\_s*' ..
1947 '\d LOAD $0\_s*' ..
1948 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001949 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001950 '\d PUSHS "vim9.txt"\_s*' ..
1951 '\d STORE $1\_s*' ..
1952 "execute 'help ' .. tag\\_s*" ..
1953 '\d\+ PUSHS "help "\_s*' ..
1954 '\d\+ LOAD $1\_s*' ..
1955 '\d\+ CONCAT\_s*' ..
1956 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001957 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001958 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001959enddef
1960
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001961def s:Echomsg()
1962 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02001963 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001964 echoerr 'went' .. 'wrong'
1965enddef
1966
1967def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001968 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001969 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1970 "echomsg 'some' 'message'\\_s*" ..
1971 '\d PUSHS "some"\_s*' ..
1972 '\d PUSHS "message"\_s*' ..
1973 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02001974 "echoconsole 'nothing'\\_s*" ..
1975 '\d PUSHS "nothing"\_s*' ..
1976 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001977 "echoerr 'went' .. 'wrong'\\_s*" ..
1978 '\d PUSHS "wentwrong"\_s*' ..
1979 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001980 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001981 res)
1982enddef
1983
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001984def SomeStringArg(arg: string)
1985 echo arg
1986enddef
1987
1988def SomeAnyArg(arg: any)
1989 echo arg
1990enddef
1991
1992def SomeStringArgAndReturn(arg: string): string
1993 return arg
1994enddef
1995
1996def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001997 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001998 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1999 '\d *echo arg.*' ..
2000 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002001 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002002
Bram Moolenaarac564082020-09-27 19:05:33 +02002003 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002004 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2005 '\d *echo arg\_s*' ..
2006 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002007 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002008
Bram Moolenaarac564082020-09-27 19:05:33 +02002009 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002010 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2011 '\d *return arg\_s*' ..
2012 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002013 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002014enddef
2015
Bram Moolenaar09689a02020-05-09 22:50:08 +02002016def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002017 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002018 vim9script
2019 def FuncOne(): string
2020 return FuncTwo()
2021 enddef
2022 def FuncTwo(): string
2023 return 'two'
2024 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002025 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002026 END
2027 writefile(lines, 'Xdisassemble')
2028 source Xdisassemble
2029
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002030 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002031 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2032 'return FuncTwo()\_s*' ..
2033 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002034 '\d RETURN',
2035 g:res_FuncOne)
2036
2037 delete('Xdisassemble')
2038 unlet g:res_FuncOne
2039enddef
2040
Bram Moolenaar61a89812020-05-07 16:58:17 +02002041def s:ConcatStrings(): string
2042 return 'one' .. 'two' .. 'three'
2043enddef
2044
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002045def s:ComputeConst(): number
2046 return 2 + 3 * 4 / 6 + 7
2047enddef
2048
Bram Moolenaar1c747212020-05-09 18:28:34 +02002049def s:ComputeConstParen(): number
2050 return ((2 + 4) * (8 / 2)) / (3 + 4)
2051enddef
2052
Bram Moolenaar61a89812020-05-07 16:58:17 +02002053def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002054 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002055 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2056 "return 'one' .. 'two' .. 'three'\\_s*" ..
2057 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002058 '\d RETURN',
2059 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002060
2061 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002062 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2063 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2064 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002065 '\d RETURN',
2066 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002067
2068 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002069 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2070 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2071 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002072 '\d RETURN',
2073 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002074enddef
2075
Bram Moolenaar389df252020-07-09 21:20:47 +02002076def s:CallAppend()
2077 eval "some text"->append(2)
2078enddef
2079
2080def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002081 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002082 assert_match('<SNR>\d*_CallAppend\_s*' ..
2083 'eval "some text"->append(2)\_s*' ..
2084 '\d PUSHS "some text"\_s*' ..
2085 '\d PUSHNR 2\_s*' ..
2086 '\d SHUFFLE 2 up 1\_s*' ..
2087 '\d BCALL append(argc 2)\_s*' ..
2088 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002089 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002090 res)
2091enddef
2092
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002093
2094def s:SilentMessage()
2095 silent echomsg "text"
2096 silent! echoerr "error"
2097enddef
2098
2099def Test_silent()
2100 var res = execute('disass s:SilentMessage')
2101 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2102 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002103 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002104 '\d PUSHS "text"\_s*' ..
2105 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002106 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002107 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002108 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002109 '\d PUSHS "error"\_s*' ..
2110 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002111 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002112 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002113 res)
2114enddef
2115
2116def s:SilentIf()
2117 silent if 4 == g:five
2118 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002119 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002120enddef
2121
2122def Test_silent_if()
2123 var res = execute('disass s:SilentIf')
2124 assert_match('<SNR>\d*_SilentIf\_s*' ..
2125 'silent if 4 == g:five\_s*' ..
2126 '\d\+ CMDMOD silent\_s*' ..
2127 '\d\+ PUSHNR 4\_s*' ..
2128 '\d\+ LOADG g:five\_s*' ..
2129 '\d\+ COMPAREANY ==\_s*' ..
2130 '\d\+ CMDMOD_REV\_s*' ..
2131 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2132 'silent elseif 4 == g:five\_s*' ..
2133 '\d\+ JUMP -> \d\+\_s*' ..
2134 '\d\+ CMDMOD silent\_s*' ..
2135 '\d\+ PUSHNR 4\_s*' ..
2136 '\d\+ LOADG g:five\_s*' ..
2137 '\d\+ COMPAREANY ==\_s*' ..
2138 '\d\+ CMDMOD_REV\_s*' ..
2139 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002140 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002141 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002142 res)
2143enddef
2144
2145def s:SilentFor()
2146 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002147 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002148enddef
2149
2150def Test_silent_for()
2151 var res = execute('disass s:SilentFor')
2152 assert_match('<SNR>\d*_SilentFor\_s*' ..
2153 'silent for i in \[0\]\_s*' ..
2154 '\d CMDMOD silent\_s*' ..
2155 '\d STORE -1 in $0\_s*' ..
2156 '\d PUSHNR 0\_s*' ..
2157 '\d NEWLIST size 1\_s*' ..
2158 '\d CMDMOD_REV\_s*' ..
2159 '5 FOR $0 -> 8\_s*' ..
2160 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002161 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002162 '\d JUMP -> 5\_s*' ..
2163 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002164 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002165 res)
2166enddef
2167
2168def s:SilentWhile()
2169 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002170 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002171enddef
2172
2173def Test_silent_while()
2174 var res = execute('disass s:SilentWhile')
2175 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2176 'silent while g:not\_s*' ..
2177 '0 CMDMOD silent\_s*' ..
2178 '\d LOADG g:not\_s*' ..
2179 '\d COND2BOOL\_s*' ..
2180 '\d CMDMOD_REV\_s*' ..
2181 '\d JUMP_IF_FALSE -> 6\_s*' ..
2182
Bram Moolenaarfa984412021-03-25 22:15:28 +01002183 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002184 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002185 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002186 res)
2187enddef
2188
2189def s:SilentReturn(): string
2190 silent return "done"
2191enddef
2192
2193def Test_silent_return()
2194 var res = execute('disass s:SilentReturn')
2195 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2196 'silent return "done"\_s*' ..
2197 '\d CMDMOD silent\_s*' ..
2198 '\d PUSHS "done"\_s*' ..
2199 '\d CMDMOD_REV\_s*' ..
2200 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002201 res)
2202enddef
2203
Bram Moolenaarb2049902021-01-24 12:53:53 +01002204def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002205 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002206 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002207 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002208 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002209 return "done"
2210enddef
2211
2212def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002213 if !has('profile')
2214 MissingFeature 'profile'
2215 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002216 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002217 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002218 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002219 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002220 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002221 '\d PUSHS "profiled"\_s*' ..
2222 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002223 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002224 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002225 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002226 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002227 '\d PUSHS "some text"\_s*' ..
2228 '\d STORE $0\_s*' ..
2229 'return "done"\_s*' ..
2230 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002231 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002232 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002233 '\d\+ RETURN\_s*' ..
2234 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002235 res)
2236enddef
2237
Bram Moolenaare99d4222021-06-13 14:01:26 +02002238def Test_debugged()
2239 var res = execute('disass debug s:Profiled')
2240 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002241 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002242 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002243 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002244 '\d PUSHS "profiled"\_s*' ..
2245 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002246 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002247 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002248 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002249 '\d PUSHS "some text"\_s*' ..
2250 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002251 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002252 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002253 '\d PUSHS "done"\_s*' ..
2254 '\d RETURN\_s*',
2255 res)
2256enddef
2257
Bram Moolenaar093165c2021-08-22 13:35:31 +02002258def s:DebugElseif()
2259 var b = false
2260 if b
2261 eval 1 + 0
2262 silent elseif !b
2263 eval 2 + 0
2264 endif
2265enddef
2266
2267def Test_debug_elseif()
2268 var res = execute('disass debug s:DebugElseif')
2269 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2270 'var b = false\_s*' ..
2271 '0 DEBUG line 1-1 varcount 0\_s*' ..
2272 '1 PUSH false\_s*' ..
2273 '2 STORE $0\_s*' ..
2274
2275 'if b\_s*' ..
2276 '3 DEBUG line 2-2 varcount 1\_s*' ..
2277 '4 LOAD $0\_s*' ..
2278 '5 JUMP_IF_FALSE -> 10\_s*' ..
2279
2280 'eval 1 + 0\_s*' ..
2281 '6 DEBUG line 3-3 varcount 1\_s*' ..
2282 '7 PUSHNR 1\_s*' ..
2283 '8 DROP\_s*' ..
2284
2285 'silent elseif !b\_s*' ..
2286 '9 JUMP -> 20\_s*' ..
2287 '10 CMDMOD silent\_s*' ..
2288 '11 DEBUG line 4-4 varcount 1\_s*' ..
2289 '12 LOAD $0\_s*' ..
2290 '13 INVERT -1 (!val)\_s*' ..
2291 '14 CMDMOD_REV\_s*' ..
2292 '15 JUMP_IF_FALSE -> 20\_s*' ..
2293
2294 'eval 2 + 0\_s*' ..
2295 '16 DEBUG line 5-5 varcount 1\_s*' ..
2296 '17 PUSHNR 2\_s*' ..
2297 '18 DROP\_s*' ..
2298
2299 'endif\_s*' ..
2300 '19 DEBUG line 6-6 varcount 1\_s*' ..
2301 '20 RETURN void*',
2302 res)
2303enddef
2304
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002305def s:EchoMessages()
2306 echohl ErrorMsg | echom v:exception | echohl NONE
2307enddef
2308
2309def Test_disassemble_nextcmd()
2310 # splitting commands and removing trailing blanks should not change the line
2311 var res = execute('disass s:EchoMessages')
2312 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2313 'echohl ErrorMsg | echom v:exception | echohl NONE',
2314 res)
2315enddef
2316
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002317def Test_disassemble_after_reload()
2318 var lines =<< trim END
2319 vim9script
2320 if exists('g:ThisFunc')
2321 finish
2322 endif
2323 var name: any
2324 def g:ThisFunc(): number
2325 g:name = name
2326 return 0
2327 enddef
2328 def g:ThatFunc(): number
2329 name = g:name
2330 return 0
2331 enddef
2332 END
2333 lines->writefile('Xreload.vim')
2334
2335 source Xreload.vim
2336 g:ThisFunc()
2337 g:ThatFunc()
2338
2339 source Xreload.vim
2340 var res = execute('disass g:ThisFunc')
2341 assert_match('ThisFunc\_s*' ..
2342 'g:name = name\_s*' ..
2343 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2344 '\d STOREG g:name\_s*' ..
2345 'return 0\_s*' ..
2346 '\d PUSHNR 0\_s*' ..
2347 '\d RETURN\_s*',
2348 res)
2349
2350 res = execute('disass g:ThatFunc')
2351 assert_match('ThatFunc\_s*' ..
2352 'name = g:name\_s*' ..
2353 '\d LOADG g:name\_s*' ..
2354 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2355 'return 0\_s*' ..
2356 '\d PUSHNR 0\_s*' ..
2357 '\d RETURN\_s*',
2358 res)
2359
2360 delete('Xreload.vim')
2361 delfunc g:ThisFunc
2362 delfunc g:ThatFunc
2363enddef
2364
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002365
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002366" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker