blob: 3b8e12d01b20e7c7b531d00534216739dbc9293e [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*' ..
458 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200459 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200460 res)
461enddef
462
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200463def s:ListAssignWithOp()
464 var a = 2
465 var b = 3
466 [a, b] += [4, 5]
467enddef
468
469def Test_disassemble_list_assign_with_op()
470 var res = execute('disass s:ListAssignWithOp')
471 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
472 'var a = 2\_s*' ..
473 '\d STORE 2 in $0\_s*' ..
474 'var b = 3\_s*' ..
475 '\d STORE 3 in $1\_s*' ..
476 '\[a, b\] += \[4, 5\]\_s*' ..
477 '\d\+ PUSHNR 4\_s*' ..
478 '\d\+ PUSHNR 5\_s*' ..
479 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200480 '\d\+ LOAD $0\_s*' ..
481 '\d\+ ITEM 0 with op\_s*' ..
482 '\d\+ OPNR +\_s*' ..
483 '\d\+ STORE $0\_s*' ..
484 '\d\+ LOAD $1\_s*' ..
485 '\d\+ ITEM 1 with op\_s*' ..
486 '\d\+ OPNR +\_s*' ..
487 '\d\+ STORE $1\_s*' ..
488 '\d\+ DROP\_s*' ..
489 '\d\+ RETURN void',
490 res)
491enddef
492
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200493def s:ListAdd()
494 var l: list<number> = []
495 add(l, 123)
496 add(l, g:aNumber)
497enddef
498
499def Test_disassemble_list_add()
500 var res = execute('disass s:ListAdd')
501 assert_match('<SNR>\d*_ListAdd\_s*' ..
502 'var l: list<number> = []\_s*' ..
503 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100504 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200505 '\d STORE $0\_s*' ..
506 'add(l, 123)\_s*' ..
507 '\d LOAD $0\_s*' ..
508 '\d PUSHNR 123\_s*' ..
509 '\d LISTAPPEND\_s*' ..
510 '\d DROP\_s*' ..
511 'add(l, g:aNumber)\_s*' ..
512 '\d LOAD $0\_s*' ..
513 '\d\+ LOADG g:aNumber\_s*' ..
514 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
515 '\d\+ LISTAPPEND\_s*' ..
516 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200517 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200518 res)
519enddef
520
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200521def s:BlobAdd()
522 var b: blob = 0z
523 add(b, 123)
524 add(b, g:aNumber)
525enddef
526
527def Test_disassemble_blob_add()
528 var res = execute('disass s:BlobAdd')
529 assert_match('<SNR>\d*_BlobAdd\_s*' ..
530 'var b: blob = 0z\_s*' ..
531 '\d PUSHBLOB 0z\_s*' ..
532 '\d STORE $0\_s*' ..
533 'add(b, 123)\_s*' ..
534 '\d LOAD $0\_s*' ..
535 '\d PUSHNR 123\_s*' ..
536 '\d BLOBAPPEND\_s*' ..
537 '\d DROP\_s*' ..
538 'add(b, g:aNumber)\_s*' ..
539 '\d LOAD $0\_s*' ..
540 '\d\+ LOADG g:aNumber\_s*' ..
541 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
542 '\d\+ BLOBAPPEND\_s*' ..
543 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200544 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200545 res)
546enddef
547
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200548def s:BlobIndexSlice()
549 var b: blob = 0z112233
550 echo b[1]
551 echo b[1 : 2]
552enddef
553
554def Test_disassemble_blob_index_slice()
555 var res = execute('disass s:BlobIndexSlice')
556 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
557 'var b: blob = 0z112233\_s*' ..
558 '\d PUSHBLOB 0z112233\_s*' ..
559 '\d STORE $0\_s*' ..
560 'echo b\[1\]\_s*' ..
561 '\d LOAD $0\_s*' ..
562 '\d PUSHNR 1\_s*' ..
563 '\d BLOBINDEX\_s*' ..
564 '\d ECHO 1\_s*' ..
565 'echo b\[1 : 2\]\_s*' ..
566 '\d LOAD $0\_s*' ..
567 '\d PUSHNR 1\_s*' ..
568 '\d\+ PUSHNR 2\_s*' ..
569 '\d\+ BLOBSLICE\_s*' ..
570 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200571 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200572 res)
573enddef
574
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200575def s:ScriptFuncUnlet()
576 g:somevar = "value"
577 unlet g:somevar
578 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200579 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200580enddef
581
582def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200583 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200584 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
585 'g:somevar = "value"\_s*' ..
586 '\d PUSHS "value"\_s*' ..
587 '\d STOREG g:somevar\_s*' ..
588 'unlet g:somevar\_s*' ..
589 '\d UNLET g:somevar\_s*' ..
590 'unlet! g:somevar\_s*' ..
591 '\d UNLET! g:somevar\_s*' ..
592 'unlet $SOMEVAR\_s*' ..
593 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200594 res)
595enddef
596
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200597def s:LockLocal()
598 var d = {a: 1}
599 lockvar d.a
600enddef
601
602def Test_disassemble_locl_local()
603 var res = execute('disass s:LockLocal')
604 assert_match('<SNR>\d*_LockLocal\_s*' ..
605 'var d = {a: 1}\_s*' ..
606 '\d PUSHS "a"\_s*' ..
607 '\d PUSHNR 1\_s*' ..
608 '\d NEWDICT size 1\_s*' ..
609 '\d STORE $0\_s*' ..
610 'lockvar d.a\_s*' ..
611 '\d LOAD $0\_s*' ..
612 '\d LOCKUNLOCK lockvar d.a\_s*',
613 res)
614enddef
615
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100616def s:ScriptFuncTry()
617 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200618 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100619 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200620 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100621 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200622 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100623 endtry
624enddef
625
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100626def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200627 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200628 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
629 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100630 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200631 'echo "yes"\_s*' ..
632 '\d PUSHS "yes"\_s*' ..
633 '\d ECHO 1\_s*' ..
634 'catch /fail/\_s*' ..
635 '\d JUMP -> \d\+\_s*' ..
636 '\d PUSH v:exception\_s*' ..
637 '\d PUSHS "fail"\_s*' ..
638 '\d COMPARESTRING =\~\_s*' ..
639 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
640 '\d CATCH\_s*' ..
641 'echo "no"\_s*' ..
642 '\d\+ PUSHS "no"\_s*' ..
643 '\d\+ ECHO 1\_s*' ..
644 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100645 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200646 'throw "end"\_s*' ..
647 '\d\+ PUSHS "end"\_s*' ..
648 '\d\+ THROW\_s*' ..
649 'endtry\_s*' ..
650 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200651 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100652enddef
653
654def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200655 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100656 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100657enddef
658
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100659def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200660 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200661 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200662 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200663 '\d PUSHNR 1\_s*' ..
664 '\d PUSHS "two"\_s*' ..
665 '\d PUSHNR 333\_s*' ..
666 '\d NEWLIST size 3\_s*' ..
667 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100668 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200669 '\d PUSHS "one"\_s*' ..
670 '\d PUSHNR 1\_s*' ..
671 '\d PUSHS "two"\_s*' ..
672 '\d PUSHS "val"\_s*' ..
673 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200674 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100675enddef
676
Bram Moolenaar6e949782020-04-13 17:21:00 +0200677def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100678 echo arg
679enddef
680
681func UserFunc()
682 echo 'nothing'
683endfunc
684
685func UserFuncWithArg(arg)
686 echo a:arg
687endfunc
688
689def s:ScriptFuncCall(): string
690 changenr()
691 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100692 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100693 FuncWithArg(343)
694 ScriptFuncNew()
695 s:ScriptFuncNew()
696 UserFunc()
697 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200698 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100699 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200700 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100701 FuncRefWithArg("bar")
702 return "yes"
703enddef
704
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100705def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200706 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200707 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
708 'changenr()\_s*' ..
709 '\d BCALL changenr(argc 0)\_s*' ..
710 '\d DROP\_s*' ..
711 'char2nr("abc")\_s*' ..
712 '\d PUSHS "abc"\_s*' ..
713 '\d BCALL char2nr(argc 1)\_s*' ..
714 '\d DROP\_s*' ..
715 'Test_disassemble_new()\_s*' ..
716 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
717 '\d DROP\_s*' ..
718 'FuncWithArg(343)\_s*' ..
719 '\d\+ PUSHNR 343\_s*' ..
720 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
721 '\d\+ DROP\_s*' ..
722 'ScriptFuncNew()\_s*' ..
723 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
724 '\d\+ DROP\_s*' ..
725 's:ScriptFuncNew()\_s*' ..
726 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
727 '\d\+ DROP\_s*' ..
728 'UserFunc()\_s*' ..
729 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
730 '\d\+ DROP\_s*' ..
731 'UserFuncWithArg("foo")\_s*' ..
732 '\d\+ PUSHS "foo"\_s*' ..
733 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
734 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200735 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200736 '\d\+ PUSHS "UserFunc"\_s*' ..
737 '\d\+ BCALL function(argc 1)\_s*' ..
738 '\d\+ STORE $0\_s*' ..
739 'FuncRef()\_s*' ..
740 '\d\+ LOAD $\d\_s*' ..
741 '\d\+ PCALL (argc 0)\_s*' ..
742 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200743 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200744 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
745 '\d\+ BCALL function(argc 1)\_s*' ..
746 '\d\+ STORE $1\_s*' ..
747 'FuncRefWithArg("bar")\_s*' ..
748 '\d\+ PUSHS "bar"\_s*' ..
749 '\d\+ LOAD $\d\_s*' ..
750 '\d\+ PCALL (argc 1)\_s*' ..
751 '\d\+ DROP\_s*' ..
752 'return "yes"\_s*' ..
753 '\d\+ PUSHS "yes"\_s*' ..
754 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200755 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100756enddef
757
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200758
759def s:CreateRefs()
760 var local = 'a'
761 def Append(arg: string)
762 local ..= arg
763 enddef
764 g:Append = Append
765 def Get(): string
766 return local
767 enddef
768 g:Get = Get
769enddef
770
771def Test_disassemble_closure()
772 CreateRefs()
773 var res = execute('disass g:Append')
774 assert_match('<lambda>\d\_s*' ..
775 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100776 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200777 '\d LOAD arg\[-1\]\_s*' ..
778 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100779 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200780 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200781 res)
782
783 res = execute('disass g:Get')
784 assert_match('<lambda>\d\_s*' ..
785 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100786 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200787 '\d RETURN',
788 res)
789
790 unlet g:Append
791 unlet g:Get
792enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200793
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100794
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200795def EchoArg(arg: string): string
796 return arg
797enddef
798def RefThis(): func
799 return function('EchoArg')
800enddef
801def s:ScriptPCall()
802 RefThis()("text")
803enddef
804
805def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200806 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200807 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
808 'RefThis()("text")\_s*' ..
809 '\d DCALL RefThis(argc 0)\_s*' ..
810 '\d PUSHS "text"\_s*' ..
811 '\d PCALL top (argc 1)\_s*' ..
812 '\d PCALL end\_s*' ..
813 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200814 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200815 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200816enddef
817
818
Bram Moolenaara26b9702020-04-18 19:53:28 +0200819def s:FuncWithForwardCall(): string
820 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100821enddef
822
823def DefinedLater(arg: string): string
824 return arg
825enddef
826
827def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200828 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200829 assert_match('FuncWithForwardCall\_s*' ..
830 'return g:DefinedLater("yes")\_s*' ..
831 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200832 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200833 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200834 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100835
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200836 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100837 assert_equal('yes', FuncWithForwardCall())
838
Bram Moolenaara26b9702020-04-18 19:53:28 +0200839 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200840 assert_match('FuncWithForwardCall\_s*' ..
841 'return g:DefinedLater("yes")\_s*' ..
842 '\d PUSHS "yes"\_s*' ..
843 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200844 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200845 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100846enddef
847
848
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200849def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200850 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100851enddef
852
853def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200855 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200856 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200857 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200859 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200860 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200861 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
862 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200863 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200864 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200865 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200866 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200867 '\d 2STRING stack\[-1]\_s*' ..
868 '\d\+ CONCAT\_s*' ..
869 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200870 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100871enddef
872
873
Bram Moolenaar158906c2020-02-06 20:39:45 +0100874def HasEval()
875 if has("eval")
876 echo "yes"
877 else
878 echo "no"
879 endif
880enddef
881
882def HasNothing()
883 if has("nothing")
884 echo "yes"
885 else
886 echo "no"
887 endif
888enddef
889
890def HasSomething()
891 if has("nothing")
892 echo "nothing"
893 elseif has("something")
894 echo "something"
895 elseif has("eval")
896 echo "eval"
897 elseif has("less")
898 echo "less"
899 endif
900enddef
901
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100902def HasGuiRunning()
903 if has("gui_running")
904 echo "yes"
905 else
906 echo "no"
907 endif
908enddef
909
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100910def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200911 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200912 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200913 assert_match('HasEval\_s*' ..
914 'if has("eval")\_s*' ..
915 'echo "yes"\_s*' ..
916 '\d PUSHS "yes"\_s*' ..
917 '\d ECHO 1\_s*' ..
918 'else\_s*' ..
919 'echo "no"\_s*' ..
920 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200921 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100922 assert_notmatch('JUMP', instr)
923
Bram Moolenaard2c61702020-09-06 15:58:36 +0200924 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100925 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200926 assert_match('HasNothing\_s*' ..
927 'if has("nothing")\_s*' ..
928 'echo "yes"\_s*' ..
929 'else\_s*' ..
930 'echo "no"\_s*' ..
931 '\d PUSHS "no"\_s*' ..
932 '\d ECHO 1\_s*' ..
933 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200934 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100935 assert_notmatch('PUSHS "yes"', instr)
936 assert_notmatch('JUMP', instr)
937
Bram Moolenaard2c61702020-09-06 15:58:36 +0200938 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100939 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200940 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200941 'if has("nothing")\_s*' ..
942 'echo "nothing"\_s*' ..
943 'elseif has("something")\_s*' ..
944 'echo "something"\_s*' ..
945 'elseif has("eval")\_s*' ..
946 'echo "eval"\_s*' ..
947 '\d PUSHS "eval"\_s*' ..
948 '\d ECHO 1\_s*' ..
949 'elseif has("less").*' ..
950 'echo "less"\_s*' ..
951 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200952 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100953 assert_notmatch('PUSHS "nothing"', instr)
954 assert_notmatch('PUSHS "something"', instr)
955 assert_notmatch('PUSHS "less"', instr)
956 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100957
958 var result: string
959 var instr_expected: string
960 if has('gui')
961 if has('gui_running')
962 # GUI already running, always returns "yes"
963 result = "\nyes"
964 instr_expected = 'HasGuiRunning.*' ..
965 'if has("gui_running")\_s*' ..
966 ' echo "yes"\_s*' ..
967 '\d PUSHS "yes"\_s*' ..
968 '\d ECHO 1\_s*' ..
969 'else\_s*' ..
970 ' echo "no"\_s*' ..
971 'endif'
972 else
973 result = "\nno"
974 if has('unix')
975 # GUI not running but can start later, call has()
976 instr_expected = 'HasGuiRunning.*' ..
977 'if has("gui_running")\_s*' ..
978 '\d PUSHS "gui_running"\_s*' ..
979 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200980 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100981 '\d JUMP_IF_FALSE -> \d\_s*' ..
982 ' echo "yes"\_s*' ..
983 '\d PUSHS "yes"\_s*' ..
984 '\d ECHO 1\_s*' ..
985 'else\_s*' ..
986 '\d JUMP -> \d\_s*' ..
987 ' echo "no"\_s*' ..
988 '\d PUSHS "no"\_s*' ..
989 '\d ECHO 1\_s*' ..
990 'endif'
991 else
992 # GUI not running, always return "no"
993 instr_expected = 'HasGuiRunning.*' ..
994 'if has("gui_running")\_s*' ..
995 ' echo "yes"\_s*' ..
996 'else\_s*' ..
997 ' echo "no"\_s*' ..
998 '\d PUSHS "no"\_s*' ..
999 '\d ECHO 1\_s*' ..
1000 'endif'
1001 endif
1002 endif
1003 else
1004 # GUI not supported, always return "no"
1005 result = "\nno"
1006 instr_expected = 'HasGuiRunning.*' ..
1007 'if has("gui_running")\_s*' ..
1008 ' echo "yes"\_s*' ..
1009 'else\_s*' ..
1010 ' echo "no"\_s*' ..
1011 '\d PUSHS "no"\_s*' ..
1012 '\d ECHO 1\_s*' ..
1013 'endif'
1014 endif
1015
1016 assert_equal(result, execute('HasGuiRunning()'))
1017 instr = execute('disassemble HasGuiRunning')
1018 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001019enddef
1020
Bram Moolenaarefd88552020-06-18 20:50:10 +02001021def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001022 if 1 < 0
1023 return "maybe"
1024 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001025 if g:cond
1026 return "yes"
1027 else
1028 return "no"
1029 endif
1030enddef
1031
1032def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001033 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001034 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001035 'if 1 < 0\_s*' ..
1036 ' return "maybe"\_s*' ..
1037 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001038 'if g:cond\_s*' ..
1039 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001040 '1 COND2BOOL\_s*' ..
1041 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001042 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001043 '3 PUSHS "yes"\_s*' ..
1044 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001045 'else\_s*' ..
1046 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001047 '5 PUSHS "no"\_s*' ..
1048 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001049 instr)
1050enddef
1051
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001052def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001053 var Funky1: func
1054 var Funky2: func = function("len")
1055 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001056enddef
1057
1058def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001059 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001060 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001061 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001062 '0 PUSHFUNC "\[none]"\_s*' ..
1063 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001064 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001065 '2 PUSHS "len"\_s*' ..
1066 '3 BCALL function(argc 1)\_s*' ..
1067 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001068 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001069 '\d PUSHS "UserFunc"\_s*' ..
1070 '\d BCALL funcref(argc 1)\_s*' ..
1071 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001072 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001073 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001074enddef
1075
1076if has('channel')
1077 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001078 var job1: job
1079 var job2: job = job_start("donothing")
1080 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001081 enddef
1082endif
1083
1084def Test_disassemble_channel()
1085 CheckFeature channel
1086
Bram Moolenaarac564082020-09-27 19:05:33 +02001087 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001088 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001089 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001090 '\d PUSHJOB "no process"\_s*' ..
1091 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001092 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001093 '\d PUSHS "donothing"\_s*' ..
1094 '\d BCALL job_start(argc 1)\_s*' ..
1095 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001096 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001097 '\d PUSHCHANNEL 0\_s*' ..
1098 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001099 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001100 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001101enddef
1102
Bram Moolenaar777770f2020-02-06 21:27:08 +01001103def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001104 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001105 return F("x")
1106enddef
1107
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001108def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001109 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001110 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001111 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001112 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001113 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001114 '\d STORE $0\_s*' ..
1115 'return F("x")\_s*' ..
1116 '\d PUSHS "x"\_s*' ..
1117 '\d LOAD $0\_s*' ..
1118 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001119 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001120 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001121
Bram Moolenaarac564082020-09-27 19:05:33 +02001122 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001123 instr = execute('disassemble ' .. name)
1124 assert_match('<lambda>\d\+\_s*' ..
1125 'return "X" .. a .. "X"\_s*' ..
1126 '\d PUSHS "X"\_s*' ..
1127 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001128 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001129 '\d CONCAT\_s*' ..
1130 '\d PUSHS "X"\_s*' ..
1131 '\d CONCAT\_s*' ..
1132 '\d RETURN',
1133 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001134enddef
1135
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001136def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001137 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001138 return Ref(g:value)
1139enddef
1140
1141def Test_disassemble_lambda_with_type()
1142 g:value = 5
1143 assert_equal(15, LambdaWithType())
1144 var instr = execute('disassemble LambdaWithType')
1145 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001146 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001147 '\d FUNCREF <lambda>\d\+\_s*' ..
1148 '\d STORE $0\_s*' ..
1149 'return Ref(g:value)\_s*' ..
1150 '\d LOADG g:value\_s*' ..
1151 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001152 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001153 '\d PCALL (argc 1)\_s*' ..
1154 '\d RETURN',
1155 instr)
1156enddef
1157
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001158def NestedOuter()
1159 def g:Inner()
1160 echomsg "inner"
1161 enddef
1162enddef
1163
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001164def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001165 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001166 assert_match('NestedOuter\_s*' ..
1167 'def g:Inner()\_s*' ..
1168 'echomsg "inner"\_s*' ..
1169 'enddef\_s*' ..
1170 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001171 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001172 instr)
1173enddef
1174
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001175def NestedDefList()
1176 def
1177 def Info
1178 def /Info
1179 def /Info/
1180enddef
1181
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001182def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001183 var instr = execute('disassemble NestedDefList')
1184 assert_match('NestedDefList\_s*' ..
1185 'def\_s*' ..
1186 '\d DEF \_s*' ..
1187 'def Info\_s*' ..
1188 '\d DEF Info\_s*' ..
1189 'def /Info\_s*' ..
1190 '\d DEF /Info\_s*' ..
1191 'def /Info/\_s*' ..
1192 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001193 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001194 instr)
1195enddef
1196
Bram Moolenaar6e949782020-04-13 17:21:00 +02001197def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001198 if arg == 1 && arg != 2 || arg == 4
1199 return 'yes'
1200 endif
1201 return 'no'
1202enddef
1203
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001204def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001205 assert_equal("yes", AndOr(1))
1206 assert_equal("no", AndOr(2))
1207 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001208 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001209 assert_match('AndOr\_s*' ..
1210 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1211 '\d LOAD arg\[-1]\_s*' ..
1212 '\d PUSHNR 1\_s*' ..
1213 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001214 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001215 '\d LOAD arg\[-1]\_s*' ..
1216 '\d PUSHNR 2\_s*' ..
1217 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001218 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001219 '\d LOAD arg\[-1]\_s*' ..
1220 '\d\+ PUSHNR 4\_s*' ..
1221 '\d\+ COMPAREANY ==\_s*' ..
1222 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001223 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001224enddef
1225
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001226def AndConstant(arg: any): string
1227 if true && arg
1228 return "yes"
1229 endif
1230 if false && arg
1231 return "never"
1232 endif
1233 return "no"
1234enddef
1235
1236def Test_disassemble_and_constant()
1237 assert_equal("yes", AndConstant(1))
1238 assert_equal("no", AndConstant(false))
1239 var instr = execute('disassemble AndConstant')
1240 assert_match('AndConstant\_s*' ..
1241 'if true && arg\_s*' ..
1242 '0 LOAD arg\[-1\]\_s*' ..
1243 '1 COND2BOOL\_s*' ..
1244 '2 JUMP_IF_FALSE -> 5\_s*' ..
1245 'return "yes"\_s*' ..
1246 '3 PUSHS "yes"\_s*' ..
1247 '4 RETURN\_s*' ..
1248 'endif\_s*' ..
1249 'if false && arg\_s*' ..
1250 'return "never"\_s*' ..
1251 'endif\_s*' ..
1252 'return "no"\_s*' ..
1253 '5 PUSHS "no"\_s*' ..
1254 '6 RETURN',
1255 instr)
1256enddef
1257
Bram Moolenaar04d05222020-02-06 22:06:54 +01001258def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001259 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001260 for i in range(3)
1261 res->add(i)
1262 endfor
1263 return res
1264enddef
1265
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001266def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001267 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001268 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001269 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001270 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001271 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001272 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001273 '\d STORE $0\_s*' ..
1274 'for i in range(3)\_s*' ..
1275 '\d STORE -1 in $1\_s*' ..
1276 '\d PUSHNR 3\_s*' ..
1277 '\d BCALL range(argc 1)\_s*' ..
1278 '\d FOR $1 -> \d\+\_s*' ..
1279 '\d STORE $2\_s*' ..
1280 'res->add(i)\_s*' ..
1281 '\d LOAD $0\_s*' ..
1282 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001283 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001284 '\d\+ DROP\_s*' ..
1285 'endfor\_s*' ..
1286 '\d\+ JUMP -> \d\+\_s*' ..
1287 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001288 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001289enddef
1290
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001291def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001292 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001293 for str in eval('["one", "two"]')
1294 res ..= str
1295 endfor
1296 return res
1297enddef
1298
1299def Test_disassemble_for_loop_eval()
1300 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001301 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001302 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001303 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001304 '\d PUSHS ""\_s*' ..
1305 '\d STORE $0\_s*' ..
1306 'for str in eval(''\["one", "two"\]'')\_s*' ..
1307 '\d STORE -1 in $1\_s*' ..
1308 '\d PUSHS "\["one", "two"\]"\_s*' ..
1309 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001310 '\d FOR $1 -> \d\+\_s*' ..
1311 '\d STORE $2\_s*' ..
1312 'res ..= str\_s*' ..
1313 '\d\+ LOAD $0\_s*' ..
1314 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001315 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001316 '\d\+ CONCAT\_s*' ..
1317 '\d\+ STORE $0\_s*' ..
1318 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001319 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001320 '\d\+ DROP\_s*' ..
1321 'return res\_s*' ..
1322 '\d\+ LOAD $0\_s*' ..
1323 '\d\+ RETURN',
1324 instr)
1325enddef
1326
Bram Moolenaar792f7862020-11-23 08:31:18 +01001327def ForLoopUnpack()
1328 for [x1, x2] in [[1, 2], [3, 4]]
1329 echo x1 x2
1330 endfor
1331enddef
1332
1333def Test_disassemble_for_loop_unpack()
1334 var instr = execute('disassemble ForLoopUnpack')
1335 assert_match('ForLoopUnpack\_s*' ..
1336 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1337 '\d\+ STORE -1 in $0\_s*' ..
1338 '\d\+ PUSHNR 1\_s*' ..
1339 '\d\+ PUSHNR 2\_s*' ..
1340 '\d\+ NEWLIST size 2\_s*' ..
1341 '\d\+ PUSHNR 3\_s*' ..
1342 '\d\+ PUSHNR 4\_s*' ..
1343 '\d\+ NEWLIST size 2\_s*' ..
1344 '\d\+ NEWLIST size 2\_s*' ..
1345 '\d\+ FOR $0 -> 16\_s*' ..
1346 '\d\+ UNPACK 2\_s*' ..
1347 '\d\+ STORE $1\_s*' ..
1348 '\d\+ STORE $2\_s*' ..
1349 'echo x1 x2\_s*' ..
1350 '\d\+ LOAD $1\_s*' ..
1351 '\d\+ LOAD $2\_s*' ..
1352 '\d\+ ECHO 2\_s*' ..
1353 'endfor\_s*' ..
1354 '\d\+ JUMP -> 8\_s*' ..
1355 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001356 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001357 instr)
1358enddef
1359
Bram Moolenaarc150c092021-02-13 15:02:46 +01001360def ForLoopContinue()
1361 for nr in [1, 2]
1362 try
1363 echo "ok"
1364 try
1365 echo "deeper"
1366 catch
1367 continue
1368 endtry
1369 catch
1370 echo "not ok"
1371 endtry
1372 endfor
1373enddef
1374
1375def Test_disassemble_for_loop_continue()
1376 var instr = execute('disassemble ForLoopContinue')
1377 assert_match('ForLoopContinue\_s*' ..
1378 'for nr in \[1, 2]\_s*' ..
1379 '0 STORE -1 in $0\_s*' ..
1380 '1 PUSHNR 1\_s*' ..
1381 '2 PUSHNR 2\_s*' ..
1382 '3 NEWLIST size 2\_s*' ..
1383 '4 FOR $0 -> 22\_s*' ..
1384 '5 STORE $1\_s*' ..
1385 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001386 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001387 'echo "ok"\_s*' ..
1388 '7 PUSHS "ok"\_s*' ..
1389 '8 ECHO 1\_s*' ..
1390 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001391 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001392 'echo "deeper"\_s*' ..
1393 '10 PUSHS "deeper"\_s*' ..
1394 '11 ECHO 1\_s*' ..
1395 'catch\_s*' ..
1396 '12 JUMP -> 15\_s*' ..
1397 '13 CATCH\_s*' ..
1398 'continue\_s*' ..
1399 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1400 'endtry\_s*' ..
1401 '15 ENDTRY\_s*' ..
1402 'catch\_s*' ..
1403 '16 JUMP -> 20\_s*' ..
1404 '17 CATCH\_s*' ..
1405 'echo "not ok"\_s*' ..
1406 '18 PUSHS "not ok"\_s*' ..
1407 '19 ECHO 1\_s*' ..
1408 'endtry\_s*' ..
1409 '20 ENDTRY\_s*' ..
1410 'endfor\_s*' ..
1411 '21 JUMP -> 4\_s*' ..
1412 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001413 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001414 instr)
1415enddef
1416
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001417let g:number = 42
1418
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001419def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001420 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001421enddef
1422
1423def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001424 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001425 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001426 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001427 '\d PUSHNR 23\_s*' ..
1428 '\d LOADG g:number\_s*' ..
1429 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1430 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001431 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001432 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001433 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001434 instr)
1435enddef
1436
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001437def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001438 var nr = 3
1439 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001440 nrres = nr - 7
1441 nrres = nr * 7
1442 nrres = nr / 7
1443 nrres = nr % 7
1444
Bram Moolenaarac564082020-09-27 19:05:33 +02001445 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001446 anyres = g:number - 7
1447 anyres = g:number * 7
1448 anyres = g:number / 7
1449 anyres = g:number % 7
1450
1451 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001452 var fl = 3.0
1453 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001454 flres = fl - 7.0
1455 flres = fl * 7.0
1456 flres = fl / 7.0
1457 endif
1458enddef
1459
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001460def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001461 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001462 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001463 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001464 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001465 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001466 '\d LOAD $0.*' ..
1467 '\d PUSHNR 7.*' ..
1468 '\d OPNR +.*' ..
1469 '\d STORE $1.*' ..
1470 'nrres = nr - 7.*' ..
1471 '\d OPNR -.*' ..
1472 'nrres = nr \* 7.*' ..
1473 '\d OPNR \*.*' ..
1474 'nrres = nr / 7.*' ..
1475 '\d OPNR /.*' ..
1476 'nrres = nr % 7.*' ..
1477 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001478 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001479 '\d LOADG g:number.*' ..
1480 '\d PUSHNR 7.*' ..
1481 '\d OPANY +.*' ..
1482 '\d STORE $2.*' ..
1483 'anyres = g:number - 7.*' ..
1484 '\d OPANY -.*' ..
1485 'anyres = g:number \* 7.*' ..
1486 '\d OPANY \*.*' ..
1487 'anyres = g:number / 7.*' ..
1488 '\d OPANY /.*' ..
1489 'anyres = g:number % 7.*' ..
1490 '\d OPANY %.*',
1491 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001492 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001493 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001494 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001495 '\d PUSHF 3.0.*' ..
1496 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001497 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001498 '\d LOAD $3.*' ..
1499 '\d PUSHF 7.0.*' ..
1500 '\d OPFLOAT +.*' ..
1501 '\d STORE $4.*' ..
1502 'flres = fl - 7.0.*' ..
1503 '\d OPFLOAT -.*' ..
1504 'flres = fl \* 7.0.*' ..
1505 '\d OPFLOAT \*.*' ..
1506 'flres = fl / 7.0.*' ..
1507 '\d OPFLOAT /.*',
1508 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001509 endif
1510enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001511
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001512def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001513 var reslist = [1, 2] + [3, 4]
1514 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001515enddef
1516
1517def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001518 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001519 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001520 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001521 '\d PUSHNR 1.*' ..
1522 '\d PUSHNR 2.*' ..
1523 '\d NEWLIST size 2.*' ..
1524 '\d PUSHNR 3.*' ..
1525 '\d PUSHNR 4.*' ..
1526 '\d NEWLIST size 2.*' ..
1527 '\d ADDLIST.*' ..
1528 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001530 '\d PUSHBLOB 0z1122.*' ..
1531 '\d PUSHBLOB 0z3344.*' ..
1532 '\d ADDBLOB.*' ..
1533 '\d STORE $.*',
1534 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001535enddef
1536
1537let g:aa = 'aa'
1538def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001539 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001540 return res
1541enddef
1542
1543def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001544 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001545 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001546 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001547 '\d LOADG g:aa.*' ..
1548 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001549 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001550 '\d CONCAT.*' ..
1551 '\d STORE $.*',
1552 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001553 assert_equal('aabb', ConcatString())
1554enddef
1555
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001556def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001557 var s = "abcd"
1558 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001559 return res
1560enddef
1561
1562def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001563 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001564 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001565 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001566 '\d PUSHS "abcd"\_s*' ..
1567 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001568 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001569 '\d LOAD $0\_s*' ..
1570 '\d PUSHNR 1\_s*' ..
1571 '\d STRINDEX\_s*' ..
1572 '\d STORE $1\_s*',
1573 instr)
1574 assert_equal('b', StringIndex())
1575enddef
1576
Bram Moolenaared591872020-08-15 22:14:53 +02001577def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001578 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001579 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001580 return res
1581enddef
1582
1583def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001584 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001585 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001586 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001587 '\d PUSHS "abcd"\_s*' ..
1588 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001589 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001590 '\d LOAD $0\_s*' ..
1591 '\d PUSHNR 1\_s*' ..
1592 '\d PUSHNR 8\_s*' ..
1593 '\d STRSLICE\_s*' ..
1594 '\d STORE $1\_s*',
1595 instr)
1596 assert_equal('bcd', StringSlice())
1597enddef
1598
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001599def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001600 var l = [1, 2, 3]
1601 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001602 return res
1603enddef
1604
1605def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001606 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001607 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001608 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001609 '\d PUSHNR 1\_s*' ..
1610 '\d PUSHNR 2\_s*' ..
1611 '\d PUSHNR 3\_s*' ..
1612 '\d NEWLIST size 3\_s*' ..
1613 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001614 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001615 '\d LOAD $0\_s*' ..
1616 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001617 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001618 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001619 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001620 assert_equal(2, ListIndex())
1621enddef
1622
Bram Moolenaared591872020-08-15 22:14:53 +02001623def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001625 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001626 return res
1627enddef
1628
1629def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001630 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001631 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001632 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001633 '\d PUSHNR 1\_s*' ..
1634 '\d PUSHNR 2\_s*' ..
1635 '\d PUSHNR 3\_s*' ..
1636 '\d NEWLIST size 3\_s*' ..
1637 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001638 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001639 '\d LOAD $0\_s*' ..
1640 '\d PUSHNR 1\_s*' ..
1641 '\d PUSHNR 8\_s*' ..
1642 '\d LISTSLICE\_s*' ..
1643 '\d STORE $1\_s*',
1644 instr)
1645 assert_equal([2, 3], ListSlice())
1646enddef
1647
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001648def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001649 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001650 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001651 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001652 return res
1653enddef
1654
1655def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001656 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001657 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001658 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001659 '\d PUSHS "item"\_s*' ..
1660 '\d PUSHNR 1\_s*' ..
1661 '\d NEWDICT size 1\_s*' ..
1662 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001663 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001664 '\d\+ LOAD $0\_s*' ..
1665 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001666 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001667 '\d\+ STORE $1\_s*' ..
1668 'res = d\["item"\]\_s*' ..
1669 '\d\+ LOAD $0\_s*' ..
1670 '\d\+ PUSHS "item"\_s*' ..
1671 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001672 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001673 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001674 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001675 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001676enddef
1677
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001678let somelist = [1, 2, 3, 4, 5]
1679def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001680 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001681 return res
1682enddef
1683
1684def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001685 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001686 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001687 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001688 '\d LOADG g:somelist\_s*' ..
1689 '\d PUSHNR 2\_s*' ..
1690 '\d ANYINDEX\_s*' ..
1691 '\d STORE $0\_s*' ..
1692 'return res\_s*' ..
1693 '\d LOAD $0\_s*' ..
1694 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1695 '\d RETURN',
1696 instr)
1697 assert_equal(3, AnyIndex())
1698enddef
1699
1700def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001701 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001702 return res
1703enddef
1704
1705def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001706 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001707 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001708 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001709 '\d LOADG g:somelist\_s*' ..
1710 '\d PUSHNR 1\_s*' ..
1711 '\d PUSHNR 3\_s*' ..
1712 '\d ANYSLICE\_s*' ..
1713 '\d STORE $0\_s*' ..
1714 'return res\_s*' ..
1715 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001716 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001717 '\d RETURN',
1718 instr)
1719 assert_equal([2, 3, 4], AnySlice())
1720enddef
1721
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001722def NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001723 g:nr = 9
1724 var plus = +g:nr
1725 var minus = -g:nr
1726 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001727enddef
1728
1729def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001730 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001731 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001732 'g:nr = 9\_s*' ..
1733 '\d PUSHNR 9\_s*' ..
1734 '\d STOREG g:nr\_s*' ..
1735 'var plus = +g:nr\_s*' ..
1736 '\d LOADG g:nr\_s*' ..
1737 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1738 '\d STORE $0\_s*' ..
1739 'var minus = -g:nr\_s*' ..
1740 '\d LOADG g:nr\_s*' ..
1741 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001742 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001743 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001744 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001745 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001746enddef
1747
1748def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001749 var flag = true
1750 var invert = !flag
1751 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001752 return res
1753enddef
1754
1755def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001756 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001757 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001758 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001759 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001760 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001761 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001762 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001763 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001764 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001765 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001766 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001767 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001768 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001769 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001770 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001771enddef
1772
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001773def ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001774 var one = 1
1775 var zero = 0
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001776 var none: number
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001777 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001778 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001779enddef
1780
1781def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001782 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001783 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001784 'var one = 1\_s*' ..
1785 '0 STORE 1 in $0\_s*' ..
1786 'var zero = 0\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001787 'var none: number\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001788 'var name: bool = one && zero || one\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001789 '1 LOAD $0\_s*' ..
1790 '2 COND2BOOL\_s*' ..
1791 '3 JUMP_IF_COND_FALSE -> 6\_s*' ..
1792 '4 LOAD $1\_s*' ..
1793 '5 COND2BOOL\_s*' ..
1794 '6 JUMP_IF_COND_TRUE -> 9\_s*' ..
1795 '7 LOAD $0\_s*' ..
1796 '8 COND2BOOL\_s*' ..
1797 '9 STORE $3\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001798 'return name\_s*' ..
Bram Moolenaar5cd64792021-12-25 18:23:24 +00001799 '\d\+ LOAD $3\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001800 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001801 instr)
1802 assert_equal(true, InvertBool())
1803enddef
1804
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001805def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001806 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001807 ['true == isFalse', 'COMPAREBOOL =='],
1808 ['true != isFalse', 'COMPAREBOOL !='],
1809 ['v:none == isNull', 'COMPARESPECIAL =='],
1810 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001811
Bram Moolenaara5565e42020-05-09 15:44:01 +02001812 ['111 == aNumber', 'COMPARENR =='],
1813 ['111 != aNumber', 'COMPARENR !='],
1814 ['111 > aNumber', 'COMPARENR >'],
1815 ['111 < aNumber', 'COMPARENR <'],
1816 ['111 >= aNumber', 'COMPARENR >='],
1817 ['111 <= aNumber', 'COMPARENR <='],
1818 ['111 =~ aNumber', 'COMPARENR =\~'],
1819 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001820
Bram Moolenaara5565e42020-05-09 15:44:01 +02001821 ['"xx" != aString', 'COMPARESTRING !='],
1822 ['"xx" > aString', 'COMPARESTRING >'],
1823 ['"xx" < aString', 'COMPARESTRING <'],
1824 ['"xx" >= aString', 'COMPARESTRING >='],
1825 ['"xx" <= aString', 'COMPARESTRING <='],
1826 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1827 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1828 ['"xx" is aString', 'COMPARESTRING is'],
1829 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001830
Bram Moolenaara5565e42020-05-09 15:44:01 +02001831 ['0z11 == aBlob', 'COMPAREBLOB =='],
1832 ['0z11 != aBlob', 'COMPAREBLOB !='],
1833 ['0z11 is aBlob', 'COMPAREBLOB is'],
1834 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001835
Bram Moolenaara5565e42020-05-09 15:44:01 +02001836 ['[1, 2] == aList', 'COMPARELIST =='],
1837 ['[1, 2] != aList', 'COMPARELIST !='],
1838 ['[1, 2] is aList', 'COMPARELIST is'],
1839 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001840
Bram Moolenaare0de1712020-12-02 17:36:54 +01001841 ['{a: 1} == aDict', 'COMPAREDICT =='],
1842 ['{a: 1} != aDict', 'COMPAREDICT !='],
1843 ['{a: 1} is aDict', 'COMPAREDICT is'],
1844 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001845
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001846 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1847 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1848 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1849 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001850
1851 ['77 == g:xx', 'COMPAREANY =='],
1852 ['77 != g:xx', 'COMPAREANY !='],
1853 ['77 > g:xx', 'COMPAREANY >'],
1854 ['77 < g:xx', 'COMPAREANY <'],
1855 ['77 >= g:xx', 'COMPAREANY >='],
1856 ['77 <= g:xx', 'COMPAREANY <='],
1857 ['77 =~ g:xx', 'COMPAREANY =\~'],
1858 ['77 !~ g:xx', 'COMPAREANY !\~'],
1859 ['77 is g:xx', 'COMPAREANY is'],
1860 ['77 isnot g:xx', 'COMPAREANY isnot'],
1861 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001862 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001863 if has('float')
1864 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001865 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1866 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1867 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1868 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1869 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1870 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1871 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1872 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001873 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001874 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001875 endif
1876
Bram Moolenaarac564082020-09-27 19:05:33 +02001877 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001878 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001879 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001880 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001881 ' var isFalse = false',
1882 ' var isNull = v:null',
1883 ' var aNumber = 222',
1884 ' var aString = "yy"',
1885 ' var aBlob = 0z22',
1886 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001887 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001888 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001889 ' if ' .. case[0],
1890 ' echo 42'
1891 ' endif',
1892 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001893 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001894 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001895 assert_match('TestCase' .. nr .. '.*' ..
1896 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1897 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001898 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001899 '\d ' .. case[1] .. '.*' ..
1900 '\d JUMP_IF_FALSE -> \d\+.*',
1901 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001902
1903 nr += 1
1904 endfor
1905
Bram Moolenaar22da5592020-03-19 14:52:20 +01001906 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001907enddef
1908
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001909def s:FalsyOp()
1910 echo g:flag ?? "yes"
1911 echo [] ?? "empty list"
1912 echo "" ?? "empty string"
1913enddef
1914
1915def Test_dsassemble_falsy_op()
1916 var res = execute('disass s:FalsyOp')
1917 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1918 'echo g:flag ?? "yes"\_s*' ..
1919 '0 LOADG g:flag\_s*' ..
1920 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1921 '2 PUSHS "yes"\_s*' ..
1922 '3 ECHO 1\_s*' ..
1923 'echo \[\] ?? "empty list"\_s*' ..
1924 '4 NEWLIST size 0\_s*' ..
1925 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1926 '6 PUSHS "empty list"\_s*' ..
1927 '7 ECHO 1\_s*' ..
1928 'echo "" ?? "empty string"\_s*' ..
1929 '\d\+ PUSHS "empty string"\_s*' ..
1930 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001931 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001932 res)
1933enddef
1934
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001935def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001936 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001937 ['"xx" == "yy"', false],
1938 ['"aa" == "aa"', true],
1939 ['has("eval") ? true : false', true],
1940 ['has("asdf") ? true : false', false],
1941 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001942
Bram Moolenaarac564082020-09-27 19:05:33 +02001943 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001944 for case in cases
1945 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001946 ' if ' .. case[0],
1947 ' echo 42'
1948 ' endif',
1949 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001950 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001951 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001952 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001953 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001954 assert_match('TestCase' .. nr .. '.*' ..
1955 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1956 '\d PUSHNR 42.*' ..
1957 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001958 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001959 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001960 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001961 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001962 assert_match('TestCase' .. nr .. '.*' ..
1963 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1964 'echo 42[ \n]*' ..
1965 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001966 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001967 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001968 endif
1969
1970 nr += 1
1971 endfor
1972
1973 delete('Xdisassemble')
1974enddef
1975
Bram Moolenaarad39c092020-02-26 18:23:43 +01001976def s:Execute()
1977 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001978 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001979 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001980 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001981 execute 'help ' .. tag
1982enddef
1983
1984def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001985 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001986 assert_match('\<SNR>\d*_Execute\_s*' ..
1987 "execute 'help vim9.txt'\\_s*" ..
1988 '\d PUSHS "help vim9.txt"\_s*' ..
1989 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001990 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001991 '\d PUSHS "help vim9.txt"\_s*' ..
1992 '\d STORE $0\_s*' ..
1993 'execute cmd\_s*' ..
1994 '\d LOAD $0\_s*' ..
1995 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001996 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001997 '\d PUSHS "vim9.txt"\_s*' ..
1998 '\d STORE $1\_s*' ..
1999 "execute 'help ' .. tag\\_s*" ..
2000 '\d\+ PUSHS "help "\_s*' ..
2001 '\d\+ LOAD $1\_s*' ..
2002 '\d\+ CONCAT\_s*' ..
2003 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002004 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002005 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002006enddef
2007
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002008def s:OnlyRange()
2009 :$
2010 :123
2011 :'m
2012enddef
2013
2014def Test_disassemble_range_only()
2015 var res = execute('disass s:OnlyRange')
2016 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2017 ':$\_s*' ..
2018 '\d EXECRANGE $\_s*' ..
2019 ':123\_s*' ..
2020 '\d EXECRANGE 123\_s*' ..
2021 ':''m\_s*' ..
2022 '\d EXECRANGE ''m\_s*' ..
2023 '\d\+ RETURN void',
2024 res)
2025enddef
2026
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002027def s:Echomsg()
2028 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002029 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002030 echoerr 'went' .. 'wrong'
2031enddef
2032
2033def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002034 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002035 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2036 "echomsg 'some' 'message'\\_s*" ..
2037 '\d PUSHS "some"\_s*' ..
2038 '\d PUSHS "message"\_s*' ..
2039 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002040 "echoconsole 'nothing'\\_s*" ..
2041 '\d PUSHS "nothing"\_s*' ..
2042 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002043 "echoerr 'went' .. 'wrong'\\_s*" ..
2044 '\d PUSHS "wentwrong"\_s*' ..
2045 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002046 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002047 res)
2048enddef
2049
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002050def SomeStringArg(arg: string)
2051 echo arg
2052enddef
2053
2054def SomeAnyArg(arg: any)
2055 echo arg
2056enddef
2057
2058def SomeStringArgAndReturn(arg: string): string
2059 return arg
2060enddef
2061
2062def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002063 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002064 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2065 '\d *echo arg.*' ..
2066 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002067 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002068
Bram Moolenaarac564082020-09-27 19:05:33 +02002069 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002070 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2071 '\d *echo arg\_s*' ..
2072 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002073 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002074
Bram Moolenaarac564082020-09-27 19:05:33 +02002075 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002076 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2077 '\d *return arg\_s*' ..
2078 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002079 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002080enddef
2081
Bram Moolenaar09689a02020-05-09 22:50:08 +02002082def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002083 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002084 vim9script
2085 def FuncOne(): string
2086 return FuncTwo()
2087 enddef
2088 def FuncTwo(): string
2089 return 'two'
2090 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002091 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002092 END
2093 writefile(lines, 'Xdisassemble')
2094 source Xdisassemble
2095
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002096 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002097 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2098 'return FuncTwo()\_s*' ..
2099 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002100 '\d RETURN',
2101 g:res_FuncOne)
2102
2103 delete('Xdisassemble')
2104 unlet g:res_FuncOne
2105enddef
2106
Bram Moolenaar61a89812020-05-07 16:58:17 +02002107def s:ConcatStrings(): string
2108 return 'one' .. 'two' .. 'three'
2109enddef
2110
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002111def s:ComputeConst(): number
2112 return 2 + 3 * 4 / 6 + 7
2113enddef
2114
Bram Moolenaar1c747212020-05-09 18:28:34 +02002115def s:ComputeConstParen(): number
2116 return ((2 + 4) * (8 / 2)) / (3 + 4)
2117enddef
2118
Bram Moolenaar61a89812020-05-07 16:58:17 +02002119def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002120 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002121 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2122 "return 'one' .. 'two' .. 'three'\\_s*" ..
2123 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002124 '\d RETURN',
2125 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002126
2127 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002128 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2129 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2130 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002131 '\d RETURN',
2132 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002133
2134 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002135 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2136 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2137 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002138 '\d RETURN',
2139 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002140enddef
2141
Bram Moolenaar389df252020-07-09 21:20:47 +02002142def s:CallAppend()
2143 eval "some text"->append(2)
2144enddef
2145
2146def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002147 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002148 assert_match('<SNR>\d*_CallAppend\_s*' ..
2149 'eval "some text"->append(2)\_s*' ..
2150 '\d PUSHS "some text"\_s*' ..
2151 '\d PUSHNR 2\_s*' ..
2152 '\d SHUFFLE 2 up 1\_s*' ..
2153 '\d BCALL append(argc 2)\_s*' ..
2154 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002155 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002156 res)
2157enddef
2158
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002159
2160def s:SilentMessage()
2161 silent echomsg "text"
2162 silent! echoerr "error"
2163enddef
2164
2165def Test_silent()
2166 var res = execute('disass s:SilentMessage')
2167 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2168 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002169 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002170 '\d PUSHS "text"\_s*' ..
2171 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002172 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002173 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002174 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002175 '\d PUSHS "error"\_s*' ..
2176 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002177 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002178 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002179 res)
2180enddef
2181
2182def s:SilentIf()
2183 silent if 4 == g:five
2184 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002185 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002186enddef
2187
2188def Test_silent_if()
2189 var res = execute('disass s:SilentIf')
2190 assert_match('<SNR>\d*_SilentIf\_s*' ..
2191 'silent if 4 == g:five\_s*' ..
2192 '\d\+ CMDMOD silent\_s*' ..
2193 '\d\+ PUSHNR 4\_s*' ..
2194 '\d\+ LOADG g:five\_s*' ..
2195 '\d\+ COMPAREANY ==\_s*' ..
2196 '\d\+ CMDMOD_REV\_s*' ..
2197 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2198 'silent elseif 4 == g:five\_s*' ..
2199 '\d\+ JUMP -> \d\+\_s*' ..
2200 '\d\+ CMDMOD silent\_s*' ..
2201 '\d\+ PUSHNR 4\_s*' ..
2202 '\d\+ LOADG g:five\_s*' ..
2203 '\d\+ COMPAREANY ==\_s*' ..
2204 '\d\+ CMDMOD_REV\_s*' ..
2205 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002206 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002207 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002208 res)
2209enddef
2210
2211def s:SilentFor()
2212 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002213 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002214enddef
2215
2216def Test_silent_for()
2217 var res = execute('disass s:SilentFor')
2218 assert_match('<SNR>\d*_SilentFor\_s*' ..
2219 'silent for i in \[0\]\_s*' ..
2220 '\d CMDMOD silent\_s*' ..
2221 '\d STORE -1 in $0\_s*' ..
2222 '\d PUSHNR 0\_s*' ..
2223 '\d NEWLIST size 1\_s*' ..
2224 '\d CMDMOD_REV\_s*' ..
2225 '5 FOR $0 -> 8\_s*' ..
2226 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002227 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002228 '\d JUMP -> 5\_s*' ..
2229 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002230 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002231 res)
2232enddef
2233
2234def s:SilentWhile()
2235 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002236 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002237enddef
2238
2239def Test_silent_while()
2240 var res = execute('disass s:SilentWhile')
2241 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2242 'silent while g:not\_s*' ..
2243 '0 CMDMOD silent\_s*' ..
2244 '\d LOADG g:not\_s*' ..
2245 '\d COND2BOOL\_s*' ..
2246 '\d CMDMOD_REV\_s*' ..
2247 '\d JUMP_IF_FALSE -> 6\_s*' ..
2248
Bram Moolenaarfa984412021-03-25 22:15:28 +01002249 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002250 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002251 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002252 res)
2253enddef
2254
2255def s:SilentReturn(): string
2256 silent return "done"
2257enddef
2258
2259def Test_silent_return()
2260 var res = execute('disass s:SilentReturn')
2261 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2262 'silent return "done"\_s*' ..
2263 '\d CMDMOD silent\_s*' ..
2264 '\d PUSHS "done"\_s*' ..
2265 '\d CMDMOD_REV\_s*' ..
2266 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002267 res)
2268enddef
2269
Bram Moolenaarb2049902021-01-24 12:53:53 +01002270def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002271 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002272 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002273 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002274 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002275 return "done"
2276enddef
2277
2278def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002279 if !has('profile')
2280 MissingFeature 'profile'
2281 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002282 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002283 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002284 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002285 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002286 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002287 '\d PUSHS "profiled"\_s*' ..
2288 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002289 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002290 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002291 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002292 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002293 '\d PUSHS "some text"\_s*' ..
2294 '\d STORE $0\_s*' ..
2295 'return "done"\_s*' ..
2296 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002297 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002298 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002299 '\d\+ RETURN\_s*' ..
2300 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002301 res)
2302enddef
2303
Bram Moolenaare99d4222021-06-13 14:01:26 +02002304def Test_debugged()
2305 var res = execute('disass debug s:Profiled')
2306 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002307 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002308 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002309 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002310 '\d PUSHS "profiled"\_s*' ..
2311 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002312 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002313 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002314 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002315 '\d PUSHS "some text"\_s*' ..
2316 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002317 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002318 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002319 '\d PUSHS "done"\_s*' ..
2320 '\d RETURN\_s*',
2321 res)
2322enddef
2323
Bram Moolenaar90770b72021-11-30 20:57:38 +00002324def s:ElseifConstant()
2325 if g:value
2326 echo "one"
2327 elseif true
2328 echo "true"
2329 elseif false
2330 echo "false"
2331 endif
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002332 if 0
2333 echo "yes"
2334 elseif 0
2335 echo "no"
2336 endif
Bram Moolenaar90770b72021-11-30 20:57:38 +00002337enddef
2338
2339def Test_debug_elseif_constant()
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002340 var res = execute('disass debug s:ElseifConstant')
Bram Moolenaar90770b72021-11-30 20:57:38 +00002341 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2342 'if g:value\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002343 '0 DEBUG line 1-1 varcount 0\_s*' ..
2344 '1 LOADG g:value\_s*' ..
2345 '2 COND2BOOL\_s*' ..
2346 '3 JUMP_IF_FALSE -> 8\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002347 'echo "one"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002348 '4 DEBUG line 2-2 varcount 0\_s*' ..
2349 '5 PUSHS "one"\_s*' ..
2350 '6 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002351 'elseif true\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002352 '7 JUMP -> 12\_s*' ..
2353 '8 DEBUG line 3-3 varcount 0\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002354 'echo "true"\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002355 '9 DEBUG line 4-4 varcount 0\_s*' ..
2356 '10 PUSHS "true"\_s*' ..
2357 '11 ECHO 1\_s*' ..
Bram Moolenaar90770b72021-11-30 20:57:38 +00002358 'elseif false\_s*' ..
2359 'echo "false"\_s*' ..
2360 'endif\_s*' ..
Bram Moolenaar1b5f7a62021-12-21 13:30:42 +00002361 'if 0\_s*' ..
2362 '12 DEBUG line 8-8 varcount 0\_s*' ..
2363 'echo "yes"\_s*' ..
2364 'elseif 0\_s*' ..
2365 '13 DEBUG line 11-10 varcount 0\_s*' ..
2366 'echo "no"\_s*' ..
2367 'endif\_s*' ..
2368 '14 RETURN void*',
Bram Moolenaar90770b72021-11-30 20:57:38 +00002369 res)
2370enddef
2371
Bram Moolenaar093165c2021-08-22 13:35:31 +02002372def s:DebugElseif()
2373 var b = false
2374 if b
2375 eval 1 + 0
2376 silent elseif !b
2377 eval 2 + 0
2378 endif
2379enddef
2380
2381def Test_debug_elseif()
2382 var res = execute('disass debug s:DebugElseif')
2383 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2384 'var b = false\_s*' ..
2385 '0 DEBUG line 1-1 varcount 0\_s*' ..
2386 '1 PUSH false\_s*' ..
2387 '2 STORE $0\_s*' ..
2388
2389 'if b\_s*' ..
2390 '3 DEBUG line 2-2 varcount 1\_s*' ..
2391 '4 LOAD $0\_s*' ..
2392 '5 JUMP_IF_FALSE -> 10\_s*' ..
2393
2394 'eval 1 + 0\_s*' ..
2395 '6 DEBUG line 3-3 varcount 1\_s*' ..
2396 '7 PUSHNR 1\_s*' ..
2397 '8 DROP\_s*' ..
2398
2399 'silent elseif !b\_s*' ..
2400 '9 JUMP -> 20\_s*' ..
2401 '10 CMDMOD silent\_s*' ..
2402 '11 DEBUG line 4-4 varcount 1\_s*' ..
2403 '12 LOAD $0\_s*' ..
2404 '13 INVERT -1 (!val)\_s*' ..
2405 '14 CMDMOD_REV\_s*' ..
2406 '15 JUMP_IF_FALSE -> 20\_s*' ..
2407
2408 'eval 2 + 0\_s*' ..
2409 '16 DEBUG line 5-5 varcount 1\_s*' ..
2410 '17 PUSHNR 2\_s*' ..
2411 '18 DROP\_s*' ..
2412
2413 'endif\_s*' ..
2414 '19 DEBUG line 6-6 varcount 1\_s*' ..
2415 '20 RETURN void*',
2416 res)
2417enddef
2418
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002419func Legacy() dict
2420 echo 'legacy'
2421endfunc
2422
2423def s:UseMember()
2424 var d = {func: Legacy}
2425 var v = d.func()
2426enddef
2427
2428def Test_disassemble_dict_stack()
2429 var res = execute('disass s:UseMember')
2430 assert_match('<SNR>\d*_UseMember\_s*' ..
2431 'var d = {func: Legacy}\_s*' ..
2432 '\d PUSHS "func"\_s*' ..
Bram Moolenaarb15cf442021-12-16 15:49:43 +00002433 '\d PUSHFUNC "g:Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002434 '\d NEWDICT size 1\_s*' ..
2435 '\d STORE $0\_s*' ..
2436
2437 'var v = d.func()\_s*' ..
2438 '\d LOAD $0\_s*' ..
2439 '\d MEMBER func\_s*' ..
2440 '\d PCALL top (argc 0)\_s*' ..
2441 '\d PCALL end\_s*' ..
2442 '\d CLEARDICT\_s*' ..
2443 '\d\+ STORE $1\_s*' ..
2444 '\d\+ RETURN void*',
2445 res)
2446enddef
2447
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002448def s:EchoMessages()
2449 echohl ErrorMsg | echom v:exception | echohl NONE
2450enddef
2451
2452def Test_disassemble_nextcmd()
2453 # splitting commands and removing trailing blanks should not change the line
2454 var res = execute('disass s:EchoMessages')
2455 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2456 'echohl ErrorMsg | echom v:exception | echohl NONE',
2457 res)
2458enddef
2459
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002460def Test_disassemble_after_reload()
2461 var lines =<< trim END
2462 vim9script
2463 if exists('g:ThisFunc')
2464 finish
2465 endif
2466 var name: any
2467 def g:ThisFunc(): number
2468 g:name = name
2469 return 0
2470 enddef
2471 def g:ThatFunc(): number
2472 name = g:name
2473 return 0
2474 enddef
2475 END
2476 lines->writefile('Xreload.vim')
2477
2478 source Xreload.vim
2479 g:ThisFunc()
2480 g:ThatFunc()
2481
2482 source Xreload.vim
2483 var res = execute('disass g:ThisFunc')
2484 assert_match('ThisFunc\_s*' ..
2485 'g:name = name\_s*' ..
2486 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2487 '\d STOREG g:name\_s*' ..
2488 'return 0\_s*' ..
2489 '\d PUSHNR 0\_s*' ..
2490 '\d RETURN\_s*',
2491 res)
2492
2493 res = execute('disass g:ThatFunc')
2494 assert_match('ThatFunc\_s*' ..
2495 'name = g:name\_s*' ..
2496 '\d LOADG g:name\_s*' ..
2497 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2498 'return 0\_s*' ..
2499 '\d PUSHNR 0\_s*' ..
2500 '\d RETURN\_s*',
2501 res)
2502
2503 delete('Xreload.vim')
2504 delfunc g:ThisFunc
2505 delfunc g:ThatFunc
2506enddef
2507
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002508
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002509
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002510" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker