blob: f09cb1ddda8d9cf8085393345c4707816c93d28b [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 Moolenaar299f3032021-01-08 20:53:09 +0100120 '\d\+ RETURN 0',
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*' ..
136 '\d RETURN 0',
137 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*' ..
156 '\d RETURN 0',
157 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*' ..
184 '\d RETURN 0',
185 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*' ..
212 '\d RETURN 0',
213 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*' ..
231 '\d RETURN 0',
232 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 Moolenaar299f3032021-01-08 20:53:09 +0100247 '\d RETURN 0',
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 Moolenaar299f3032021-01-08 20:53:09 +0100261 '\d RETURN 0',
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 Moolenaar299f3032021-01-08 20:53:09 +0100275 '\d RETURN 0',
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 Moolenaar299f3032021-01-08 20:53:09 +0100393 '\d\+ RETURN 0',
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 Moolenaar299f3032021-01-08 20:53:09 +0100416 '\d\+ RETURN 0',
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 Moolenaar299f3032021-01-08 20:53:09 +0100451 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200452 res)
453enddef
454
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200455def s:ListAdd()
456 var l: list<number> = []
457 add(l, 123)
458 add(l, g:aNumber)
459enddef
460
461def Test_disassemble_list_add()
462 var res = execute('disass s:ListAdd')
463 assert_match('<SNR>\d*_ListAdd\_s*' ..
464 'var l: list<number> = []\_s*' ..
465 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100466 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200467 '\d STORE $0\_s*' ..
468 'add(l, 123)\_s*' ..
469 '\d LOAD $0\_s*' ..
470 '\d PUSHNR 123\_s*' ..
471 '\d LISTAPPEND\_s*' ..
472 '\d DROP\_s*' ..
473 'add(l, g:aNumber)\_s*' ..
474 '\d LOAD $0\_s*' ..
475 '\d\+ LOADG g:aNumber\_s*' ..
476 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
477 '\d\+ LISTAPPEND\_s*' ..
478 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100479 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200480 res)
481enddef
482
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200483def s:BlobAdd()
484 var b: blob = 0z
485 add(b, 123)
486 add(b, g:aNumber)
487enddef
488
489def Test_disassemble_blob_add()
490 var res = execute('disass s:BlobAdd')
491 assert_match('<SNR>\d*_BlobAdd\_s*' ..
492 'var b: blob = 0z\_s*' ..
493 '\d PUSHBLOB 0z\_s*' ..
494 '\d STORE $0\_s*' ..
495 'add(b, 123)\_s*' ..
496 '\d LOAD $0\_s*' ..
497 '\d PUSHNR 123\_s*' ..
498 '\d BLOBAPPEND\_s*' ..
499 '\d DROP\_s*' ..
500 'add(b, g:aNumber)\_s*' ..
501 '\d LOAD $0\_s*' ..
502 '\d\+ LOADG g:aNumber\_s*' ..
503 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
504 '\d\+ BLOBAPPEND\_s*' ..
505 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100506 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200507 res)
508enddef
509
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200510def s:BlobIndexSlice()
511 var b: blob = 0z112233
512 echo b[1]
513 echo b[1 : 2]
514enddef
515
516def Test_disassemble_blob_index_slice()
517 var res = execute('disass s:BlobIndexSlice')
518 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
519 'var b: blob = 0z112233\_s*' ..
520 '\d PUSHBLOB 0z112233\_s*' ..
521 '\d STORE $0\_s*' ..
522 'echo b\[1\]\_s*' ..
523 '\d LOAD $0\_s*' ..
524 '\d PUSHNR 1\_s*' ..
525 '\d BLOBINDEX\_s*' ..
526 '\d ECHO 1\_s*' ..
527 'echo b\[1 : 2\]\_s*' ..
528 '\d LOAD $0\_s*' ..
529 '\d PUSHNR 1\_s*' ..
530 '\d\+ PUSHNR 2\_s*' ..
531 '\d\+ BLOBSLICE\_s*' ..
532 '\d\+ ECHO 1\_s*' ..
533 '\d\+ RETURN 0',
534 res)
535enddef
536
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200537def s:ScriptFuncUnlet()
538 g:somevar = "value"
539 unlet g:somevar
540 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200541 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200542enddef
543
544def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200545 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200546 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
547 'g:somevar = "value"\_s*' ..
548 '\d PUSHS "value"\_s*' ..
549 '\d STOREG g:somevar\_s*' ..
550 'unlet g:somevar\_s*' ..
551 '\d UNLET g:somevar\_s*' ..
552 'unlet! g:somevar\_s*' ..
553 '\d UNLET! g:somevar\_s*' ..
554 'unlet $SOMEVAR\_s*' ..
555 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200556 res)
557enddef
558
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100559def s:ScriptFuncTry()
560 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200561 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100562 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200563 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100564 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200565 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100566 endtry
567enddef
568
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100569def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200570 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200571 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
572 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100573 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200574 'echo "yes"\_s*' ..
575 '\d PUSHS "yes"\_s*' ..
576 '\d ECHO 1\_s*' ..
577 'catch /fail/\_s*' ..
578 '\d JUMP -> \d\+\_s*' ..
579 '\d PUSH v:exception\_s*' ..
580 '\d PUSHS "fail"\_s*' ..
581 '\d COMPARESTRING =\~\_s*' ..
582 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
583 '\d CATCH\_s*' ..
584 'echo "no"\_s*' ..
585 '\d\+ PUSHS "no"\_s*' ..
586 '\d\+ ECHO 1\_s*' ..
587 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100588 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200589 'throw "end"\_s*' ..
590 '\d\+ PUSHS "end"\_s*' ..
591 '\d\+ THROW\_s*' ..
592 'endtry\_s*' ..
593 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200594 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100595enddef
596
597def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200598 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100599 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100600enddef
601
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100602def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200603 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200604 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200605 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200606 '\d PUSHNR 1\_s*' ..
607 '\d PUSHS "two"\_s*' ..
608 '\d PUSHNR 333\_s*' ..
609 '\d NEWLIST size 3\_s*' ..
610 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100611 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200612 '\d PUSHS "one"\_s*' ..
613 '\d PUSHNR 1\_s*' ..
614 '\d PUSHS "two"\_s*' ..
615 '\d PUSHS "val"\_s*' ..
616 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200617 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100618enddef
619
Bram Moolenaar6e949782020-04-13 17:21:00 +0200620def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100621 echo arg
622enddef
623
624func UserFunc()
625 echo 'nothing'
626endfunc
627
628func UserFuncWithArg(arg)
629 echo a:arg
630endfunc
631
632def s:ScriptFuncCall(): string
633 changenr()
634 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100635 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100636 FuncWithArg(343)
637 ScriptFuncNew()
638 s:ScriptFuncNew()
639 UserFunc()
640 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200641 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100642 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200643 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100644 FuncRefWithArg("bar")
645 return "yes"
646enddef
647
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100648def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200649 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200650 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
651 'changenr()\_s*' ..
652 '\d BCALL changenr(argc 0)\_s*' ..
653 '\d DROP\_s*' ..
654 'char2nr("abc")\_s*' ..
655 '\d PUSHS "abc"\_s*' ..
656 '\d BCALL char2nr(argc 1)\_s*' ..
657 '\d DROP\_s*' ..
658 'Test_disassemble_new()\_s*' ..
659 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
660 '\d DROP\_s*' ..
661 'FuncWithArg(343)\_s*' ..
662 '\d\+ PUSHNR 343\_s*' ..
663 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
664 '\d\+ DROP\_s*' ..
665 'ScriptFuncNew()\_s*' ..
666 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
667 '\d\+ DROP\_s*' ..
668 's:ScriptFuncNew()\_s*' ..
669 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
670 '\d\+ DROP\_s*' ..
671 'UserFunc()\_s*' ..
672 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
673 '\d\+ DROP\_s*' ..
674 'UserFuncWithArg("foo")\_s*' ..
675 '\d\+ PUSHS "foo"\_s*' ..
676 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
677 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200678 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200679 '\d\+ PUSHS "UserFunc"\_s*' ..
680 '\d\+ BCALL function(argc 1)\_s*' ..
681 '\d\+ STORE $0\_s*' ..
682 'FuncRef()\_s*' ..
683 '\d\+ LOAD $\d\_s*' ..
684 '\d\+ PCALL (argc 0)\_s*' ..
685 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200686 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200687 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
688 '\d\+ BCALL function(argc 1)\_s*' ..
689 '\d\+ STORE $1\_s*' ..
690 'FuncRefWithArg("bar")\_s*' ..
691 '\d\+ PUSHS "bar"\_s*' ..
692 '\d\+ LOAD $\d\_s*' ..
693 '\d\+ PCALL (argc 1)\_s*' ..
694 '\d\+ DROP\_s*' ..
695 'return "yes"\_s*' ..
696 '\d\+ PUSHS "yes"\_s*' ..
697 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200698 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100699enddef
700
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200701
702def s:CreateRefs()
703 var local = 'a'
704 def Append(arg: string)
705 local ..= arg
706 enddef
707 g:Append = Append
708 def Get(): string
709 return local
710 enddef
711 g:Get = Get
712enddef
713
714def Test_disassemble_closure()
715 CreateRefs()
716 var res = execute('disass g:Append')
717 assert_match('<lambda>\d\_s*' ..
718 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100719 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200720 '\d LOAD arg\[-1\]\_s*' ..
721 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100722 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100723 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200724 res)
725
726 res = execute('disass g:Get')
727 assert_match('<lambda>\d\_s*' ..
728 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100729 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200730 '\d RETURN',
731 res)
732
733 unlet g:Append
734 unlet g:Get
735enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200736
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100737
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200738def EchoArg(arg: string): string
739 return arg
740enddef
741def RefThis(): func
742 return function('EchoArg')
743enddef
744def s:ScriptPCall()
745 RefThis()("text")
746enddef
747
748def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200749 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200750 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
751 'RefThis()("text")\_s*' ..
752 '\d DCALL RefThis(argc 0)\_s*' ..
753 '\d PUSHS "text"\_s*' ..
754 '\d PCALL top (argc 1)\_s*' ..
755 '\d PCALL end\_s*' ..
756 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100757 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200758 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200759enddef
760
761
Bram Moolenaara26b9702020-04-18 19:53:28 +0200762def s:FuncWithForwardCall(): string
763 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100764enddef
765
766def DefinedLater(arg: string): string
767 return arg
768enddef
769
770def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200771 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200772 assert_match('FuncWithForwardCall\_s*' ..
773 'return g:DefinedLater("yes")\_s*' ..
774 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200775 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200776 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200777 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100778
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200779 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100780 assert_equal('yes', FuncWithForwardCall())
781
Bram Moolenaara26b9702020-04-18 19:53:28 +0200782 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200783 assert_match('FuncWithForwardCall\_s*' ..
784 'return g:DefinedLater("yes")\_s*' ..
785 '\d PUSHS "yes"\_s*' ..
786 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200787 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200788 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100789enddef
790
791
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200792def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200793 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100794enddef
795
796def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200797 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200798 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200799 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200800 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200801 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200802 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200803 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200804 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
805 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200806 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200807 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200808 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200809 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200810 '\d 2STRING stack\[-1]\_s*' ..
811 '\d\+ CONCAT\_s*' ..
812 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200813 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100814enddef
815
816
Bram Moolenaar158906c2020-02-06 20:39:45 +0100817def HasEval()
818 if has("eval")
819 echo "yes"
820 else
821 echo "no"
822 endif
823enddef
824
825def HasNothing()
826 if has("nothing")
827 echo "yes"
828 else
829 echo "no"
830 endif
831enddef
832
833def HasSomething()
834 if has("nothing")
835 echo "nothing"
836 elseif has("something")
837 echo "something"
838 elseif has("eval")
839 echo "eval"
840 elseif has("less")
841 echo "less"
842 endif
843enddef
844
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100845def HasGuiRunning()
846 if has("gui_running")
847 echo "yes"
848 else
849 echo "no"
850 endif
851enddef
852
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100853def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200854 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200855 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200856 assert_match('HasEval\_s*' ..
857 'if has("eval")\_s*' ..
858 'echo "yes"\_s*' ..
859 '\d PUSHS "yes"\_s*' ..
860 '\d ECHO 1\_s*' ..
861 'else\_s*' ..
862 'echo "no"\_s*' ..
863 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200864 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100865 assert_notmatch('JUMP', instr)
866
Bram Moolenaard2c61702020-09-06 15:58:36 +0200867 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100868 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200869 assert_match('HasNothing\_s*' ..
870 'if has("nothing")\_s*' ..
871 'echo "yes"\_s*' ..
872 'else\_s*' ..
873 'echo "no"\_s*' ..
874 '\d PUSHS "no"\_s*' ..
875 '\d ECHO 1\_s*' ..
876 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200877 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100878 assert_notmatch('PUSHS "yes"', instr)
879 assert_notmatch('JUMP', instr)
880
Bram Moolenaard2c61702020-09-06 15:58:36 +0200881 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100882 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200883 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200884 'if has("nothing")\_s*' ..
885 'echo "nothing"\_s*' ..
886 'elseif has("something")\_s*' ..
887 'echo "something"\_s*' ..
888 'elseif has("eval")\_s*' ..
889 'echo "eval"\_s*' ..
890 '\d PUSHS "eval"\_s*' ..
891 '\d ECHO 1\_s*' ..
892 'elseif has("less").*' ..
893 'echo "less"\_s*' ..
894 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200895 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100896 assert_notmatch('PUSHS "nothing"', instr)
897 assert_notmatch('PUSHS "something"', instr)
898 assert_notmatch('PUSHS "less"', instr)
899 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100900
901 var result: string
902 var instr_expected: string
903 if has('gui')
904 if has('gui_running')
905 # GUI already running, always returns "yes"
906 result = "\nyes"
907 instr_expected = 'HasGuiRunning.*' ..
908 'if has("gui_running")\_s*' ..
909 ' echo "yes"\_s*' ..
910 '\d PUSHS "yes"\_s*' ..
911 '\d ECHO 1\_s*' ..
912 'else\_s*' ..
913 ' echo "no"\_s*' ..
914 'endif'
915 else
916 result = "\nno"
917 if has('unix')
918 # GUI not running but can start later, call has()
919 instr_expected = 'HasGuiRunning.*' ..
920 'if has("gui_running")\_s*' ..
921 '\d PUSHS "gui_running"\_s*' ..
922 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200923 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100924 '\d JUMP_IF_FALSE -> \d\_s*' ..
925 ' echo "yes"\_s*' ..
926 '\d PUSHS "yes"\_s*' ..
927 '\d ECHO 1\_s*' ..
928 'else\_s*' ..
929 '\d JUMP -> \d\_s*' ..
930 ' echo "no"\_s*' ..
931 '\d PUSHS "no"\_s*' ..
932 '\d ECHO 1\_s*' ..
933 'endif'
934 else
935 # GUI not running, always return "no"
936 instr_expected = 'HasGuiRunning.*' ..
937 'if has("gui_running")\_s*' ..
938 ' echo "yes"\_s*' ..
939 'else\_s*' ..
940 ' echo "no"\_s*' ..
941 '\d PUSHS "no"\_s*' ..
942 '\d ECHO 1\_s*' ..
943 'endif'
944 endif
945 endif
946 else
947 # GUI not supported, always return "no"
948 result = "\nno"
949 instr_expected = 'HasGuiRunning.*' ..
950 'if has("gui_running")\_s*' ..
951 ' echo "yes"\_s*' ..
952 'else\_s*' ..
953 ' echo "no"\_s*' ..
954 '\d PUSHS "no"\_s*' ..
955 '\d ECHO 1\_s*' ..
956 'endif'
957 endif
958
959 assert_equal(result, execute('HasGuiRunning()'))
960 instr = execute('disassemble HasGuiRunning')
961 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100962enddef
963
Bram Moolenaarefd88552020-06-18 20:50:10 +0200964def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100965 if 1 < 0
966 return "maybe"
967 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200968 if g:cond
969 return "yes"
970 else
971 return "no"
972 endif
973enddef
974
975def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200976 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200977 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100978 'if 1 < 0\_s*' ..
979 ' return "maybe"\_s*' ..
980 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200981 'if g:cond\_s*' ..
982 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100983 '1 COND2BOOL\_s*' ..
984 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200985 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100986 '3 PUSHS "yes"\_s*' ..
987 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200988 'else\_s*' ..
989 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100990 '5 PUSHS "no"\_s*' ..
991 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200992 instr)
993enddef
994
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100995def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200996 var Funky1: func
997 var Funky2: func = function("len")
998 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100999enddef
1000
1001def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001002 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001003 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001004 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001005 '0 PUSHFUNC "\[none]"\_s*' ..
1006 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001007 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001008 '2 PUSHS "len"\_s*' ..
1009 '3 BCALL function(argc 1)\_s*' ..
1010 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001011 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001012 '\d PUSHS "UserFunc"\_s*' ..
1013 '\d BCALL funcref(argc 1)\_s*' ..
1014 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001015 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001016 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001017enddef
1018
1019if has('channel')
1020 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001021 var job1: job
1022 var job2: job = job_start("donothing")
1023 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001024 enddef
1025endif
1026
1027def Test_disassemble_channel()
1028 CheckFeature channel
1029
Bram Moolenaarac564082020-09-27 19:05:33 +02001030 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001031 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001032 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001033 '\d PUSHJOB "no process"\_s*' ..
1034 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001035 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001036 '\d PUSHS "donothing"\_s*' ..
1037 '\d BCALL job_start(argc 1)\_s*' ..
1038 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001039 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001040 '\d PUSHCHANNEL 0\_s*' ..
1041 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001042 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001043 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001044enddef
1045
Bram Moolenaar777770f2020-02-06 21:27:08 +01001046def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001047 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001048 return F("x")
1049enddef
1050
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001051def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001052 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001053 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001054 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001055 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001056 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001057 '\d STORE $0\_s*' ..
1058 'return F("x")\_s*' ..
1059 '\d PUSHS "x"\_s*' ..
1060 '\d LOAD $0\_s*' ..
1061 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001062 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001063 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001064
Bram Moolenaarac564082020-09-27 19:05:33 +02001065 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001066 instr = execute('disassemble ' .. name)
1067 assert_match('<lambda>\d\+\_s*' ..
1068 'return "X" .. a .. "X"\_s*' ..
1069 '\d PUSHS "X"\_s*' ..
1070 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001071 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001072 '\d CONCAT\_s*' ..
1073 '\d PUSHS "X"\_s*' ..
1074 '\d CONCAT\_s*' ..
1075 '\d RETURN',
1076 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001077enddef
1078
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001079def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001080 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001081 return Ref(g:value)
1082enddef
1083
1084def Test_disassemble_lambda_with_type()
1085 g:value = 5
1086 assert_equal(15, LambdaWithType())
1087 var instr = execute('disassemble LambdaWithType')
1088 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001089 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001090 '\d FUNCREF <lambda>\d\+\_s*' ..
1091 '\d STORE $0\_s*' ..
1092 'return Ref(g:value)\_s*' ..
1093 '\d LOADG g:value\_s*' ..
1094 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001095 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001096 '\d PCALL (argc 1)\_s*' ..
1097 '\d RETURN',
1098 instr)
1099enddef
1100
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001101def NestedOuter()
1102 def g:Inner()
1103 echomsg "inner"
1104 enddef
1105enddef
1106
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001107def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001108 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001109 assert_match('NestedOuter\_s*' ..
1110 'def g:Inner()\_s*' ..
1111 'echomsg "inner"\_s*' ..
1112 'enddef\_s*' ..
1113 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001114 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001115 instr)
1116enddef
1117
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001118def NestedDefList()
1119 def
1120 def Info
1121 def /Info
1122 def /Info/
1123enddef
1124
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001125def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001126 var instr = execute('disassemble NestedDefList')
1127 assert_match('NestedDefList\_s*' ..
1128 'def\_s*' ..
1129 '\d DEF \_s*' ..
1130 'def Info\_s*' ..
1131 '\d DEF Info\_s*' ..
1132 'def /Info\_s*' ..
1133 '\d DEF /Info\_s*' ..
1134 'def /Info/\_s*' ..
1135 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001136 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001137 instr)
1138enddef
1139
Bram Moolenaar6e949782020-04-13 17:21:00 +02001140def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001141 if arg == 1 && arg != 2 || arg == 4
1142 return 'yes'
1143 endif
1144 return 'no'
1145enddef
1146
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001147def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001148 assert_equal("yes", AndOr(1))
1149 assert_equal("no", AndOr(2))
1150 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001151 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001152 assert_match('AndOr\_s*' ..
1153 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1154 '\d LOAD arg\[-1]\_s*' ..
1155 '\d PUSHNR 1\_s*' ..
1156 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001157 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001158 '\d LOAD arg\[-1]\_s*' ..
1159 '\d PUSHNR 2\_s*' ..
1160 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001161 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001162 '\d LOAD arg\[-1]\_s*' ..
1163 '\d\+ PUSHNR 4\_s*' ..
1164 '\d\+ COMPAREANY ==\_s*' ..
1165 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001166 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001167enddef
1168
Bram Moolenaar04d05222020-02-06 22:06:54 +01001169def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001170 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001171 for i in range(3)
1172 res->add(i)
1173 endfor
1174 return res
1175enddef
1176
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001177def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001178 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001179 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001180 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001181 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001182 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001183 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001184 '\d STORE $0\_s*' ..
1185 'for i in range(3)\_s*' ..
1186 '\d STORE -1 in $1\_s*' ..
1187 '\d PUSHNR 3\_s*' ..
1188 '\d BCALL range(argc 1)\_s*' ..
1189 '\d FOR $1 -> \d\+\_s*' ..
1190 '\d STORE $2\_s*' ..
1191 'res->add(i)\_s*' ..
1192 '\d LOAD $0\_s*' ..
1193 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001194 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001195 '\d\+ DROP\_s*' ..
1196 'endfor\_s*' ..
1197 '\d\+ JUMP -> \d\+\_s*' ..
1198 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001199 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001200enddef
1201
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001202def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001203 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001204 for str in eval('["one", "two"]')
1205 res ..= str
1206 endfor
1207 return res
1208enddef
1209
1210def Test_disassemble_for_loop_eval()
1211 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001212 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001213 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001215 '\d PUSHS ""\_s*' ..
1216 '\d STORE $0\_s*' ..
1217 'for str in eval(''\["one", "two"\]'')\_s*' ..
1218 '\d STORE -1 in $1\_s*' ..
1219 '\d PUSHS "\["one", "two"\]"\_s*' ..
1220 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001221 '\d FOR $1 -> \d\+\_s*' ..
1222 '\d STORE $2\_s*' ..
1223 'res ..= str\_s*' ..
1224 '\d\+ LOAD $0\_s*' ..
1225 '\d\+ LOAD $2\_s*' ..
1226 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1227 '\d\+ CONCAT\_s*' ..
1228 '\d\+ STORE $0\_s*' ..
1229 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001230 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001231 '\d\+ DROP\_s*' ..
1232 'return res\_s*' ..
1233 '\d\+ LOAD $0\_s*' ..
1234 '\d\+ RETURN',
1235 instr)
1236enddef
1237
Bram Moolenaar792f7862020-11-23 08:31:18 +01001238def ForLoopUnpack()
1239 for [x1, x2] in [[1, 2], [3, 4]]
1240 echo x1 x2
1241 endfor
1242enddef
1243
1244def Test_disassemble_for_loop_unpack()
1245 var instr = execute('disassemble ForLoopUnpack')
1246 assert_match('ForLoopUnpack\_s*' ..
1247 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1248 '\d\+ STORE -1 in $0\_s*' ..
1249 '\d\+ PUSHNR 1\_s*' ..
1250 '\d\+ PUSHNR 2\_s*' ..
1251 '\d\+ NEWLIST size 2\_s*' ..
1252 '\d\+ PUSHNR 3\_s*' ..
1253 '\d\+ PUSHNR 4\_s*' ..
1254 '\d\+ NEWLIST size 2\_s*' ..
1255 '\d\+ NEWLIST size 2\_s*' ..
1256 '\d\+ FOR $0 -> 16\_s*' ..
1257 '\d\+ UNPACK 2\_s*' ..
1258 '\d\+ STORE $1\_s*' ..
1259 '\d\+ STORE $2\_s*' ..
1260 'echo x1 x2\_s*' ..
1261 '\d\+ LOAD $1\_s*' ..
1262 '\d\+ LOAD $2\_s*' ..
1263 '\d\+ ECHO 2\_s*' ..
1264 'endfor\_s*' ..
1265 '\d\+ JUMP -> 8\_s*' ..
1266 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001267 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001268 instr)
1269enddef
1270
Bram Moolenaarc150c092021-02-13 15:02:46 +01001271def ForLoopContinue()
1272 for nr in [1, 2]
1273 try
1274 echo "ok"
1275 try
1276 echo "deeper"
1277 catch
1278 continue
1279 endtry
1280 catch
1281 echo "not ok"
1282 endtry
1283 endfor
1284enddef
1285
1286def Test_disassemble_for_loop_continue()
1287 var instr = execute('disassemble ForLoopContinue')
1288 assert_match('ForLoopContinue\_s*' ..
1289 'for nr in \[1, 2]\_s*' ..
1290 '0 STORE -1 in $0\_s*' ..
1291 '1 PUSHNR 1\_s*' ..
1292 '2 PUSHNR 2\_s*' ..
1293 '3 NEWLIST size 2\_s*' ..
1294 '4 FOR $0 -> 22\_s*' ..
1295 '5 STORE $1\_s*' ..
1296 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001297 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001298 'echo "ok"\_s*' ..
1299 '7 PUSHS "ok"\_s*' ..
1300 '8 ECHO 1\_s*' ..
1301 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001302 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001303 'echo "deeper"\_s*' ..
1304 '10 PUSHS "deeper"\_s*' ..
1305 '11 ECHO 1\_s*' ..
1306 'catch\_s*' ..
1307 '12 JUMP -> 15\_s*' ..
1308 '13 CATCH\_s*' ..
1309 'continue\_s*' ..
1310 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1311 'endtry\_s*' ..
1312 '15 ENDTRY\_s*' ..
1313 'catch\_s*' ..
1314 '16 JUMP -> 20\_s*' ..
1315 '17 CATCH\_s*' ..
1316 'echo "not ok"\_s*' ..
1317 '18 PUSHS "not ok"\_s*' ..
1318 '19 ECHO 1\_s*' ..
1319 'endtry\_s*' ..
1320 '20 ENDTRY\_s*' ..
1321 'endfor\_s*' ..
1322 '21 JUMP -> 4\_s*' ..
1323 '\d\+ DROP\_s*' ..
1324 '\d\+ RETURN 0',
1325 instr)
1326enddef
1327
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001328let g:number = 42
1329
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001330def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001331 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001332enddef
1333
1334def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001335 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001336 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001337 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001338 '\d PUSHNR 23\_s*' ..
1339 '\d LOADG g:number\_s*' ..
1340 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1341 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001342 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001343 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001344 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001345 instr)
1346enddef
1347
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001348def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001349 var nr = 3
1350 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001351 nrres = nr - 7
1352 nrres = nr * 7
1353 nrres = nr / 7
1354 nrres = nr % 7
1355
Bram Moolenaarac564082020-09-27 19:05:33 +02001356 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001357 anyres = g:number - 7
1358 anyres = g:number * 7
1359 anyres = g:number / 7
1360 anyres = g:number % 7
1361
1362 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001363 var fl = 3.0
1364 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001365 flres = fl - 7.0
1366 flres = fl * 7.0
1367 flres = fl / 7.0
1368 endif
1369enddef
1370
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001371def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001372 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001373 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001374 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001375 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001376 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001377 '\d LOAD $0.*' ..
1378 '\d PUSHNR 7.*' ..
1379 '\d OPNR +.*' ..
1380 '\d STORE $1.*' ..
1381 'nrres = nr - 7.*' ..
1382 '\d OPNR -.*' ..
1383 'nrres = nr \* 7.*' ..
1384 '\d OPNR \*.*' ..
1385 'nrres = nr / 7.*' ..
1386 '\d OPNR /.*' ..
1387 'nrres = nr % 7.*' ..
1388 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001389 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001390 '\d LOADG g:number.*' ..
1391 '\d PUSHNR 7.*' ..
1392 '\d OPANY +.*' ..
1393 '\d STORE $2.*' ..
1394 'anyres = g:number - 7.*' ..
1395 '\d OPANY -.*' ..
1396 'anyres = g:number \* 7.*' ..
1397 '\d OPANY \*.*' ..
1398 'anyres = g:number / 7.*' ..
1399 '\d OPANY /.*' ..
1400 'anyres = g:number % 7.*' ..
1401 '\d OPANY %.*',
1402 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001403 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001404 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001405 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001406 '\d PUSHF 3.0.*' ..
1407 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001408 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001409 '\d LOAD $3.*' ..
1410 '\d PUSHF 7.0.*' ..
1411 '\d OPFLOAT +.*' ..
1412 '\d STORE $4.*' ..
1413 'flres = fl - 7.0.*' ..
1414 '\d OPFLOAT -.*' ..
1415 'flres = fl \* 7.0.*' ..
1416 '\d OPFLOAT \*.*' ..
1417 'flres = fl / 7.0.*' ..
1418 '\d OPFLOAT /.*',
1419 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001420 endif
1421enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001422
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001423def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001424 var reslist = [1, 2] + [3, 4]
1425 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001426enddef
1427
1428def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001429 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001430 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001431 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001432 '\d PUSHNR 1.*' ..
1433 '\d PUSHNR 2.*' ..
1434 '\d NEWLIST size 2.*' ..
1435 '\d PUSHNR 3.*' ..
1436 '\d PUSHNR 4.*' ..
1437 '\d NEWLIST size 2.*' ..
1438 '\d ADDLIST.*' ..
1439 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001441 '\d PUSHBLOB 0z1122.*' ..
1442 '\d PUSHBLOB 0z3344.*' ..
1443 '\d ADDBLOB.*' ..
1444 '\d STORE $.*',
1445 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001446enddef
1447
1448let g:aa = 'aa'
1449def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001450 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001451 return res
1452enddef
1453
1454def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001455 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001456 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001457 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001458 '\d LOADG g:aa.*' ..
1459 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001460 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001461 '\d CONCAT.*' ..
1462 '\d STORE $.*',
1463 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001464 assert_equal('aabb', ConcatString())
1465enddef
1466
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001467def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001468 var s = "abcd"
1469 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001470 return res
1471enddef
1472
1473def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001474 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001475 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001476 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001477 '\d PUSHS "abcd"\_s*' ..
1478 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001479 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001480 '\d LOAD $0\_s*' ..
1481 '\d PUSHNR 1\_s*' ..
1482 '\d STRINDEX\_s*' ..
1483 '\d STORE $1\_s*',
1484 instr)
1485 assert_equal('b', StringIndex())
1486enddef
1487
Bram Moolenaared591872020-08-15 22:14:53 +02001488def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001489 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001490 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001491 return res
1492enddef
1493
1494def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001495 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001496 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001497 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001498 '\d PUSHS "abcd"\_s*' ..
1499 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001500 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001501 '\d LOAD $0\_s*' ..
1502 '\d PUSHNR 1\_s*' ..
1503 '\d PUSHNR 8\_s*' ..
1504 '\d STRSLICE\_s*' ..
1505 '\d STORE $1\_s*',
1506 instr)
1507 assert_equal('bcd', StringSlice())
1508enddef
1509
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001510def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001511 var l = [1, 2, 3]
1512 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001513 return res
1514enddef
1515
1516def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001517 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001518 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001519 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001520 '\d PUSHNR 1\_s*' ..
1521 '\d PUSHNR 2\_s*' ..
1522 '\d PUSHNR 3\_s*' ..
1523 '\d NEWLIST size 3\_s*' ..
1524 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001525 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001526 '\d LOAD $0\_s*' ..
1527 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001528 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001529 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001530 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001531 assert_equal(2, ListIndex())
1532enddef
1533
Bram Moolenaared591872020-08-15 22:14:53 +02001534def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001535 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001536 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001537 return res
1538enddef
1539
1540def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001541 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001542 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001543 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001544 '\d PUSHNR 1\_s*' ..
1545 '\d PUSHNR 2\_s*' ..
1546 '\d PUSHNR 3\_s*' ..
1547 '\d NEWLIST size 3\_s*' ..
1548 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001549 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001550 '\d LOAD $0\_s*' ..
1551 '\d PUSHNR 1\_s*' ..
1552 '\d PUSHNR 8\_s*' ..
1553 '\d LISTSLICE\_s*' ..
1554 '\d STORE $1\_s*',
1555 instr)
1556 assert_equal([2, 3], ListSlice())
1557enddef
1558
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001559def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001560 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001561 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001562 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001563 return res
1564enddef
1565
1566def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001567 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001568 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001569 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001570 '\d PUSHS "item"\_s*' ..
1571 '\d PUSHNR 1\_s*' ..
1572 '\d NEWDICT size 1\_s*' ..
1573 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001574 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001575 '\d\+ LOAD $0\_s*' ..
1576 '\d\+ MEMBER item\_s*' ..
1577 '\d\+ STORE $1\_s*' ..
1578 'res = d\["item"\]\_s*' ..
1579 '\d\+ LOAD $0\_s*' ..
1580 '\d\+ PUSHS "item"\_s*' ..
1581 '\d\+ MEMBER\_s*' ..
1582 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001583 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001584 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001585enddef
1586
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001587let somelist = [1, 2, 3, 4, 5]
1588def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001589 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001590 return res
1591enddef
1592
1593def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001594 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001595 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001596 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001597 '\d LOADG g:somelist\_s*' ..
1598 '\d PUSHNR 2\_s*' ..
1599 '\d ANYINDEX\_s*' ..
1600 '\d STORE $0\_s*' ..
1601 'return res\_s*' ..
1602 '\d LOAD $0\_s*' ..
1603 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1604 '\d RETURN',
1605 instr)
1606 assert_equal(3, AnyIndex())
1607enddef
1608
1609def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001610 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001611 return res
1612enddef
1613
1614def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001615 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001616 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001617 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001618 '\d LOADG g:somelist\_s*' ..
1619 '\d PUSHNR 1\_s*' ..
1620 '\d PUSHNR 3\_s*' ..
1621 '\d ANYSLICE\_s*' ..
1622 '\d STORE $0\_s*' ..
1623 'return res\_s*' ..
1624 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001625 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001626 '\d RETURN',
1627 instr)
1628 assert_equal([2, 3, 4], AnySlice())
1629enddef
1630
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001631def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001632 var nr = 9
1633 var plus = +nr
1634 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001635 return res
1636enddef
1637
1638def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001639 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001640 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001641 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001642 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001643 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001644 '\d LOAD $0\_s*' ..
1645 '\d CHECKNR\_s*' ..
1646 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001647 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001648 '\d LOAD $0\_s*' ..
1649 '\d NEGATENR\_s*' ..
1650 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001651 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001652 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001653enddef
1654
1655def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001656 var flag = true
1657 var invert = !flag
1658 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001659 return res
1660enddef
1661
1662def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001663 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001664 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001665 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001666 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001667 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001668 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001669 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001670 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001671 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001672 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001673 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001674 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001675 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001676 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001677 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001678enddef
1679
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001680def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001681 var name: bool = 1 && 0 || 1
1682 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001683enddef
1684
1685def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001687 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001688 'var name: bool = 1 && 0 || 1\_s*' ..
1689 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001690 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001691 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1692 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001693 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001694 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1695 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001696 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001697 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001698 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001699 '\d\+ LOAD $0\_s*' ..
1700 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001701 instr)
1702 assert_equal(true, InvertBool())
1703enddef
1704
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001705def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001706 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001707 ['true == isFalse', 'COMPAREBOOL =='],
1708 ['true != isFalse', 'COMPAREBOOL !='],
1709 ['v:none == isNull', 'COMPARESPECIAL =='],
1710 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001711
Bram Moolenaara5565e42020-05-09 15:44:01 +02001712 ['111 == aNumber', 'COMPARENR =='],
1713 ['111 != aNumber', 'COMPARENR !='],
1714 ['111 > aNumber', 'COMPARENR >'],
1715 ['111 < aNumber', 'COMPARENR <'],
1716 ['111 >= aNumber', 'COMPARENR >='],
1717 ['111 <= aNumber', 'COMPARENR <='],
1718 ['111 =~ aNumber', 'COMPARENR =\~'],
1719 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001720
Bram Moolenaara5565e42020-05-09 15:44:01 +02001721 ['"xx" != aString', 'COMPARESTRING !='],
1722 ['"xx" > aString', 'COMPARESTRING >'],
1723 ['"xx" < aString', 'COMPARESTRING <'],
1724 ['"xx" >= aString', 'COMPARESTRING >='],
1725 ['"xx" <= aString', 'COMPARESTRING <='],
1726 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1727 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1728 ['"xx" is aString', 'COMPARESTRING is'],
1729 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001730
Bram Moolenaara5565e42020-05-09 15:44:01 +02001731 ['0z11 == aBlob', 'COMPAREBLOB =='],
1732 ['0z11 != aBlob', 'COMPAREBLOB !='],
1733 ['0z11 is aBlob', 'COMPAREBLOB is'],
1734 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001735
Bram Moolenaara5565e42020-05-09 15:44:01 +02001736 ['[1, 2] == aList', 'COMPARELIST =='],
1737 ['[1, 2] != aList', 'COMPARELIST !='],
1738 ['[1, 2] is aList', 'COMPARELIST is'],
1739 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001740
Bram Moolenaare0de1712020-12-02 17:36:54 +01001741 ['{a: 1} == aDict', 'COMPAREDICT =='],
1742 ['{a: 1} != aDict', 'COMPAREDICT !='],
1743 ['{a: 1} is aDict', 'COMPAREDICT is'],
1744 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001745
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001746 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1747 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1748 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1749 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001750
1751 ['77 == g:xx', 'COMPAREANY =='],
1752 ['77 != g:xx', 'COMPAREANY !='],
1753 ['77 > g:xx', 'COMPAREANY >'],
1754 ['77 < g:xx', 'COMPAREANY <'],
1755 ['77 >= g:xx', 'COMPAREANY >='],
1756 ['77 <= g:xx', 'COMPAREANY <='],
1757 ['77 =~ g:xx', 'COMPAREANY =\~'],
1758 ['77 !~ g:xx', 'COMPAREANY !\~'],
1759 ['77 is g:xx', 'COMPAREANY is'],
1760 ['77 isnot g:xx', 'COMPAREANY isnot'],
1761 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001762 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001763 if has('float')
1764 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001765 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1766 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1767 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1768 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1769 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1770 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1771 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1772 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001773 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001774 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001775 endif
1776
Bram Moolenaarac564082020-09-27 19:05:33 +02001777 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001778 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001779 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001780 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001781 ' var isFalse = false',
1782 ' var isNull = v:null',
1783 ' var aNumber = 222',
1784 ' var aString = "yy"',
1785 ' var aBlob = 0z22',
1786 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001787 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001788 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001789 ' if ' .. case[0],
1790 ' echo 42'
1791 ' endif',
1792 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001793 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001794 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001795 assert_match('TestCase' .. nr .. '.*' ..
1796 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1797 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001798 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001799 '\d ' .. case[1] .. '.*' ..
1800 '\d JUMP_IF_FALSE -> \d\+.*',
1801 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001802
1803 nr += 1
1804 endfor
1805
Bram Moolenaar22da5592020-03-19 14:52:20 +01001806 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001807enddef
1808
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001809def s:FalsyOp()
1810 echo g:flag ?? "yes"
1811 echo [] ?? "empty list"
1812 echo "" ?? "empty string"
1813enddef
1814
1815def Test_dsassemble_falsy_op()
1816 var res = execute('disass s:FalsyOp')
1817 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1818 'echo g:flag ?? "yes"\_s*' ..
1819 '0 LOADG g:flag\_s*' ..
1820 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1821 '2 PUSHS "yes"\_s*' ..
1822 '3 ECHO 1\_s*' ..
1823 'echo \[\] ?? "empty list"\_s*' ..
1824 '4 NEWLIST size 0\_s*' ..
1825 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1826 '6 PUSHS "empty list"\_s*' ..
1827 '7 ECHO 1\_s*' ..
1828 'echo "" ?? "empty string"\_s*' ..
1829 '\d\+ PUSHS "empty string"\_s*' ..
1830 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001831 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001832 res)
1833enddef
1834
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001835def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001836 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001837 ['"xx" == "yy"', false],
1838 ['"aa" == "aa"', true],
1839 ['has("eval") ? true : false', true],
1840 ['has("asdf") ? true : false', false],
1841 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001842
Bram Moolenaarac564082020-09-27 19:05:33 +02001843 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001844 for case in cases
1845 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001846 ' if ' .. case[0],
1847 ' echo 42'
1848 ' endif',
1849 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001850 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001851 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001852 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001853 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001854 assert_match('TestCase' .. nr .. '.*' ..
1855 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1856 '\d PUSHNR 42.*' ..
1857 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001858 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001859 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001860 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001861 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001862 assert_match('TestCase' .. nr .. '.*' ..
1863 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1864 'echo 42[ \n]*' ..
1865 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001866 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001867 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001868 endif
1869
1870 nr += 1
1871 endfor
1872
1873 delete('Xdisassemble')
1874enddef
1875
Bram Moolenaarad39c092020-02-26 18:23:43 +01001876def s:Execute()
1877 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001878 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001879 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001880 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001881 execute 'help ' .. tag
1882enddef
1883
1884def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001885 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001886 assert_match('\<SNR>\d*_Execute\_s*' ..
1887 "execute 'help vim9.txt'\\_s*" ..
1888 '\d PUSHS "help vim9.txt"\_s*' ..
1889 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001890 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001891 '\d PUSHS "help vim9.txt"\_s*' ..
1892 '\d STORE $0\_s*' ..
1893 'execute cmd\_s*' ..
1894 '\d LOAD $0\_s*' ..
1895 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001896 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001897 '\d PUSHS "vim9.txt"\_s*' ..
1898 '\d STORE $1\_s*' ..
1899 "execute 'help ' .. tag\\_s*" ..
1900 '\d\+ PUSHS "help "\_s*' ..
1901 '\d\+ LOAD $1\_s*' ..
1902 '\d\+ CONCAT\_s*' ..
1903 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001904 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001905 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001906enddef
1907
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001908def s:Echomsg()
1909 echomsg 'some' 'message'
1910 echoerr 'went' .. 'wrong'
1911enddef
1912
1913def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001914 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001915 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1916 "echomsg 'some' 'message'\\_s*" ..
1917 '\d PUSHS "some"\_s*' ..
1918 '\d PUSHS "message"\_s*' ..
1919 '\d ECHOMSG 2\_s*' ..
1920 "echoerr 'went' .. 'wrong'\\_s*" ..
1921 '\d PUSHS "wentwrong"\_s*' ..
1922 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001923 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001924 res)
1925enddef
1926
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001927def SomeStringArg(arg: string)
1928 echo arg
1929enddef
1930
1931def SomeAnyArg(arg: any)
1932 echo arg
1933enddef
1934
1935def SomeStringArgAndReturn(arg: string): string
1936 return arg
1937enddef
1938
1939def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001940 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001941 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1942 '\d *echo arg.*' ..
1943 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001944 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001945
Bram Moolenaarac564082020-09-27 19:05:33 +02001946 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001947 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1948 '\d *echo arg\_s*' ..
1949 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001950 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001951
Bram Moolenaarac564082020-09-27 19:05:33 +02001952 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001953 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1954 '\d *return arg\_s*' ..
1955 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001956 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001957enddef
1958
Bram Moolenaar09689a02020-05-09 22:50:08 +02001959def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001960 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001961 vim9script
1962 def FuncOne(): string
1963 return FuncTwo()
1964 enddef
1965 def FuncTwo(): string
1966 return 'two'
1967 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001968 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001969 END
1970 writefile(lines, 'Xdisassemble')
1971 source Xdisassemble
1972
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001973 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001974 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1975 'return FuncTwo()\_s*' ..
1976 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001977 '\d RETURN',
1978 g:res_FuncOne)
1979
1980 delete('Xdisassemble')
1981 unlet g:res_FuncOne
1982enddef
1983
Bram Moolenaar61a89812020-05-07 16:58:17 +02001984def s:ConcatStrings(): string
1985 return 'one' .. 'two' .. 'three'
1986enddef
1987
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001988def s:ComputeConst(): number
1989 return 2 + 3 * 4 / 6 + 7
1990enddef
1991
Bram Moolenaar1c747212020-05-09 18:28:34 +02001992def s:ComputeConstParen(): number
1993 return ((2 + 4) * (8 / 2)) / (3 + 4)
1994enddef
1995
Bram Moolenaar61a89812020-05-07 16:58:17 +02001996def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001997 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001998 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1999 "return 'one' .. 'two' .. 'three'\\_s*" ..
2000 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002001 '\d RETURN',
2002 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002003
2004 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002005 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2006 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2007 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002008 '\d RETURN',
2009 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002010
2011 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002012 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2013 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2014 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002015 '\d RETURN',
2016 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002017enddef
2018
Bram Moolenaar389df252020-07-09 21:20:47 +02002019def s:CallAppend()
2020 eval "some text"->append(2)
2021enddef
2022
2023def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002024 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002025 assert_match('<SNR>\d*_CallAppend\_s*' ..
2026 'eval "some text"->append(2)\_s*' ..
2027 '\d PUSHS "some text"\_s*' ..
2028 '\d PUSHNR 2\_s*' ..
2029 '\d SHUFFLE 2 up 1\_s*' ..
2030 '\d BCALL append(argc 2)\_s*' ..
2031 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01002032 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02002033 res)
2034enddef
2035
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002036
2037def s:SilentMessage()
2038 silent echomsg "text"
2039 silent! echoerr "error"
2040enddef
2041
2042def Test_silent()
2043 var res = execute('disass s:SilentMessage')
2044 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2045 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002046 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002047 '\d PUSHS "text"\_s*' ..
2048 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002049 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002050 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002051 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002052 '\d PUSHS "error"\_s*' ..
2053 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002054 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002055 '\d\+ RETURN 0',
2056 res)
2057enddef
2058
2059def s:SilentIf()
2060 silent if 4 == g:five
2061 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002062 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002063enddef
2064
2065def Test_silent_if()
2066 var res = execute('disass s:SilentIf')
2067 assert_match('<SNR>\d*_SilentIf\_s*' ..
2068 'silent if 4 == g:five\_s*' ..
2069 '\d\+ CMDMOD silent\_s*' ..
2070 '\d\+ PUSHNR 4\_s*' ..
2071 '\d\+ LOADG g:five\_s*' ..
2072 '\d\+ COMPAREANY ==\_s*' ..
2073 '\d\+ CMDMOD_REV\_s*' ..
2074 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2075 'silent elseif 4 == g:five\_s*' ..
2076 '\d\+ JUMP -> \d\+\_s*' ..
2077 '\d\+ CMDMOD silent\_s*' ..
2078 '\d\+ PUSHNR 4\_s*' ..
2079 '\d\+ LOADG g:five\_s*' ..
2080 '\d\+ COMPAREANY ==\_s*' ..
2081 '\d\+ CMDMOD_REV\_s*' ..
2082 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002083 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002084 '\d\+ RETURN 0',
2085 res)
2086enddef
2087
2088def s:SilentFor()
2089 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002090 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002091enddef
2092
2093def Test_silent_for()
2094 var res = execute('disass s:SilentFor')
2095 assert_match('<SNR>\d*_SilentFor\_s*' ..
2096 'silent for i in \[0\]\_s*' ..
2097 '\d CMDMOD silent\_s*' ..
2098 '\d STORE -1 in $0\_s*' ..
2099 '\d PUSHNR 0\_s*' ..
2100 '\d NEWLIST size 1\_s*' ..
2101 '\d CMDMOD_REV\_s*' ..
2102 '5 FOR $0 -> 8\_s*' ..
2103 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002104 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002105 '\d JUMP -> 5\_s*' ..
2106 '8 DROP\_s*' ..
2107 '\d RETURN 0\_s*',
2108 res)
2109enddef
2110
2111def s:SilentWhile()
2112 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002113 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002114enddef
2115
2116def Test_silent_while()
2117 var res = execute('disass s:SilentWhile')
2118 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2119 'silent while g:not\_s*' ..
2120 '0 CMDMOD silent\_s*' ..
2121 '\d LOADG g:not\_s*' ..
2122 '\d COND2BOOL\_s*' ..
2123 '\d CMDMOD_REV\_s*' ..
2124 '\d JUMP_IF_FALSE -> 6\_s*' ..
2125
Bram Moolenaarfa984412021-03-25 22:15:28 +01002126 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002127 '\d JUMP -> 0\_s*' ..
2128 '6 RETURN 0\_s*',
2129 res)
2130enddef
2131
2132def s:SilentReturn(): string
2133 silent return "done"
2134enddef
2135
2136def Test_silent_return()
2137 var res = execute('disass s:SilentReturn')
2138 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2139 'silent return "done"\_s*' ..
2140 '\d CMDMOD silent\_s*' ..
2141 '\d PUSHS "done"\_s*' ..
2142 '\d CMDMOD_REV\_s*' ..
2143 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002144 res)
2145enddef
2146
Bram Moolenaarb2049902021-01-24 12:53:53 +01002147def s:Profiled(): string
2148 echo "profiled"
Bram Moolenaar26d71162021-06-14 21:08:56 +02002149 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002150 return "done"
2151enddef
2152
2153def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002154 if !has('profile')
2155 MissingFeature 'profile'
2156 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002157 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002158 assert_match('<SNR>\d*_Profiled\_s*' ..
2159 'echo "profiled"\_s*' ..
2160 '\d PROFILE START line 1\_s*' ..
2161 '\d PUSHS "profiled"\_s*' ..
2162 '\d ECHO 1\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002163 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002164 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002165 '\d PROFILE START line 2\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002166 '\d PUSHS "some text"\_s*' ..
2167 '\d STORE $0\_s*' ..
2168 'return "done"\_s*' ..
2169 '\d PROFILE END\_s*' ..
2170 '\d PROFILE START line 3\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002171 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002172 '\d\+ RETURN\_s*' ..
2173 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002174 res)
2175enddef
2176
Bram Moolenaare99d4222021-06-13 14:01:26 +02002177def Test_debugged()
2178 var res = execute('disass debug s:Profiled')
2179 assert_match('<SNR>\d*_Profiled\_s*' ..
2180 'echo "profiled"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002181 '\d DEBUG line 1 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002182 '\d PUSHS "profiled"\_s*' ..
2183 '\d ECHO 1\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002184 'var some = "some text"\_s*' ..
2185 '\d DEBUG line 2 varcount 0\_s*' ..
2186 '\d PUSHS "some text"\_s*' ..
2187 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002188 'return "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002189 '\d DEBUG line 3 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002190 '\d PUSHS "done"\_s*' ..
2191 '\d RETURN\_s*',
2192 res)
2193enddef
2194
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002195def s:EchoMessages()
2196 echohl ErrorMsg | echom v:exception | echohl NONE
2197enddef
2198
2199def Test_disassemble_nextcmd()
2200 # splitting commands and removing trailing blanks should not change the line
2201 var res = execute('disass s:EchoMessages')
2202 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2203 'echohl ErrorMsg | echom v:exception | echohl NONE',
2204 res)
2205enddef
2206
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002207
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002208" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker