blob: 76fd3fac1118d1565240c5083e4303dc87c3c271 [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
1776 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001777 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001778enddef
1779
1780def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001781 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001782 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001783 'var one = 1\_s*' ..
1784 '0 STORE 1 in $0\_s*' ..
1785 'var zero = 0\_s*' ..
1786 '1 STORE 0 in $1\_s*' ..
1787 'var name: bool = one && zero || one\_s*' ..
1788 '2 LOAD $0\_s*' ..
1789 '3 COND2BOOL\_s*' ..
1790 '4 JUMP_IF_COND_FALSE -> 7\_s*' ..
1791 '5 LOAD $1\_s*' ..
1792 '6 COND2BOOL\_s*' ..
1793 '7 JUMP_IF_COND_TRUE -> 10\_s*' ..
1794 '8 LOAD $0\_s*' ..
1795 '9 COND2BOOL\_s*' ..
1796 '10 STORE $2\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001797 'return name\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001798 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001799 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001800 instr)
1801 assert_equal(true, InvertBool())
1802enddef
1803
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001804def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001806 ['true == isFalse', 'COMPAREBOOL =='],
1807 ['true != isFalse', 'COMPAREBOOL !='],
1808 ['v:none == isNull', 'COMPARESPECIAL =='],
1809 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001810
Bram Moolenaara5565e42020-05-09 15:44:01 +02001811 ['111 == aNumber', 'COMPARENR =='],
1812 ['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 !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001819
Bram Moolenaara5565e42020-05-09 15:44:01 +02001820 ['"xx" != aString', 'COMPARESTRING !='],
1821 ['"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" is aString', 'COMPARESTRING is'],
1828 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001829
Bram Moolenaara5565e42020-05-09 15:44:01 +02001830 ['0z11 == aBlob', 'COMPAREBLOB =='],
1831 ['0z11 != aBlob', 'COMPAREBLOB !='],
1832 ['0z11 is aBlob', 'COMPAREBLOB is'],
1833 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001834
Bram Moolenaara5565e42020-05-09 15:44:01 +02001835 ['[1, 2] == aList', 'COMPARELIST =='],
1836 ['[1, 2] != aList', 'COMPARELIST !='],
1837 ['[1, 2] is aList', 'COMPARELIST is'],
1838 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001839
Bram Moolenaare0de1712020-12-02 17:36:54 +01001840 ['{a: 1} == aDict', 'COMPAREDICT =='],
1841 ['{a: 1} != aDict', 'COMPAREDICT !='],
1842 ['{a: 1} is aDict', 'COMPAREDICT is'],
1843 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001844
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001845 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1846 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1847 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1848 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001849
1850 ['77 == g:xx', 'COMPAREANY =='],
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 is g:xx', 'COMPAREANY is'],
1859 ['77 isnot g:xx', 'COMPAREANY isnot'],
1860 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001861 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001862 if has('float')
1863 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001864 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1865 ['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 !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001872 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001873 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001874 endif
1875
Bram Moolenaarac564082020-09-27 19:05:33 +02001876 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001877 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001878 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001879 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001880 ' var isFalse = false',
1881 ' var isNull = v:null',
1882 ' var aNumber = 222',
1883 ' var aString = "yy"',
1884 ' var aBlob = 0z22',
1885 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001886 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001887 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001888 ' if ' .. case[0],
1889 ' echo 42'
1890 ' endif',
1891 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001892 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001893 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001894 assert_match('TestCase' .. nr .. '.*' ..
1895 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1896 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001897 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001898 '\d ' .. case[1] .. '.*' ..
1899 '\d JUMP_IF_FALSE -> \d\+.*',
1900 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001901
1902 nr += 1
1903 endfor
1904
Bram Moolenaar22da5592020-03-19 14:52:20 +01001905 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001906enddef
1907
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001908def s:FalsyOp()
1909 echo g:flag ?? "yes"
1910 echo [] ?? "empty list"
1911 echo "" ?? "empty string"
1912enddef
1913
1914def Test_dsassemble_falsy_op()
1915 var res = execute('disass s:FalsyOp')
1916 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1917 'echo g:flag ?? "yes"\_s*' ..
1918 '0 LOADG g:flag\_s*' ..
1919 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1920 '2 PUSHS "yes"\_s*' ..
1921 '3 ECHO 1\_s*' ..
1922 'echo \[\] ?? "empty list"\_s*' ..
1923 '4 NEWLIST size 0\_s*' ..
1924 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1925 '6 PUSHS "empty list"\_s*' ..
1926 '7 ECHO 1\_s*' ..
1927 'echo "" ?? "empty string"\_s*' ..
1928 '\d\+ PUSHS "empty string"\_s*' ..
1929 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001930 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001931 res)
1932enddef
1933
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001934def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001935 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001936 ['"xx" == "yy"', false],
1937 ['"aa" == "aa"', true],
1938 ['has("eval") ? true : false', true],
1939 ['has("asdf") ? true : false', false],
1940 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001941
Bram Moolenaarac564082020-09-27 19:05:33 +02001942 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001943 for case in cases
1944 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001945 ' if ' .. case[0],
1946 ' echo 42'
1947 ' endif',
1948 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001949 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001950 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001951 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001952 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001953 assert_match('TestCase' .. nr .. '.*' ..
1954 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1955 '\d PUSHNR 42.*' ..
1956 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001957 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001958 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001959 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001960 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001961 assert_match('TestCase' .. nr .. '.*' ..
1962 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1963 'echo 42[ \n]*' ..
1964 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001965 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001966 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001967 endif
1968
1969 nr += 1
1970 endfor
1971
1972 delete('Xdisassemble')
1973enddef
1974
Bram Moolenaarad39c092020-02-26 18:23:43 +01001975def s:Execute()
1976 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001977 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001978 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001979 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001980 execute 'help ' .. tag
1981enddef
1982
1983def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001984 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001985 assert_match('\<SNR>\d*_Execute\_s*' ..
1986 "execute 'help vim9.txt'\\_s*" ..
1987 '\d PUSHS "help vim9.txt"\_s*' ..
1988 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001989 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001990 '\d PUSHS "help vim9.txt"\_s*' ..
1991 '\d STORE $0\_s*' ..
1992 'execute cmd\_s*' ..
1993 '\d LOAD $0\_s*' ..
1994 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001995 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001996 '\d PUSHS "vim9.txt"\_s*' ..
1997 '\d STORE $1\_s*' ..
1998 "execute 'help ' .. tag\\_s*" ..
1999 '\d\+ PUSHS "help "\_s*' ..
2000 '\d\+ LOAD $1\_s*' ..
2001 '\d\+ CONCAT\_s*' ..
2002 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002003 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002004 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01002005enddef
2006
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002007def s:OnlyRange()
2008 :$
2009 :123
2010 :'m
2011enddef
2012
2013def Test_disassemble_range_only()
2014 var res = execute('disass s:OnlyRange')
2015 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2016 ':$\_s*' ..
2017 '\d EXECRANGE $\_s*' ..
2018 ':123\_s*' ..
2019 '\d EXECRANGE 123\_s*' ..
2020 ':''m\_s*' ..
2021 '\d EXECRANGE ''m\_s*' ..
2022 '\d\+ RETURN void',
2023 res)
2024enddef
2025
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002026def s:Echomsg()
2027 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002028 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002029 echoerr 'went' .. 'wrong'
2030enddef
2031
2032def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002033 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002034 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2035 "echomsg 'some' 'message'\\_s*" ..
2036 '\d PUSHS "some"\_s*' ..
2037 '\d PUSHS "message"\_s*' ..
2038 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002039 "echoconsole 'nothing'\\_s*" ..
2040 '\d PUSHS "nothing"\_s*' ..
2041 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002042 "echoerr 'went' .. 'wrong'\\_s*" ..
2043 '\d PUSHS "wentwrong"\_s*' ..
2044 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002045 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002046 res)
2047enddef
2048
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002049def SomeStringArg(arg: string)
2050 echo arg
2051enddef
2052
2053def SomeAnyArg(arg: any)
2054 echo arg
2055enddef
2056
2057def SomeStringArgAndReturn(arg: string): string
2058 return arg
2059enddef
2060
2061def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002062 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002063 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2064 '\d *echo arg.*' ..
2065 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002066 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002067
Bram Moolenaarac564082020-09-27 19:05:33 +02002068 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002069 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2070 '\d *echo arg\_s*' ..
2071 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002072 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002073
Bram Moolenaarac564082020-09-27 19:05:33 +02002074 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002075 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2076 '\d *return arg\_s*' ..
2077 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002078 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002079enddef
2080
Bram Moolenaar09689a02020-05-09 22:50:08 +02002081def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002082 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002083 vim9script
2084 def FuncOne(): string
2085 return FuncTwo()
2086 enddef
2087 def FuncTwo(): string
2088 return 'two'
2089 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002090 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002091 END
2092 writefile(lines, 'Xdisassemble')
2093 source Xdisassemble
2094
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002095 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002096 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2097 'return FuncTwo()\_s*' ..
2098 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002099 '\d RETURN',
2100 g:res_FuncOne)
2101
2102 delete('Xdisassemble')
2103 unlet g:res_FuncOne
2104enddef
2105
Bram Moolenaar61a89812020-05-07 16:58:17 +02002106def s:ConcatStrings(): string
2107 return 'one' .. 'two' .. 'three'
2108enddef
2109
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002110def s:ComputeConst(): number
2111 return 2 + 3 * 4 / 6 + 7
2112enddef
2113
Bram Moolenaar1c747212020-05-09 18:28:34 +02002114def s:ComputeConstParen(): number
2115 return ((2 + 4) * (8 / 2)) / (3 + 4)
2116enddef
2117
Bram Moolenaar61a89812020-05-07 16:58:17 +02002118def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002119 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002120 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2121 "return 'one' .. 'two' .. 'three'\\_s*" ..
2122 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002123 '\d RETURN',
2124 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002125
2126 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002127 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2128 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2129 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002130 '\d RETURN',
2131 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002132
2133 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002134 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2135 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2136 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002137 '\d RETURN',
2138 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002139enddef
2140
Bram Moolenaar389df252020-07-09 21:20:47 +02002141def s:CallAppend()
2142 eval "some text"->append(2)
2143enddef
2144
2145def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002146 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002147 assert_match('<SNR>\d*_CallAppend\_s*' ..
2148 'eval "some text"->append(2)\_s*' ..
2149 '\d PUSHS "some text"\_s*' ..
2150 '\d PUSHNR 2\_s*' ..
2151 '\d SHUFFLE 2 up 1\_s*' ..
2152 '\d BCALL append(argc 2)\_s*' ..
2153 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002154 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002155 res)
2156enddef
2157
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002158
2159def s:SilentMessage()
2160 silent echomsg "text"
2161 silent! echoerr "error"
2162enddef
2163
2164def Test_silent()
2165 var res = execute('disass s:SilentMessage')
2166 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2167 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002168 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002169 '\d PUSHS "text"\_s*' ..
2170 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002171 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002172 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002173 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002174 '\d PUSHS "error"\_s*' ..
2175 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002176 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002177 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002178 res)
2179enddef
2180
2181def s:SilentIf()
2182 silent if 4 == g:five
2183 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002184 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002185enddef
2186
2187def Test_silent_if()
2188 var res = execute('disass s:SilentIf')
2189 assert_match('<SNR>\d*_SilentIf\_s*' ..
2190 'silent if 4 == g:five\_s*' ..
2191 '\d\+ CMDMOD silent\_s*' ..
2192 '\d\+ PUSHNR 4\_s*' ..
2193 '\d\+ LOADG g:five\_s*' ..
2194 '\d\+ COMPAREANY ==\_s*' ..
2195 '\d\+ CMDMOD_REV\_s*' ..
2196 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2197 'silent elseif 4 == g:five\_s*' ..
2198 '\d\+ JUMP -> \d\+\_s*' ..
2199 '\d\+ CMDMOD silent\_s*' ..
2200 '\d\+ PUSHNR 4\_s*' ..
2201 '\d\+ LOADG g:five\_s*' ..
2202 '\d\+ COMPAREANY ==\_s*' ..
2203 '\d\+ CMDMOD_REV\_s*' ..
2204 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002205 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002206 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002207 res)
2208enddef
2209
2210def s:SilentFor()
2211 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002212 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002213enddef
2214
2215def Test_silent_for()
2216 var res = execute('disass s:SilentFor')
2217 assert_match('<SNR>\d*_SilentFor\_s*' ..
2218 'silent for i in \[0\]\_s*' ..
2219 '\d CMDMOD silent\_s*' ..
2220 '\d STORE -1 in $0\_s*' ..
2221 '\d PUSHNR 0\_s*' ..
2222 '\d NEWLIST size 1\_s*' ..
2223 '\d CMDMOD_REV\_s*' ..
2224 '5 FOR $0 -> 8\_s*' ..
2225 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002226 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002227 '\d JUMP -> 5\_s*' ..
2228 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002229 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002230 res)
2231enddef
2232
2233def s:SilentWhile()
2234 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002235 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002236enddef
2237
2238def Test_silent_while()
2239 var res = execute('disass s:SilentWhile')
2240 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2241 'silent while g:not\_s*' ..
2242 '0 CMDMOD silent\_s*' ..
2243 '\d LOADG g:not\_s*' ..
2244 '\d COND2BOOL\_s*' ..
2245 '\d CMDMOD_REV\_s*' ..
2246 '\d JUMP_IF_FALSE -> 6\_s*' ..
2247
Bram Moolenaarfa984412021-03-25 22:15:28 +01002248 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002249 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002250 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002251 res)
2252enddef
2253
2254def s:SilentReturn(): string
2255 silent return "done"
2256enddef
2257
2258def Test_silent_return()
2259 var res = execute('disass s:SilentReturn')
2260 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2261 'silent return "done"\_s*' ..
2262 '\d CMDMOD silent\_s*' ..
2263 '\d PUSHS "done"\_s*' ..
2264 '\d CMDMOD_REV\_s*' ..
2265 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002266 res)
2267enddef
2268
Bram Moolenaarb2049902021-01-24 12:53:53 +01002269def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002270 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002271 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002272 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002273 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002274 return "done"
2275enddef
2276
2277def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002278 if !has('profile')
2279 MissingFeature 'profile'
2280 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002281 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002282 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002283 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002284 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002285 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002286 '\d PUSHS "profiled"\_s*' ..
2287 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002288 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002289 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002290 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002291 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002292 '\d PUSHS "some text"\_s*' ..
2293 '\d STORE $0\_s*' ..
2294 'return "done"\_s*' ..
2295 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002296 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002297 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002298 '\d\+ RETURN\_s*' ..
2299 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002300 res)
2301enddef
2302
Bram Moolenaare99d4222021-06-13 14:01:26 +02002303def Test_debugged()
2304 var res = execute('disass debug s:Profiled')
2305 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002306 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002307 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002308 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002309 '\d PUSHS "profiled"\_s*' ..
2310 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002311 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002312 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002313 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002314 '\d PUSHS "some text"\_s*' ..
2315 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002316 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002317 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002318 '\d PUSHS "done"\_s*' ..
2319 '\d RETURN\_s*',
2320 res)
2321enddef
2322
Bram Moolenaar90770b72021-11-30 20:57:38 +00002323def s:ElseifConstant()
2324 if g:value
2325 echo "one"
2326 elseif true
2327 echo "true"
2328 elseif false
2329 echo "false"
2330 endif
2331enddef
2332
2333def Test_debug_elseif_constant()
2334 var res = execute('disass s:ElseifConstant')
2335 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2336 'if g:value\_s*' ..
2337 '0 LOADG g:value\_s*' ..
2338 '1 COND2BOOL\_s*' ..
2339 '2 JUMP_IF_FALSE -> 6\_s*' ..
2340 'echo "one"\_s*' ..
2341 '3 PUSHS "one"\_s*' ..
2342 '4 ECHO 1\_s*' ..
2343 'elseif true\_s*' ..
2344 '5 JUMP -> 8\_s*' ..
2345 'echo "true"\_s*' ..
2346 '6 PUSHS "true"\_s*' ..
2347 '7 ECHO 1\_s*' ..
2348 'elseif false\_s*' ..
2349 'echo "false"\_s*' ..
2350 'endif\_s*' ..
2351 '\d RETURN void*',
2352 res)
2353enddef
2354
Bram Moolenaar093165c2021-08-22 13:35:31 +02002355def s:DebugElseif()
2356 var b = false
2357 if b
2358 eval 1 + 0
2359 silent elseif !b
2360 eval 2 + 0
2361 endif
2362enddef
2363
2364def Test_debug_elseif()
2365 var res = execute('disass debug s:DebugElseif')
2366 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2367 'var b = false\_s*' ..
2368 '0 DEBUG line 1-1 varcount 0\_s*' ..
2369 '1 PUSH false\_s*' ..
2370 '2 STORE $0\_s*' ..
2371
2372 'if b\_s*' ..
2373 '3 DEBUG line 2-2 varcount 1\_s*' ..
2374 '4 LOAD $0\_s*' ..
2375 '5 JUMP_IF_FALSE -> 10\_s*' ..
2376
2377 'eval 1 + 0\_s*' ..
2378 '6 DEBUG line 3-3 varcount 1\_s*' ..
2379 '7 PUSHNR 1\_s*' ..
2380 '8 DROP\_s*' ..
2381
2382 'silent elseif !b\_s*' ..
2383 '9 JUMP -> 20\_s*' ..
2384 '10 CMDMOD silent\_s*' ..
2385 '11 DEBUG line 4-4 varcount 1\_s*' ..
2386 '12 LOAD $0\_s*' ..
2387 '13 INVERT -1 (!val)\_s*' ..
2388 '14 CMDMOD_REV\_s*' ..
2389 '15 JUMP_IF_FALSE -> 20\_s*' ..
2390
2391 'eval 2 + 0\_s*' ..
2392 '16 DEBUG line 5-5 varcount 1\_s*' ..
2393 '17 PUSHNR 2\_s*' ..
2394 '18 DROP\_s*' ..
2395
2396 'endif\_s*' ..
2397 '19 DEBUG line 6-6 varcount 1\_s*' ..
2398 '20 RETURN void*',
2399 res)
2400enddef
2401
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002402func Legacy() dict
2403 echo 'legacy'
2404endfunc
2405
2406def s:UseMember()
2407 var d = {func: Legacy}
2408 var v = d.func()
2409enddef
2410
2411def Test_disassemble_dict_stack()
2412 var res = execute('disass s:UseMember')
2413 assert_match('<SNR>\d*_UseMember\_s*' ..
2414 'var d = {func: Legacy}\_s*' ..
2415 '\d PUSHS "func"\_s*' ..
Bram Moolenaarb15cf442021-12-16 15:49:43 +00002416 '\d PUSHFUNC "g:Legacy"\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002417 '\d NEWDICT size 1\_s*' ..
2418 '\d STORE $0\_s*' ..
2419
2420 'var v = d.func()\_s*' ..
2421 '\d LOAD $0\_s*' ..
2422 '\d MEMBER func\_s*' ..
2423 '\d PCALL top (argc 0)\_s*' ..
2424 '\d PCALL end\_s*' ..
2425 '\d CLEARDICT\_s*' ..
2426 '\d\+ STORE $1\_s*' ..
2427 '\d\+ RETURN void*',
2428 res)
2429enddef
2430
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002431def s:EchoMessages()
2432 echohl ErrorMsg | echom v:exception | echohl NONE
2433enddef
2434
2435def Test_disassemble_nextcmd()
2436 # splitting commands and removing trailing blanks should not change the line
2437 var res = execute('disass s:EchoMessages')
2438 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2439 'echohl ErrorMsg | echom v:exception | echohl NONE',
2440 res)
2441enddef
2442
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002443def Test_disassemble_after_reload()
2444 var lines =<< trim END
2445 vim9script
2446 if exists('g:ThisFunc')
2447 finish
2448 endif
2449 var name: any
2450 def g:ThisFunc(): number
2451 g:name = name
2452 return 0
2453 enddef
2454 def g:ThatFunc(): number
2455 name = g:name
2456 return 0
2457 enddef
2458 END
2459 lines->writefile('Xreload.vim')
2460
2461 source Xreload.vim
2462 g:ThisFunc()
2463 g:ThatFunc()
2464
2465 source Xreload.vim
2466 var res = execute('disass g:ThisFunc')
2467 assert_match('ThisFunc\_s*' ..
2468 'g:name = name\_s*' ..
2469 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2470 '\d STOREG g:name\_s*' ..
2471 'return 0\_s*' ..
2472 '\d PUSHNR 0\_s*' ..
2473 '\d RETURN\_s*',
2474 res)
2475
2476 res = execute('disass g:ThatFunc')
2477 assert_match('ThatFunc\_s*' ..
2478 'name = g:name\_s*' ..
2479 '\d LOADG g:name\_s*' ..
2480 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2481 'return 0\_s*' ..
2482 '\d PUSHNR 0\_s*' ..
2483 '\d RETURN\_s*',
2484 res)
2485
2486 delete('Xreload.vim')
2487 delfunc g:ThisFunc
2488 delfunc g:ThatFunc
2489enddef
2490
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002491
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002492
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002493" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker