blob: 3a7642f7c27e026c606f015b6fe2f38da8867884 [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
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000319 &opfunc = (t) => len(t)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100320 $ENVVAR = 'ev'
321 @z = 'rv'
322enddef
323
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100324def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200325 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200326 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200327 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200328 'localnr = 2.*' ..
329 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200330 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200331 'localstr = ''xyz''.*' ..
332 ' STORE $1.*' ..
333 'v:char = ''abc''.*' ..
334 'STOREV v:char.*' ..
335 's:scriptvar = ''sv''.*' ..
336 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
337 'g:globalvar = ''gv''.*' ..
338 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100339 'g:auto#var = ''av''.*' ..
340 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200341 'b:buffervar = ''bv''.*' ..
342 ' STOREB b:buffervar.*' ..
343 'w:windowvar = ''wv''.*' ..
344 ' STOREW w:windowvar.*' ..
345 't:tabpagevar = ''tv''.*' ..
346 ' STORET t:tabpagevar.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000347 '&tabstop = 8\_s*' ..
348 '\d\+ PUSHNR 8\_s*' ..
349 '\d\+ STOREOPT &tabstop\_s*' ..
350 '&opfunc = (t) => len(t)\_s*' ..
351 '\d\+ FUNCREF <lambda>\d\+\_s*' ..
352 '\d\+ STOREFUNCOPT &opfunc\_s*' ..
353 '$ENVVAR = ''ev''\_s*' ..
354 '\d\+ PUSHS "ev"\_s*' ..
355 '\d\+ STOREENV $ENVVAR\_s*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200356 '@z = ''rv''.*' ..
Bram Moolenaardcb53be2021-12-09 14:23:43 +0000357 '\d\+ STOREREG @z.*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200358 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100359enddef
360
Bram Moolenaarcb790402020-05-15 20:53:00 +0200361def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200362 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200363 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200364 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200365 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200366 var localblob: blob = 0z1122
367 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200368enddef
369
370def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200371 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200372 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200373 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200374 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100375 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200376 '\d STORE $0\_s*' ..
377 'locallist\[0\] = 123\_s*' ..
378 '\d PUSHNR 123\_s*' ..
379 '\d PUSHNR 0\_s*' ..
380 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200381 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200382 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200383 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100384 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200385 '\d STORE $1\_s*' ..
386 'localdict\["a"\] = 456\_s*' ..
387 '\d\+ PUSHNR 456\_s*' ..
388 '\d\+ PUSHS "a"\_s*' ..
389 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200390 '\d\+ STOREINDEX dict\_s*' ..
391 'var localblob: blob = 0z1122\_s*' ..
392 '\d\+ PUSHBLOB 0z1122\_s*' ..
393 '\d\+ STORE $2\_s*' ..
394 'localblob\[1\] = 33\_s*' ..
395 '\d\+ PUSHNR 33\_s*' ..
396 '\d\+ PUSHNR 1\_s*' ..
397 '\d\+ LOAD $2\_s*' ..
398 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200399 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200400 res)
401enddef
402
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100403def s:ScriptFuncStoreIndex()
404 var d = {dd: {}}
405 d.dd[0] = 0
406enddef
407
408def Test_disassemble_store_index()
409 var res = execute('disass s:ScriptFuncStoreIndex')
410 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
411 'var d = {dd: {}}\_s*' ..
412 '\d PUSHS "dd"\_s*' ..
413 '\d NEWDICT size 0\_s*' ..
414 '\d NEWDICT size 1\_s*' ..
415 '\d STORE $0\_s*' ..
416 'd.dd\[0\] = 0\_s*' ..
417 '\d PUSHNR 0\_s*' ..
418 '\d PUSHNR 0\_s*' ..
419 '\d LOAD $0\_s*' ..
420 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200421 '\d\+ USEDICT\_s*' ..
422 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200423 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100424 res)
425enddef
426
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200427def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200428 var x: string
429 var y: string
430 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200431 [x, y; l] = g:stringlist
432enddef
433
434def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200435 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200436 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200437 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200438 '\d PUSHS "\[NULL\]"\_s*' ..
439 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200440 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200441 '\d PUSHS "\[NULL\]"\_s*' ..
442 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200443 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200444 '\d NEWLIST size 0\_s*' ..
Bram Moolenaar6e48b842021-08-10 22:52:02 +0200445 '\d SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200446 '\d STORE $2\_s*' ..
447 '\[x, y; l\] = g:stringlist\_s*' ..
448 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200449 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200450 '\d CHECKLEN >= 2\_s*' ..
451 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200452 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200453 '\d\+ STORE $0\_s*' ..
454 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200455 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200456 '\d\+ STORE $1\_s*' ..
457 '\d\+ SLICE 2\_s*' ..
Bram Moolenaar10d6f182022-01-04 15:54:38 +0000458 '\d\+ SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200459 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200460 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200461 res)
462enddef
463
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200464def s:ListAssignWithOp()
465 var a = 2
466 var b = 3
467 [a, b] += [4, 5]
468enddef
469
470def Test_disassemble_list_assign_with_op()
471 var res = execute('disass s:ListAssignWithOp')
472 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
473 'var a = 2\_s*' ..
474 '\d STORE 2 in $0\_s*' ..
475 'var b = 3\_s*' ..
476 '\d STORE 3 in $1\_s*' ..
477 '\[a, b\] += \[4, 5\]\_s*' ..
478 '\d\+ PUSHNR 4\_s*' ..
479 '\d\+ PUSHNR 5\_s*' ..
480 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200481 '\d\+ LOAD $0\_s*' ..
482 '\d\+ ITEM 0 with op\_s*' ..
483 '\d\+ OPNR +\_s*' ..
484 '\d\+ STORE $0\_s*' ..
485 '\d\+ LOAD $1\_s*' ..
486 '\d\+ ITEM 1 with op\_s*' ..
487 '\d\+ OPNR +\_s*' ..
488 '\d\+ STORE $1\_s*' ..
489 '\d\+ DROP\_s*' ..
490 '\d\+ RETURN void',
491 res)
492enddef
493
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200494def s:ListAdd()
495 var l: list<number> = []
496 add(l, 123)
497 add(l, g:aNumber)
498enddef
499
500def Test_disassemble_list_add()
501 var res = execute('disass s:ListAdd')
502 assert_match('<SNR>\d*_ListAdd\_s*' ..
503 'var l: list<number> = []\_s*' ..
504 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100505 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200506 '\d STORE $0\_s*' ..
507 'add(l, 123)\_s*' ..
508 '\d LOAD $0\_s*' ..
509 '\d PUSHNR 123\_s*' ..
510 '\d LISTAPPEND\_s*' ..
511 '\d DROP\_s*' ..
512 'add(l, g:aNumber)\_s*' ..
513 '\d LOAD $0\_s*' ..
514 '\d\+ LOADG g:aNumber\_s*' ..
515 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
516 '\d\+ LISTAPPEND\_s*' ..
517 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200518 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200519 res)
520enddef
521
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200522def s:BlobAdd()
523 var b: blob = 0z
524 add(b, 123)
525 add(b, g:aNumber)
526enddef
527
528def Test_disassemble_blob_add()
529 var res = execute('disass s:BlobAdd')
530 assert_match('<SNR>\d*_BlobAdd\_s*' ..
531 'var b: blob = 0z\_s*' ..
532 '\d PUSHBLOB 0z\_s*' ..
533 '\d STORE $0\_s*' ..
534 'add(b, 123)\_s*' ..
535 '\d LOAD $0\_s*' ..
536 '\d PUSHNR 123\_s*' ..
537 '\d BLOBAPPEND\_s*' ..
538 '\d DROP\_s*' ..
539 'add(b, g:aNumber)\_s*' ..
540 '\d LOAD $0\_s*' ..
541 '\d\+ LOADG g:aNumber\_s*' ..
542 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
543 '\d\+ BLOBAPPEND\_s*' ..
544 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200545 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200546 res)
547enddef
548
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200549def s:BlobIndexSlice()
550 var b: blob = 0z112233
551 echo b[1]
552 echo b[1 : 2]
553enddef
554
555def Test_disassemble_blob_index_slice()
556 var res = execute('disass s:BlobIndexSlice')
557 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
558 'var b: blob = 0z112233\_s*' ..
559 '\d PUSHBLOB 0z112233\_s*' ..
560 '\d STORE $0\_s*' ..
561 'echo b\[1\]\_s*' ..
562 '\d LOAD $0\_s*' ..
563 '\d PUSHNR 1\_s*' ..
564 '\d BLOBINDEX\_s*' ..
565 '\d ECHO 1\_s*' ..
566 'echo b\[1 : 2\]\_s*' ..
567 '\d LOAD $0\_s*' ..
568 '\d PUSHNR 1\_s*' ..
569 '\d\+ PUSHNR 2\_s*' ..
570 '\d\+ BLOBSLICE\_s*' ..
571 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200572 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200573 res)
574enddef
575
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200576def s:ScriptFuncUnlet()
577 g:somevar = "value"
578 unlet g:somevar
579 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200580 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200581enddef
582
583def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200584 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200585 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
586 'g:somevar = "value"\_s*' ..
587 '\d PUSHS "value"\_s*' ..
588 '\d STOREG g:somevar\_s*' ..
589 'unlet g:somevar\_s*' ..
590 '\d UNLET g:somevar\_s*' ..
591 'unlet! g:somevar\_s*' ..
592 '\d UNLET! g:somevar\_s*' ..
593 'unlet $SOMEVAR\_s*' ..
594 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200595 res)
596enddef
597
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200598def s:LockLocal()
599 var d = {a: 1}
600 lockvar d.a
601enddef
602
603def Test_disassemble_locl_local()
604 var res = execute('disass s:LockLocal')
605 assert_match('<SNR>\d*_LockLocal\_s*' ..
606 'var d = {a: 1}\_s*' ..
607 '\d PUSHS "a"\_s*' ..
608 '\d PUSHNR 1\_s*' ..
609 '\d NEWDICT size 1\_s*' ..
610 '\d STORE $0\_s*' ..
611 'lockvar d.a\_s*' ..
612 '\d LOAD $0\_s*' ..
613 '\d LOCKUNLOCK lockvar d.a\_s*',
614 res)
615enddef
616
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100617def s:ScriptFuncTry()
618 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200619 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100620 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200621 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100622 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200623 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100624 endtry
625enddef
626
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100627def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200628 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200629 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
630 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100631 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200632 'echo "yes"\_s*' ..
633 '\d PUSHS "yes"\_s*' ..
634 '\d ECHO 1\_s*' ..
635 'catch /fail/\_s*' ..
636 '\d JUMP -> \d\+\_s*' ..
637 '\d PUSH v:exception\_s*' ..
638 '\d PUSHS "fail"\_s*' ..
639 '\d COMPARESTRING =\~\_s*' ..
640 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
641 '\d CATCH\_s*' ..
642 'echo "no"\_s*' ..
643 '\d\+ PUSHS "no"\_s*' ..
644 '\d\+ ECHO 1\_s*' ..
645 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100646 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200647 'throw "end"\_s*' ..
648 '\d\+ PUSHS "end"\_s*' ..
649 '\d\+ THROW\_s*' ..
650 'endtry\_s*' ..
651 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200652 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100653enddef
654
655def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200656 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100657 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100658enddef
659
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100660def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200661 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200662 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200663 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200664 '\d PUSHNR 1\_s*' ..
665 '\d PUSHS "two"\_s*' ..
666 '\d PUSHNR 333\_s*' ..
667 '\d NEWLIST size 3\_s*' ..
668 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100669 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200670 '\d PUSHS "one"\_s*' ..
671 '\d PUSHNR 1\_s*' ..
672 '\d PUSHS "two"\_s*' ..
673 '\d PUSHS "val"\_s*' ..
674 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200675 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100676enddef
677
Bram Moolenaar6e949782020-04-13 17:21:00 +0200678def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100679 echo arg
680enddef
681
682func UserFunc()
683 echo 'nothing'
684endfunc
685
686func UserFuncWithArg(arg)
687 echo a:arg
688endfunc
689
690def s:ScriptFuncCall(): string
691 changenr()
692 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100693 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100694 FuncWithArg(343)
695 ScriptFuncNew()
696 s:ScriptFuncNew()
697 UserFunc()
698 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200699 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100700 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200701 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100702 FuncRefWithArg("bar")
703 return "yes"
704enddef
705
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100706def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200707 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200708 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
709 'changenr()\_s*' ..
710 '\d BCALL changenr(argc 0)\_s*' ..
711 '\d DROP\_s*' ..
712 'char2nr("abc")\_s*' ..
713 '\d PUSHS "abc"\_s*' ..
714 '\d BCALL char2nr(argc 1)\_s*' ..
715 '\d DROP\_s*' ..
716 'Test_disassemble_new()\_s*' ..
717 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
718 '\d DROP\_s*' ..
719 'FuncWithArg(343)\_s*' ..
720 '\d\+ PUSHNR 343\_s*' ..
721 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
722 '\d\+ DROP\_s*' ..
723 'ScriptFuncNew()\_s*' ..
724 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
725 '\d\+ DROP\_s*' ..
726 's:ScriptFuncNew()\_s*' ..
727 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
728 '\d\+ DROP\_s*' ..
729 'UserFunc()\_s*' ..
730 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
731 '\d\+ DROP\_s*' ..
732 'UserFuncWithArg("foo")\_s*' ..
733 '\d\+ PUSHS "foo"\_s*' ..
734 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
735 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200736 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200737 '\d\+ PUSHS "UserFunc"\_s*' ..
738 '\d\+ BCALL function(argc 1)\_s*' ..
739 '\d\+ STORE $0\_s*' ..
740 'FuncRef()\_s*' ..
741 '\d\+ LOAD $\d\_s*' ..
742 '\d\+ PCALL (argc 0)\_s*' ..
743 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200744 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200745 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
746 '\d\+ BCALL function(argc 1)\_s*' ..
747 '\d\+ STORE $1\_s*' ..
748 'FuncRefWithArg("bar")\_s*' ..
749 '\d\+ PUSHS "bar"\_s*' ..
750 '\d\+ LOAD $\d\_s*' ..
751 '\d\+ PCALL (argc 1)\_s*' ..
752 '\d\+ DROP\_s*' ..
753 'return "yes"\_s*' ..
754 '\d\+ PUSHS "yes"\_s*' ..
755 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200756 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100757enddef
758
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200759
760def s:CreateRefs()
761 var local = 'a'
762 def Append(arg: string)
763 local ..= arg
764 enddef
765 g:Append = Append
766 def Get(): string
767 return local
768 enddef
769 g:Get = Get
770enddef
771
772def Test_disassemble_closure()
773 CreateRefs()
774 var res = execute('disass g:Append')
775 assert_match('<lambda>\d\_s*' ..
776 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100777 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200778 '\d LOAD arg\[-1\]\_s*' ..
779 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100780 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200781 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200782 res)
783
784 res = execute('disass g:Get')
785 assert_match('<lambda>\d\_s*' ..
786 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100787 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200788 '\d RETURN',
789 res)
790
791 unlet g:Append
792 unlet g:Get
793enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200794
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100795
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200796def EchoArg(arg: string): string
797 return arg
798enddef
799def RefThis(): func
800 return function('EchoArg')
801enddef
802def s:ScriptPCall()
803 RefThis()("text")
804enddef
805
806def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200807 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200808 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
809 'RefThis()("text")\_s*' ..
810 '\d DCALL RefThis(argc 0)\_s*' ..
811 '\d PUSHS "text"\_s*' ..
812 '\d PCALL top (argc 1)\_s*' ..
813 '\d PCALL end\_s*' ..
814 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200815 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200816 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200817enddef
818
819
Bram Moolenaara26b9702020-04-18 19:53:28 +0200820def s:FuncWithForwardCall(): string
821 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100822enddef
823
824def DefinedLater(arg: string): string
825 return arg
826enddef
827
828def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200829 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200830 assert_match('FuncWithForwardCall\_s*' ..
831 'return g:DefinedLater("yes")\_s*' ..
832 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200833 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200834 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200835 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100836
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200837 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100838 assert_equal('yes', FuncWithForwardCall())
839
Bram Moolenaara26b9702020-04-18 19:53:28 +0200840 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200841 assert_match('FuncWithForwardCall\_s*' ..
842 'return g:DefinedLater("yes")\_s*' ..
843 '\d PUSHS "yes"\_s*' ..
844 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200845 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200846 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100847enddef
848
849
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200850def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200851 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100852enddef
853
854def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200855 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200856 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200857 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200858 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200859 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200860 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200861 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200862 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
863 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200864 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200865 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200866 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200867 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200868 '\d 2STRING stack\[-1]\_s*' ..
869 '\d\+ CONCAT\_s*' ..
870 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200871 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100872enddef
873
874
Bram Moolenaar158906c2020-02-06 20:39:45 +0100875def HasEval()
876 if has("eval")
877 echo "yes"
878 else
879 echo "no"
880 endif
881enddef
882
883def HasNothing()
884 if has("nothing")
885 echo "yes"
886 else
887 echo "no"
888 endif
889enddef
890
891def HasSomething()
892 if has("nothing")
893 echo "nothing"
894 elseif has("something")
895 echo "something"
896 elseif has("eval")
897 echo "eval"
898 elseif has("less")
899 echo "less"
900 endif
901enddef
902
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100903def HasGuiRunning()
904 if has("gui_running")
905 echo "yes"
906 else
907 echo "no"
908 endif
909enddef
910
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100911def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200912 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200913 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200914 assert_match('HasEval\_s*' ..
915 'if has("eval")\_s*' ..
916 'echo "yes"\_s*' ..
917 '\d PUSHS "yes"\_s*' ..
918 '\d ECHO 1\_s*' ..
919 'else\_s*' ..
920 'echo "no"\_s*' ..
921 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200922 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100923 assert_notmatch('JUMP', instr)
924
Bram Moolenaard2c61702020-09-06 15:58:36 +0200925 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100926 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200927 assert_match('HasNothing\_s*' ..
928 'if has("nothing")\_s*' ..
929 'echo "yes"\_s*' ..
930 'else\_s*' ..
931 'echo "no"\_s*' ..
932 '\d PUSHS "no"\_s*' ..
933 '\d ECHO 1\_s*' ..
934 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200935 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100936 assert_notmatch('PUSHS "yes"', instr)
937 assert_notmatch('JUMP', instr)
938
Bram Moolenaard2c61702020-09-06 15:58:36 +0200939 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100940 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200941 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200942 'if has("nothing")\_s*' ..
943 'echo "nothing"\_s*' ..
944 'elseif has("something")\_s*' ..
945 'echo "something"\_s*' ..
946 'elseif has("eval")\_s*' ..
947 'echo "eval"\_s*' ..
948 '\d PUSHS "eval"\_s*' ..
949 '\d ECHO 1\_s*' ..
950 'elseif has("less").*' ..
951 'echo "less"\_s*' ..
952 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200953 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100954 assert_notmatch('PUSHS "nothing"', instr)
955 assert_notmatch('PUSHS "something"', instr)
956 assert_notmatch('PUSHS "less"', instr)
957 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100958
959 var result: string
960 var instr_expected: string
961 if has('gui')
962 if has('gui_running')
963 # GUI already running, always returns "yes"
964 result = "\nyes"
965 instr_expected = 'HasGuiRunning.*' ..
966 'if has("gui_running")\_s*' ..
967 ' echo "yes"\_s*' ..
968 '\d PUSHS "yes"\_s*' ..
969 '\d ECHO 1\_s*' ..
970 'else\_s*' ..
971 ' echo "no"\_s*' ..
972 'endif'
973 else
974 result = "\nno"
975 if has('unix')
976 # GUI not running but can start later, call has()
977 instr_expected = 'HasGuiRunning.*' ..
978 'if has("gui_running")\_s*' ..
979 '\d PUSHS "gui_running"\_s*' ..
980 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200981 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100982 '\d JUMP_IF_FALSE -> \d\_s*' ..
983 ' echo "yes"\_s*' ..
984 '\d PUSHS "yes"\_s*' ..
985 '\d ECHO 1\_s*' ..
986 'else\_s*' ..
987 '\d JUMP -> \d\_s*' ..
988 ' echo "no"\_s*' ..
989 '\d PUSHS "no"\_s*' ..
990 '\d ECHO 1\_s*' ..
991 'endif'
992 else
993 # GUI not running, always return "no"
994 instr_expected = 'HasGuiRunning.*' ..
995 'if has("gui_running")\_s*' ..
996 ' echo "yes"\_s*' ..
997 'else\_s*' ..
998 ' echo "no"\_s*' ..
999 '\d PUSHS "no"\_s*' ..
1000 '\d ECHO 1\_s*' ..
1001 'endif'
1002 endif
1003 endif
1004 else
1005 # GUI not supported, always return "no"
1006 result = "\nno"
1007 instr_expected = 'HasGuiRunning.*' ..
1008 'if has("gui_running")\_s*' ..
1009 ' echo "yes"\_s*' ..
1010 'else\_s*' ..
1011 ' echo "no"\_s*' ..
1012 '\d PUSHS "no"\_s*' ..
1013 '\d ECHO 1\_s*' ..
1014 'endif'
1015 endif
1016
1017 assert_equal(result, execute('HasGuiRunning()'))
1018 instr = execute('disassemble HasGuiRunning')
1019 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001020enddef
1021
Bram Moolenaarefd88552020-06-18 20:50:10 +02001022def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001023 if 1 < 0
1024 return "maybe"
1025 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001026 if g:cond
1027 return "yes"
1028 else
1029 return "no"
1030 endif
1031enddef
1032
1033def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001034 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001035 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001036 'if 1 < 0\_s*' ..
1037 ' return "maybe"\_s*' ..
1038 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001039 'if g:cond\_s*' ..
1040 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001041 '1 COND2BOOL\_s*' ..
1042 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001043 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001044 '3 PUSHS "yes"\_s*' ..
1045 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001046 'else\_s*' ..
1047 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001048 '5 PUSHS "no"\_s*' ..
1049 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001050 instr)
1051enddef
1052
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001053def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001054 var Funky1: func
1055 var Funky2: func = function("len")
1056 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001057enddef
1058
1059def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001060 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001061 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001063 '0 PUSHFUNC "\[none]"\_s*' ..
1064 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001065 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001066 '2 PUSHS "len"\_s*' ..
1067 '3 BCALL function(argc 1)\_s*' ..
1068 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001069 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001070 '\d PUSHS "UserFunc"\_s*' ..
1071 '\d BCALL funcref(argc 1)\_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
1077if has('channel')
1078 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001079 var job1: job
1080 var job2: job = job_start("donothing")
1081 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001082 enddef
1083endif
1084
1085def Test_disassemble_channel()
1086 CheckFeature channel
1087
Bram Moolenaarac564082020-09-27 19:05:33 +02001088 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001089 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001090 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001091 '\d PUSHJOB "no process"\_s*' ..
1092 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001093 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001094 '\d PUSHS "donothing"\_s*' ..
1095 '\d BCALL job_start(argc 1)\_s*' ..
1096 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001097 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001098 '\d PUSHCHANNEL 0\_s*' ..
1099 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001100 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001101 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001102enddef
1103
Bram Moolenaar777770f2020-02-06 21:27:08 +01001104def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001105 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001106 return F("x")
1107enddef
1108
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001109def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001110 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001111 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001112 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001113 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001114 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001115 '\d STORE $0\_s*' ..
1116 'return F("x")\_s*' ..
1117 '\d PUSHS "x"\_s*' ..
1118 '\d LOAD $0\_s*' ..
1119 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001120 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001121 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001122
Bram Moolenaarac564082020-09-27 19:05:33 +02001123 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001124 instr = execute('disassemble ' .. name)
1125 assert_match('<lambda>\d\+\_s*' ..
1126 'return "X" .. a .. "X"\_s*' ..
1127 '\d PUSHS "X"\_s*' ..
1128 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001129 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001130 '\d CONCAT\_s*' ..
1131 '\d PUSHS "X"\_s*' ..
1132 '\d CONCAT\_s*' ..
1133 '\d RETURN',
1134 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001135enddef
1136
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001137def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001138 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001139 return Ref(g:value)
1140enddef
1141
1142def Test_disassemble_lambda_with_type()
1143 g:value = 5
1144 assert_equal(15, LambdaWithType())
1145 var instr = execute('disassemble LambdaWithType')
1146 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001147 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001148 '\d FUNCREF <lambda>\d\+\_s*' ..
1149 '\d STORE $0\_s*' ..
1150 'return Ref(g:value)\_s*' ..
1151 '\d LOADG g:value\_s*' ..
1152 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001153 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001154 '\d PCALL (argc 1)\_s*' ..
1155 '\d RETURN',
1156 instr)
1157enddef
1158
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001159def NestedOuter()
1160 def g:Inner()
1161 echomsg "inner"
1162 enddef
1163enddef
1164
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001165def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001167 assert_match('NestedOuter\_s*' ..
1168 'def g:Inner()\_s*' ..
1169 'echomsg "inner"\_s*' ..
1170 'enddef\_s*' ..
1171 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001172 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001173 instr)
1174enddef
1175
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001176def NestedDefList()
1177 def
1178 def Info
1179 def /Info
1180 def /Info/
1181enddef
1182
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001183def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001184 var instr = execute('disassemble NestedDefList')
1185 assert_match('NestedDefList\_s*' ..
1186 'def\_s*' ..
1187 '\d DEF \_s*' ..
1188 'def Info\_s*' ..
1189 '\d DEF Info\_s*' ..
1190 'def /Info\_s*' ..
1191 '\d DEF /Info\_s*' ..
1192 'def /Info/\_s*' ..
1193 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001194 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001195 instr)
1196enddef
1197
Bram Moolenaar6e949782020-04-13 17:21:00 +02001198def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001199 if arg == 1 && arg != 2 || arg == 4
1200 return 'yes'
1201 endif
1202 return 'no'
1203enddef
1204
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001205def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001206 assert_equal("yes", AndOr(1))
1207 assert_equal("no", AndOr(2))
1208 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001209 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001210 assert_match('AndOr\_s*' ..
1211 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1212 '\d LOAD arg\[-1]\_s*' ..
1213 '\d PUSHNR 1\_s*' ..
1214 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001215 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001216 '\d LOAD arg\[-1]\_s*' ..
1217 '\d PUSHNR 2\_s*' ..
1218 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001219 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001220 '\d LOAD arg\[-1]\_s*' ..
1221 '\d\+ PUSHNR 4\_s*' ..
1222 '\d\+ COMPAREANY ==\_s*' ..
1223 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001224 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001225enddef
1226
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001227def AndConstant(arg: any): string
1228 if true && arg
1229 return "yes"
1230 endif
1231 if false && arg
1232 return "never"
1233 endif
1234 return "no"
1235enddef
1236
1237def Test_disassemble_and_constant()
1238 assert_equal("yes", AndConstant(1))
1239 assert_equal("no", AndConstant(false))
1240 var instr = execute('disassemble AndConstant')
1241 assert_match('AndConstant\_s*' ..
1242 'if true && arg\_s*' ..
1243 '0 LOAD arg\[-1\]\_s*' ..
1244 '1 COND2BOOL\_s*' ..
1245 '2 JUMP_IF_FALSE -> 5\_s*' ..
1246 'return "yes"\_s*' ..
1247 '3 PUSHS "yes"\_s*' ..
1248 '4 RETURN\_s*' ..
1249 'endif\_s*' ..
1250 'if false && arg\_s*' ..
1251 'return "never"\_s*' ..
1252 'endif\_s*' ..
1253 'return "no"\_s*' ..
1254 '5 PUSHS "no"\_s*' ..
1255 '6 RETURN',
1256 instr)
1257enddef
1258
Bram Moolenaar04d05222020-02-06 22:06:54 +01001259def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001260 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001261 for i in range(3)
1262 res->add(i)
1263 endfor
1264 return res
1265enddef
1266
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001267def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001268 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001269 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001270 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001271 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001272 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001273 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001274 '\d STORE $0\_s*' ..
1275 'for i in range(3)\_s*' ..
1276 '\d STORE -1 in $1\_s*' ..
1277 '\d PUSHNR 3\_s*' ..
1278 '\d BCALL range(argc 1)\_s*' ..
1279 '\d FOR $1 -> \d\+\_s*' ..
1280 '\d STORE $2\_s*' ..
1281 'res->add(i)\_s*' ..
1282 '\d LOAD $0\_s*' ..
1283 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001284 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001285 '\d\+ DROP\_s*' ..
1286 'endfor\_s*' ..
1287 '\d\+ JUMP -> \d\+\_s*' ..
1288 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001289 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001290enddef
1291
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001292def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001293 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001294 for str in eval('["one", "two"]')
1295 res ..= str
1296 endfor
1297 return res
1298enddef
1299
1300def Test_disassemble_for_loop_eval()
1301 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001302 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001303 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001304 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001305 '\d PUSHS ""\_s*' ..
1306 '\d STORE $0\_s*' ..
1307 'for str in eval(''\["one", "two"\]'')\_s*' ..
1308 '\d STORE -1 in $1\_s*' ..
1309 '\d PUSHS "\["one", "two"\]"\_s*' ..
1310 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001311 '\d FOR $1 -> \d\+\_s*' ..
1312 '\d STORE $2\_s*' ..
1313 'res ..= str\_s*' ..
1314 '\d\+ LOAD $0\_s*' ..
1315 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001316 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001317 '\d\+ CONCAT\_s*' ..
1318 '\d\+ STORE $0\_s*' ..
1319 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001320 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001321 '\d\+ DROP\_s*' ..
1322 'return res\_s*' ..
1323 '\d\+ LOAD $0\_s*' ..
1324 '\d\+ RETURN',
1325 instr)
1326enddef
1327
Bram Moolenaar792f7862020-11-23 08:31:18 +01001328def ForLoopUnpack()
1329 for [x1, x2] in [[1, 2], [3, 4]]
1330 echo x1 x2
1331 endfor
1332enddef
1333
1334def Test_disassemble_for_loop_unpack()
1335 var instr = execute('disassemble ForLoopUnpack')
1336 assert_match('ForLoopUnpack\_s*' ..
1337 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1338 '\d\+ STORE -1 in $0\_s*' ..
1339 '\d\+ PUSHNR 1\_s*' ..
1340 '\d\+ PUSHNR 2\_s*' ..
1341 '\d\+ NEWLIST size 2\_s*' ..
1342 '\d\+ PUSHNR 3\_s*' ..
1343 '\d\+ PUSHNR 4\_s*' ..
1344 '\d\+ NEWLIST size 2\_s*' ..
1345 '\d\+ NEWLIST size 2\_s*' ..
1346 '\d\+ FOR $0 -> 16\_s*' ..
1347 '\d\+ UNPACK 2\_s*' ..
1348 '\d\+ STORE $1\_s*' ..
1349 '\d\+ STORE $2\_s*' ..
1350 'echo x1 x2\_s*' ..
1351 '\d\+ LOAD $1\_s*' ..
1352 '\d\+ LOAD $2\_s*' ..
1353 '\d\+ ECHO 2\_s*' ..
1354 'endfor\_s*' ..
1355 '\d\+ JUMP -> 8\_s*' ..
1356 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001357 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001358 instr)
1359enddef
1360
Bram Moolenaarc150c092021-02-13 15:02:46 +01001361def ForLoopContinue()
1362 for nr in [1, 2]
1363 try
1364 echo "ok"
1365 try
1366 echo "deeper"
1367 catch
1368 continue
1369 endtry
1370 catch
1371 echo "not ok"
1372 endtry
1373 endfor
1374enddef
1375
1376def Test_disassemble_for_loop_continue()
1377 var instr = execute('disassemble ForLoopContinue')
1378 assert_match('ForLoopContinue\_s*' ..
1379 'for nr in \[1, 2]\_s*' ..
1380 '0 STORE -1 in $0\_s*' ..
1381 '1 PUSHNR 1\_s*' ..
1382 '2 PUSHNR 2\_s*' ..
1383 '3 NEWLIST size 2\_s*' ..
1384 '4 FOR $0 -> 22\_s*' ..
1385 '5 STORE $1\_s*' ..
1386 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001387 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001388 'echo "ok"\_s*' ..
1389 '7 PUSHS "ok"\_s*' ..
1390 '8 ECHO 1\_s*' ..
1391 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001392 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001393 'echo "deeper"\_s*' ..
1394 '10 PUSHS "deeper"\_s*' ..
1395 '11 ECHO 1\_s*' ..
1396 'catch\_s*' ..
1397 '12 JUMP -> 15\_s*' ..
1398 '13 CATCH\_s*' ..
1399 'continue\_s*' ..
1400 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1401 'endtry\_s*' ..
1402 '15 ENDTRY\_s*' ..
1403 'catch\_s*' ..
1404 '16 JUMP -> 20\_s*' ..
1405 '17 CATCH\_s*' ..
1406 'echo "not ok"\_s*' ..
1407 '18 PUSHS "not ok"\_s*' ..
1408 '19 ECHO 1\_s*' ..
1409 'endtry\_s*' ..
1410 '20 ENDTRY\_s*' ..
1411 'endfor\_s*' ..
1412 '21 JUMP -> 4\_s*' ..
1413 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001414 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001415 instr)
1416enddef
1417
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001418let g:number = 42
1419
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001420def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001421 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001422enddef
1423
1424def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001425 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001426 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001427 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001428 '\d PUSHNR 23\_s*' ..
1429 '\d LOADG g:number\_s*' ..
1430 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1431 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001432 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001433 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001434 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001435 instr)
1436enddef
1437
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001438def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 var nr = 3
1440 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001441 nrres = nr - 7
1442 nrres = nr * 7
1443 nrres = nr / 7
1444 nrres = nr % 7
1445
Bram Moolenaarac564082020-09-27 19:05:33 +02001446 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001447 anyres = g:number - 7
1448 anyres = g:number * 7
1449 anyres = g:number / 7
1450 anyres = g:number % 7
1451
1452 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001453 var fl = 3.0
1454 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001455 flres = fl - 7.0
1456 flres = fl * 7.0
1457 flres = fl / 7.0
1458 endif
1459enddef
1460
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001461def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001462 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001463 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001464 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001465 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001466 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001467 '\d LOAD $0.*' ..
1468 '\d PUSHNR 7.*' ..
1469 '\d OPNR +.*' ..
1470 '\d STORE $1.*' ..
1471 'nrres = nr - 7.*' ..
1472 '\d OPNR -.*' ..
1473 'nrres = nr \* 7.*' ..
1474 '\d OPNR \*.*' ..
1475 'nrres = nr / 7.*' ..
1476 '\d OPNR /.*' ..
1477 'nrres = nr % 7.*' ..
1478 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001479 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001480 '\d LOADG g:number.*' ..
1481 '\d PUSHNR 7.*' ..
1482 '\d OPANY +.*' ..
1483 '\d STORE $2.*' ..
1484 'anyres = g:number - 7.*' ..
1485 '\d OPANY -.*' ..
1486 'anyres = g:number \* 7.*' ..
1487 '\d OPANY \*.*' ..
1488 'anyres = g:number / 7.*' ..
1489 '\d OPANY /.*' ..
1490 'anyres = g:number % 7.*' ..
1491 '\d OPANY %.*',
1492 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001493 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001494 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001495 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001496 '\d PUSHF 3.0.*' ..
1497 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001498 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001499 '\d LOAD $3.*' ..
1500 '\d PUSHF 7.0.*' ..
1501 '\d OPFLOAT +.*' ..
1502 '\d STORE $4.*' ..
1503 'flres = fl - 7.0.*' ..
1504 '\d OPFLOAT -.*' ..
1505 'flres = fl \* 7.0.*' ..
1506 '\d OPFLOAT \*.*' ..
1507 'flres = fl / 7.0.*' ..
1508 '\d OPFLOAT /.*',
1509 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001510 endif
1511enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001512
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001513def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001514 var reslist = [1, 2] + [3, 4]
1515 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001516enddef
1517
1518def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001519 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001520 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001521 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001522 '\d PUSHNR 1.*' ..
1523 '\d PUSHNR 2.*' ..
1524 '\d NEWLIST size 2.*' ..
1525 '\d PUSHNR 3.*' ..
1526 '\d PUSHNR 4.*' ..
1527 '\d NEWLIST size 2.*' ..
1528 '\d ADDLIST.*' ..
1529 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001530 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001531 '\d PUSHBLOB 0z1122.*' ..
1532 '\d PUSHBLOB 0z3344.*' ..
1533 '\d ADDBLOB.*' ..
1534 '\d STORE $.*',
1535 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001536enddef
1537
1538let g:aa = 'aa'
1539def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001540 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001541 return res
1542enddef
1543
1544def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001545 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001546 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001547 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001548 '\d LOADG g:aa.*' ..
1549 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001550 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001551 '\d CONCAT.*' ..
1552 '\d STORE $.*',
1553 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001554 assert_equal('aabb', ConcatString())
1555enddef
1556
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001557def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001558 var s = "abcd"
1559 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001560 return res
1561enddef
1562
1563def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001564 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001565 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001566 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001567 '\d PUSHS "abcd"\_s*' ..
1568 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001569 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001570 '\d LOAD $0\_s*' ..
1571 '\d PUSHNR 1\_s*' ..
1572 '\d STRINDEX\_s*' ..
1573 '\d STORE $1\_s*',
1574 instr)
1575 assert_equal('b', StringIndex())
1576enddef
1577
Bram Moolenaared591872020-08-15 22:14:53 +02001578def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001580 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001581 return res
1582enddef
1583
1584def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001585 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001586 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001587 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001588 '\d PUSHS "abcd"\_s*' ..
1589 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001590 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001591 '\d LOAD $0\_s*' ..
1592 '\d PUSHNR 1\_s*' ..
1593 '\d PUSHNR 8\_s*' ..
1594 '\d STRSLICE\_s*' ..
1595 '\d STORE $1\_s*',
1596 instr)
1597 assert_equal('bcd', StringSlice())
1598enddef
1599
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001600def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001601 var l = [1, 2, 3]
1602 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001603 return res
1604enddef
1605
1606def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001607 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001608 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001609 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001610 '\d PUSHNR 1\_s*' ..
1611 '\d PUSHNR 2\_s*' ..
1612 '\d PUSHNR 3\_s*' ..
1613 '\d NEWLIST size 3\_s*' ..
1614 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001615 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001616 '\d LOAD $0\_s*' ..
1617 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001618 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001619 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001620 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001621 assert_equal(2, ListIndex())
1622enddef
1623
Bram Moolenaared591872020-08-15 22:14:53 +02001624def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001625 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001626 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001627 return res
1628enddef
1629
1630def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001631 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001632 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001633 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001634 '\d PUSHNR 1\_s*' ..
1635 '\d PUSHNR 2\_s*' ..
1636 '\d PUSHNR 3\_s*' ..
1637 '\d NEWLIST size 3\_s*' ..
1638 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001639 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001640 '\d LOAD $0\_s*' ..
1641 '\d PUSHNR 1\_s*' ..
1642 '\d PUSHNR 8\_s*' ..
1643 '\d LISTSLICE\_s*' ..
1644 '\d STORE $1\_s*',
1645 instr)
1646 assert_equal([2, 3], ListSlice())
1647enddef
1648
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001649def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001650 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001651 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001652 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001653 return res
1654enddef
1655
1656def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001657 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001658 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001659 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001660 '\d PUSHS "item"\_s*' ..
1661 '\d PUSHNR 1\_s*' ..
1662 '\d NEWDICT size 1\_s*' ..
1663 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001664 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001665 '\d\+ LOAD $0\_s*' ..
1666 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001667 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001668 '\d\+ STORE $1\_s*' ..
1669 'res = d\["item"\]\_s*' ..
1670 '\d\+ LOAD $0\_s*' ..
1671 '\d\+ PUSHS "item"\_s*' ..
1672 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001673 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001674 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001675 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001676 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001677enddef
1678
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001679let somelist = [1, 2, 3, 4, 5]
1680def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001681 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001682 return res
1683enddef
1684
1685def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001687 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001688 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001689 '\d LOADG g:somelist\_s*' ..
1690 '\d PUSHNR 2\_s*' ..
1691 '\d ANYINDEX\_s*' ..
1692 '\d STORE $0\_s*' ..
1693 'return res\_s*' ..
1694 '\d LOAD $0\_s*' ..
1695 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1696 '\d RETURN',
1697 instr)
1698 assert_equal(3, AnyIndex())
1699enddef
1700
1701def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001702 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001703 return res
1704enddef
1705
1706def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001707 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001708 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001709 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001710 '\d LOADG g:somelist\_s*' ..
1711 '\d PUSHNR 1\_s*' ..
1712 '\d PUSHNR 3\_s*' ..
1713 '\d ANYSLICE\_s*' ..
1714 '\d STORE $0\_s*' ..
1715 'return res\_s*' ..
1716 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001717 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001718 '\d RETURN',
1719 instr)
1720 assert_equal([2, 3, 4], AnySlice())
1721enddef
1722
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001723def NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001724 g:nr = 9
1725 var plus = +g:nr
1726 var minus = -g:nr
1727 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001728enddef
1729
1730def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001731 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001732 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001733 'g:nr = 9\_s*' ..
1734 '\d PUSHNR 9\_s*' ..
1735 '\d STOREG g:nr\_s*' ..
1736 'var plus = +g:nr\_s*' ..
1737 '\d LOADG g:nr\_s*' ..
1738 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1739 '\d STORE $0\_s*' ..
1740 'var minus = -g:nr\_s*' ..
1741 '\d LOADG g:nr\_s*' ..
1742 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001743 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001744 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001745 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001746 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001747enddef
1748
1749def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001750 var flag = true
1751 var invert = !flag
1752 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001753 return res
1754enddef
1755
1756def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001758 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001759 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001760 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001761 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001762 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001763 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001764 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001765 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001766 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001767 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001768 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001769 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001770 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001771 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001772enddef
1773
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001774def ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001775 var one = 1
1776 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001777 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001778 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001779 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001780enddef
1781
1782def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001783 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001784 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001785 'var one = 1\_s*' ..
1786 '0 STORE 1 in $0\_s*' ..
1787 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001788 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001789 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001790 '1 LOAD $0\_s*' ..
1791 '2 COND2BOOL\_s*' ..
1792 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1793 '4 LOAD $1\_s*' ..
1794 '5 COND2BOOL\_s*' ..
1795 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1796 '7 LOAD $0\_s*' ..
1797 '8 COND2BOOL\_s*' ..
1798 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001799 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001800 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001801 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001802 instr)
1803 assert_equal(true, InvertBool())
1804enddef
1805
Bram Moolenaarfb9dcb02021-12-25 22:00:49 +00001806def AutoInit()
1807 var t: number
1808 t = 1
1809 t = 0
1810enddef
1811
1812def Test_disassemble_auto_init()
1813 var instr = execute('disassemble AutoInit')
1814 assert_match('AutoInit\_s*' ..
1815 'var t: number\_s*' ..
1816 't = 1\_s*' ..
1817 '\d STORE 1 in $0\_s*' ..
1818 't = 0\_s*' ..
1819 '\d STORE 0 in $0\_s*' ..
1820 '\d\+ RETURN void',
1821 instr)
1822enddef
1823
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001824def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001825 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001826 ['true == isFalse', 'COMPAREBOOL =='],
1827 ['true != isFalse', 'COMPAREBOOL !='],
1828 ['v:none == isNull', 'COMPARESPECIAL =='],
1829 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001830
Bram Moolenaara5565e42020-05-09 15:44:01 +02001831 ['111 == aNumber', 'COMPARENR =='],
1832 ['111 != aNumber', 'COMPARENR !='],
1833 ['111 > aNumber', 'COMPARENR >'],
1834 ['111 < aNumber', 'COMPARENR <'],
1835 ['111 >= aNumber', 'COMPARENR >='],
1836 ['111 <= aNumber', 'COMPARENR <='],
1837 ['111 =~ aNumber', 'COMPARENR =\~'],
1838 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001839
Bram Moolenaara5565e42020-05-09 15:44:01 +02001840 ['"xx" != aString', 'COMPARESTRING !='],
1841 ['"xx" > aString', 'COMPARESTRING >'],
1842 ['"xx" < aString', 'COMPARESTRING <'],
1843 ['"xx" >= aString', 'COMPARESTRING >='],
1844 ['"xx" <= aString', 'COMPARESTRING <='],
1845 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1846 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1847 ['"xx" is aString', 'COMPARESTRING is'],
1848 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001849
Bram Moolenaara5565e42020-05-09 15:44:01 +02001850 ['0z11 == aBlob', 'COMPAREBLOB =='],
1851 ['0z11 != aBlob', 'COMPAREBLOB !='],
1852 ['0z11 is aBlob', 'COMPAREBLOB is'],
1853 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001854
Bram Moolenaara5565e42020-05-09 15:44:01 +02001855 ['[1, 2] == aList', 'COMPARELIST =='],
1856 ['[1, 2] != aList', 'COMPARELIST !='],
1857 ['[1, 2] is aList', 'COMPARELIST is'],
1858 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001859
Bram Moolenaare0de1712020-12-02 17:36:54 +01001860 ['{a: 1} == aDict', 'COMPAREDICT =='],
1861 ['{a: 1} != aDict', 'COMPAREDICT !='],
1862 ['{a: 1} is aDict', 'COMPAREDICT is'],
1863 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001864
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001865 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1866 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1867 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1868 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001869
1870 ['77 == g:xx', 'COMPAREANY =='],
1871 ['77 != g:xx', 'COMPAREANY !='],
1872 ['77 > g:xx', 'COMPAREANY >'],
1873 ['77 < g:xx', 'COMPAREANY <'],
1874 ['77 >= g:xx', 'COMPAREANY >='],
1875 ['77 <= g:xx', 'COMPAREANY <='],
1876 ['77 =~ g:xx', 'COMPAREANY =\~'],
1877 ['77 !~ g:xx', 'COMPAREANY !\~'],
1878 ['77 is g:xx', 'COMPAREANY is'],
1879 ['77 isnot g:xx', 'COMPAREANY isnot'],
1880 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001881 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001882 if has('float')
1883 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001884 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1885 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1886 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1887 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1888 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1889 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1890 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1891 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001892 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001893 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001894 endif
1895
Bram Moolenaarac564082020-09-27 19:05:33 +02001896 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001897 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001898 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001899 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001900 ' var isFalse = false',
1901 ' var isNull = v:null',
1902 ' var aNumber = 222',
1903 ' var aString = "yy"',
1904 ' var aBlob = 0z22',
1905 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001906 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001907 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001908 ' if ' .. case[0],
1909 ' echo 42'
1910 ' endif',
1911 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001912 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001913 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001914 assert_match('TestCase' .. nr .. '.*' ..
1915 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1916 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001917 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001918 '\d ' .. case[1] .. '.*' ..
1919 '\d JUMP_IF_FALSE -> \d\+.*',
1920 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001921
1922 nr += 1
1923 endfor
1924
Bram Moolenaar22da5592020-03-19 14:52:20 +01001925 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001926enddef
1927
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001928def s:FalsyOp()
1929 echo g:flag ?? "yes"
1930 echo [] ?? "empty list"
1931 echo "" ?? "empty string"
1932enddef
1933
1934def Test_dsassemble_falsy_op()
1935 var res = execute('disass s:FalsyOp')
1936 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1937 'echo g:flag ?? "yes"\_s*' ..
1938 '0 LOADG g:flag\_s*' ..
1939 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1940 '2 PUSHS "yes"\_s*' ..
1941 '3 ECHO 1\_s*' ..
1942 'echo \[\] ?? "empty list"\_s*' ..
1943 '4 NEWLIST size 0\_s*' ..
1944 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1945 '6 PUSHS "empty list"\_s*' ..
1946 '7 ECHO 1\_s*' ..
1947 'echo "" ?? "empty string"\_s*' ..
1948 '\d\+ PUSHS "empty string"\_s*' ..
1949 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001950 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001951 res)
1952enddef
1953
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001954def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001955 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001956 ['"xx" == "yy"', false],
1957 ['"aa" == "aa"', true],
1958 ['has("eval") ? true : false', true],
1959 ['has("asdf") ? true : false', false],
1960 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001961
Bram Moolenaarac564082020-09-27 19:05:33 +02001962 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001963 for case in cases
1964 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001965 ' if ' .. case[0],
1966 ' echo 42'
1967 ' endif',
1968 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001969 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001970 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001971 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001972 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001973 assert_match('TestCase' .. nr .. '.*' ..
1974 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1975 '\d PUSHNR 42.*' ..
1976 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001977 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001978 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001979 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001980 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001981 assert_match('TestCase' .. nr .. '.*' ..
1982 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1983 'echo 42[ \n]*' ..
1984 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001985 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001986 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001987 endif
1988
1989 nr += 1
1990 endfor
1991
1992 delete('Xdisassemble')
1993enddef
1994
Bram Moolenaarad39c092020-02-26 18:23:43 +01001995def s:Execute()
1996 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001997 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001998 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001999 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01002000 execute 'help ' .. tag
2001enddef
2002
2003def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02002004 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002005 assert_match('\<SNR>\d*_Execute\_s*' ..
2006 "execute 'help vim9.txt'\\_s*" ..
2007 '\d PUSHS "help vim9.txt"\_s*' ..
2008 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002009 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002010 '\d PUSHS "help vim9.txt"\_s*' ..
2011 '\d STORE $0\_s*' ..
2012 'execute cmd\_s*' ..
2013 '\d LOAD $0\_s*' ..
2014 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02002015 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002016 '\d PUSHS "vim9.txt"\_s*' ..
2017 '\d STORE $1\_s*' ..
2018 "execute 'help ' .. tag\\_s*" ..
2019 '\d\+ PUSHS "help "\_s*' ..
2020 '\d\+ LOAD $1\_s*' ..
2021 '\d\+ CONCAT\_s*' ..
2022 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002023 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002024 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002025enddef
2026
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002027def s:OnlyRange()
2028 :$
2029 :123
2030 :'m
2031enddef
2032
2033def Test_disassemble_range_only()
2034 var res = execute('disass s:OnlyRange')
2035 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2036 ':$\_s*' ..
2037 '\d EXECRANGE $\_s*' ..
2038 ':123\_s*' ..
2039 '\d EXECRANGE 123\_s*' ..
2040 ':''m\_s*' ..
2041 '\d EXECRANGE ''m\_s*' ..
2042 '\d\+ RETURN void',
2043 res)
2044enddef
2045
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002046def s:Echomsg()
2047 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002048 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002049 echoerr 'went' .. 'wrong'
2050enddef
2051
2052def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002053 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002054 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2055 "echomsg 'some' 'message'\\_s*" ..
2056 '\d PUSHS "some"\_s*' ..
2057 '\d PUSHS "message"\_s*' ..
2058 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002059 "echoconsole 'nothing'\\_s*" ..
2060 '\d PUSHS "nothing"\_s*' ..
2061 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002062 "echoerr 'went' .. 'wrong'\\_s*" ..
2063 '\d PUSHS "wentwrong"\_s*' ..
2064 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002065 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002066 res)
2067enddef
2068
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002069def SomeStringArg(arg: string)
2070 echo arg
2071enddef
2072
2073def SomeAnyArg(arg: any)
2074 echo arg
2075enddef
2076
2077def SomeStringArgAndReturn(arg: string): string
2078 return arg
2079enddef
2080
2081def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002082 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002083 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2084 '\d *echo arg.*' ..
2085 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002086 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002087
Bram Moolenaarac564082020-09-27 19:05:33 +02002088 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002089 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2090 '\d *echo arg\_s*' ..
2091 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002092 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002093
Bram Moolenaarac564082020-09-27 19:05:33 +02002094 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002095 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2096 '\d *return arg\_s*' ..
2097 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002098 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002099enddef
2100
Bram Moolenaar09689a02020-05-09 22:50:08 +02002101def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002102 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002103 vim9script
2104 def FuncOne(): string
2105 return FuncTwo()
2106 enddef
2107 def FuncTwo(): string
2108 return 'two'
2109 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002110 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002111 END
2112 writefile(lines, 'Xdisassemble')
2113 source Xdisassemble
2114
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002115 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002116 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2117 'return FuncTwo()\_s*' ..
2118 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002119 '\d RETURN',
2120 g:res_FuncOne)
2121
2122 delete('Xdisassemble')
2123 unlet g:res_FuncOne
2124enddef
2125
Bram Moolenaar61a89812020-05-07 16:58:17 +02002126def s:ConcatStrings(): string
2127 return 'one' .. 'two' .. 'three'
2128enddef
2129
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002130def s:ComputeConst(): number
2131 return 2 + 3 * 4 / 6 + 7
2132enddef
2133
Bram Moolenaar1c747212020-05-09 18:28:34 +02002134def s:ComputeConstParen(): number
2135 return ((2 + 4) * (8 / 2)) / (3 + 4)
2136enddef
2137
Bram Moolenaar61a89812020-05-07 16:58:17 +02002138def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002139 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002140 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2141 "return 'one' .. 'two' .. 'three'\\_s*" ..
2142 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002143 '\d RETURN',
2144 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002145
2146 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002147 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2148 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2149 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002150 '\d RETURN',
2151 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002152
2153 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002154 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2155 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2156 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002157 '\d RETURN',
2158 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002159enddef
2160
Bram Moolenaar389df252020-07-09 21:20:47 +02002161def s:CallAppend()
2162 eval "some text"->append(2)
2163enddef
2164
2165def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002166 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002167 assert_match('<SNR>\d*_CallAppend\_s*' ..
2168 'eval "some text"->append(2)\_s*' ..
2169 '\d PUSHS "some text"\_s*' ..
2170 '\d PUSHNR 2\_s*' ..
2171 '\d SHUFFLE 2 up 1\_s*' ..
2172 '\d BCALL append(argc 2)\_s*' ..
2173 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002174 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002175 res)
2176enddef
2177
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002178
2179def s:SilentMessage()
2180 silent echomsg "text"
2181 silent! echoerr "error"
2182enddef
2183
2184def Test_silent()
2185 var res = execute('disass s:SilentMessage')
2186 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2187 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002188 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002189 '\d PUSHS "text"\_s*' ..
2190 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002191 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002192 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002193 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002194 '\d PUSHS "error"\_s*' ..
2195 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002196 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002197 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002198 res)
2199enddef
2200
2201def s:SilentIf()
2202 silent if 4 == g:five
2203 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002204 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002205enddef
2206
2207def Test_silent_if()
2208 var res = execute('disass s:SilentIf')
2209 assert_match('<SNR>\d*_SilentIf\_s*' ..
2210 'silent if 4 == g:five\_s*' ..
2211 '\d\+ CMDMOD silent\_s*' ..
2212 '\d\+ PUSHNR 4\_s*' ..
2213 '\d\+ LOADG g:five\_s*' ..
2214 '\d\+ COMPAREANY ==\_s*' ..
2215 '\d\+ CMDMOD_REV\_s*' ..
2216 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2217 'silent elseif 4 == g:five\_s*' ..
2218 '\d\+ JUMP -> \d\+\_s*' ..
2219 '\d\+ CMDMOD silent\_s*' ..
2220 '\d\+ PUSHNR 4\_s*' ..
2221 '\d\+ LOADG g:five\_s*' ..
2222 '\d\+ COMPAREANY ==\_s*' ..
2223 '\d\+ CMDMOD_REV\_s*' ..
2224 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002225 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002226 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002227 res)
2228enddef
2229
2230def s:SilentFor()
2231 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002232 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002233enddef
2234
2235def Test_silent_for()
2236 var res = execute('disass s:SilentFor')
2237 assert_match('<SNR>\d*_SilentFor\_s*' ..
2238 'silent for i in \[0\]\_s*' ..
2239 '\d CMDMOD silent\_s*' ..
2240 '\d STORE -1 in $0\_s*' ..
2241 '\d PUSHNR 0\_s*' ..
2242 '\d NEWLIST size 1\_s*' ..
2243 '\d CMDMOD_REV\_s*' ..
2244 '5 FOR $0 -> 8\_s*' ..
2245 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002246 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002247 '\d JUMP -> 5\_s*' ..
2248 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002249 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002250 res)
2251enddef
2252
2253def s:SilentWhile()
2254 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002255 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002256enddef
2257
2258def Test_silent_while()
2259 var res = execute('disass s:SilentWhile')
2260 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2261 'silent while g:not\_s*' ..
2262 '0 CMDMOD silent\_s*' ..
2263 '\d LOADG g:not\_s*' ..
2264 '\d COND2BOOL\_s*' ..
2265 '\d CMDMOD_REV\_s*' ..
2266 '\d JUMP_IF_FALSE -> 6\_s*' ..
2267
Bram Moolenaarfa984412021-03-25 22:15:28 +01002268 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002269 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002270 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002271 res)
2272enddef
2273
2274def s:SilentReturn(): string
2275 silent return "done"
2276enddef
2277
2278def Test_silent_return()
2279 var res = execute('disass s:SilentReturn')
2280 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2281 'silent return "done"\_s*' ..
2282 '\d CMDMOD silent\_s*' ..
2283 '\d PUSHS "done"\_s*' ..
2284 '\d CMDMOD_REV\_s*' ..
2285 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002286 res)
2287enddef
2288
Bram Moolenaarb2049902021-01-24 12:53:53 +01002289def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002290 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002291 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002292 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002293 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002294 return "done"
2295enddef
2296
2297def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002298 if !has('profile')
2299 MissingFeature 'profile'
2300 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002301 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002302 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002303 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002304 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002305 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002306 '\d PUSHS "profiled"\_s*' ..
2307 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002308 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002309 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002310 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002311 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002312 '\d PUSHS "some text"\_s*' ..
2313 '\d STORE $0\_s*' ..
2314 'return "done"\_s*' ..
2315 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002316 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002317 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002318 '\d\+ RETURN\_s*' ..
2319 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002320 res)
2321enddef
2322
Bram Moolenaare99d4222021-06-13 14:01:26 +02002323def Test_debugged()
2324 var res = execute('disass debug s:Profiled')
2325 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002326 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002327 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002328 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002329 '\d PUSHS "profiled"\_s*' ..
2330 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002331 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002332 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002333 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002334 '\d PUSHS "some text"\_s*' ..
2335 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002336 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002337 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002338 '\d PUSHS "done"\_s*' ..
2339 '\d RETURN\_s*',
2340 res)
2341enddef
2342
Bram Moolenaar90770b72021-11-30 20:57:38 +00002343def s:ElseifConstant()
2344 if g:value
2345 echo "one"
2346 elseif true
2347 echo "true"
2348 elseif false
2349 echo "false"
2350 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002351 if 0
2352 echo "yes"
2353 elseif 0
2354 echo "no"
2355 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002356enddef
2357
2358def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002359 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002360 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2361 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002362 '0 DEBUG line 1-1 varcount 0\_s*' ..
2363 '1 LOADG g:value\_s*' ..
2364 '2 COND2BOOL\_s*' ..
2365 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002366 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002367 '4 DEBUG line 2-2 varcount 0\_s*' ..
2368 '5 PUSHS "one"\_s*' ..
2369 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002370 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002371 '7 JUMP -> 12\_s*' ..
2372 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002373 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002374 '9 DEBUG line 4-4 varcount 0\_s*' ..
2375 '10 PUSHS "true"\_s*' ..
2376 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002377 'elseif false\_s*' ..
2378 'echo "false"\_s*' ..
2379 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002380 'if 0\_s*' ..
2381 '12 DEBUG line 8-8 varcount 0\_s*' ..
2382 'echo "yes"\_s*' ..
2383 'elseif 0\_s*' ..
2384 '13 DEBUG line 11-10 varcount 0\_s*' ..
2385 'echo "no"\_s*' ..
2386 'endif\_s*' ..
2387 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002388 res)
2389enddef
2390
Bram Moolenaar093165c2021-08-22 13:35:31 +02002391def s:DebugElseif()
2392 var b = false
2393 if b
2394 eval 1 + 0
2395 silent elseif !b
2396 eval 2 + 0
2397 endif
2398enddef
2399
2400def Test_debug_elseif()
2401 var res = execute('disass debug s:DebugElseif')
2402 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2403 'var b = false\_s*' ..
2404 '0 DEBUG line 1-1 varcount 0\_s*' ..
2405 '1 PUSH false\_s*' ..
2406 '2 STORE $0\_s*' ..
2407
2408 'if b\_s*' ..
2409 '3 DEBUG line 2-2 varcount 1\_s*' ..
2410 '4 LOAD $0\_s*' ..
2411 '5 JUMP_IF_FALSE -> 10\_s*' ..
2412
2413 'eval 1 + 0\_s*' ..
2414 '6 DEBUG line 3-3 varcount 1\_s*' ..
2415 '7 PUSHNR 1\_s*' ..
2416 '8 DROP\_s*' ..
2417
2418 'silent elseif !b\_s*' ..
2419 '9 JUMP -> 20\_s*' ..
2420 '10 CMDMOD silent\_s*' ..
2421 '11 DEBUG line 4-4 varcount 1\_s*' ..
2422 '12 LOAD $0\_s*' ..
2423 '13 INVERT -1 (!val)\_s*' ..
2424 '14 CMDMOD_REV\_s*' ..
2425 '15 JUMP_IF_FALSE -> 20\_s*' ..
2426
2427 'eval 2 + 0\_s*' ..
2428 '16 DEBUG line 5-5 varcount 1\_s*' ..
2429 '17 PUSHNR 2\_s*' ..
2430 '18 DROP\_s*' ..
2431
2432 'endif\_s*' ..
2433 '19 DEBUG line 6-6 varcount 1\_s*' ..
2434 '20 RETURN void*',
2435 res)
2436enddef
2437
Bram Moolenaar2b4ecc22022-01-02 14:08:18 +00002438def s:DebugFor()
2439 echo "hello"
2440 for a in [0]
2441 echo a
2442 endfor
2443enddef
2444
2445def Test_debug_for()
2446 var res = execute('disass debug s:DebugFor')
2447 assert_match('<SNR>\d*_DebugFor\_s*' ..
2448 'echo "hello"\_s*' ..
2449 '0 DEBUG line 1-1 varcount 0\_s*' ..
2450 '1 PUSHS "hello"\_s*' ..
2451 '2 ECHO 1\_s*' ..
2452
2453 'for a in \[0\]\_s*' ..
2454 '3 DEBUG line 2-2 varcount 0\_s*' ..
2455 '4 STORE -1 in $0\_s*' ..
2456 '5 PUSHNR 0\_s*' ..
2457 '6 NEWLIST size 1\_s*' ..
2458 '7 DEBUG line 2-2 varcount 2\_s*' ..
2459 '8 FOR $0 -> 15\_s*' ..
2460 '9 STORE $1\_s*' ..
2461
2462 'echo a\_s*' ..
2463 '10 DEBUG line 3-3 varcount 2\_s*' ..
2464 '11 LOAD $1\_s*' ..
2465 '12 ECHO 1\_s*' ..
2466
2467 'endfor\_s*' ..
2468 '13 DEBUG line 4-4 varcount 2\_s*' ..
2469 '14 JUMP -> 7\_s*' ..
2470 '15 DROP\_s*' ..
2471 '16 RETURN void*',
2472 res)
2473enddef
2474
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002475func Legacy() dict
2476 echo 'legacy'
2477endfunc
2478
2479def s:UseMember()
2480 var d = {func: Legacy}
2481 var v = d.func()
2482enddef
2483
2484def Test_disassemble_dict_stack()
2485 var res = execute('disass s:UseMember')
2486 assert_match('<SNR>\d*_UseMember\_s*' ..
2487 'var d = {func: Legacy}\_s*' ..
2488 '\d PUSHS "func"\_s*' ..
Bram Moolenaarb15cf442021-12-16 15:49:43 +00002489 '\d PUSHFUNC "g:Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002490 '\d NEWDICT size 1\_s*' ..
2491 '\d STORE $0\_s*' ..
2492
2493 'var v = d.func()\_s*' ..
2494 '\d LOAD $0\_s*' ..
2495 '\d MEMBER func\_s*' ..
2496 '\d PCALL top (argc 0)\_s*' ..
2497 '\d PCALL end\_s*' ..
2498 '\d CLEARDICT\_s*' ..
2499 '\d\+ STORE $1\_s*' ..
2500 '\d\+ RETURN void*',
2501 res)
2502enddef
2503
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002504def s:EchoMessages()
2505 echohl ErrorMsg | echom v:exception | echohl NONE
2506enddef
2507
2508def Test_disassemble_nextcmd()
2509 # splitting commands and removing trailing blanks should not change the line
2510 var res = execute('disass s:EchoMessages')
2511 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2512 'echohl ErrorMsg | echom v:exception | echohl NONE',
2513 res)
2514enddef
2515
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002516def Test_disassemble_after_reload()
2517 var lines =<< trim END
2518 vim9script
2519 if exists('g:ThisFunc')
2520 finish
2521 endif
2522 var name: any
2523 def g:ThisFunc(): number
2524 g:name = name
2525 return 0
2526 enddef
2527 def g:ThatFunc(): number
2528 name = g:name
2529 return 0
2530 enddef
2531 END
2532 lines->writefile('Xreload.vim')
2533
2534 source Xreload.vim
2535 g:ThisFunc()
2536 g:ThatFunc()
2537
2538 source Xreload.vim
2539 var res = execute('disass g:ThisFunc')
2540 assert_match('ThisFunc\_s*' ..
2541 'g:name = name\_s*' ..
2542 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2543 '\d STOREG g:name\_s*' ..
2544 'return 0\_s*' ..
2545 '\d PUSHNR 0\_s*' ..
2546 '\d RETURN\_s*',
2547 res)
2548
2549 res = execute('disass g:ThatFunc')
2550 assert_match('ThatFunc\_s*' ..
2551 'name = g:name\_s*' ..
2552 '\d LOADG g:name\_s*' ..
2553 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2554 'return 0\_s*' ..
2555 '\d PUSHNR 0\_s*' ..
2556 '\d RETURN\_s*',
2557 res)
2558
2559 delete('Xreload.vim')
2560 delfunc g:ThisFunc
2561 delfunc g:ThatFunc
2562enddef
2563
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002564
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002565
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002566" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker