blob: 840017418cace1e1d5e3ece78dc82ff9c6ac06fc [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 Moolenaarb1b6f4d2021-09-13 18:25:54 +0200415 '\d\+ USEDICT\_s*' ..
416 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200417 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100418 res)
419enddef
420
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200421def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200422 var x: string
423 var y: string
424 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200425 [x, y; l] = g:stringlist
426enddef
427
428def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200429 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200430 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200432 '\d PUSHS "\[NULL\]"\_s*' ..
433 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200434 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200435 '\d PUSHS "\[NULL\]"\_s*' ..
436 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200437 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200438 '\d NEWLIST size 0\_s*' ..
Bram Moolenaar6e48b842021-08-10 22:52:02 +0200439 '\d SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200440 '\d STORE $2\_s*' ..
441 '\[x, y; l\] = g:stringlist\_s*' ..
442 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200443 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200444 '\d CHECKLEN >= 2\_s*' ..
445 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200446 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200447 '\d\+ STORE $0\_s*' ..
448 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200449 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200450 '\d\+ STORE $1\_s*' ..
451 '\d\+ SLICE 2\_s*' ..
452 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200453 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200454 res)
455enddef
456
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200457def s:ListAssignWithOp()
458 var a = 2
459 var b = 3
460 [a, b] += [4, 5]
461enddef
462
463def Test_disassemble_list_assign_with_op()
464 var res = execute('disass s:ListAssignWithOp')
465 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
466 'var a = 2\_s*' ..
467 '\d STORE 2 in $0\_s*' ..
468 'var b = 3\_s*' ..
469 '\d STORE 3 in $1\_s*' ..
470 '\[a, b\] += \[4, 5\]\_s*' ..
471 '\d\+ PUSHNR 4\_s*' ..
472 '\d\+ PUSHNR 5\_s*' ..
473 '\d\+ NEWLIST size 2\_s*' ..
474 '\d\+ CHECKLEN 2\_s*' ..
475 '\d\+ LOAD $0\_s*' ..
476 '\d\+ ITEM 0 with op\_s*' ..
477 '\d\+ OPNR +\_s*' ..
478 '\d\+ STORE $0\_s*' ..
479 '\d\+ LOAD $1\_s*' ..
480 '\d\+ ITEM 1 with op\_s*' ..
481 '\d\+ OPNR +\_s*' ..
482 '\d\+ STORE $1\_s*' ..
483 '\d\+ DROP\_s*' ..
484 '\d\+ RETURN void',
485 res)
486enddef
487
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200488def s:ListAdd()
489 var l: list<number> = []
490 add(l, 123)
491 add(l, g:aNumber)
492enddef
493
494def Test_disassemble_list_add()
495 var res = execute('disass s:ListAdd')
496 assert_match('<SNR>\d*_ListAdd\_s*' ..
497 'var l: list<number> = []\_s*' ..
498 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100499 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200500 '\d STORE $0\_s*' ..
501 'add(l, 123)\_s*' ..
502 '\d LOAD $0\_s*' ..
503 '\d PUSHNR 123\_s*' ..
504 '\d LISTAPPEND\_s*' ..
505 '\d DROP\_s*' ..
506 'add(l, g:aNumber)\_s*' ..
507 '\d LOAD $0\_s*' ..
508 '\d\+ LOADG g:aNumber\_s*' ..
509 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
510 '\d\+ LISTAPPEND\_s*' ..
511 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200512 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200513 res)
514enddef
515
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200516def s:BlobAdd()
517 var b: blob = 0z
518 add(b, 123)
519 add(b, g:aNumber)
520enddef
521
522def Test_disassemble_blob_add()
523 var res = execute('disass s:BlobAdd')
524 assert_match('<SNR>\d*_BlobAdd\_s*' ..
525 'var b: blob = 0z\_s*' ..
526 '\d PUSHBLOB 0z\_s*' ..
527 '\d STORE $0\_s*' ..
528 'add(b, 123)\_s*' ..
529 '\d LOAD $0\_s*' ..
530 '\d PUSHNR 123\_s*' ..
531 '\d BLOBAPPEND\_s*' ..
532 '\d DROP\_s*' ..
533 'add(b, g:aNumber)\_s*' ..
534 '\d LOAD $0\_s*' ..
535 '\d\+ LOADG g:aNumber\_s*' ..
536 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
537 '\d\+ BLOBAPPEND\_s*' ..
538 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200539 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200540 res)
541enddef
542
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200543def s:BlobIndexSlice()
544 var b: blob = 0z112233
545 echo b[1]
546 echo b[1 : 2]
547enddef
548
549def Test_disassemble_blob_index_slice()
550 var res = execute('disass s:BlobIndexSlice')
551 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
552 'var b: blob = 0z112233\_s*' ..
553 '\d PUSHBLOB 0z112233\_s*' ..
554 '\d STORE $0\_s*' ..
555 'echo b\[1\]\_s*' ..
556 '\d LOAD $0\_s*' ..
557 '\d PUSHNR 1\_s*' ..
558 '\d BLOBINDEX\_s*' ..
559 '\d ECHO 1\_s*' ..
560 'echo b\[1 : 2\]\_s*' ..
561 '\d LOAD $0\_s*' ..
562 '\d PUSHNR 1\_s*' ..
563 '\d\+ PUSHNR 2\_s*' ..
564 '\d\+ BLOBSLICE\_s*' ..
565 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200566 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200567 res)
568enddef
569
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200570def s:ScriptFuncUnlet()
571 g:somevar = "value"
572 unlet g:somevar
573 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200574 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200575enddef
576
577def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200578 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200579 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
580 'g:somevar = "value"\_s*' ..
581 '\d PUSHS "value"\_s*' ..
582 '\d STOREG g:somevar\_s*' ..
583 'unlet g:somevar\_s*' ..
584 '\d UNLET g:somevar\_s*' ..
585 'unlet! g:somevar\_s*' ..
586 '\d UNLET! g:somevar\_s*' ..
587 'unlet $SOMEVAR\_s*' ..
588 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200589 res)
590enddef
591
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200592def s:LockLocal()
593 var d = {a: 1}
594 lockvar d.a
595enddef
596
597def Test_disassemble_locl_local()
598 var res = execute('disass s:LockLocal')
599 assert_match('<SNR>\d*_LockLocal\_s*' ..
600 'var d = {a: 1}\_s*' ..
601 '\d PUSHS "a"\_s*' ..
602 '\d PUSHNR 1\_s*' ..
603 '\d NEWDICT size 1\_s*' ..
604 '\d STORE $0\_s*' ..
605 'lockvar d.a\_s*' ..
606 '\d LOAD $0\_s*' ..
607 '\d LOCKUNLOCK lockvar d.a\_s*',
608 res)
609enddef
610
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100611def s:ScriptFuncTry()
612 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200613 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100614 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200615 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100616 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200617 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100618 endtry
619enddef
620
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100621def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200622 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200623 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
624 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100625 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200626 'echo "yes"\_s*' ..
627 '\d PUSHS "yes"\_s*' ..
628 '\d ECHO 1\_s*' ..
629 'catch /fail/\_s*' ..
630 '\d JUMP -> \d\+\_s*' ..
631 '\d PUSH v:exception\_s*' ..
632 '\d PUSHS "fail"\_s*' ..
633 '\d COMPARESTRING =\~\_s*' ..
634 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
635 '\d CATCH\_s*' ..
636 'echo "no"\_s*' ..
637 '\d\+ PUSHS "no"\_s*' ..
638 '\d\+ ECHO 1\_s*' ..
639 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100640 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200641 'throw "end"\_s*' ..
642 '\d\+ PUSHS "end"\_s*' ..
643 '\d\+ THROW\_s*' ..
644 'endtry\_s*' ..
645 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200646 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100647enddef
648
649def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200650 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100651 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100652enddef
653
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100654def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200655 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200656 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200657 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200658 '\d PUSHNR 1\_s*' ..
659 '\d PUSHS "two"\_s*' ..
660 '\d PUSHNR 333\_s*' ..
661 '\d NEWLIST size 3\_s*' ..
662 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100663 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200664 '\d PUSHS "one"\_s*' ..
665 '\d PUSHNR 1\_s*' ..
666 '\d PUSHS "two"\_s*' ..
667 '\d PUSHS "val"\_s*' ..
668 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200669 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100670enddef
671
Bram Moolenaar6e949782020-04-13 17:21:00 +0200672def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100673 echo arg
674enddef
675
676func UserFunc()
677 echo 'nothing'
678endfunc
679
680func UserFuncWithArg(arg)
681 echo a:arg
682endfunc
683
684def s:ScriptFuncCall(): string
685 changenr()
686 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100687 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100688 FuncWithArg(343)
689 ScriptFuncNew()
690 s:ScriptFuncNew()
691 UserFunc()
692 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200693 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100694 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200695 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100696 FuncRefWithArg("bar")
697 return "yes"
698enddef
699
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100700def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200701 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200702 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
703 'changenr()\_s*' ..
704 '\d BCALL changenr(argc 0)\_s*' ..
705 '\d DROP\_s*' ..
706 'char2nr("abc")\_s*' ..
707 '\d PUSHS "abc"\_s*' ..
708 '\d BCALL char2nr(argc 1)\_s*' ..
709 '\d DROP\_s*' ..
710 'Test_disassemble_new()\_s*' ..
711 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
712 '\d DROP\_s*' ..
713 'FuncWithArg(343)\_s*' ..
714 '\d\+ PUSHNR 343\_s*' ..
715 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
716 '\d\+ DROP\_s*' ..
717 'ScriptFuncNew()\_s*' ..
718 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
719 '\d\+ DROP\_s*' ..
720 's:ScriptFuncNew()\_s*' ..
721 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
722 '\d\+ DROP\_s*' ..
723 'UserFunc()\_s*' ..
724 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
725 '\d\+ DROP\_s*' ..
726 'UserFuncWithArg("foo")\_s*' ..
727 '\d\+ PUSHS "foo"\_s*' ..
728 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
729 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200730 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200731 '\d\+ PUSHS "UserFunc"\_s*' ..
732 '\d\+ BCALL function(argc 1)\_s*' ..
733 '\d\+ STORE $0\_s*' ..
734 'FuncRef()\_s*' ..
735 '\d\+ LOAD $\d\_s*' ..
736 '\d\+ PCALL (argc 0)\_s*' ..
737 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200738 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200739 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
740 '\d\+ BCALL function(argc 1)\_s*' ..
741 '\d\+ STORE $1\_s*' ..
742 'FuncRefWithArg("bar")\_s*' ..
743 '\d\+ PUSHS "bar"\_s*' ..
744 '\d\+ LOAD $\d\_s*' ..
745 '\d\+ PCALL (argc 1)\_s*' ..
746 '\d\+ DROP\_s*' ..
747 'return "yes"\_s*' ..
748 '\d\+ PUSHS "yes"\_s*' ..
749 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200750 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100751enddef
752
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200753
754def s:CreateRefs()
755 var local = 'a'
756 def Append(arg: string)
757 local ..= arg
758 enddef
759 g:Append = Append
760 def Get(): string
761 return local
762 enddef
763 g:Get = Get
764enddef
765
766def Test_disassemble_closure()
767 CreateRefs()
768 var res = execute('disass g:Append')
769 assert_match('<lambda>\d\_s*' ..
770 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100771 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200772 '\d LOAD arg\[-1\]\_s*' ..
773 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100774 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200775 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200776 res)
777
778 res = execute('disass g:Get')
779 assert_match('<lambda>\d\_s*' ..
780 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100781 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200782 '\d RETURN',
783 res)
784
785 unlet g:Append
786 unlet g:Get
787enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200788
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100789
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200790def EchoArg(arg: string): string
791 return arg
792enddef
793def RefThis(): func
794 return function('EchoArg')
795enddef
796def s:ScriptPCall()
797 RefThis()("text")
798enddef
799
800def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200801 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200802 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
803 'RefThis()("text")\_s*' ..
804 '\d DCALL RefThis(argc 0)\_s*' ..
805 '\d PUSHS "text"\_s*' ..
806 '\d PCALL top (argc 1)\_s*' ..
807 '\d PCALL end\_s*' ..
808 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200809 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200810 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200811enddef
812
813
Bram Moolenaara26b9702020-04-18 19:53:28 +0200814def s:FuncWithForwardCall(): string
815 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100816enddef
817
818def DefinedLater(arg: string): string
819 return arg
820enddef
821
822def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200823 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200824 assert_match('FuncWithForwardCall\_s*' ..
825 'return g:DefinedLater("yes")\_s*' ..
826 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200827 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200828 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200829 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100830
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200831 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100832 assert_equal('yes', FuncWithForwardCall())
833
Bram Moolenaara26b9702020-04-18 19:53:28 +0200834 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200835 assert_match('FuncWithForwardCall\_s*' ..
836 'return g:DefinedLater("yes")\_s*' ..
837 '\d PUSHS "yes"\_s*' ..
838 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200839 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200840 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100841enddef
842
843
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200844def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200845 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100846enddef
847
848def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200849 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200850 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200851 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200852 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200853 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200854 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200855 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200856 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
857 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200859 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200860 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200861 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200862 '\d 2STRING stack\[-1]\_s*' ..
863 '\d\+ CONCAT\_s*' ..
864 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200865 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100866enddef
867
868
Bram Moolenaar158906c2020-02-06 20:39:45 +0100869def HasEval()
870 if has("eval")
871 echo "yes"
872 else
873 echo "no"
874 endif
875enddef
876
877def HasNothing()
878 if has("nothing")
879 echo "yes"
880 else
881 echo "no"
882 endif
883enddef
884
885def HasSomething()
886 if has("nothing")
887 echo "nothing"
888 elseif has("something")
889 echo "something"
890 elseif has("eval")
891 echo "eval"
892 elseif has("less")
893 echo "less"
894 endif
895enddef
896
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100897def HasGuiRunning()
898 if has("gui_running")
899 echo "yes"
900 else
901 echo "no"
902 endif
903enddef
904
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100905def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200906 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200907 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200908 assert_match('HasEval\_s*' ..
909 'if has("eval")\_s*' ..
910 'echo "yes"\_s*' ..
911 '\d PUSHS "yes"\_s*' ..
912 '\d ECHO 1\_s*' ..
913 'else\_s*' ..
914 'echo "no"\_s*' ..
915 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200916 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100917 assert_notmatch('JUMP', instr)
918
Bram Moolenaard2c61702020-09-06 15:58:36 +0200919 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100920 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200921 assert_match('HasNothing\_s*' ..
922 'if has("nothing")\_s*' ..
923 'echo "yes"\_s*' ..
924 'else\_s*' ..
925 'echo "no"\_s*' ..
926 '\d PUSHS "no"\_s*' ..
927 '\d ECHO 1\_s*' ..
928 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200929 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100930 assert_notmatch('PUSHS "yes"', instr)
931 assert_notmatch('JUMP', instr)
932
Bram Moolenaard2c61702020-09-06 15:58:36 +0200933 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100934 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200935 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200936 'if has("nothing")\_s*' ..
937 'echo "nothing"\_s*' ..
938 'elseif has("something")\_s*' ..
939 'echo "something"\_s*' ..
940 'elseif has("eval")\_s*' ..
941 'echo "eval"\_s*' ..
942 '\d PUSHS "eval"\_s*' ..
943 '\d ECHO 1\_s*' ..
944 'elseif has("less").*' ..
945 'echo "less"\_s*' ..
946 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200947 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100948 assert_notmatch('PUSHS "nothing"', instr)
949 assert_notmatch('PUSHS "something"', instr)
950 assert_notmatch('PUSHS "less"', instr)
951 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100952
953 var result: string
954 var instr_expected: string
955 if has('gui')
956 if has('gui_running')
957 # GUI already running, always returns "yes"
958 result = "\nyes"
959 instr_expected = 'HasGuiRunning.*' ..
960 'if has("gui_running")\_s*' ..
961 ' echo "yes"\_s*' ..
962 '\d PUSHS "yes"\_s*' ..
963 '\d ECHO 1\_s*' ..
964 'else\_s*' ..
965 ' echo "no"\_s*' ..
966 'endif'
967 else
968 result = "\nno"
969 if has('unix')
970 # GUI not running but can start later, call has()
971 instr_expected = 'HasGuiRunning.*' ..
972 'if has("gui_running")\_s*' ..
973 '\d PUSHS "gui_running"\_s*' ..
974 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200975 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100976 '\d JUMP_IF_FALSE -> \d\_s*' ..
977 ' echo "yes"\_s*' ..
978 '\d PUSHS "yes"\_s*' ..
979 '\d ECHO 1\_s*' ..
980 'else\_s*' ..
981 '\d JUMP -> \d\_s*' ..
982 ' echo "no"\_s*' ..
983 '\d PUSHS "no"\_s*' ..
984 '\d ECHO 1\_s*' ..
985 'endif'
986 else
987 # GUI not running, always return "no"
988 instr_expected = 'HasGuiRunning.*' ..
989 'if has("gui_running")\_s*' ..
990 ' echo "yes"\_s*' ..
991 'else\_s*' ..
992 ' echo "no"\_s*' ..
993 '\d PUSHS "no"\_s*' ..
994 '\d ECHO 1\_s*' ..
995 'endif'
996 endif
997 endif
998 else
999 # GUI not supported, always return "no"
1000 result = "\nno"
1001 instr_expected = 'HasGuiRunning.*' ..
1002 'if has("gui_running")\_s*' ..
1003 ' echo "yes"\_s*' ..
1004 'else\_s*' ..
1005 ' echo "no"\_s*' ..
1006 '\d PUSHS "no"\_s*' ..
1007 '\d ECHO 1\_s*' ..
1008 'endif'
1009 endif
1010
1011 assert_equal(result, execute('HasGuiRunning()'))
1012 instr = execute('disassemble HasGuiRunning')
1013 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001014enddef
1015
Bram Moolenaarefd88552020-06-18 20:50:10 +02001016def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001017 if 1 < 0
1018 return "maybe"
1019 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001020 if g:cond
1021 return "yes"
1022 else
1023 return "no"
1024 endif
1025enddef
1026
1027def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001028 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001029 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001030 'if 1 < 0\_s*' ..
1031 ' return "maybe"\_s*' ..
1032 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001033 'if g:cond\_s*' ..
1034 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001035 '1 COND2BOOL\_s*' ..
1036 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001037 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001038 '3 PUSHS "yes"\_s*' ..
1039 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001040 'else\_s*' ..
1041 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001042 '5 PUSHS "no"\_s*' ..
1043 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001044 instr)
1045enddef
1046
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001047def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001048 var Funky1: func
1049 var Funky2: func = function("len")
1050 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001051enddef
1052
1053def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001054 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001055 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001056 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001057 '0 PUSHFUNC "\[none]"\_s*' ..
1058 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001059 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001060 '2 PUSHS "len"\_s*' ..
1061 '3 BCALL function(argc 1)\_s*' ..
1062 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001063 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001064 '\d PUSHS "UserFunc"\_s*' ..
1065 '\d BCALL funcref(argc 1)\_s*' ..
1066 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001067 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001068 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001069enddef
1070
1071if has('channel')
1072 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001073 var job1: job
1074 var job2: job = job_start("donothing")
1075 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001076 enddef
1077endif
1078
1079def Test_disassemble_channel()
1080 CheckFeature channel
1081
Bram Moolenaarac564082020-09-27 19:05:33 +02001082 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001083 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001084 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001085 '\d PUSHJOB "no process"\_s*' ..
1086 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001087 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001088 '\d PUSHS "donothing"\_s*' ..
1089 '\d BCALL job_start(argc 1)\_s*' ..
1090 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001091 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001092 '\d PUSHCHANNEL 0\_s*' ..
1093 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001094 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001095 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001096enddef
1097
Bram Moolenaar777770f2020-02-06 21:27:08 +01001098def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001099 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001100 return F("x")
1101enddef
1102
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001103def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001104 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001105 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001106 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001107 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001108 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001109 '\d STORE $0\_s*' ..
1110 'return F("x")\_s*' ..
1111 '\d PUSHS "x"\_s*' ..
1112 '\d LOAD $0\_s*' ..
1113 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001114 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001115 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001116
Bram Moolenaarac564082020-09-27 19:05:33 +02001117 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001118 instr = execute('disassemble ' .. name)
1119 assert_match('<lambda>\d\+\_s*' ..
1120 'return "X" .. a .. "X"\_s*' ..
1121 '\d PUSHS "X"\_s*' ..
1122 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001123 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001124 '\d CONCAT\_s*' ..
1125 '\d PUSHS "X"\_s*' ..
1126 '\d CONCAT\_s*' ..
1127 '\d RETURN',
1128 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001129enddef
1130
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001131def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001132 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001133 return Ref(g:value)
1134enddef
1135
1136def Test_disassemble_lambda_with_type()
1137 g:value = 5
1138 assert_equal(15, LambdaWithType())
1139 var instr = execute('disassemble LambdaWithType')
1140 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001141 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001142 '\d FUNCREF <lambda>\d\+\_s*' ..
1143 '\d STORE $0\_s*' ..
1144 'return Ref(g:value)\_s*' ..
1145 '\d LOADG g:value\_s*' ..
1146 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001147 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001148 '\d PCALL (argc 1)\_s*' ..
1149 '\d RETURN',
1150 instr)
1151enddef
1152
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001153def NestedOuter()
1154 def g:Inner()
1155 echomsg "inner"
1156 enddef
1157enddef
1158
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001159def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001160 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001161 assert_match('NestedOuter\_s*' ..
1162 'def g:Inner()\_s*' ..
1163 'echomsg "inner"\_s*' ..
1164 'enddef\_s*' ..
1165 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001166 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001167 instr)
1168enddef
1169
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001170def NestedDefList()
1171 def
1172 def Info
1173 def /Info
1174 def /Info/
1175enddef
1176
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001177def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001178 var instr = execute('disassemble NestedDefList')
1179 assert_match('NestedDefList\_s*' ..
1180 'def\_s*' ..
1181 '\d DEF \_s*' ..
1182 'def Info\_s*' ..
1183 '\d DEF Info\_s*' ..
1184 'def /Info\_s*' ..
1185 '\d DEF /Info\_s*' ..
1186 'def /Info/\_s*' ..
1187 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001188 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001189 instr)
1190enddef
1191
Bram Moolenaar6e949782020-04-13 17:21:00 +02001192def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001193 if arg == 1 && arg != 2 || arg == 4
1194 return 'yes'
1195 endif
1196 return 'no'
1197enddef
1198
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001199def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001200 assert_equal("yes", AndOr(1))
1201 assert_equal("no", AndOr(2))
1202 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001203 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001204 assert_match('AndOr\_s*' ..
1205 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1206 '\d LOAD arg\[-1]\_s*' ..
1207 '\d PUSHNR 1\_s*' ..
1208 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001209 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001210 '\d LOAD arg\[-1]\_s*' ..
1211 '\d PUSHNR 2\_s*' ..
1212 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001213 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001214 '\d LOAD arg\[-1]\_s*' ..
1215 '\d\+ PUSHNR 4\_s*' ..
1216 '\d\+ COMPAREANY ==\_s*' ..
1217 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001218 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001219enddef
1220
Bram Moolenaar04d05222020-02-06 22:06:54 +01001221def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001222 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001223 for i in range(3)
1224 res->add(i)
1225 endfor
1226 return res
1227enddef
1228
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001229def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001230 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001231 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001232 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001233 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001234 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001235 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001236 '\d STORE $0\_s*' ..
1237 'for i in range(3)\_s*' ..
1238 '\d STORE -1 in $1\_s*' ..
1239 '\d PUSHNR 3\_s*' ..
1240 '\d BCALL range(argc 1)\_s*' ..
1241 '\d FOR $1 -> \d\+\_s*' ..
1242 '\d STORE $2\_s*' ..
1243 'res->add(i)\_s*' ..
1244 '\d LOAD $0\_s*' ..
1245 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001246 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001247 '\d\+ DROP\_s*' ..
1248 'endfor\_s*' ..
1249 '\d\+ JUMP -> \d\+\_s*' ..
1250 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001251 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001252enddef
1253
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001254def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001255 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001256 for str in eval('["one", "two"]')
1257 res ..= str
1258 endfor
1259 return res
1260enddef
1261
1262def Test_disassemble_for_loop_eval()
1263 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001264 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001265 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001266 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001267 '\d PUSHS ""\_s*' ..
1268 '\d STORE $0\_s*' ..
1269 'for str in eval(''\["one", "two"\]'')\_s*' ..
1270 '\d STORE -1 in $1\_s*' ..
1271 '\d PUSHS "\["one", "two"\]"\_s*' ..
1272 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001273 '\d FOR $1 -> \d\+\_s*' ..
1274 '\d STORE $2\_s*' ..
1275 'res ..= str\_s*' ..
1276 '\d\+ LOAD $0\_s*' ..
1277 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001278 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001279 '\d\+ CONCAT\_s*' ..
1280 '\d\+ STORE $0\_s*' ..
1281 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001282 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001283 '\d\+ DROP\_s*' ..
1284 'return res\_s*' ..
1285 '\d\+ LOAD $0\_s*' ..
1286 '\d\+ RETURN',
1287 instr)
1288enddef
1289
Bram Moolenaar792f7862020-11-23 08:31:18 +01001290def ForLoopUnpack()
1291 for [x1, x2] in [[1, 2], [3, 4]]
1292 echo x1 x2
1293 endfor
1294enddef
1295
1296def Test_disassemble_for_loop_unpack()
1297 var instr = execute('disassemble ForLoopUnpack')
1298 assert_match('ForLoopUnpack\_s*' ..
1299 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1300 '\d\+ STORE -1 in $0\_s*' ..
1301 '\d\+ PUSHNR 1\_s*' ..
1302 '\d\+ PUSHNR 2\_s*' ..
1303 '\d\+ NEWLIST size 2\_s*' ..
1304 '\d\+ PUSHNR 3\_s*' ..
1305 '\d\+ PUSHNR 4\_s*' ..
1306 '\d\+ NEWLIST size 2\_s*' ..
1307 '\d\+ NEWLIST size 2\_s*' ..
1308 '\d\+ FOR $0 -> 16\_s*' ..
1309 '\d\+ UNPACK 2\_s*' ..
1310 '\d\+ STORE $1\_s*' ..
1311 '\d\+ STORE $2\_s*' ..
1312 'echo x1 x2\_s*' ..
1313 '\d\+ LOAD $1\_s*' ..
1314 '\d\+ LOAD $2\_s*' ..
1315 '\d\+ ECHO 2\_s*' ..
1316 'endfor\_s*' ..
1317 '\d\+ JUMP -> 8\_s*' ..
1318 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001319 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001320 instr)
1321enddef
1322
Bram Moolenaarc150c092021-02-13 15:02:46 +01001323def ForLoopContinue()
1324 for nr in [1, 2]
1325 try
1326 echo "ok"
1327 try
1328 echo "deeper"
1329 catch
1330 continue
1331 endtry
1332 catch
1333 echo "not ok"
1334 endtry
1335 endfor
1336enddef
1337
1338def Test_disassemble_for_loop_continue()
1339 var instr = execute('disassemble ForLoopContinue')
1340 assert_match('ForLoopContinue\_s*' ..
1341 'for nr in \[1, 2]\_s*' ..
1342 '0 STORE -1 in $0\_s*' ..
1343 '1 PUSHNR 1\_s*' ..
1344 '2 PUSHNR 2\_s*' ..
1345 '3 NEWLIST size 2\_s*' ..
1346 '4 FOR $0 -> 22\_s*' ..
1347 '5 STORE $1\_s*' ..
1348 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001349 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001350 'echo "ok"\_s*' ..
1351 '7 PUSHS "ok"\_s*' ..
1352 '8 ECHO 1\_s*' ..
1353 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001354 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001355 'echo "deeper"\_s*' ..
1356 '10 PUSHS "deeper"\_s*' ..
1357 '11 ECHO 1\_s*' ..
1358 'catch\_s*' ..
1359 '12 JUMP -> 15\_s*' ..
1360 '13 CATCH\_s*' ..
1361 'continue\_s*' ..
1362 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1363 'endtry\_s*' ..
1364 '15 ENDTRY\_s*' ..
1365 'catch\_s*' ..
1366 '16 JUMP -> 20\_s*' ..
1367 '17 CATCH\_s*' ..
1368 'echo "not ok"\_s*' ..
1369 '18 PUSHS "not ok"\_s*' ..
1370 '19 ECHO 1\_s*' ..
1371 'endtry\_s*' ..
1372 '20 ENDTRY\_s*' ..
1373 'endfor\_s*' ..
1374 '21 JUMP -> 4\_s*' ..
1375 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001376 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001377 instr)
1378enddef
1379
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001380let g:number = 42
1381
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001382def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001383 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001384enddef
1385
1386def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001387 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001388 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001389 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001390 '\d PUSHNR 23\_s*' ..
1391 '\d LOADG g:number\_s*' ..
1392 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1393 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001394 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001395 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001396 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001397 instr)
1398enddef
1399
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001400def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001401 var nr = 3
1402 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001403 nrres = nr - 7
1404 nrres = nr * 7
1405 nrres = nr / 7
1406 nrres = nr % 7
1407
Bram Moolenaarac564082020-09-27 19:05:33 +02001408 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001409 anyres = g:number - 7
1410 anyres = g:number * 7
1411 anyres = g:number / 7
1412 anyres = g:number % 7
1413
1414 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001415 var fl = 3.0
1416 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001417 flres = fl - 7.0
1418 flres = fl * 7.0
1419 flres = fl / 7.0
1420 endif
1421enddef
1422
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001423def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001424 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001425 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001426 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001427 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001428 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001429 '\d LOAD $0.*' ..
1430 '\d PUSHNR 7.*' ..
1431 '\d OPNR +.*' ..
1432 '\d STORE $1.*' ..
1433 'nrres = nr - 7.*' ..
1434 '\d OPNR -.*' ..
1435 'nrres = nr \* 7.*' ..
1436 '\d OPNR \*.*' ..
1437 'nrres = nr / 7.*' ..
1438 '\d OPNR /.*' ..
1439 'nrres = nr % 7.*' ..
1440 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001441 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001442 '\d LOADG g:number.*' ..
1443 '\d PUSHNR 7.*' ..
1444 '\d OPANY +.*' ..
1445 '\d STORE $2.*' ..
1446 'anyres = g:number - 7.*' ..
1447 '\d OPANY -.*' ..
1448 'anyres = g:number \* 7.*' ..
1449 '\d OPANY \*.*' ..
1450 'anyres = g:number / 7.*' ..
1451 '\d OPANY /.*' ..
1452 'anyres = g:number % 7.*' ..
1453 '\d OPANY %.*',
1454 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001455 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001456 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001457 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001458 '\d PUSHF 3.0.*' ..
1459 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001460 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001461 '\d LOAD $3.*' ..
1462 '\d PUSHF 7.0.*' ..
1463 '\d OPFLOAT +.*' ..
1464 '\d STORE $4.*' ..
1465 'flres = fl - 7.0.*' ..
1466 '\d OPFLOAT -.*' ..
1467 'flres = fl \* 7.0.*' ..
1468 '\d OPFLOAT \*.*' ..
1469 'flres = fl / 7.0.*' ..
1470 '\d OPFLOAT /.*',
1471 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001472 endif
1473enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001474
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001475def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001476 var reslist = [1, 2] + [3, 4]
1477 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001478enddef
1479
1480def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001481 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001482 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001483 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001484 '\d PUSHNR 1.*' ..
1485 '\d PUSHNR 2.*' ..
1486 '\d NEWLIST size 2.*' ..
1487 '\d PUSHNR 3.*' ..
1488 '\d PUSHNR 4.*' ..
1489 '\d NEWLIST size 2.*' ..
1490 '\d ADDLIST.*' ..
1491 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001492 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001493 '\d PUSHBLOB 0z1122.*' ..
1494 '\d PUSHBLOB 0z3344.*' ..
1495 '\d ADDBLOB.*' ..
1496 '\d STORE $.*',
1497 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001498enddef
1499
1500let g:aa = 'aa'
1501def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001502 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001503 return res
1504enddef
1505
1506def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001507 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001508 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001509 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001510 '\d LOADG g:aa.*' ..
1511 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001512 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001513 '\d CONCAT.*' ..
1514 '\d STORE $.*',
1515 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001516 assert_equal('aabb', ConcatString())
1517enddef
1518
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001519def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001520 var s = "abcd"
1521 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001522 return res
1523enddef
1524
1525def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001526 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001527 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001528 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001529 '\d PUSHS "abcd"\_s*' ..
1530 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001531 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001532 '\d LOAD $0\_s*' ..
1533 '\d PUSHNR 1\_s*' ..
1534 '\d STRINDEX\_s*' ..
1535 '\d STORE $1\_s*',
1536 instr)
1537 assert_equal('b', StringIndex())
1538enddef
1539
Bram Moolenaared591872020-08-15 22:14:53 +02001540def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001541 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001542 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001543 return res
1544enddef
1545
1546def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001547 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001548 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001549 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001550 '\d PUSHS "abcd"\_s*' ..
1551 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001552 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001553 '\d LOAD $0\_s*' ..
1554 '\d PUSHNR 1\_s*' ..
1555 '\d PUSHNR 8\_s*' ..
1556 '\d STRSLICE\_s*' ..
1557 '\d STORE $1\_s*',
1558 instr)
1559 assert_equal('bcd', StringSlice())
1560enddef
1561
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001562def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001563 var l = [1, 2, 3]
1564 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001565 return res
1566enddef
1567
1568def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001569 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001570 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001571 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001572 '\d PUSHNR 1\_s*' ..
1573 '\d PUSHNR 2\_s*' ..
1574 '\d PUSHNR 3\_s*' ..
1575 '\d NEWLIST size 3\_s*' ..
1576 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001577 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001578 '\d LOAD $0\_s*' ..
1579 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001580 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001581 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001582 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001583 assert_equal(2, ListIndex())
1584enddef
1585
Bram Moolenaared591872020-08-15 22:14:53 +02001586def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001587 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001588 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001589 return res
1590enddef
1591
1592def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001593 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001594 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001595 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001596 '\d PUSHNR 1\_s*' ..
1597 '\d PUSHNR 2\_s*' ..
1598 '\d PUSHNR 3\_s*' ..
1599 '\d NEWLIST size 3\_s*' ..
1600 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001601 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001602 '\d LOAD $0\_s*' ..
1603 '\d PUSHNR 1\_s*' ..
1604 '\d PUSHNR 8\_s*' ..
1605 '\d LISTSLICE\_s*' ..
1606 '\d STORE $1\_s*',
1607 instr)
1608 assert_equal([2, 3], ListSlice())
1609enddef
1610
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001611def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001612 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001613 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001614 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001615 return res
1616enddef
1617
1618def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001619 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001620 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001621 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001622 '\d PUSHS "item"\_s*' ..
1623 '\d PUSHNR 1\_s*' ..
1624 '\d NEWDICT size 1\_s*' ..
1625 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001626 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001627 '\d\+ LOAD $0\_s*' ..
1628 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001629 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001630 '\d\+ STORE $1\_s*' ..
1631 'res = d\["item"\]\_s*' ..
1632 '\d\+ LOAD $0\_s*' ..
1633 '\d\+ PUSHS "item"\_s*' ..
1634 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001635 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001636 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001637 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001638 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001639enddef
1640
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001641let somelist = [1, 2, 3, 4, 5]
1642def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001643 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001644 return res
1645enddef
1646
1647def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001648 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001649 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001650 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001651 '\d LOADG g:somelist\_s*' ..
1652 '\d PUSHNR 2\_s*' ..
1653 '\d ANYINDEX\_s*' ..
1654 '\d STORE $0\_s*' ..
1655 'return res\_s*' ..
1656 '\d LOAD $0\_s*' ..
1657 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1658 '\d RETURN',
1659 instr)
1660 assert_equal(3, AnyIndex())
1661enddef
1662
1663def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001664 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001665 return res
1666enddef
1667
1668def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001669 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001670 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001671 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001672 '\d LOADG g:somelist\_s*' ..
1673 '\d PUSHNR 1\_s*' ..
1674 '\d PUSHNR 3\_s*' ..
1675 '\d ANYSLICE\_s*' ..
1676 '\d STORE $0\_s*' ..
1677 'return res\_s*' ..
1678 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001679 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001680 '\d RETURN',
1681 instr)
1682 assert_equal([2, 3, 4], AnySlice())
1683enddef
1684
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001685def NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001686 g:nr = 9
1687 var plus = +g:nr
1688 var minus = -g:nr
1689 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001690enddef
1691
1692def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001693 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001694 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001695 'g:nr = 9\_s*' ..
1696 '\d PUSHNR 9\_s*' ..
1697 '\d STOREG g:nr\_s*' ..
1698 'var plus = +g:nr\_s*' ..
1699 '\d LOADG g:nr\_s*' ..
1700 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1701 '\d STORE $0\_s*' ..
1702 'var minus = -g:nr\_s*' ..
1703 '\d LOADG g:nr\_s*' ..
1704 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001705 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001706 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001707 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001708 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001709enddef
1710
1711def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001712 var flag = true
1713 var invert = !flag
1714 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001715 return res
1716enddef
1717
1718def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001719 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001720 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001722 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001723 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001724 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001725 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001726 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001727 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001728 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001729 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001730 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001731 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001732 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001733 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001734enddef
1735
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001736def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001737 var name: bool = 1 && 0 || 1
1738 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001739enddef
1740
1741def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001742 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001743 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001744 'var name: bool = 1 && 0 || 1\_s*' ..
1745 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001746 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001747 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1748 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001749 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001750 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1751 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001752 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001753 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001754 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001755 '\d\+ LOAD $0\_s*' ..
1756 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001757 instr)
1758 assert_equal(true, InvertBool())
1759enddef
1760
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001761def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001762 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001763 ['true == isFalse', 'COMPAREBOOL =='],
1764 ['true != isFalse', 'COMPAREBOOL !='],
1765 ['v:none == isNull', 'COMPARESPECIAL =='],
1766 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001767
Bram Moolenaara5565e42020-05-09 15:44:01 +02001768 ['111 == aNumber', 'COMPARENR =='],
1769 ['111 != aNumber', 'COMPARENR !='],
1770 ['111 > aNumber', 'COMPARENR >'],
1771 ['111 < aNumber', 'COMPARENR <'],
1772 ['111 >= aNumber', 'COMPARENR >='],
1773 ['111 <= aNumber', 'COMPARENR <='],
1774 ['111 =~ aNumber', 'COMPARENR =\~'],
1775 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001776
Bram Moolenaara5565e42020-05-09 15:44:01 +02001777 ['"xx" != aString', 'COMPARESTRING !='],
1778 ['"xx" > aString', 'COMPARESTRING >'],
1779 ['"xx" < aString', 'COMPARESTRING <'],
1780 ['"xx" >= aString', 'COMPARESTRING >='],
1781 ['"xx" <= aString', 'COMPARESTRING <='],
1782 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1783 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1784 ['"xx" is aString', 'COMPARESTRING is'],
1785 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001786
Bram Moolenaara5565e42020-05-09 15:44:01 +02001787 ['0z11 == aBlob', 'COMPAREBLOB =='],
1788 ['0z11 != aBlob', 'COMPAREBLOB !='],
1789 ['0z11 is aBlob', 'COMPAREBLOB is'],
1790 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001791
Bram Moolenaara5565e42020-05-09 15:44:01 +02001792 ['[1, 2] == aList', 'COMPARELIST =='],
1793 ['[1, 2] != aList', 'COMPARELIST !='],
1794 ['[1, 2] is aList', 'COMPARELIST is'],
1795 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001796
Bram Moolenaare0de1712020-12-02 17:36:54 +01001797 ['{a: 1} == aDict', 'COMPAREDICT =='],
1798 ['{a: 1} != aDict', 'COMPAREDICT !='],
1799 ['{a: 1} is aDict', 'COMPAREDICT is'],
1800 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001801
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001802 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1803 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1804 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1805 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001806
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 <= g:xx', 'COMPAREANY <='],
1813 ['77 =~ g:xx', 'COMPAREANY =\~'],
1814 ['77 !~ g:xx', 'COMPAREANY !\~'],
1815 ['77 is g:xx', 'COMPAREANY is'],
1816 ['77 isnot g:xx', 'COMPAREANY isnot'],
1817 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001818 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001819 if has('float')
1820 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001821 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1822 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1823 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1824 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1825 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1826 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1827 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1828 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001829 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001830 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001831 endif
1832
Bram Moolenaarac564082020-09-27 19:05:33 +02001833 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001834 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001835 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001836 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001837 ' var isFalse = false',
1838 ' var isNull = v:null',
1839 ' var aNumber = 222',
1840 ' var aString = "yy"',
1841 ' var aBlob = 0z22',
1842 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001843 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001844 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001845 ' if ' .. case[0],
1846 ' echo 42'
1847 ' endif',
1848 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001849 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001850 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001851 assert_match('TestCase' .. nr .. '.*' ..
1852 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1853 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001854 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001855 '\d ' .. case[1] .. '.*' ..
1856 '\d JUMP_IF_FALSE -> \d\+.*',
1857 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001858
1859 nr += 1
1860 endfor
1861
Bram Moolenaar22da5592020-03-19 14:52:20 +01001862 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001863enddef
1864
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001865def s:FalsyOp()
1866 echo g:flag ?? "yes"
1867 echo [] ?? "empty list"
1868 echo "" ?? "empty string"
1869enddef
1870
1871def Test_dsassemble_falsy_op()
1872 var res = execute('disass s:FalsyOp')
1873 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1874 'echo g:flag ?? "yes"\_s*' ..
1875 '0 LOADG g:flag\_s*' ..
1876 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1877 '2 PUSHS "yes"\_s*' ..
1878 '3 ECHO 1\_s*' ..
1879 'echo \[\] ?? "empty list"\_s*' ..
1880 '4 NEWLIST size 0\_s*' ..
1881 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1882 '6 PUSHS "empty list"\_s*' ..
1883 '7 ECHO 1\_s*' ..
1884 'echo "" ?? "empty string"\_s*' ..
1885 '\d\+ PUSHS "empty string"\_s*' ..
1886 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001887 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001888 res)
1889enddef
1890
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001891def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001892 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001893 ['"xx" == "yy"', false],
1894 ['"aa" == "aa"', true],
1895 ['has("eval") ? true : false', true],
1896 ['has("asdf") ? true : false', false],
1897 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001898
Bram Moolenaarac564082020-09-27 19:05:33 +02001899 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001900 for case in cases
1901 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001902 ' if ' .. case[0],
1903 ' echo 42'
1904 ' endif',
1905 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001906 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001907 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001908 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001909 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001910 assert_match('TestCase' .. nr .. '.*' ..
1911 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1912 '\d PUSHNR 42.*' ..
1913 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001914 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001915 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001916 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001917 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001918 assert_match('TestCase' .. nr .. '.*' ..
1919 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1920 'echo 42[ \n]*' ..
1921 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001922 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001923 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001924 endif
1925
1926 nr += 1
1927 endfor
1928
1929 delete('Xdisassemble')
1930enddef
1931
Bram Moolenaarad39c092020-02-26 18:23:43 +01001932def s:Execute()
1933 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001934 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001935 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001936 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001937 execute 'help ' .. tag
1938enddef
1939
1940def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001941 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001942 assert_match('\<SNR>\d*_Execute\_s*' ..
1943 "execute 'help vim9.txt'\\_s*" ..
1944 '\d PUSHS "help vim9.txt"\_s*' ..
1945 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001946 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001947 '\d PUSHS "help vim9.txt"\_s*' ..
1948 '\d STORE $0\_s*' ..
1949 'execute cmd\_s*' ..
1950 '\d LOAD $0\_s*' ..
1951 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001952 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001953 '\d PUSHS "vim9.txt"\_s*' ..
1954 '\d STORE $1\_s*' ..
1955 "execute 'help ' .. tag\\_s*" ..
1956 '\d\+ PUSHS "help "\_s*' ..
1957 '\d\+ LOAD $1\_s*' ..
1958 '\d\+ CONCAT\_s*' ..
1959 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001960 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001961 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001962enddef
1963
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001964def s:Echomsg()
1965 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02001966 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001967 echoerr 'went' .. 'wrong'
1968enddef
1969
1970def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001971 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001972 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1973 "echomsg 'some' 'message'\\_s*" ..
1974 '\d PUSHS "some"\_s*' ..
1975 '\d PUSHS "message"\_s*' ..
1976 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02001977 "echoconsole 'nothing'\\_s*" ..
1978 '\d PUSHS "nothing"\_s*' ..
1979 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001980 "echoerr 'went' .. 'wrong'\\_s*" ..
1981 '\d PUSHS "wentwrong"\_s*' ..
1982 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001983 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001984 res)
1985enddef
1986
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001987def SomeStringArg(arg: string)
1988 echo arg
1989enddef
1990
1991def SomeAnyArg(arg: any)
1992 echo arg
1993enddef
1994
1995def SomeStringArgAndReturn(arg: string): string
1996 return arg
1997enddef
1998
1999def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002000 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002001 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2002 '\d *echo arg.*' ..
2003 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002004 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002005
Bram Moolenaarac564082020-09-27 19:05:33 +02002006 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002007 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2008 '\d *echo arg\_s*' ..
2009 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002010 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002011
Bram Moolenaarac564082020-09-27 19:05:33 +02002012 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002013 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2014 '\d *return arg\_s*' ..
2015 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002016 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002017enddef
2018
Bram Moolenaar09689a02020-05-09 22:50:08 +02002019def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002020 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002021 vim9script
2022 def FuncOne(): string
2023 return FuncTwo()
2024 enddef
2025 def FuncTwo(): string
2026 return 'two'
2027 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002028 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002029 END
2030 writefile(lines, 'Xdisassemble')
2031 source Xdisassemble
2032
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002033 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002034 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2035 'return FuncTwo()\_s*' ..
2036 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002037 '\d RETURN',
2038 g:res_FuncOne)
2039
2040 delete('Xdisassemble')
2041 unlet g:res_FuncOne
2042enddef
2043
Bram Moolenaar61a89812020-05-07 16:58:17 +02002044def s:ConcatStrings(): string
2045 return 'one' .. 'two' .. 'three'
2046enddef
2047
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002048def s:ComputeConst(): number
2049 return 2 + 3 * 4 / 6 + 7
2050enddef
2051
Bram Moolenaar1c747212020-05-09 18:28:34 +02002052def s:ComputeConstParen(): number
2053 return ((2 + 4) * (8 / 2)) / (3 + 4)
2054enddef
2055
Bram Moolenaar61a89812020-05-07 16:58:17 +02002056def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002057 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002058 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2059 "return 'one' .. 'two' .. 'three'\\_s*" ..
2060 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002061 '\d RETURN',
2062 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002063
2064 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002065 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2066 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2067 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002068 '\d RETURN',
2069 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002070
2071 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002072 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2073 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2074 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002075 '\d RETURN',
2076 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002077enddef
2078
Bram Moolenaar389df252020-07-09 21:20:47 +02002079def s:CallAppend()
2080 eval "some text"->append(2)
2081enddef
2082
2083def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002084 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002085 assert_match('<SNR>\d*_CallAppend\_s*' ..
2086 'eval "some text"->append(2)\_s*' ..
2087 '\d PUSHS "some text"\_s*' ..
2088 '\d PUSHNR 2\_s*' ..
2089 '\d SHUFFLE 2 up 1\_s*' ..
2090 '\d BCALL append(argc 2)\_s*' ..
2091 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002092 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002093 res)
2094enddef
2095
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002096
2097def s:SilentMessage()
2098 silent echomsg "text"
2099 silent! echoerr "error"
2100enddef
2101
2102def Test_silent()
2103 var res = execute('disass s:SilentMessage')
2104 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2105 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002106 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002107 '\d PUSHS "text"\_s*' ..
2108 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002109 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002110 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002111 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002112 '\d PUSHS "error"\_s*' ..
2113 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002114 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002115 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002116 res)
2117enddef
2118
2119def s:SilentIf()
2120 silent if 4 == g:five
2121 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002122 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002123enddef
2124
2125def Test_silent_if()
2126 var res = execute('disass s:SilentIf')
2127 assert_match('<SNR>\d*_SilentIf\_s*' ..
2128 'silent if 4 == g:five\_s*' ..
2129 '\d\+ CMDMOD silent\_s*' ..
2130 '\d\+ PUSHNR 4\_s*' ..
2131 '\d\+ LOADG g:five\_s*' ..
2132 '\d\+ COMPAREANY ==\_s*' ..
2133 '\d\+ CMDMOD_REV\_s*' ..
2134 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2135 'silent elseif 4 == g:five\_s*' ..
2136 '\d\+ JUMP -> \d\+\_s*' ..
2137 '\d\+ CMDMOD silent\_s*' ..
2138 '\d\+ PUSHNR 4\_s*' ..
2139 '\d\+ LOADG g:five\_s*' ..
2140 '\d\+ COMPAREANY ==\_s*' ..
2141 '\d\+ CMDMOD_REV\_s*' ..
2142 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002143 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002144 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002145 res)
2146enddef
2147
2148def s:SilentFor()
2149 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002150 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002151enddef
2152
2153def Test_silent_for()
2154 var res = execute('disass s:SilentFor')
2155 assert_match('<SNR>\d*_SilentFor\_s*' ..
2156 'silent for i in \[0\]\_s*' ..
2157 '\d CMDMOD silent\_s*' ..
2158 '\d STORE -1 in $0\_s*' ..
2159 '\d PUSHNR 0\_s*' ..
2160 '\d NEWLIST size 1\_s*' ..
2161 '\d CMDMOD_REV\_s*' ..
2162 '5 FOR $0 -> 8\_s*' ..
2163 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002164 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002165 '\d JUMP -> 5\_s*' ..
2166 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002167 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002168 res)
2169enddef
2170
2171def s:SilentWhile()
2172 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002173 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002174enddef
2175
2176def Test_silent_while()
2177 var res = execute('disass s:SilentWhile')
2178 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2179 'silent while g:not\_s*' ..
2180 '0 CMDMOD silent\_s*' ..
2181 '\d LOADG g:not\_s*' ..
2182 '\d COND2BOOL\_s*' ..
2183 '\d CMDMOD_REV\_s*' ..
2184 '\d JUMP_IF_FALSE -> 6\_s*' ..
2185
Bram Moolenaarfa984412021-03-25 22:15:28 +01002186 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002187 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002188 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002189 res)
2190enddef
2191
2192def s:SilentReturn(): string
2193 silent return "done"
2194enddef
2195
2196def Test_silent_return()
2197 var res = execute('disass s:SilentReturn')
2198 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2199 'silent return "done"\_s*' ..
2200 '\d CMDMOD silent\_s*' ..
2201 '\d PUSHS "done"\_s*' ..
2202 '\d CMDMOD_REV\_s*' ..
2203 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002204 res)
2205enddef
2206
Bram Moolenaarb2049902021-01-24 12:53:53 +01002207def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002208 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002209 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002210 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002211 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002212 return "done"
2213enddef
2214
2215def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002216 if !has('profile')
2217 MissingFeature 'profile'
2218 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002219 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002220 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002221 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002222 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002223 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002224 '\d PUSHS "profiled"\_s*' ..
2225 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002226 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002227 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002228 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002229 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002230 '\d PUSHS "some text"\_s*' ..
2231 '\d STORE $0\_s*' ..
2232 'return "done"\_s*' ..
2233 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002234 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002235 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002236 '\d\+ RETURN\_s*' ..
2237 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002238 res)
2239enddef
2240
Bram Moolenaare99d4222021-06-13 14:01:26 +02002241def Test_debugged()
2242 var res = execute('disass debug s:Profiled')
2243 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002244 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002245 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002246 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002247 '\d PUSHS "profiled"\_s*' ..
2248 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002249 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002250 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002251 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002252 '\d PUSHS "some text"\_s*' ..
2253 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002254 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002255 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002256 '\d PUSHS "done"\_s*' ..
2257 '\d RETURN\_s*',
2258 res)
2259enddef
2260
Bram Moolenaar093165c2021-08-22 13:35:31 +02002261def s:DebugElseif()
2262 var b = false
2263 if b
2264 eval 1 + 0
2265 silent elseif !b
2266 eval 2 + 0
2267 endif
2268enddef
2269
2270def Test_debug_elseif()
2271 var res = execute('disass debug s:DebugElseif')
2272 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2273 'var b = false\_s*' ..
2274 '0 DEBUG line 1-1 varcount 0\_s*' ..
2275 '1 PUSH false\_s*' ..
2276 '2 STORE $0\_s*' ..
2277
2278 'if b\_s*' ..
2279 '3 DEBUG line 2-2 varcount 1\_s*' ..
2280 '4 LOAD $0\_s*' ..
2281 '5 JUMP_IF_FALSE -> 10\_s*' ..
2282
2283 'eval 1 + 0\_s*' ..
2284 '6 DEBUG line 3-3 varcount 1\_s*' ..
2285 '7 PUSHNR 1\_s*' ..
2286 '8 DROP\_s*' ..
2287
2288 'silent elseif !b\_s*' ..
2289 '9 JUMP -> 20\_s*' ..
2290 '10 CMDMOD silent\_s*' ..
2291 '11 DEBUG line 4-4 varcount 1\_s*' ..
2292 '12 LOAD $0\_s*' ..
2293 '13 INVERT -1 (!val)\_s*' ..
2294 '14 CMDMOD_REV\_s*' ..
2295 '15 JUMP_IF_FALSE -> 20\_s*' ..
2296
2297 'eval 2 + 0\_s*' ..
2298 '16 DEBUG line 5-5 varcount 1\_s*' ..
2299 '17 PUSHNR 2\_s*' ..
2300 '18 DROP\_s*' ..
2301
2302 'endif\_s*' ..
2303 '19 DEBUG line 6-6 varcount 1\_s*' ..
2304 '20 RETURN void*',
2305 res)
2306enddef
2307
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002308func Legacy() dict
2309 echo 'legacy'
2310endfunc
2311
2312def s:UseMember()
2313 var d = {func: Legacy}
2314 var v = d.func()
2315enddef
2316
2317def Test_disassemble_dict_stack()
2318 var res = execute('disass s:UseMember')
2319 assert_match('<SNR>\d*_UseMember\_s*' ..
2320 'var d = {func: Legacy}\_s*' ..
2321 '\d PUSHS "func"\_s*' ..
2322 '\d PUSHFUNC "Legacy"\_s*' ..
2323 '\d NEWDICT size 1\_s*' ..
2324 '\d STORE $0\_s*' ..
2325
2326 'var v = d.func()\_s*' ..
2327 '\d LOAD $0\_s*' ..
2328 '\d MEMBER func\_s*' ..
2329 '\d PCALL top (argc 0)\_s*' ..
2330 '\d PCALL end\_s*' ..
2331 '\d CLEARDICT\_s*' ..
2332 '\d\+ STORE $1\_s*' ..
2333 '\d\+ RETURN void*',
2334 res)
2335enddef
2336
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002337def s:EchoMessages()
2338 echohl ErrorMsg | echom v:exception | echohl NONE
2339enddef
2340
2341def Test_disassemble_nextcmd()
2342 # splitting commands and removing trailing blanks should not change the line
2343 var res = execute('disass s:EchoMessages')
2344 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2345 'echohl ErrorMsg | echom v:exception | echohl NONE',
2346 res)
2347enddef
2348
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002349def Test_disassemble_after_reload()
2350 var lines =<< trim END
2351 vim9script
2352 if exists('g:ThisFunc')
2353 finish
2354 endif
2355 var name: any
2356 def g:ThisFunc(): number
2357 g:name = name
2358 return 0
2359 enddef
2360 def g:ThatFunc(): number
2361 name = g:name
2362 return 0
2363 enddef
2364 END
2365 lines->writefile('Xreload.vim')
2366
2367 source Xreload.vim
2368 g:ThisFunc()
2369 g:ThatFunc()
2370
2371 source Xreload.vim
2372 var res = execute('disass g:ThisFunc')
2373 assert_match('ThisFunc\_s*' ..
2374 'g:name = name\_s*' ..
2375 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2376 '\d STOREG g:name\_s*' ..
2377 'return 0\_s*' ..
2378 '\d PUSHNR 0\_s*' ..
2379 '\d RETURN\_s*',
2380 res)
2381
2382 res = execute('disass g:ThatFunc')
2383 assert_match('ThatFunc\_s*' ..
2384 'name = g:name\_s*' ..
2385 '\d LOADG g:name\_s*' ..
2386 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2387 'return 0\_s*' ..
2388 '\d PUSHNR 0\_s*' ..
2389 '\d RETURN\_s*',
2390 res)
2391
2392 delete('Xreload.vim')
2393 delfunc g:ThisFunc
2394 delfunc g:ThatFunc
2395enddef
2396
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002397
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002398
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002399" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker