blob: 7938d91f85ca7d74bd1c790c09d1c5d0576e76b3 [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200120 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
Bram Moolenaar20677332021-06-06 17:02:53 +0200124if has('python3')
125 def s:PyHeredoc()
126 python3 << EOF
127 print('hello')
128EOF
129 enddef
130
131 def Test_disassemble_python_heredoc()
132 var res = execute('disass s:PyHeredoc')
133 assert_match('<SNR>\d*_PyHeredoc.*' ..
134 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
135 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200136 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200137 res)
138 enddef
139endif
140
Bram Moolenaar4c137212021-04-19 16:48:48 +0200141def s:Substitute()
142 var expr = "abc"
143 :%s/a/\=expr/&g#c
144enddef
145
146def Test_disassemble_substitute()
147 var res = execute('disass s:Substitute')
148 assert_match('<SNR>\d*_Substitute.*' ..
149 ' var expr = "abc"\_s*' ..
150 '\d PUSHS "abc"\_s*' ..
151 '\d STORE $0\_s*' ..
152 ' :%s/a/\\=expr/&g#c\_s*' ..
153 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
154 ' 0 LOAD $0\_s*' ..
155 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200156 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200157 res)
158enddef
159
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200160
161def s:SearchPair()
162 var col = 8
163 searchpair("{", "", "}", "", "col('.') > col")
164enddef
165
166def Test_disassemble_seachpair()
167 var res = execute('disass s:SearchPair')
168 assert_match('<SNR>\d*_SearchPair.*' ..
169 ' var col = 8\_s*' ..
170 '\d STORE 8 in $0\_s*' ..
171 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
172 '\d PUSHS "{"\_s*' ..
173 '\d PUSHS ""\_s*' ..
174 '\d PUSHS "}"\_s*' ..
175 '\d PUSHS ""\_s*' ..
176 '\d INSTR\_s*' ..
177 ' 0 PUSHS "."\_s*' ..
178 ' 1 BCALL col(argc 1)\_s*' ..
179 ' 2 LOAD $0\_s*' ..
180 ' 3 COMPARENR >\_s*' ..
181 ' -------------\_s*' ..
182 '\d BCALL searchpair(argc 5)\_s*' ..
183 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200184 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200185 res)
186enddef
187
188
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200189def s:RedirVar()
190 var result: string
191 redir =>> result
192 echo "text"
193 redir END
194enddef
195
196def Test_disassemble_redir_var()
197 var res = execute('disass s:RedirVar')
198 assert_match('<SNR>\d*_RedirVar.*' ..
199 ' var result: string\_s*' ..
200 '\d PUSHS "\[NULL\]"\_s*' ..
201 '\d STORE $0\_s*' ..
202 ' redir =>> result\_s*' ..
203 '\d REDIR\_s*' ..
204 ' echo "text"\_s*' ..
205 '\d PUSHS "text"\_s*' ..
206 '\d ECHO 1\_s*' ..
207 ' redir END\_s*' ..
208 '\d LOAD $0\_s*' ..
209 '\d REDIR END\_s*' ..
210 '\d CONCAT\_s*' ..
211 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200212 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200213 res)
214enddef
215
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200216def s:Cexpr()
217 var errors = "list of errors"
218 cexpr errors
219enddef
220
221def Test_disassemble_cexpr()
222 var res = execute('disass s:Cexpr')
223 assert_match('<SNR>\d*_Cexpr.*' ..
224 ' var errors = "list of errors"\_s*' ..
225 '\d PUSHS "list of errors"\_s*' ..
226 '\d STORE $0\_s*' ..
227 ' cexpr errors\_s*' ..
228 '\d CEXPR pre cexpr\_s*' ..
229 '\d LOAD $0\_s*' ..
230 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200231 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200232 res)
233enddef
234
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200235def s:YankRange()
236 norm! m[jjm]
237 :'[,']yank
238enddef
239
240def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200241 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200242 assert_match('<SNR>\d*_YankRange.*' ..
243 ' norm! m\[jjm\]\_s*' ..
244 '\d EXEC norm! m\[jjm\]\_s*' ..
245 ' :''\[,''\]yank\_s*' ..
246 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200247 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200248 res)
249enddef
250
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200251def s:PutExpr()
252 :3put ="text"
253enddef
254
255def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200257 assert_match('<SNR>\d*_PutExpr.*' ..
258 ' :3put ="text"\_s*' ..
259 '\d PUSHS "text"\_s*' ..
260 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200261 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200262 res)
263enddef
264
Bram Moolenaar08597872020-12-10 19:43:40 +0100265def s:PutRange()
266 :$-2put a
267enddef
268
269def Test_disassemble_put_range()
270 var res = execute('disass s:PutRange')
271 assert_match('<SNR>\d*_PutRange.*' ..
272 ' :$-2put a\_s*' ..
273 '\d RANGE $-2\_s*' ..
274 '\d PUT a range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200275 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100276 res)
277enddef
278
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100279def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200280 var localbool = true
281 var localspec = v:none
282 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100283 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200284 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100285 endif
286enddef
287
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100288def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200289 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200290 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
291 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100292 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200293 'localspec = v:none.*' ..
294 ' PUSH v:none.*' ..
295 'localblob = 0z1234.*' ..
296 ' PUSHBLOB 0z1234.*',
297 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100298 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200299 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
300 'localfloat = 1.234.*' ..
301 ' PUSHF 1.234.*',
302 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100303 endif
304enddef
305
306def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200307 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100308 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100310 localstr = 'xyz'
311 v:char = 'abc'
312 s:scriptvar = 'sv'
313 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100314 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200315 b:buffervar = 'bv'
316 w:windowvar = 'wv'
317 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100318 &tabstop = 8
319 $ENVVAR = 'ev'
320 @z = 'rv'
321enddef
322
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100323def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200324 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200325 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200326 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200327 'localnr = 2.*' ..
328 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200329 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200330 'localstr = ''xyz''.*' ..
331 ' STORE $1.*' ..
332 'v:char = ''abc''.*' ..
333 'STOREV v:char.*' ..
334 's:scriptvar = ''sv''.*' ..
335 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
336 'g:globalvar = ''gv''.*' ..
337 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100338 'g:auto#var = ''av''.*' ..
339 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200340 'b:buffervar = ''bv''.*' ..
341 ' STOREB b:buffervar.*' ..
342 'w:windowvar = ''wv''.*' ..
343 ' STOREW w:windowvar.*' ..
344 't:tabpagevar = ''tv''.*' ..
345 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200346 '&tabstop = 8.*' ..
347 ' STOREOPT &tabstop.*' ..
348 '$ENVVAR = ''ev''.*' ..
349 ' STOREENV $ENVVAR.*' ..
350 '@z = ''rv''.*' ..
351 ' STOREREG @z.*',
352 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100353enddef
354
Bram Moolenaarcb790402020-05-15 20:53:00 +0200355def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200356 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200357 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200358 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200359 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200360 var localblob: blob = 0z1122
361 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200362enddef
363
364def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200365 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200366 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200367 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200368 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100369 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200370 '\d STORE $0\_s*' ..
371 'locallist\[0\] = 123\_s*' ..
372 '\d PUSHNR 123\_s*' ..
373 '\d PUSHNR 0\_s*' ..
374 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200375 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200376 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200377 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100378 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200379 '\d STORE $1\_s*' ..
380 'localdict\["a"\] = 456\_s*' ..
381 '\d\+ PUSHNR 456\_s*' ..
382 '\d\+ PUSHS "a"\_s*' ..
383 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200384 '\d\+ STOREINDEX dict\_s*' ..
385 'var localblob: blob = 0z1122\_s*' ..
386 '\d\+ PUSHBLOB 0z1122\_s*' ..
387 '\d\+ STORE $2\_s*' ..
388 'localblob\[1\] = 33\_s*' ..
389 '\d\+ PUSHNR 33\_s*' ..
390 '\d\+ PUSHNR 1\_s*' ..
391 '\d\+ LOAD $2\_s*' ..
392 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200393 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200394 res)
395enddef
396
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100397def s:ScriptFuncStoreIndex()
398 var d = {dd: {}}
399 d.dd[0] = 0
400enddef
401
402def Test_disassemble_store_index()
403 var res = execute('disass s:ScriptFuncStoreIndex')
404 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
405 'var d = {dd: {}}\_s*' ..
406 '\d PUSHS "dd"\_s*' ..
407 '\d NEWDICT size 0\_s*' ..
408 '\d NEWDICT size 1\_s*' ..
409 '\d STORE $0\_s*' ..
410 'd.dd\[0\] = 0\_s*' ..
411 '\d PUSHNR 0\_s*' ..
412 '\d PUSHNR 0\_s*' ..
413 '\d LOAD $0\_s*' ..
414 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200415 '\d STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200416 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100417 res)
418enddef
419
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200420def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200421 var x: string
422 var y: string
423 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200424 [x, y; l] = g:stringlist
425enddef
426
427def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200428 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200429 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200430 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200431 '\d PUSHS "\[NULL\]"\_s*' ..
432 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200433 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200434 '\d PUSHS "\[NULL\]"\_s*' ..
435 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200436 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200437 '\d NEWLIST size 0\_s*' ..
438 '\d STORE $2\_s*' ..
439 '\[x, y; l\] = g:stringlist\_s*' ..
440 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200441 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200442 '\d CHECKLEN >= 2\_s*' ..
443 '\d\+ ITEM 0\_s*' ..
444 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
445 '\d\+ STORE $0\_s*' ..
446 '\d\+ ITEM 1\_s*' ..
447 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
448 '\d\+ STORE $1\_s*' ..
449 '\d\+ SLICE 2\_s*' ..
450 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200451 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200452 res)
453enddef
454
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200455def s:ListAssignWithOp()
456 var a = 2
457 var b = 3
458 [a, b] += [4, 5]
459enddef
460
461def Test_disassemble_list_assign_with_op()
462 var res = execute('disass s:ListAssignWithOp')
463 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
464 'var a = 2\_s*' ..
465 '\d STORE 2 in $0\_s*' ..
466 'var b = 3\_s*' ..
467 '\d STORE 3 in $1\_s*' ..
468 '\[a, b\] += \[4, 5\]\_s*' ..
469 '\d\+ PUSHNR 4\_s*' ..
470 '\d\+ PUSHNR 5\_s*' ..
471 '\d\+ NEWLIST size 2\_s*' ..
472 '\d\+ CHECKLEN 2\_s*' ..
473 '\d\+ LOAD $0\_s*' ..
474 '\d\+ ITEM 0 with op\_s*' ..
475 '\d\+ OPNR +\_s*' ..
476 '\d\+ STORE $0\_s*' ..
477 '\d\+ LOAD $1\_s*' ..
478 '\d\+ ITEM 1 with op\_s*' ..
479 '\d\+ OPNR +\_s*' ..
480 '\d\+ STORE $1\_s*' ..
481 '\d\+ DROP\_s*' ..
482 '\d\+ RETURN void',
483 res)
484enddef
485
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200486def s:ListAdd()
487 var l: list<number> = []
488 add(l, 123)
489 add(l, g:aNumber)
490enddef
491
492def Test_disassemble_list_add()
493 var res = execute('disass s:ListAdd')
494 assert_match('<SNR>\d*_ListAdd\_s*' ..
495 'var l: list<number> = []\_s*' ..
496 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100497 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200498 '\d STORE $0\_s*' ..
499 'add(l, 123)\_s*' ..
500 '\d LOAD $0\_s*' ..
501 '\d PUSHNR 123\_s*' ..
502 '\d LISTAPPEND\_s*' ..
503 '\d DROP\_s*' ..
504 'add(l, g:aNumber)\_s*' ..
505 '\d LOAD $0\_s*' ..
506 '\d\+ LOADG g:aNumber\_s*' ..
507 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
508 '\d\+ LISTAPPEND\_s*' ..
509 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200510 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200511 res)
512enddef
513
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200514def s:BlobAdd()
515 var b: blob = 0z
516 add(b, 123)
517 add(b, g:aNumber)
518enddef
519
520def Test_disassemble_blob_add()
521 var res = execute('disass s:BlobAdd')
522 assert_match('<SNR>\d*_BlobAdd\_s*' ..
523 'var b: blob = 0z\_s*' ..
524 '\d PUSHBLOB 0z\_s*' ..
525 '\d STORE $0\_s*' ..
526 'add(b, 123)\_s*' ..
527 '\d LOAD $0\_s*' ..
528 '\d PUSHNR 123\_s*' ..
529 '\d BLOBAPPEND\_s*' ..
530 '\d DROP\_s*' ..
531 'add(b, g:aNumber)\_s*' ..
532 '\d LOAD $0\_s*' ..
533 '\d\+ LOADG g:aNumber\_s*' ..
534 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
535 '\d\+ BLOBAPPEND\_s*' ..
536 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200537 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200538 res)
539enddef
540
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200541def s:BlobIndexSlice()
542 var b: blob = 0z112233
543 echo b[1]
544 echo b[1 : 2]
545enddef
546
547def Test_disassemble_blob_index_slice()
548 var res = execute('disass s:BlobIndexSlice')
549 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
550 'var b: blob = 0z112233\_s*' ..
551 '\d PUSHBLOB 0z112233\_s*' ..
552 '\d STORE $0\_s*' ..
553 'echo b\[1\]\_s*' ..
554 '\d LOAD $0\_s*' ..
555 '\d PUSHNR 1\_s*' ..
556 '\d BLOBINDEX\_s*' ..
557 '\d ECHO 1\_s*' ..
558 'echo b\[1 : 2\]\_s*' ..
559 '\d LOAD $0\_s*' ..
560 '\d PUSHNR 1\_s*' ..
561 '\d\+ PUSHNR 2\_s*' ..
562 '\d\+ BLOBSLICE\_s*' ..
563 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200564 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200565 res)
566enddef
567
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200568def s:ScriptFuncUnlet()
569 g:somevar = "value"
570 unlet g:somevar
571 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200572 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200573enddef
574
575def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200576 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200577 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
578 'g:somevar = "value"\_s*' ..
579 '\d PUSHS "value"\_s*' ..
580 '\d STOREG g:somevar\_s*' ..
581 'unlet g:somevar\_s*' ..
582 '\d UNLET g:somevar\_s*' ..
583 'unlet! g:somevar\_s*' ..
584 '\d UNLET! g:somevar\_s*' ..
585 'unlet $SOMEVAR\_s*' ..
586 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200587 res)
588enddef
589
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100590def s:ScriptFuncTry()
591 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200592 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100593 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200594 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100595 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200596 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100597 endtry
598enddef
599
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100600def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200601 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200602 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
603 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100604 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200605 'echo "yes"\_s*' ..
606 '\d PUSHS "yes"\_s*' ..
607 '\d ECHO 1\_s*' ..
608 'catch /fail/\_s*' ..
609 '\d JUMP -> \d\+\_s*' ..
610 '\d PUSH v:exception\_s*' ..
611 '\d PUSHS "fail"\_s*' ..
612 '\d COMPARESTRING =\~\_s*' ..
613 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
614 '\d CATCH\_s*' ..
615 'echo "no"\_s*' ..
616 '\d\+ PUSHS "no"\_s*' ..
617 '\d\+ ECHO 1\_s*' ..
618 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100619 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200620 'throw "end"\_s*' ..
621 '\d\+ PUSHS "end"\_s*' ..
622 '\d\+ THROW\_s*' ..
623 'endtry\_s*' ..
624 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200625 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100626enddef
627
628def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200629 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100630 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100631enddef
632
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100633def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200634 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200635 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200636 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200637 '\d PUSHNR 1\_s*' ..
638 '\d PUSHS "two"\_s*' ..
639 '\d PUSHNR 333\_s*' ..
640 '\d NEWLIST size 3\_s*' ..
641 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100642 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200643 '\d PUSHS "one"\_s*' ..
644 '\d PUSHNR 1\_s*' ..
645 '\d PUSHS "two"\_s*' ..
646 '\d PUSHS "val"\_s*' ..
647 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200648 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100649enddef
650
Bram Moolenaar6e949782020-04-13 17:21:00 +0200651def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100652 echo arg
653enddef
654
655func UserFunc()
656 echo 'nothing'
657endfunc
658
659func UserFuncWithArg(arg)
660 echo a:arg
661endfunc
662
663def s:ScriptFuncCall(): string
664 changenr()
665 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100666 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100667 FuncWithArg(343)
668 ScriptFuncNew()
669 s:ScriptFuncNew()
670 UserFunc()
671 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200672 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100673 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200674 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100675 FuncRefWithArg("bar")
676 return "yes"
677enddef
678
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100679def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200680 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200681 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
682 'changenr()\_s*' ..
683 '\d BCALL changenr(argc 0)\_s*' ..
684 '\d DROP\_s*' ..
685 'char2nr("abc")\_s*' ..
686 '\d PUSHS "abc"\_s*' ..
687 '\d BCALL char2nr(argc 1)\_s*' ..
688 '\d DROP\_s*' ..
689 'Test_disassemble_new()\_s*' ..
690 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
691 '\d DROP\_s*' ..
692 'FuncWithArg(343)\_s*' ..
693 '\d\+ PUSHNR 343\_s*' ..
694 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
695 '\d\+ DROP\_s*' ..
696 'ScriptFuncNew()\_s*' ..
697 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
698 '\d\+ DROP\_s*' ..
699 's:ScriptFuncNew()\_s*' ..
700 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
701 '\d\+ DROP\_s*' ..
702 'UserFunc()\_s*' ..
703 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
704 '\d\+ DROP\_s*' ..
705 'UserFuncWithArg("foo")\_s*' ..
706 '\d\+ PUSHS "foo"\_s*' ..
707 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
708 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200709 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200710 '\d\+ PUSHS "UserFunc"\_s*' ..
711 '\d\+ BCALL function(argc 1)\_s*' ..
712 '\d\+ STORE $0\_s*' ..
713 'FuncRef()\_s*' ..
714 '\d\+ LOAD $\d\_s*' ..
715 '\d\+ PCALL (argc 0)\_s*' ..
716 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200717 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200718 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
719 '\d\+ BCALL function(argc 1)\_s*' ..
720 '\d\+ STORE $1\_s*' ..
721 'FuncRefWithArg("bar")\_s*' ..
722 '\d\+ PUSHS "bar"\_s*' ..
723 '\d\+ LOAD $\d\_s*' ..
724 '\d\+ PCALL (argc 1)\_s*' ..
725 '\d\+ DROP\_s*' ..
726 'return "yes"\_s*' ..
727 '\d\+ PUSHS "yes"\_s*' ..
728 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200729 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100730enddef
731
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200732
733def s:CreateRefs()
734 var local = 'a'
735 def Append(arg: string)
736 local ..= arg
737 enddef
738 g:Append = Append
739 def Get(): string
740 return local
741 enddef
742 g:Get = Get
743enddef
744
745def Test_disassemble_closure()
746 CreateRefs()
747 var res = execute('disass g:Append')
748 assert_match('<lambda>\d\_s*' ..
749 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100750 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200751 '\d LOAD arg\[-1\]\_s*' ..
752 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100753 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200754 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200755 res)
756
757 res = execute('disass g:Get')
758 assert_match('<lambda>\d\_s*' ..
759 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100760 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200761 '\d RETURN',
762 res)
763
764 unlet g:Append
765 unlet g:Get
766enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200767
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100768
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200769def EchoArg(arg: string): string
770 return arg
771enddef
772def RefThis(): func
773 return function('EchoArg')
774enddef
775def s:ScriptPCall()
776 RefThis()("text")
777enddef
778
779def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200780 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200781 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
782 'RefThis()("text")\_s*' ..
783 '\d DCALL RefThis(argc 0)\_s*' ..
784 '\d PUSHS "text"\_s*' ..
785 '\d PCALL top (argc 1)\_s*' ..
786 '\d PCALL end\_s*' ..
787 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200788 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200789 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200790enddef
791
792
Bram Moolenaara26b9702020-04-18 19:53:28 +0200793def s:FuncWithForwardCall(): string
794 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100795enddef
796
797def DefinedLater(arg: string): string
798 return arg
799enddef
800
801def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200802 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200803 assert_match('FuncWithForwardCall\_s*' ..
804 'return g:DefinedLater("yes")\_s*' ..
805 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200806 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200807 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200808 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100809
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200810 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100811 assert_equal('yes', FuncWithForwardCall())
812
Bram Moolenaara26b9702020-04-18 19:53:28 +0200813 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200814 assert_match('FuncWithForwardCall\_s*' ..
815 'return g:DefinedLater("yes")\_s*' ..
816 '\d PUSHS "yes"\_s*' ..
817 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200818 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200819 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100820enddef
821
822
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200823def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200824 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100825enddef
826
827def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200828 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200829 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200830 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200831 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200832 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200833 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200834 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200835 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
836 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200837 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200838 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200839 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200840 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200841 '\d 2STRING stack\[-1]\_s*' ..
842 '\d\+ CONCAT\_s*' ..
843 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200844 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100845enddef
846
847
Bram Moolenaar158906c2020-02-06 20:39:45 +0100848def HasEval()
849 if has("eval")
850 echo "yes"
851 else
852 echo "no"
853 endif
854enddef
855
856def HasNothing()
857 if has("nothing")
858 echo "yes"
859 else
860 echo "no"
861 endif
862enddef
863
864def HasSomething()
865 if has("nothing")
866 echo "nothing"
867 elseif has("something")
868 echo "something"
869 elseif has("eval")
870 echo "eval"
871 elseif has("less")
872 echo "less"
873 endif
874enddef
875
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100876def HasGuiRunning()
877 if has("gui_running")
878 echo "yes"
879 else
880 echo "no"
881 endif
882enddef
883
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100884def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200885 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200886 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200887 assert_match('HasEval\_s*' ..
888 'if has("eval")\_s*' ..
889 'echo "yes"\_s*' ..
890 '\d PUSHS "yes"\_s*' ..
891 '\d ECHO 1\_s*' ..
892 'else\_s*' ..
893 'echo "no"\_s*' ..
894 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200895 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100896 assert_notmatch('JUMP', instr)
897
Bram Moolenaard2c61702020-09-06 15:58:36 +0200898 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100899 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200900 assert_match('HasNothing\_s*' ..
901 'if has("nothing")\_s*' ..
902 'echo "yes"\_s*' ..
903 'else\_s*' ..
904 'echo "no"\_s*' ..
905 '\d PUSHS "no"\_s*' ..
906 '\d ECHO 1\_s*' ..
907 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200908 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100909 assert_notmatch('PUSHS "yes"', instr)
910 assert_notmatch('JUMP', instr)
911
Bram Moolenaard2c61702020-09-06 15:58:36 +0200912 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100913 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200914 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200915 'if has("nothing")\_s*' ..
916 'echo "nothing"\_s*' ..
917 'elseif has("something")\_s*' ..
918 'echo "something"\_s*' ..
919 'elseif has("eval")\_s*' ..
920 'echo "eval"\_s*' ..
921 '\d PUSHS "eval"\_s*' ..
922 '\d ECHO 1\_s*' ..
923 'elseif has("less").*' ..
924 'echo "less"\_s*' ..
925 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200926 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100927 assert_notmatch('PUSHS "nothing"', instr)
928 assert_notmatch('PUSHS "something"', instr)
929 assert_notmatch('PUSHS "less"', instr)
930 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100931
932 var result: string
933 var instr_expected: string
934 if has('gui')
935 if has('gui_running')
936 # GUI already running, always returns "yes"
937 result = "\nyes"
938 instr_expected = 'HasGuiRunning.*' ..
939 'if has("gui_running")\_s*' ..
940 ' echo "yes"\_s*' ..
941 '\d PUSHS "yes"\_s*' ..
942 '\d ECHO 1\_s*' ..
943 'else\_s*' ..
944 ' echo "no"\_s*' ..
945 'endif'
946 else
947 result = "\nno"
948 if has('unix')
949 # GUI not running but can start later, call has()
950 instr_expected = 'HasGuiRunning.*' ..
951 'if has("gui_running")\_s*' ..
952 '\d PUSHS "gui_running"\_s*' ..
953 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200954 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100955 '\d JUMP_IF_FALSE -> \d\_s*' ..
956 ' echo "yes"\_s*' ..
957 '\d PUSHS "yes"\_s*' ..
958 '\d ECHO 1\_s*' ..
959 'else\_s*' ..
960 '\d JUMP -> \d\_s*' ..
961 ' echo "no"\_s*' ..
962 '\d PUSHS "no"\_s*' ..
963 '\d ECHO 1\_s*' ..
964 'endif'
965 else
966 # GUI not running, always return "no"
967 instr_expected = 'HasGuiRunning.*' ..
968 'if has("gui_running")\_s*' ..
969 ' echo "yes"\_s*' ..
970 'else\_s*' ..
971 ' echo "no"\_s*' ..
972 '\d PUSHS "no"\_s*' ..
973 '\d ECHO 1\_s*' ..
974 'endif'
975 endif
976 endif
977 else
978 # GUI not supported, always return "no"
979 result = "\nno"
980 instr_expected = 'HasGuiRunning.*' ..
981 'if has("gui_running")\_s*' ..
982 ' echo "yes"\_s*' ..
983 'else\_s*' ..
984 ' echo "no"\_s*' ..
985 '\d PUSHS "no"\_s*' ..
986 '\d ECHO 1\_s*' ..
987 'endif'
988 endif
989
990 assert_equal(result, execute('HasGuiRunning()'))
991 instr = execute('disassemble HasGuiRunning')
992 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100993enddef
994
Bram Moolenaarefd88552020-06-18 20:50:10 +0200995def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100996 if 1 < 0
997 return "maybe"
998 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200999 if g:cond
1000 return "yes"
1001 else
1002 return "no"
1003 endif
1004enddef
1005
1006def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001007 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001008 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001009 'if 1 < 0\_s*' ..
1010 ' return "maybe"\_s*' ..
1011 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001012 'if g:cond\_s*' ..
1013 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001014 '1 COND2BOOL\_s*' ..
1015 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001016 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001017 '3 PUSHS "yes"\_s*' ..
1018 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001019 'else\_s*' ..
1020 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001021 '5 PUSHS "no"\_s*' ..
1022 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001023 instr)
1024enddef
1025
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001026def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001027 var Funky1: func
1028 var Funky2: func = function("len")
1029 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001030enddef
1031
1032def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001033 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001034 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001035 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001036 '0 PUSHFUNC "\[none]"\_s*' ..
1037 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001038 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001039 '2 PUSHS "len"\_s*' ..
1040 '3 BCALL function(argc 1)\_s*' ..
1041 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001042 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001043 '\d PUSHS "UserFunc"\_s*' ..
1044 '\d BCALL funcref(argc 1)\_s*' ..
1045 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001046 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001047 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001048enddef
1049
1050if has('channel')
1051 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001052 var job1: job
1053 var job2: job = job_start("donothing")
1054 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001055 enddef
1056endif
1057
1058def Test_disassemble_channel()
1059 CheckFeature channel
1060
Bram Moolenaarac564082020-09-27 19:05:33 +02001061 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001062 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001063 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001064 '\d PUSHJOB "no process"\_s*' ..
1065 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001066 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001067 '\d PUSHS "donothing"\_s*' ..
1068 '\d BCALL job_start(argc 1)\_s*' ..
1069 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001070 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001071 '\d PUSHCHANNEL 0\_s*' ..
1072 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001073 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001074 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001075enddef
1076
Bram Moolenaar777770f2020-02-06 21:27:08 +01001077def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001078 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001079 return F("x")
1080enddef
1081
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001082def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001083 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001084 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001085 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001086 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001087 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001088 '\d STORE $0\_s*' ..
1089 'return F("x")\_s*' ..
1090 '\d PUSHS "x"\_s*' ..
1091 '\d LOAD $0\_s*' ..
1092 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001093 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001094 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001095
Bram Moolenaarac564082020-09-27 19:05:33 +02001096 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001097 instr = execute('disassemble ' .. name)
1098 assert_match('<lambda>\d\+\_s*' ..
1099 'return "X" .. a .. "X"\_s*' ..
1100 '\d PUSHS "X"\_s*' ..
1101 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001102 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001103 '\d CONCAT\_s*' ..
1104 '\d PUSHS "X"\_s*' ..
1105 '\d CONCAT\_s*' ..
1106 '\d RETURN',
1107 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001108enddef
1109
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001110def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001111 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001112 return Ref(g:value)
1113enddef
1114
1115def Test_disassemble_lambda_with_type()
1116 g:value = 5
1117 assert_equal(15, LambdaWithType())
1118 var instr = execute('disassemble LambdaWithType')
1119 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001120 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001121 '\d FUNCREF <lambda>\d\+\_s*' ..
1122 '\d STORE $0\_s*' ..
1123 'return Ref(g:value)\_s*' ..
1124 '\d LOADG g:value\_s*' ..
1125 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001126 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001127 '\d PCALL (argc 1)\_s*' ..
1128 '\d RETURN',
1129 instr)
1130enddef
1131
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001132def NestedOuter()
1133 def g:Inner()
1134 echomsg "inner"
1135 enddef
1136enddef
1137
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001138def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001139 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001140 assert_match('NestedOuter\_s*' ..
1141 'def g:Inner()\_s*' ..
1142 'echomsg "inner"\_s*' ..
1143 'enddef\_s*' ..
1144 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001145 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001146 instr)
1147enddef
1148
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001149def NestedDefList()
1150 def
1151 def Info
1152 def /Info
1153 def /Info/
1154enddef
1155
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001156def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001157 var instr = execute('disassemble NestedDefList')
1158 assert_match('NestedDefList\_s*' ..
1159 'def\_s*' ..
1160 '\d DEF \_s*' ..
1161 'def Info\_s*' ..
1162 '\d DEF Info\_s*' ..
1163 'def /Info\_s*' ..
1164 '\d DEF /Info\_s*' ..
1165 'def /Info/\_s*' ..
1166 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001167 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001168 instr)
1169enddef
1170
Bram Moolenaar6e949782020-04-13 17:21:00 +02001171def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001172 if arg == 1 && arg != 2 || arg == 4
1173 return 'yes'
1174 endif
1175 return 'no'
1176enddef
1177
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001178def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001179 assert_equal("yes", AndOr(1))
1180 assert_equal("no", AndOr(2))
1181 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001182 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001183 assert_match('AndOr\_s*' ..
1184 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1185 '\d LOAD arg\[-1]\_s*' ..
1186 '\d PUSHNR 1\_s*' ..
1187 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001188 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001189 '\d LOAD arg\[-1]\_s*' ..
1190 '\d PUSHNR 2\_s*' ..
1191 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001192 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001193 '\d LOAD arg\[-1]\_s*' ..
1194 '\d\+ PUSHNR 4\_s*' ..
1195 '\d\+ COMPAREANY ==\_s*' ..
1196 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001197 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001198enddef
1199
Bram Moolenaar04d05222020-02-06 22:06:54 +01001200def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001201 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001202 for i in range(3)
1203 res->add(i)
1204 endfor
1205 return res
1206enddef
1207
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001208def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001209 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001210 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001211 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001212 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001213 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001214 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001215 '\d STORE $0\_s*' ..
1216 'for i in range(3)\_s*' ..
1217 '\d STORE -1 in $1\_s*' ..
1218 '\d PUSHNR 3\_s*' ..
1219 '\d BCALL range(argc 1)\_s*' ..
1220 '\d FOR $1 -> \d\+\_s*' ..
1221 '\d STORE $2\_s*' ..
1222 'res->add(i)\_s*' ..
1223 '\d LOAD $0\_s*' ..
1224 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001225 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001226 '\d\+ DROP\_s*' ..
1227 'endfor\_s*' ..
1228 '\d\+ JUMP -> \d\+\_s*' ..
1229 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001230 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001231enddef
1232
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001233def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001234 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001235 for str in eval('["one", "two"]')
1236 res ..= str
1237 endfor
1238 return res
1239enddef
1240
1241def Test_disassemble_for_loop_eval()
1242 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001243 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001244 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001245 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001246 '\d PUSHS ""\_s*' ..
1247 '\d STORE $0\_s*' ..
1248 'for str in eval(''\["one", "two"\]'')\_s*' ..
1249 '\d STORE -1 in $1\_s*' ..
1250 '\d PUSHS "\["one", "two"\]"\_s*' ..
1251 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001252 '\d FOR $1 -> \d\+\_s*' ..
1253 '\d STORE $2\_s*' ..
1254 'res ..= str\_s*' ..
1255 '\d\+ LOAD $0\_s*' ..
1256 '\d\+ LOAD $2\_s*' ..
1257 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1258 '\d\+ CONCAT\_s*' ..
1259 '\d\+ STORE $0\_s*' ..
1260 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001261 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001262 '\d\+ DROP\_s*' ..
1263 'return res\_s*' ..
1264 '\d\+ LOAD $0\_s*' ..
1265 '\d\+ RETURN',
1266 instr)
1267enddef
1268
Bram Moolenaar792f7862020-11-23 08:31:18 +01001269def ForLoopUnpack()
1270 for [x1, x2] in [[1, 2], [3, 4]]
1271 echo x1 x2
1272 endfor
1273enddef
1274
1275def Test_disassemble_for_loop_unpack()
1276 var instr = execute('disassemble ForLoopUnpack')
1277 assert_match('ForLoopUnpack\_s*' ..
1278 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1279 '\d\+ STORE -1 in $0\_s*' ..
1280 '\d\+ PUSHNR 1\_s*' ..
1281 '\d\+ PUSHNR 2\_s*' ..
1282 '\d\+ NEWLIST size 2\_s*' ..
1283 '\d\+ PUSHNR 3\_s*' ..
1284 '\d\+ PUSHNR 4\_s*' ..
1285 '\d\+ NEWLIST size 2\_s*' ..
1286 '\d\+ NEWLIST size 2\_s*' ..
1287 '\d\+ FOR $0 -> 16\_s*' ..
1288 '\d\+ UNPACK 2\_s*' ..
1289 '\d\+ STORE $1\_s*' ..
1290 '\d\+ STORE $2\_s*' ..
1291 'echo x1 x2\_s*' ..
1292 '\d\+ LOAD $1\_s*' ..
1293 '\d\+ LOAD $2\_s*' ..
1294 '\d\+ ECHO 2\_s*' ..
1295 'endfor\_s*' ..
1296 '\d\+ JUMP -> 8\_s*' ..
1297 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001298 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001299 instr)
1300enddef
1301
Bram Moolenaarc150c092021-02-13 15:02:46 +01001302def ForLoopContinue()
1303 for nr in [1, 2]
1304 try
1305 echo "ok"
1306 try
1307 echo "deeper"
1308 catch
1309 continue
1310 endtry
1311 catch
1312 echo "not ok"
1313 endtry
1314 endfor
1315enddef
1316
1317def Test_disassemble_for_loop_continue()
1318 var instr = execute('disassemble ForLoopContinue')
1319 assert_match('ForLoopContinue\_s*' ..
1320 'for nr in \[1, 2]\_s*' ..
1321 '0 STORE -1 in $0\_s*' ..
1322 '1 PUSHNR 1\_s*' ..
1323 '2 PUSHNR 2\_s*' ..
1324 '3 NEWLIST size 2\_s*' ..
1325 '4 FOR $0 -> 22\_s*' ..
1326 '5 STORE $1\_s*' ..
1327 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001328 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001329 'echo "ok"\_s*' ..
1330 '7 PUSHS "ok"\_s*' ..
1331 '8 ECHO 1\_s*' ..
1332 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001333 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001334 'echo "deeper"\_s*' ..
1335 '10 PUSHS "deeper"\_s*' ..
1336 '11 ECHO 1\_s*' ..
1337 'catch\_s*' ..
1338 '12 JUMP -> 15\_s*' ..
1339 '13 CATCH\_s*' ..
1340 'continue\_s*' ..
1341 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1342 'endtry\_s*' ..
1343 '15 ENDTRY\_s*' ..
1344 'catch\_s*' ..
1345 '16 JUMP -> 20\_s*' ..
1346 '17 CATCH\_s*' ..
1347 'echo "not ok"\_s*' ..
1348 '18 PUSHS "not ok"\_s*' ..
1349 '19 ECHO 1\_s*' ..
1350 'endtry\_s*' ..
1351 '20 ENDTRY\_s*' ..
1352 'endfor\_s*' ..
1353 '21 JUMP -> 4\_s*' ..
1354 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001355 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001356 instr)
1357enddef
1358
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001359let g:number = 42
1360
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001361def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001362 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001363enddef
1364
1365def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001367 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001368 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001369 '\d PUSHNR 23\_s*' ..
1370 '\d LOADG g:number\_s*' ..
1371 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1372 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001373 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001374 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001375 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001376 instr)
1377enddef
1378
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001379def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001380 var nr = 3
1381 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001382 nrres = nr - 7
1383 nrres = nr * 7
1384 nrres = nr / 7
1385 nrres = nr % 7
1386
Bram Moolenaarac564082020-09-27 19:05:33 +02001387 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001388 anyres = g:number - 7
1389 anyres = g:number * 7
1390 anyres = g:number / 7
1391 anyres = g:number % 7
1392
1393 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001394 var fl = 3.0
1395 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001396 flres = fl - 7.0
1397 flres = fl * 7.0
1398 flres = fl / 7.0
1399 endif
1400enddef
1401
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001402def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001404 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001405 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001406 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001407 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001408 '\d LOAD $0.*' ..
1409 '\d PUSHNR 7.*' ..
1410 '\d OPNR +.*' ..
1411 '\d STORE $1.*' ..
1412 'nrres = nr - 7.*' ..
1413 '\d OPNR -.*' ..
1414 'nrres = nr \* 7.*' ..
1415 '\d OPNR \*.*' ..
1416 'nrres = nr / 7.*' ..
1417 '\d OPNR /.*' ..
1418 'nrres = nr % 7.*' ..
1419 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001420 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001421 '\d LOADG g:number.*' ..
1422 '\d PUSHNR 7.*' ..
1423 '\d OPANY +.*' ..
1424 '\d STORE $2.*' ..
1425 'anyres = g:number - 7.*' ..
1426 '\d OPANY -.*' ..
1427 'anyres = g:number \* 7.*' ..
1428 '\d OPANY \*.*' ..
1429 'anyres = g:number / 7.*' ..
1430 '\d OPANY /.*' ..
1431 'anyres = g:number % 7.*' ..
1432 '\d OPANY %.*',
1433 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001434 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001435 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001436 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001437 '\d PUSHF 3.0.*' ..
1438 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001440 '\d LOAD $3.*' ..
1441 '\d PUSHF 7.0.*' ..
1442 '\d OPFLOAT +.*' ..
1443 '\d STORE $4.*' ..
1444 'flres = fl - 7.0.*' ..
1445 '\d OPFLOAT -.*' ..
1446 'flres = fl \* 7.0.*' ..
1447 '\d OPFLOAT \*.*' ..
1448 'flres = fl / 7.0.*' ..
1449 '\d OPFLOAT /.*',
1450 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001451 endif
1452enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001453
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001454def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001455 var reslist = [1, 2] + [3, 4]
1456 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001457enddef
1458
1459def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001460 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001461 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001462 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001463 '\d PUSHNR 1.*' ..
1464 '\d PUSHNR 2.*' ..
1465 '\d NEWLIST size 2.*' ..
1466 '\d PUSHNR 3.*' ..
1467 '\d PUSHNR 4.*' ..
1468 '\d NEWLIST size 2.*' ..
1469 '\d ADDLIST.*' ..
1470 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001471 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001472 '\d PUSHBLOB 0z1122.*' ..
1473 '\d PUSHBLOB 0z3344.*' ..
1474 '\d ADDBLOB.*' ..
1475 '\d STORE $.*',
1476 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001477enddef
1478
1479let g:aa = 'aa'
1480def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001481 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001482 return res
1483enddef
1484
1485def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001486 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001487 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001488 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001489 '\d LOADG g:aa.*' ..
1490 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001491 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001492 '\d CONCAT.*' ..
1493 '\d STORE $.*',
1494 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001495 assert_equal('aabb', ConcatString())
1496enddef
1497
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001498def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001499 var s = "abcd"
1500 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001501 return res
1502enddef
1503
1504def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001505 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001506 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001507 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001508 '\d PUSHS "abcd"\_s*' ..
1509 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001510 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001511 '\d LOAD $0\_s*' ..
1512 '\d PUSHNR 1\_s*' ..
1513 '\d STRINDEX\_s*' ..
1514 '\d STORE $1\_s*',
1515 instr)
1516 assert_equal('b', StringIndex())
1517enddef
1518
Bram Moolenaared591872020-08-15 22:14:53 +02001519def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001520 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001521 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001522 return res
1523enddef
1524
1525def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001526 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001527 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001528 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001529 '\d PUSHS "abcd"\_s*' ..
1530 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001531 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001532 '\d LOAD $0\_s*' ..
1533 '\d PUSHNR 1\_s*' ..
1534 '\d PUSHNR 8\_s*' ..
1535 '\d STRSLICE\_s*' ..
1536 '\d STORE $1\_s*',
1537 instr)
1538 assert_equal('bcd', StringSlice())
1539enddef
1540
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001541def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001542 var l = [1, 2, 3]
1543 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001544 return res
1545enddef
1546
1547def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001548 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001549 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001550 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001551 '\d PUSHNR 1\_s*' ..
1552 '\d PUSHNR 2\_s*' ..
1553 '\d PUSHNR 3\_s*' ..
1554 '\d NEWLIST size 3\_s*' ..
1555 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001556 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001557 '\d LOAD $0\_s*' ..
1558 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001559 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001560 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001561 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001562 assert_equal(2, ListIndex())
1563enddef
1564
Bram Moolenaared591872020-08-15 22:14:53 +02001565def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001566 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001567 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001568 return res
1569enddef
1570
1571def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001572 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001573 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001574 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001575 '\d PUSHNR 1\_s*' ..
1576 '\d PUSHNR 2\_s*' ..
1577 '\d PUSHNR 3\_s*' ..
1578 '\d NEWLIST size 3\_s*' ..
1579 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001580 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001581 '\d LOAD $0\_s*' ..
1582 '\d PUSHNR 1\_s*' ..
1583 '\d PUSHNR 8\_s*' ..
1584 '\d LISTSLICE\_s*' ..
1585 '\d STORE $1\_s*',
1586 instr)
1587 assert_equal([2, 3], ListSlice())
1588enddef
1589
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001590def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001591 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001592 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001593 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001594 return res
1595enddef
1596
1597def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001598 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001599 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001600 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001601 '\d PUSHS "item"\_s*' ..
1602 '\d PUSHNR 1\_s*' ..
1603 '\d NEWDICT size 1\_s*' ..
1604 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001605 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001606 '\d\+ LOAD $0\_s*' ..
1607 '\d\+ MEMBER item\_s*' ..
1608 '\d\+ STORE $1\_s*' ..
1609 'res = d\["item"\]\_s*' ..
1610 '\d\+ LOAD $0\_s*' ..
1611 '\d\+ PUSHS "item"\_s*' ..
1612 '\d\+ MEMBER\_s*' ..
1613 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001614 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001615 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001616enddef
1617
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001618let somelist = [1, 2, 3, 4, 5]
1619def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001620 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001621 return res
1622enddef
1623
1624def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001625 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001626 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001627 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001628 '\d LOADG g:somelist\_s*' ..
1629 '\d PUSHNR 2\_s*' ..
1630 '\d ANYINDEX\_s*' ..
1631 '\d STORE $0\_s*' ..
1632 'return res\_s*' ..
1633 '\d LOAD $0\_s*' ..
1634 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1635 '\d RETURN',
1636 instr)
1637 assert_equal(3, AnyIndex())
1638enddef
1639
1640def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001641 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001642 return res
1643enddef
1644
1645def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001646 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001647 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001648 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001649 '\d LOADG g:somelist\_s*' ..
1650 '\d PUSHNR 1\_s*' ..
1651 '\d PUSHNR 3\_s*' ..
1652 '\d ANYSLICE\_s*' ..
1653 '\d STORE $0\_s*' ..
1654 'return res\_s*' ..
1655 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001656 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001657 '\d RETURN',
1658 instr)
1659 assert_equal([2, 3, 4], AnySlice())
1660enddef
1661
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001662def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001663 var nr = 9
1664 var plus = +nr
1665 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001666 return res
1667enddef
1668
1669def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001670 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001671 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001672 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001673 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001674 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001675 '\d LOAD $0\_s*' ..
1676 '\d CHECKNR\_s*' ..
1677 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001678 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001679 '\d LOAD $0\_s*' ..
1680 '\d NEGATENR\_s*' ..
1681 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001682 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001683 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001684enddef
1685
1686def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001687 var flag = true
1688 var invert = !flag
1689 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001690 return res
1691enddef
1692
1693def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001694 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001695 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001696 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001697 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001698 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001699 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001700 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001701 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001702 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001703 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001704 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001705 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001706 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001707 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001708 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001709enddef
1710
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001711def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001712 var name: bool = 1 && 0 || 1
1713 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001714enddef
1715
1716def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001717 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001718 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001719 'var name: bool = 1 && 0 || 1\_s*' ..
1720 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001721 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001722 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1723 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001724 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001725 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1726 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001727 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001728 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001729 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001730 '\d\+ LOAD $0\_s*' ..
1731 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001732 instr)
1733 assert_equal(true, InvertBool())
1734enddef
1735
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001736def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001737 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001738 ['true == isFalse', 'COMPAREBOOL =='],
1739 ['true != isFalse', 'COMPAREBOOL !='],
1740 ['v:none == isNull', 'COMPARESPECIAL =='],
1741 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001742
Bram Moolenaara5565e42020-05-09 15:44:01 +02001743 ['111 == aNumber', 'COMPARENR =='],
1744 ['111 != aNumber', 'COMPARENR !='],
1745 ['111 > aNumber', 'COMPARENR >'],
1746 ['111 < aNumber', 'COMPARENR <'],
1747 ['111 >= aNumber', 'COMPARENR >='],
1748 ['111 <= aNumber', 'COMPARENR <='],
1749 ['111 =~ aNumber', 'COMPARENR =\~'],
1750 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001751
Bram Moolenaara5565e42020-05-09 15:44:01 +02001752 ['"xx" != aString', 'COMPARESTRING !='],
1753 ['"xx" > aString', 'COMPARESTRING >'],
1754 ['"xx" < aString', 'COMPARESTRING <'],
1755 ['"xx" >= aString', 'COMPARESTRING >='],
1756 ['"xx" <= aString', 'COMPARESTRING <='],
1757 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1758 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1759 ['"xx" is aString', 'COMPARESTRING is'],
1760 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001761
Bram Moolenaara5565e42020-05-09 15:44:01 +02001762 ['0z11 == aBlob', 'COMPAREBLOB =='],
1763 ['0z11 != aBlob', 'COMPAREBLOB !='],
1764 ['0z11 is aBlob', 'COMPAREBLOB is'],
1765 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001766
Bram Moolenaara5565e42020-05-09 15:44:01 +02001767 ['[1, 2] == aList', 'COMPARELIST =='],
1768 ['[1, 2] != aList', 'COMPARELIST !='],
1769 ['[1, 2] is aList', 'COMPARELIST is'],
1770 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001771
Bram Moolenaare0de1712020-12-02 17:36:54 +01001772 ['{a: 1} == aDict', 'COMPAREDICT =='],
1773 ['{a: 1} != aDict', 'COMPAREDICT !='],
1774 ['{a: 1} is aDict', 'COMPAREDICT is'],
1775 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001776
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001777 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1778 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1779 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1780 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001781
1782 ['77 == g:xx', 'COMPAREANY =='],
1783 ['77 != g:xx', 'COMPAREANY !='],
1784 ['77 > g:xx', 'COMPAREANY >'],
1785 ['77 < g:xx', 'COMPAREANY <'],
1786 ['77 >= g:xx', 'COMPAREANY >='],
1787 ['77 <= g:xx', 'COMPAREANY <='],
1788 ['77 =~ g:xx', 'COMPAREANY =\~'],
1789 ['77 !~ g:xx', 'COMPAREANY !\~'],
1790 ['77 is g:xx', 'COMPAREANY is'],
1791 ['77 isnot g:xx', 'COMPAREANY isnot'],
1792 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001793 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001794 if has('float')
1795 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001796 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1797 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1798 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1799 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1800 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1801 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1802 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1803 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001804 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001806 endif
1807
Bram Moolenaarac564082020-09-27 19:05:33 +02001808 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001809 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001810 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001811 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001812 ' var isFalse = false',
1813 ' var isNull = v:null',
1814 ' var aNumber = 222',
1815 ' var aString = "yy"',
1816 ' var aBlob = 0z22',
1817 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001818 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001819 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001820 ' if ' .. case[0],
1821 ' echo 42'
1822 ' endif',
1823 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001824 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001825 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001826 assert_match('TestCase' .. nr .. '.*' ..
1827 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1828 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001829 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001830 '\d ' .. case[1] .. '.*' ..
1831 '\d JUMP_IF_FALSE -> \d\+.*',
1832 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001833
1834 nr += 1
1835 endfor
1836
Bram Moolenaar22da5592020-03-19 14:52:20 +01001837 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001838enddef
1839
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001840def s:FalsyOp()
1841 echo g:flag ?? "yes"
1842 echo [] ?? "empty list"
1843 echo "" ?? "empty string"
1844enddef
1845
1846def Test_dsassemble_falsy_op()
1847 var res = execute('disass s:FalsyOp')
1848 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1849 'echo g:flag ?? "yes"\_s*' ..
1850 '0 LOADG g:flag\_s*' ..
1851 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1852 '2 PUSHS "yes"\_s*' ..
1853 '3 ECHO 1\_s*' ..
1854 'echo \[\] ?? "empty list"\_s*' ..
1855 '4 NEWLIST size 0\_s*' ..
1856 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1857 '6 PUSHS "empty list"\_s*' ..
1858 '7 ECHO 1\_s*' ..
1859 'echo "" ?? "empty string"\_s*' ..
1860 '\d\+ PUSHS "empty string"\_s*' ..
1861 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001862 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001863 res)
1864enddef
1865
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001866def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001867 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001868 ['"xx" == "yy"', false],
1869 ['"aa" == "aa"', true],
1870 ['has("eval") ? true : false', true],
1871 ['has("asdf") ? true : false', false],
1872 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001873
Bram Moolenaarac564082020-09-27 19:05:33 +02001874 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001875 for case in cases
1876 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001877 ' if ' .. case[0],
1878 ' echo 42'
1879 ' endif',
1880 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001881 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001882 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001883 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001884 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001885 assert_match('TestCase' .. nr .. '.*' ..
1886 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1887 '\d PUSHNR 42.*' ..
1888 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001889 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001890 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001891 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001892 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001893 assert_match('TestCase' .. nr .. '.*' ..
1894 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1895 'echo 42[ \n]*' ..
1896 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001897 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001898 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001899 endif
1900
1901 nr += 1
1902 endfor
1903
1904 delete('Xdisassemble')
1905enddef
1906
Bram Moolenaarad39c092020-02-26 18:23:43 +01001907def s:Execute()
1908 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001909 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001910 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001911 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001912 execute 'help ' .. tag
1913enddef
1914
1915def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001916 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001917 assert_match('\<SNR>\d*_Execute\_s*' ..
1918 "execute 'help vim9.txt'\\_s*" ..
1919 '\d PUSHS "help vim9.txt"\_s*' ..
1920 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001921 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001922 '\d PUSHS "help vim9.txt"\_s*' ..
1923 '\d STORE $0\_s*' ..
1924 'execute cmd\_s*' ..
1925 '\d LOAD $0\_s*' ..
1926 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001927 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001928 '\d PUSHS "vim9.txt"\_s*' ..
1929 '\d STORE $1\_s*' ..
1930 "execute 'help ' .. tag\\_s*" ..
1931 '\d\+ PUSHS "help "\_s*' ..
1932 '\d\+ LOAD $1\_s*' ..
1933 '\d\+ CONCAT\_s*' ..
1934 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001935 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001936 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001937enddef
1938
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001939def s:Echomsg()
1940 echomsg 'some' 'message'
1941 echoerr 'went' .. 'wrong'
1942enddef
1943
1944def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001945 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001946 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1947 "echomsg 'some' 'message'\\_s*" ..
1948 '\d PUSHS "some"\_s*' ..
1949 '\d PUSHS "message"\_s*' ..
1950 '\d ECHOMSG 2\_s*' ..
1951 "echoerr 'went' .. 'wrong'\\_s*" ..
1952 '\d PUSHS "wentwrong"\_s*' ..
1953 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001954 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001955 res)
1956enddef
1957
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001958def SomeStringArg(arg: string)
1959 echo arg
1960enddef
1961
1962def SomeAnyArg(arg: any)
1963 echo arg
1964enddef
1965
1966def SomeStringArgAndReturn(arg: string): string
1967 return arg
1968enddef
1969
1970def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001971 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001972 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1973 '\d *echo arg.*' ..
1974 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001975 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001976
Bram Moolenaarac564082020-09-27 19:05:33 +02001977 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001978 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1979 '\d *echo arg\_s*' ..
1980 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001981 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001982
Bram Moolenaarac564082020-09-27 19:05:33 +02001983 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001984 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1985 '\d *return arg\_s*' ..
1986 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001987 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001988enddef
1989
Bram Moolenaar09689a02020-05-09 22:50:08 +02001990def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001991 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001992 vim9script
1993 def FuncOne(): string
1994 return FuncTwo()
1995 enddef
1996 def FuncTwo(): string
1997 return 'two'
1998 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001999 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002000 END
2001 writefile(lines, 'Xdisassemble')
2002 source Xdisassemble
2003
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002004 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002005 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2006 'return FuncTwo()\_s*' ..
2007 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002008 '\d RETURN',
2009 g:res_FuncOne)
2010
2011 delete('Xdisassemble')
2012 unlet g:res_FuncOne
2013enddef
2014
Bram Moolenaar61a89812020-05-07 16:58:17 +02002015def s:ConcatStrings(): string
2016 return 'one' .. 'two' .. 'three'
2017enddef
2018
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002019def s:ComputeConst(): number
2020 return 2 + 3 * 4 / 6 + 7
2021enddef
2022
Bram Moolenaar1c747212020-05-09 18:28:34 +02002023def s:ComputeConstParen(): number
2024 return ((2 + 4) * (8 / 2)) / (3 + 4)
2025enddef
2026
Bram Moolenaar61a89812020-05-07 16:58:17 +02002027def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002028 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002029 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2030 "return 'one' .. 'two' .. 'three'\\_s*" ..
2031 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002032 '\d RETURN',
2033 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002034
2035 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002036 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2037 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2038 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002039 '\d RETURN',
2040 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002041
2042 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002043 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2044 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2045 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002046 '\d RETURN',
2047 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002048enddef
2049
Bram Moolenaar389df252020-07-09 21:20:47 +02002050def s:CallAppend()
2051 eval "some text"->append(2)
2052enddef
2053
2054def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002055 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002056 assert_match('<SNR>\d*_CallAppend\_s*' ..
2057 'eval "some text"->append(2)\_s*' ..
2058 '\d PUSHS "some text"\_s*' ..
2059 '\d PUSHNR 2\_s*' ..
2060 '\d SHUFFLE 2 up 1\_s*' ..
2061 '\d BCALL append(argc 2)\_s*' ..
2062 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002063 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002064 res)
2065enddef
2066
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002067
2068def s:SilentMessage()
2069 silent echomsg "text"
2070 silent! echoerr "error"
2071enddef
2072
2073def Test_silent()
2074 var res = execute('disass s:SilentMessage')
2075 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2076 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002077 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002078 '\d PUSHS "text"\_s*' ..
2079 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002080 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002081 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002082 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002083 '\d PUSHS "error"\_s*' ..
2084 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002085 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002086 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002087 res)
2088enddef
2089
2090def s:SilentIf()
2091 silent if 4 == g:five
2092 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002093 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002094enddef
2095
2096def Test_silent_if()
2097 var res = execute('disass s:SilentIf')
2098 assert_match('<SNR>\d*_SilentIf\_s*' ..
2099 'silent if 4 == g:five\_s*' ..
2100 '\d\+ CMDMOD silent\_s*' ..
2101 '\d\+ PUSHNR 4\_s*' ..
2102 '\d\+ LOADG g:five\_s*' ..
2103 '\d\+ COMPAREANY ==\_s*' ..
2104 '\d\+ CMDMOD_REV\_s*' ..
2105 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2106 'silent elseif 4 == g:five\_s*' ..
2107 '\d\+ JUMP -> \d\+\_s*' ..
2108 '\d\+ CMDMOD silent\_s*' ..
2109 '\d\+ PUSHNR 4\_s*' ..
2110 '\d\+ LOADG g:five\_s*' ..
2111 '\d\+ COMPAREANY ==\_s*' ..
2112 '\d\+ CMDMOD_REV\_s*' ..
2113 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002114 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002115 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002116 res)
2117enddef
2118
2119def s:SilentFor()
2120 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002121 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002122enddef
2123
2124def Test_silent_for()
2125 var res = execute('disass s:SilentFor')
2126 assert_match('<SNR>\d*_SilentFor\_s*' ..
2127 'silent for i in \[0\]\_s*' ..
2128 '\d CMDMOD silent\_s*' ..
2129 '\d STORE -1 in $0\_s*' ..
2130 '\d PUSHNR 0\_s*' ..
2131 '\d NEWLIST size 1\_s*' ..
2132 '\d CMDMOD_REV\_s*' ..
2133 '5 FOR $0 -> 8\_s*' ..
2134 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002135 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002136 '\d JUMP -> 5\_s*' ..
2137 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002138 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002139 res)
2140enddef
2141
2142def s:SilentWhile()
2143 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002144 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002145enddef
2146
2147def Test_silent_while()
2148 var res = execute('disass s:SilentWhile')
2149 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2150 'silent while g:not\_s*' ..
2151 '0 CMDMOD silent\_s*' ..
2152 '\d LOADG g:not\_s*' ..
2153 '\d COND2BOOL\_s*' ..
2154 '\d CMDMOD_REV\_s*' ..
2155 '\d JUMP_IF_FALSE -> 6\_s*' ..
2156
Bram Moolenaarfa984412021-03-25 22:15:28 +01002157 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002158 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002159 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002160 res)
2161enddef
2162
2163def s:SilentReturn(): string
2164 silent return "done"
2165enddef
2166
2167def Test_silent_return()
2168 var res = execute('disass s:SilentReturn')
2169 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2170 'silent return "done"\_s*' ..
2171 '\d CMDMOD silent\_s*' ..
2172 '\d PUSHS "done"\_s*' ..
2173 '\d CMDMOD_REV\_s*' ..
2174 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002175 res)
2176enddef
2177
Bram Moolenaarb2049902021-01-24 12:53:53 +01002178def s:Profiled(): string
2179 echo "profiled"
Bram Moolenaar26d71162021-06-14 21:08:56 +02002180 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002181 return "done"
2182enddef
2183
2184def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002185 if !has('profile')
2186 MissingFeature 'profile'
2187 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002188 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002189 assert_match('<SNR>\d*_Profiled\_s*' ..
2190 'echo "profiled"\_s*' ..
2191 '\d PROFILE START line 1\_s*' ..
2192 '\d PUSHS "profiled"\_s*' ..
2193 '\d ECHO 1\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002194 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002195 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002196 '\d PROFILE START line 2\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002197 '\d PUSHS "some text"\_s*' ..
2198 '\d STORE $0\_s*' ..
2199 'return "done"\_s*' ..
2200 '\d PROFILE END\_s*' ..
2201 '\d PROFILE START line 3\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002202 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002203 '\d\+ RETURN\_s*' ..
2204 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002205 res)
2206enddef
2207
Bram Moolenaare99d4222021-06-13 14:01:26 +02002208def Test_debugged()
2209 var res = execute('disass debug s:Profiled')
2210 assert_match('<SNR>\d*_Profiled\_s*' ..
2211 'echo "profiled"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002212 '\d DEBUG line 1 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002213 '\d PUSHS "profiled"\_s*' ..
2214 '\d ECHO 1\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002215 'var some = "some text"\_s*' ..
2216 '\d DEBUG line 2 varcount 0\_s*' ..
2217 '\d PUSHS "some text"\_s*' ..
2218 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002219 'return "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002220 '\d DEBUG line 3 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002221 '\d PUSHS "done"\_s*' ..
2222 '\d RETURN\_s*',
2223 res)
2224enddef
2225
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002226def s:EchoMessages()
2227 echohl ErrorMsg | echom v:exception | echohl NONE
2228enddef
2229
2230def Test_disassemble_nextcmd()
2231 # splitting commands and removing trailing blanks should not change the line
2232 var res = execute('disass s:EchoMessages')
2233 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2234 'echohl ErrorMsg | echom v:exception | echohl NONE',
2235 res)
2236enddef
2237
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002238
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002239" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker