blob: ba2d0a16ece045bf3e0f03aaa2495584f9526ca0 [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 Moolenaar1a7ee4d2021-09-16 16:15:07 +02001221def AndConstant(arg: any): string
1222 if true && arg
1223 return "yes"
1224 endif
1225 if false && arg
1226 return "never"
1227 endif
1228 return "no"
1229enddef
1230
1231def Test_disassemble_and_constant()
1232 assert_equal("yes", AndConstant(1))
1233 assert_equal("no", AndConstant(false))
1234 var instr = execute('disassemble AndConstant')
1235 assert_match('AndConstant\_s*' ..
1236 'if true && arg\_s*' ..
1237 '0 LOAD arg\[-1\]\_s*' ..
1238 '1 COND2BOOL\_s*' ..
1239 '2 JUMP_IF_FALSE -> 5\_s*' ..
1240 'return "yes"\_s*' ..
1241 '3 PUSHS "yes"\_s*' ..
1242 '4 RETURN\_s*' ..
1243 'endif\_s*' ..
1244 'if false && arg\_s*' ..
1245 'return "never"\_s*' ..
1246 'endif\_s*' ..
1247 'return "no"\_s*' ..
1248 '5 PUSHS "no"\_s*' ..
1249 '6 RETURN',
1250 instr)
1251enddef
1252
Bram Moolenaar04d05222020-02-06 22:06:54 +01001253def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001254 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001255 for i in range(3)
1256 res->add(i)
1257 endfor
1258 return res
1259enddef
1260
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001261def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001262 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001263 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001264 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001265 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001266 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001267 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001268 '\d STORE $0\_s*' ..
1269 'for i in range(3)\_s*' ..
1270 '\d STORE -1 in $1\_s*' ..
1271 '\d PUSHNR 3\_s*' ..
1272 '\d BCALL range(argc 1)\_s*' ..
1273 '\d FOR $1 -> \d\+\_s*' ..
1274 '\d STORE $2\_s*' ..
1275 'res->add(i)\_s*' ..
1276 '\d LOAD $0\_s*' ..
1277 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001278 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001279 '\d\+ DROP\_s*' ..
1280 'endfor\_s*' ..
1281 '\d\+ JUMP -> \d\+\_s*' ..
1282 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001283 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001284enddef
1285
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001286def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001287 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001288 for str in eval('["one", "two"]')
1289 res ..= str
1290 endfor
1291 return res
1292enddef
1293
1294def Test_disassemble_for_loop_eval()
1295 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001296 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001297 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001298 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001299 '\d PUSHS ""\_s*' ..
1300 '\d STORE $0\_s*' ..
1301 'for str in eval(''\["one", "two"\]'')\_s*' ..
1302 '\d STORE -1 in $1\_s*' ..
1303 '\d PUSHS "\["one", "two"\]"\_s*' ..
1304 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001305 '\d FOR $1 -> \d\+\_s*' ..
1306 '\d STORE $2\_s*' ..
1307 'res ..= str\_s*' ..
1308 '\d\+ LOAD $0\_s*' ..
1309 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001310 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001311 '\d\+ CONCAT\_s*' ..
1312 '\d\+ STORE $0\_s*' ..
1313 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001314 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001315 '\d\+ DROP\_s*' ..
1316 'return res\_s*' ..
1317 '\d\+ LOAD $0\_s*' ..
1318 '\d\+ RETURN',
1319 instr)
1320enddef
1321
Bram Moolenaar792f7862020-11-23 08:31:18 +01001322def ForLoopUnpack()
1323 for [x1, x2] in [[1, 2], [3, 4]]
1324 echo x1 x2
1325 endfor
1326enddef
1327
1328def Test_disassemble_for_loop_unpack()
1329 var instr = execute('disassemble ForLoopUnpack')
1330 assert_match('ForLoopUnpack\_s*' ..
1331 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1332 '\d\+ STORE -1 in $0\_s*' ..
1333 '\d\+ PUSHNR 1\_s*' ..
1334 '\d\+ PUSHNR 2\_s*' ..
1335 '\d\+ NEWLIST size 2\_s*' ..
1336 '\d\+ PUSHNR 3\_s*' ..
1337 '\d\+ PUSHNR 4\_s*' ..
1338 '\d\+ NEWLIST size 2\_s*' ..
1339 '\d\+ NEWLIST size 2\_s*' ..
1340 '\d\+ FOR $0 -> 16\_s*' ..
1341 '\d\+ UNPACK 2\_s*' ..
1342 '\d\+ STORE $1\_s*' ..
1343 '\d\+ STORE $2\_s*' ..
1344 'echo x1 x2\_s*' ..
1345 '\d\+ LOAD $1\_s*' ..
1346 '\d\+ LOAD $2\_s*' ..
1347 '\d\+ ECHO 2\_s*' ..
1348 'endfor\_s*' ..
1349 '\d\+ JUMP -> 8\_s*' ..
1350 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001351 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001352 instr)
1353enddef
1354
Bram Moolenaarc150c092021-02-13 15:02:46 +01001355def ForLoopContinue()
1356 for nr in [1, 2]
1357 try
1358 echo "ok"
1359 try
1360 echo "deeper"
1361 catch
1362 continue
1363 endtry
1364 catch
1365 echo "not ok"
1366 endtry
1367 endfor
1368enddef
1369
1370def Test_disassemble_for_loop_continue()
1371 var instr = execute('disassemble ForLoopContinue')
1372 assert_match('ForLoopContinue\_s*' ..
1373 'for nr in \[1, 2]\_s*' ..
1374 '0 STORE -1 in $0\_s*' ..
1375 '1 PUSHNR 1\_s*' ..
1376 '2 PUSHNR 2\_s*' ..
1377 '3 NEWLIST size 2\_s*' ..
1378 '4 FOR $0 -> 22\_s*' ..
1379 '5 STORE $1\_s*' ..
1380 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001381 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001382 'echo "ok"\_s*' ..
1383 '7 PUSHS "ok"\_s*' ..
1384 '8 ECHO 1\_s*' ..
1385 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001386 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001387 'echo "deeper"\_s*' ..
1388 '10 PUSHS "deeper"\_s*' ..
1389 '11 ECHO 1\_s*' ..
1390 'catch\_s*' ..
1391 '12 JUMP -> 15\_s*' ..
1392 '13 CATCH\_s*' ..
1393 'continue\_s*' ..
1394 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1395 'endtry\_s*' ..
1396 '15 ENDTRY\_s*' ..
1397 'catch\_s*' ..
1398 '16 JUMP -> 20\_s*' ..
1399 '17 CATCH\_s*' ..
1400 'echo "not ok"\_s*' ..
1401 '18 PUSHS "not ok"\_s*' ..
1402 '19 ECHO 1\_s*' ..
1403 'endtry\_s*' ..
1404 '20 ENDTRY\_s*' ..
1405 'endfor\_s*' ..
1406 '21 JUMP -> 4\_s*' ..
1407 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001408 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001409 instr)
1410enddef
1411
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001412let g:number = 42
1413
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001414def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001415 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001416enddef
1417
1418def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001419 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001420 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001421 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001422 '\d PUSHNR 23\_s*' ..
1423 '\d LOADG g:number\_s*' ..
1424 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1425 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001426 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001427 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001428 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001429 instr)
1430enddef
1431
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001432def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001433 var nr = 3
1434 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001435 nrres = nr - 7
1436 nrres = nr * 7
1437 nrres = nr / 7
1438 nrres = nr % 7
1439
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001441 anyres = g:number - 7
1442 anyres = g:number * 7
1443 anyres = g:number / 7
1444 anyres = g:number % 7
1445
1446 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001447 var fl = 3.0
1448 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001449 flres = fl - 7.0
1450 flres = fl * 7.0
1451 flres = fl / 7.0
1452 endif
1453enddef
1454
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001455def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001456 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001457 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001458 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001459 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001460 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001461 '\d LOAD $0.*' ..
1462 '\d PUSHNR 7.*' ..
1463 '\d OPNR +.*' ..
1464 '\d STORE $1.*' ..
1465 'nrres = nr - 7.*' ..
1466 '\d OPNR -.*' ..
1467 'nrres = nr \* 7.*' ..
1468 '\d OPNR \*.*' ..
1469 'nrres = nr / 7.*' ..
1470 '\d OPNR /.*' ..
1471 'nrres = nr % 7.*' ..
1472 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001473 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001474 '\d LOADG g:number.*' ..
1475 '\d PUSHNR 7.*' ..
1476 '\d OPANY +.*' ..
1477 '\d STORE $2.*' ..
1478 'anyres = g:number - 7.*' ..
1479 '\d OPANY -.*' ..
1480 'anyres = g:number \* 7.*' ..
1481 '\d OPANY \*.*' ..
1482 'anyres = g:number / 7.*' ..
1483 '\d OPANY /.*' ..
1484 'anyres = g:number % 7.*' ..
1485 '\d OPANY %.*',
1486 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001487 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001488 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001489 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001490 '\d PUSHF 3.0.*' ..
1491 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001492 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001493 '\d LOAD $3.*' ..
1494 '\d PUSHF 7.0.*' ..
1495 '\d OPFLOAT +.*' ..
1496 '\d STORE $4.*' ..
1497 'flres = fl - 7.0.*' ..
1498 '\d OPFLOAT -.*' ..
1499 'flres = fl \* 7.0.*' ..
1500 '\d OPFLOAT \*.*' ..
1501 'flres = fl / 7.0.*' ..
1502 '\d OPFLOAT /.*',
1503 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001504 endif
1505enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001506
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001507def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001508 var reslist = [1, 2] + [3, 4]
1509 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001510enddef
1511
1512def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001513 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001514 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001515 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001516 '\d PUSHNR 1.*' ..
1517 '\d PUSHNR 2.*' ..
1518 '\d NEWLIST size 2.*' ..
1519 '\d PUSHNR 3.*' ..
1520 '\d PUSHNR 4.*' ..
1521 '\d NEWLIST size 2.*' ..
1522 '\d ADDLIST.*' ..
1523 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001524 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001525 '\d PUSHBLOB 0z1122.*' ..
1526 '\d PUSHBLOB 0z3344.*' ..
1527 '\d ADDBLOB.*' ..
1528 '\d STORE $.*',
1529 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001530enddef
1531
1532let g:aa = 'aa'
1533def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001534 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001535 return res
1536enddef
1537
1538def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001539 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001540 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001541 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001542 '\d LOADG g:aa.*' ..
1543 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001544 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001545 '\d CONCAT.*' ..
1546 '\d STORE $.*',
1547 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001548 assert_equal('aabb', ConcatString())
1549enddef
1550
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001551def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001552 var s = "abcd"
1553 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001554 return res
1555enddef
1556
1557def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001558 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001559 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001560 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001561 '\d PUSHS "abcd"\_s*' ..
1562 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001563 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001564 '\d LOAD $0\_s*' ..
1565 '\d PUSHNR 1\_s*' ..
1566 '\d STRINDEX\_s*' ..
1567 '\d STORE $1\_s*',
1568 instr)
1569 assert_equal('b', StringIndex())
1570enddef
1571
Bram Moolenaared591872020-08-15 22:14:53 +02001572def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001573 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001574 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001575 return res
1576enddef
1577
1578def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001580 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001581 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001582 '\d PUSHS "abcd"\_s*' ..
1583 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001584 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001585 '\d LOAD $0\_s*' ..
1586 '\d PUSHNR 1\_s*' ..
1587 '\d PUSHNR 8\_s*' ..
1588 '\d STRSLICE\_s*' ..
1589 '\d STORE $1\_s*',
1590 instr)
1591 assert_equal('bcd', StringSlice())
1592enddef
1593
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001594def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001595 var l = [1, 2, 3]
1596 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001597 return res
1598enddef
1599
1600def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001601 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001602 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001603 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001604 '\d PUSHNR 1\_s*' ..
1605 '\d PUSHNR 2\_s*' ..
1606 '\d PUSHNR 3\_s*' ..
1607 '\d NEWLIST size 3\_s*' ..
1608 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001609 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001610 '\d LOAD $0\_s*' ..
1611 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001612 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001613 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001614 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001615 assert_equal(2, ListIndex())
1616enddef
1617
Bram Moolenaared591872020-08-15 22:14:53 +02001618def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001619 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001620 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001621 return res
1622enddef
1623
1624def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001625 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001626 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001627 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001628 '\d PUSHNR 1\_s*' ..
1629 '\d PUSHNR 2\_s*' ..
1630 '\d PUSHNR 3\_s*' ..
1631 '\d NEWLIST size 3\_s*' ..
1632 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001633 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001634 '\d LOAD $0\_s*' ..
1635 '\d PUSHNR 1\_s*' ..
1636 '\d PUSHNR 8\_s*' ..
1637 '\d LISTSLICE\_s*' ..
1638 '\d STORE $1\_s*',
1639 instr)
1640 assert_equal([2, 3], ListSlice())
1641enddef
1642
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001643def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001644 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001645 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001646 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001647 return res
1648enddef
1649
1650def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001651 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001652 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001653 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001654 '\d PUSHS "item"\_s*' ..
1655 '\d PUSHNR 1\_s*' ..
1656 '\d NEWDICT size 1\_s*' ..
1657 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001658 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001659 '\d\+ LOAD $0\_s*' ..
1660 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001661 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001662 '\d\+ STORE $1\_s*' ..
1663 'res = d\["item"\]\_s*' ..
1664 '\d\+ LOAD $0\_s*' ..
1665 '\d\+ PUSHS "item"\_s*' ..
1666 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001667 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001668 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001669 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001670 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001671enddef
1672
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001673let somelist = [1, 2, 3, 4, 5]
1674def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001675 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001676 return res
1677enddef
1678
1679def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001680 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001681 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001682 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001683 '\d LOADG g:somelist\_s*' ..
1684 '\d PUSHNR 2\_s*' ..
1685 '\d ANYINDEX\_s*' ..
1686 '\d STORE $0\_s*' ..
1687 'return res\_s*' ..
1688 '\d LOAD $0\_s*' ..
1689 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1690 '\d RETURN',
1691 instr)
1692 assert_equal(3, AnyIndex())
1693enddef
1694
1695def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001696 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001697 return res
1698enddef
1699
1700def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001702 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001703 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001704 '\d LOADG g:somelist\_s*' ..
1705 '\d PUSHNR 1\_s*' ..
1706 '\d PUSHNR 3\_s*' ..
1707 '\d ANYSLICE\_s*' ..
1708 '\d STORE $0\_s*' ..
1709 'return res\_s*' ..
1710 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001711 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001712 '\d RETURN',
1713 instr)
1714 assert_equal([2, 3, 4], AnySlice())
1715enddef
1716
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001717def NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001718 g:nr = 9
1719 var plus = +g:nr
1720 var minus = -g:nr
1721 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001722enddef
1723
1724def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001725 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001726 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001727 'g:nr = 9\_s*' ..
1728 '\d PUSHNR 9\_s*' ..
1729 '\d STOREG g:nr\_s*' ..
1730 'var plus = +g:nr\_s*' ..
1731 '\d LOADG g:nr\_s*' ..
1732 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1733 '\d STORE $0\_s*' ..
1734 'var minus = -g:nr\_s*' ..
1735 '\d LOADG g:nr\_s*' ..
1736 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001737 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001738 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001739 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001740 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001741enddef
1742
1743def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001744 var flag = true
1745 var invert = !flag
1746 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001747 return res
1748enddef
1749
1750def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001751 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001752 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001753 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001754 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001755 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001756 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001757 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001758 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001759 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001760 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001761 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001762 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001763 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001764 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001765 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001766enddef
1767
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001768def ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001769 var one = 1
1770 var zero = 0
1771 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001772 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001773enddef
1774
1775def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001776 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001777 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001778 'var one = 1\_s*' ..
1779 '0 STORE 1 in $0\_s*' ..
1780 'var zero = 0\_s*' ..
1781 '1 STORE 0 in $1\_s*' ..
1782 'var name: bool = one && zero || one\_s*' ..
1783 '2 LOAD $0\_s*' ..
1784 '3 COND2BOOL\_s*' ..
1785 '4 JUMP_IF_COND_FALSE -> 7\_s*' ..
1786 '5 LOAD $1\_s*' ..
1787 '6 COND2BOOL\_s*' ..
1788 '7 JUMP_IF_COND_TRUE -> 10\_s*' ..
1789 '8 LOAD $0\_s*' ..
1790 '9 COND2BOOL\_s*' ..
1791 '10 STORE $2\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001792 'return name\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001793 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001794 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001795 instr)
1796 assert_equal(true, InvertBool())
1797enddef
1798
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001799def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001800 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001801 ['true == isFalse', 'COMPAREBOOL =='],
1802 ['true != isFalse', 'COMPAREBOOL !='],
1803 ['v:none == isNull', 'COMPARESPECIAL =='],
1804 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001805
Bram Moolenaara5565e42020-05-09 15:44:01 +02001806 ['111 == aNumber', 'COMPARENR =='],
1807 ['111 != aNumber', 'COMPARENR !='],
1808 ['111 > aNumber', 'COMPARENR >'],
1809 ['111 < aNumber', 'COMPARENR <'],
1810 ['111 >= aNumber', 'COMPARENR >='],
1811 ['111 <= aNumber', 'COMPARENR <='],
1812 ['111 =~ aNumber', 'COMPARENR =\~'],
1813 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001814
Bram Moolenaara5565e42020-05-09 15:44:01 +02001815 ['"xx" != aString', 'COMPARESTRING !='],
1816 ['"xx" > aString', 'COMPARESTRING >'],
1817 ['"xx" < aString', 'COMPARESTRING <'],
1818 ['"xx" >= aString', 'COMPARESTRING >='],
1819 ['"xx" <= aString', 'COMPARESTRING <='],
1820 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1821 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1822 ['"xx" is aString', 'COMPARESTRING is'],
1823 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001824
Bram Moolenaara5565e42020-05-09 15:44:01 +02001825 ['0z11 == aBlob', 'COMPAREBLOB =='],
1826 ['0z11 != aBlob', 'COMPAREBLOB !='],
1827 ['0z11 is aBlob', 'COMPAREBLOB is'],
1828 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001829
Bram Moolenaara5565e42020-05-09 15:44:01 +02001830 ['[1, 2] == aList', 'COMPARELIST =='],
1831 ['[1, 2] != aList', 'COMPARELIST !='],
1832 ['[1, 2] is aList', 'COMPARELIST is'],
1833 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001834
Bram Moolenaare0de1712020-12-02 17:36:54 +01001835 ['{a: 1} == aDict', 'COMPAREDICT =='],
1836 ['{a: 1} != aDict', 'COMPAREDICT !='],
1837 ['{a: 1} is aDict', 'COMPAREDICT is'],
1838 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001839
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001840 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1841 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1842 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1843 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001844
1845 ['77 == g:xx', 'COMPAREANY =='],
1846 ['77 != g:xx', 'COMPAREANY !='],
1847 ['77 > g:xx', 'COMPAREANY >'],
1848 ['77 < g:xx', 'COMPAREANY <'],
1849 ['77 >= g:xx', 'COMPAREANY >='],
1850 ['77 <= g:xx', 'COMPAREANY <='],
1851 ['77 =~ g:xx', 'COMPAREANY =\~'],
1852 ['77 !~ g:xx', 'COMPAREANY !\~'],
1853 ['77 is g:xx', 'COMPAREANY is'],
1854 ['77 isnot g:xx', 'COMPAREANY isnot'],
1855 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001856 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001857 if has('float')
1858 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001859 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1860 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1861 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1862 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1863 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1864 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1865 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1866 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001867 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001868 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001869 endif
1870
Bram Moolenaarac564082020-09-27 19:05:33 +02001871 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001872 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001873 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001874 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001875 ' var isFalse = false',
1876 ' var isNull = v:null',
1877 ' var aNumber = 222',
1878 ' var aString = "yy"',
1879 ' var aBlob = 0z22',
1880 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001881 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001882 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001883 ' if ' .. case[0],
1884 ' echo 42'
1885 ' endif',
1886 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001887 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001888 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001889 assert_match('TestCase' .. nr .. '.*' ..
1890 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1891 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001892 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001893 '\d ' .. case[1] .. '.*' ..
1894 '\d JUMP_IF_FALSE -> \d\+.*',
1895 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001896
1897 nr += 1
1898 endfor
1899
Bram Moolenaar22da5592020-03-19 14:52:20 +01001900 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001901enddef
1902
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001903def s:FalsyOp()
1904 echo g:flag ?? "yes"
1905 echo [] ?? "empty list"
1906 echo "" ?? "empty string"
1907enddef
1908
1909def Test_dsassemble_falsy_op()
1910 var res = execute('disass s:FalsyOp')
1911 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1912 'echo g:flag ?? "yes"\_s*' ..
1913 '0 LOADG g:flag\_s*' ..
1914 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1915 '2 PUSHS "yes"\_s*' ..
1916 '3 ECHO 1\_s*' ..
1917 'echo \[\] ?? "empty list"\_s*' ..
1918 '4 NEWLIST size 0\_s*' ..
1919 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1920 '6 PUSHS "empty list"\_s*' ..
1921 '7 ECHO 1\_s*' ..
1922 'echo "" ?? "empty string"\_s*' ..
1923 '\d\+ PUSHS "empty string"\_s*' ..
1924 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001925 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001926 res)
1927enddef
1928
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001929def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001930 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001931 ['"xx" == "yy"', false],
1932 ['"aa" == "aa"', true],
1933 ['has("eval") ? true : false', true],
1934 ['has("asdf") ? true : false', false],
1935 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001936
Bram Moolenaarac564082020-09-27 19:05:33 +02001937 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001938 for case in cases
1939 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001940 ' if ' .. case[0],
1941 ' echo 42'
1942 ' endif',
1943 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001944 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001945 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001946 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001947 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001948 assert_match('TestCase' .. nr .. '.*' ..
1949 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1950 '\d PUSHNR 42.*' ..
1951 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001952 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001953 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001954 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001955 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001956 assert_match('TestCase' .. nr .. '.*' ..
1957 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1958 'echo 42[ \n]*' ..
1959 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001960 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001961 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001962 endif
1963
1964 nr += 1
1965 endfor
1966
1967 delete('Xdisassemble')
1968enddef
1969
Bram Moolenaarad39c092020-02-26 18:23:43 +01001970def s:Execute()
1971 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001972 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001973 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001974 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001975 execute 'help ' .. tag
1976enddef
1977
1978def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001979 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001980 assert_match('\<SNR>\d*_Execute\_s*' ..
1981 "execute 'help vim9.txt'\\_s*" ..
1982 '\d PUSHS "help vim9.txt"\_s*' ..
1983 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001984 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001985 '\d PUSHS "help vim9.txt"\_s*' ..
1986 '\d STORE $0\_s*' ..
1987 'execute cmd\_s*' ..
1988 '\d LOAD $0\_s*' ..
1989 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001990 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001991 '\d PUSHS "vim9.txt"\_s*' ..
1992 '\d STORE $1\_s*' ..
1993 "execute 'help ' .. tag\\_s*" ..
1994 '\d\+ PUSHS "help "\_s*' ..
1995 '\d\+ LOAD $1\_s*' ..
1996 '\d\+ CONCAT\_s*' ..
1997 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001998 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001999 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002000enddef
2001
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002002def s:Echomsg()
2003 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002004 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002005 echoerr 'went' .. 'wrong'
2006enddef
2007
2008def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002009 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002010 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2011 "echomsg 'some' 'message'\\_s*" ..
2012 '\d PUSHS "some"\_s*' ..
2013 '\d PUSHS "message"\_s*' ..
2014 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002015 "echoconsole 'nothing'\\_s*" ..
2016 '\d PUSHS "nothing"\_s*' ..
2017 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002018 "echoerr 'went' .. 'wrong'\\_s*" ..
2019 '\d PUSHS "wentwrong"\_s*' ..
2020 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002021 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002022 res)
2023enddef
2024
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002025def SomeStringArg(arg: string)
2026 echo arg
2027enddef
2028
2029def SomeAnyArg(arg: any)
2030 echo arg
2031enddef
2032
2033def SomeStringArgAndReturn(arg: string): string
2034 return arg
2035enddef
2036
2037def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002038 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002039 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2040 '\d *echo arg.*' ..
2041 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002042 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002043
Bram Moolenaarac564082020-09-27 19:05:33 +02002044 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002045 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2046 '\d *echo arg\_s*' ..
2047 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002048 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002049
Bram Moolenaarac564082020-09-27 19:05:33 +02002050 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002051 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2052 '\d *return arg\_s*' ..
2053 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002054 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002055enddef
2056
Bram Moolenaar09689a02020-05-09 22:50:08 +02002057def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002058 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002059 vim9script
2060 def FuncOne(): string
2061 return FuncTwo()
2062 enddef
2063 def FuncTwo(): string
2064 return 'two'
2065 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002066 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002067 END
2068 writefile(lines, 'Xdisassemble')
2069 source Xdisassemble
2070
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002071 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002072 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2073 'return FuncTwo()\_s*' ..
2074 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002075 '\d RETURN',
2076 g:res_FuncOne)
2077
2078 delete('Xdisassemble')
2079 unlet g:res_FuncOne
2080enddef
2081
Bram Moolenaar61a89812020-05-07 16:58:17 +02002082def s:ConcatStrings(): string
2083 return 'one' .. 'two' .. 'three'
2084enddef
2085
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002086def s:ComputeConst(): number
2087 return 2 + 3 * 4 / 6 + 7
2088enddef
2089
Bram Moolenaar1c747212020-05-09 18:28:34 +02002090def s:ComputeConstParen(): number
2091 return ((2 + 4) * (8 / 2)) / (3 + 4)
2092enddef
2093
Bram Moolenaar61a89812020-05-07 16:58:17 +02002094def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002095 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002096 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2097 "return 'one' .. 'two' .. 'three'\\_s*" ..
2098 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002099 '\d RETURN',
2100 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002101
2102 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002103 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2104 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2105 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002106 '\d RETURN',
2107 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002108
2109 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002110 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2111 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2112 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002113 '\d RETURN',
2114 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002115enddef
2116
Bram Moolenaar389df252020-07-09 21:20:47 +02002117def s:CallAppend()
2118 eval "some text"->append(2)
2119enddef
2120
2121def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002122 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002123 assert_match('<SNR>\d*_CallAppend\_s*' ..
2124 'eval "some text"->append(2)\_s*' ..
2125 '\d PUSHS "some text"\_s*' ..
2126 '\d PUSHNR 2\_s*' ..
2127 '\d SHUFFLE 2 up 1\_s*' ..
2128 '\d BCALL append(argc 2)\_s*' ..
2129 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002130 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002131 res)
2132enddef
2133
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002134
2135def s:SilentMessage()
2136 silent echomsg "text"
2137 silent! echoerr "error"
2138enddef
2139
2140def Test_silent()
2141 var res = execute('disass s:SilentMessage')
2142 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2143 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002144 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002145 '\d PUSHS "text"\_s*' ..
2146 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002147 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002148 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002149 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002150 '\d PUSHS "error"\_s*' ..
2151 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002152 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002153 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002154 res)
2155enddef
2156
2157def s:SilentIf()
2158 silent if 4 == g:five
2159 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002160 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002161enddef
2162
2163def Test_silent_if()
2164 var res = execute('disass s:SilentIf')
2165 assert_match('<SNR>\d*_SilentIf\_s*' ..
2166 'silent if 4 == g:five\_s*' ..
2167 '\d\+ CMDMOD silent\_s*' ..
2168 '\d\+ PUSHNR 4\_s*' ..
2169 '\d\+ LOADG g:five\_s*' ..
2170 '\d\+ COMPAREANY ==\_s*' ..
2171 '\d\+ CMDMOD_REV\_s*' ..
2172 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2173 'silent elseif 4 == g:five\_s*' ..
2174 '\d\+ JUMP -> \d\+\_s*' ..
2175 '\d\+ CMDMOD silent\_s*' ..
2176 '\d\+ PUSHNR 4\_s*' ..
2177 '\d\+ LOADG g:five\_s*' ..
2178 '\d\+ COMPAREANY ==\_s*' ..
2179 '\d\+ CMDMOD_REV\_s*' ..
2180 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002181 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002182 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002183 res)
2184enddef
2185
2186def s:SilentFor()
2187 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002188 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002189enddef
2190
2191def Test_silent_for()
2192 var res = execute('disass s:SilentFor')
2193 assert_match('<SNR>\d*_SilentFor\_s*' ..
2194 'silent for i in \[0\]\_s*' ..
2195 '\d CMDMOD silent\_s*' ..
2196 '\d STORE -1 in $0\_s*' ..
2197 '\d PUSHNR 0\_s*' ..
2198 '\d NEWLIST size 1\_s*' ..
2199 '\d CMDMOD_REV\_s*' ..
2200 '5 FOR $0 -> 8\_s*' ..
2201 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002202 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002203 '\d JUMP -> 5\_s*' ..
2204 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002205 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002206 res)
2207enddef
2208
2209def s:SilentWhile()
2210 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002211 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002212enddef
2213
2214def Test_silent_while()
2215 var res = execute('disass s:SilentWhile')
2216 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2217 'silent while g:not\_s*' ..
2218 '0 CMDMOD silent\_s*' ..
2219 '\d LOADG g:not\_s*' ..
2220 '\d COND2BOOL\_s*' ..
2221 '\d CMDMOD_REV\_s*' ..
2222 '\d JUMP_IF_FALSE -> 6\_s*' ..
2223
Bram Moolenaarfa984412021-03-25 22:15:28 +01002224 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002225 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002226 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002227 res)
2228enddef
2229
2230def s:SilentReturn(): string
2231 silent return "done"
2232enddef
2233
2234def Test_silent_return()
2235 var res = execute('disass s:SilentReturn')
2236 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2237 'silent return "done"\_s*' ..
2238 '\d CMDMOD silent\_s*' ..
2239 '\d PUSHS "done"\_s*' ..
2240 '\d CMDMOD_REV\_s*' ..
2241 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002242 res)
2243enddef
2244
Bram Moolenaarb2049902021-01-24 12:53:53 +01002245def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002246 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002247 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002248 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002249 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002250 return "done"
2251enddef
2252
2253def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002254 if !has('profile')
2255 MissingFeature 'profile'
2256 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002257 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002258 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002259 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002260 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002261 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002262 '\d PUSHS "profiled"\_s*' ..
2263 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002264 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002265 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002266 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002267 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002268 '\d PUSHS "some text"\_s*' ..
2269 '\d STORE $0\_s*' ..
2270 'return "done"\_s*' ..
2271 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002272 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002273 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002274 '\d\+ RETURN\_s*' ..
2275 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002276 res)
2277enddef
2278
Bram Moolenaare99d4222021-06-13 14:01:26 +02002279def Test_debugged()
2280 var res = execute('disass debug s:Profiled')
2281 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002282 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002283 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002284 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002285 '\d PUSHS "profiled"\_s*' ..
2286 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002287 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002288 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002289 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002290 '\d PUSHS "some text"\_s*' ..
2291 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002292 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002293 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002294 '\d PUSHS "done"\_s*' ..
2295 '\d RETURN\_s*',
2296 res)
2297enddef
2298
Bram Moolenaar093165c2021-08-22 13:35:31 +02002299def s:DebugElseif()
2300 var b = false
2301 if b
2302 eval 1 + 0
2303 silent elseif !b
2304 eval 2 + 0
2305 endif
2306enddef
2307
2308def Test_debug_elseif()
2309 var res = execute('disass debug s:DebugElseif')
2310 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2311 'var b = false\_s*' ..
2312 '0 DEBUG line 1-1 varcount 0\_s*' ..
2313 '1 PUSH false\_s*' ..
2314 '2 STORE $0\_s*' ..
2315
2316 'if b\_s*' ..
2317 '3 DEBUG line 2-2 varcount 1\_s*' ..
2318 '4 LOAD $0\_s*' ..
2319 '5 JUMP_IF_FALSE -> 10\_s*' ..
2320
2321 'eval 1 + 0\_s*' ..
2322 '6 DEBUG line 3-3 varcount 1\_s*' ..
2323 '7 PUSHNR 1\_s*' ..
2324 '8 DROP\_s*' ..
2325
2326 'silent elseif !b\_s*' ..
2327 '9 JUMP -> 20\_s*' ..
2328 '10 CMDMOD silent\_s*' ..
2329 '11 DEBUG line 4-4 varcount 1\_s*' ..
2330 '12 LOAD $0\_s*' ..
2331 '13 INVERT -1 (!val)\_s*' ..
2332 '14 CMDMOD_REV\_s*' ..
2333 '15 JUMP_IF_FALSE -> 20\_s*' ..
2334
2335 'eval 2 + 0\_s*' ..
2336 '16 DEBUG line 5-5 varcount 1\_s*' ..
2337 '17 PUSHNR 2\_s*' ..
2338 '18 DROP\_s*' ..
2339
2340 'endif\_s*' ..
2341 '19 DEBUG line 6-6 varcount 1\_s*' ..
2342 '20 RETURN void*',
2343 res)
2344enddef
2345
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002346func Legacy() dict
2347 echo 'legacy'
2348endfunc
2349
2350def s:UseMember()
2351 var d = {func: Legacy}
2352 var v = d.func()
2353enddef
2354
2355def Test_disassemble_dict_stack()
2356 var res = execute('disass s:UseMember')
2357 assert_match('<SNR>\d*_UseMember\_s*' ..
2358 'var d = {func: Legacy}\_s*' ..
2359 '\d PUSHS "func"\_s*' ..
2360 '\d PUSHFUNC "Legacy"\_s*' ..
2361 '\d NEWDICT size 1\_s*' ..
2362 '\d STORE $0\_s*' ..
2363
2364 'var v = d.func()\_s*' ..
2365 '\d LOAD $0\_s*' ..
2366 '\d MEMBER func\_s*' ..
2367 '\d PCALL top (argc 0)\_s*' ..
2368 '\d PCALL end\_s*' ..
2369 '\d CLEARDICT\_s*' ..
2370 '\d\+ STORE $1\_s*' ..
2371 '\d\+ RETURN void*',
2372 res)
2373enddef
2374
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002375def s:EchoMessages()
2376 echohl ErrorMsg | echom v:exception | echohl NONE
2377enddef
2378
2379def Test_disassemble_nextcmd()
2380 # splitting commands and removing trailing blanks should not change the line
2381 var res = execute('disass s:EchoMessages')
2382 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2383 'echohl ErrorMsg | echom v:exception | echohl NONE',
2384 res)
2385enddef
2386
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002387def Test_disassemble_after_reload()
2388 var lines =<< trim END
2389 vim9script
2390 if exists('g:ThisFunc')
2391 finish
2392 endif
2393 var name: any
2394 def g:ThisFunc(): number
2395 g:name = name
2396 return 0
2397 enddef
2398 def g:ThatFunc(): number
2399 name = g:name
2400 return 0
2401 enddef
2402 END
2403 lines->writefile('Xreload.vim')
2404
2405 source Xreload.vim
2406 g:ThisFunc()
2407 g:ThatFunc()
2408
2409 source Xreload.vim
2410 var res = execute('disass g:ThisFunc')
2411 assert_match('ThisFunc\_s*' ..
2412 'g:name = name\_s*' ..
2413 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2414 '\d STOREG g:name\_s*' ..
2415 'return 0\_s*' ..
2416 '\d PUSHNR 0\_s*' ..
2417 '\d RETURN\_s*',
2418 res)
2419
2420 res = execute('disass g:ThatFunc')
2421 assert_match('ThatFunc\_s*' ..
2422 'name = g:name\_s*' ..
2423 '\d LOADG g:name\_s*' ..
2424 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2425 'return 0\_s*' ..
2426 '\d PUSHNR 0\_s*' ..
2427 '\d RETURN\_s*',
2428 res)
2429
2430 delete('Xreload.vim')
2431 delfunc g:ThisFunc
2432 delfunc g:ThatFunc
2433enddef
2434
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002435
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002436
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002437" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker