blob: 184f5575866b226ae13d6627316a6e7b6e65514d [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200120 '\d\+ RETURN void',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
Bram Moolenaar20677332021-06-06 17:02:53 +0200124if has('python3')
125 def s:PyHeredoc()
126 python3 << EOF
127 print('hello')
128EOF
129 enddef
130
131 def Test_disassemble_python_heredoc()
132 var res = execute('disass s:PyHeredoc')
133 assert_match('<SNR>\d*_PyHeredoc.*' ..
134 " python3 << EOF^@ print('hello')^@EOF\\_s*" ..
135 '\d EXEC_SPLIT python3 << EOF^@ print(''hello'')^@EOF\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200136 '\d RETURN void',
Bram Moolenaar20677332021-06-06 17:02:53 +0200137 res)
138 enddef
139endif
140
Bram Moolenaar4c137212021-04-19 16:48:48 +0200141def s:Substitute()
142 var expr = "abc"
143 :%s/a/\=expr/&g#c
144enddef
145
146def Test_disassemble_substitute()
147 var res = execute('disass s:Substitute')
148 assert_match('<SNR>\d*_Substitute.*' ..
149 ' var expr = "abc"\_s*' ..
150 '\d PUSHS "abc"\_s*' ..
151 '\d STORE $0\_s*' ..
152 ' :%s/a/\\=expr/&g#c\_s*' ..
153 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
154 ' 0 LOAD $0\_s*' ..
155 ' -------------\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200156 '\d RETURN void',
Bram Moolenaar4c137212021-04-19 16:48:48 +0200157 res)
158enddef
159
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200160
161def s:SearchPair()
162 var col = 8
163 searchpair("{", "", "}", "", "col('.') > col")
164enddef
165
166def Test_disassemble_seachpair()
167 var res = execute('disass s:SearchPair')
168 assert_match('<SNR>\d*_SearchPair.*' ..
169 ' var col = 8\_s*' ..
170 '\d STORE 8 in $0\_s*' ..
171 ' searchpair("{", "", "}", "", "col(''.'') > col")\_s*' ..
172 '\d PUSHS "{"\_s*' ..
173 '\d PUSHS ""\_s*' ..
174 '\d PUSHS "}"\_s*' ..
175 '\d PUSHS ""\_s*' ..
176 '\d INSTR\_s*' ..
177 ' 0 PUSHS "."\_s*' ..
178 ' 1 BCALL col(argc 1)\_s*' ..
179 ' 2 LOAD $0\_s*' ..
180 ' 3 COMPARENR >\_s*' ..
181 ' -------------\_s*' ..
182 '\d BCALL searchpair(argc 5)\_s*' ..
183 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200184 '\d RETURN void',
Bram Moolenaarf18332f2021-05-07 17:55:55 +0200185 res)
186enddef
187
188
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200189def s:RedirVar()
190 var result: string
191 redir =>> result
192 echo "text"
193 redir END
194enddef
195
196def Test_disassemble_redir_var()
197 var res = execute('disass s:RedirVar')
198 assert_match('<SNR>\d*_RedirVar.*' ..
199 ' var result: string\_s*' ..
200 '\d PUSHS "\[NULL\]"\_s*' ..
201 '\d STORE $0\_s*' ..
202 ' redir =>> result\_s*' ..
203 '\d REDIR\_s*' ..
204 ' echo "text"\_s*' ..
205 '\d PUSHS "text"\_s*' ..
206 '\d ECHO 1\_s*' ..
207 ' redir END\_s*' ..
208 '\d LOAD $0\_s*' ..
209 '\d REDIR END\_s*' ..
210 '\d CONCAT\_s*' ..
211 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200212 '\d RETURN void',
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200213 res)
214enddef
215
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200216def s:Cexpr()
217 var errors = "list of errors"
218 cexpr errors
219enddef
220
221def Test_disassemble_cexpr()
222 var res = execute('disass s:Cexpr')
223 assert_match('<SNR>\d*_Cexpr.*' ..
224 ' var errors = "list of errors"\_s*' ..
225 '\d PUSHS "list of errors"\_s*' ..
226 '\d STORE $0\_s*' ..
227 ' cexpr errors\_s*' ..
228 '\d CEXPR pre cexpr\_s*' ..
229 '\d LOAD $0\_s*' ..
230 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200231 '\d RETURN void',
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200232 res)
233enddef
234
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200235def s:YankRange()
236 norm! m[jjm]
237 :'[,']yank
238enddef
239
240def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200241 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200242 assert_match('<SNR>\d*_YankRange.*' ..
243 ' norm! m\[jjm\]\_s*' ..
244 '\d EXEC norm! m\[jjm\]\_s*' ..
245 ' :''\[,''\]yank\_s*' ..
246 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200247 '\d RETURN void',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200248 res)
249enddef
250
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200251def s:PutExpr()
252 :3put ="text"
253enddef
254
255def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200257 assert_match('<SNR>\d*_PutExpr.*' ..
258 ' :3put ="text"\_s*' ..
259 '\d PUSHS "text"\_s*' ..
260 '\d PUT = 3\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200261 '\d RETURN void',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200262 res)
263enddef
264
Bram Moolenaar08597872020-12-10 19:43:40 +0100265def s:PutRange()
266 :$-2put a
267enddef
268
269def Test_disassemble_put_range()
270 var res = execute('disass s:PutRange')
271 assert_match('<SNR>\d*_PutRange.*' ..
272 ' :$-2put a\_s*' ..
273 '\d RANGE $-2\_s*' ..
274 '\d PUT a range\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200275 '\d RETURN void',
Bram Moolenaar08597872020-12-10 19:43:40 +0100276 res)
277enddef
278
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100279def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200280 var localbool = true
281 var localspec = v:none
282 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100283 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200284 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100285 endif
286enddef
287
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100288def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200289 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200290 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
291 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100292 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200293 'localspec = v:none.*' ..
294 ' PUSH v:none.*' ..
295 'localblob = 0z1234.*' ..
296 ' PUSHBLOB 0z1234.*',
297 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100298 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200299 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
300 'localfloat = 1.234.*' ..
301 ' PUSHF 1.234.*',
302 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100303 endif
304enddef
305
306def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200307 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100308 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100310 localstr = 'xyz'
311 v:char = 'abc'
312 s:scriptvar = 'sv'
313 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100314 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200315 b:buffervar = 'bv'
316 w:windowvar = 'wv'
317 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100318 &tabstop = 8
319 $ENVVAR = 'ev'
320 @z = 'rv'
321enddef
322
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100323def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200324 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200325 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200326 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200327 'localnr = 2.*' ..
328 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200329 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200330 'localstr = ''xyz''.*' ..
331 ' STORE $1.*' ..
332 'v:char = ''abc''.*' ..
333 'STOREV v:char.*' ..
334 's:scriptvar = ''sv''.*' ..
335 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
336 'g:globalvar = ''gv''.*' ..
337 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100338 'g:auto#var = ''av''.*' ..
339 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200340 'b:buffervar = ''bv''.*' ..
341 ' STOREB b:buffervar.*' ..
342 'w:windowvar = ''wv''.*' ..
343 ' STOREW w:windowvar.*' ..
344 't:tabpagevar = ''tv''.*' ..
345 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200346 '&tabstop = 8.*' ..
347 ' STOREOPT &tabstop.*' ..
348 '$ENVVAR = ''ev''.*' ..
349 ' STOREENV $ENVVAR.*' ..
350 '@z = ''rv''.*' ..
351 ' STOREREG @z.*',
352 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100353enddef
354
Bram Moolenaarcb790402020-05-15 20:53:00 +0200355def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200356 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200357 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200358 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200359 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200360 var localblob: blob = 0z1122
361 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200362enddef
363
364def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200365 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200366 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200367 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200368 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100369 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200370 '\d STORE $0\_s*' ..
371 'locallist\[0\] = 123\_s*' ..
372 '\d PUSHNR 123\_s*' ..
373 '\d PUSHNR 0\_s*' ..
374 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200375 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200376 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200377 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100378 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200379 '\d STORE $1\_s*' ..
380 'localdict\["a"\] = 456\_s*' ..
381 '\d\+ PUSHNR 456\_s*' ..
382 '\d\+ PUSHS "a"\_s*' ..
383 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200384 '\d\+ STOREINDEX dict\_s*' ..
385 'var localblob: blob = 0z1122\_s*' ..
386 '\d\+ PUSHBLOB 0z1122\_s*' ..
387 '\d\+ STORE $2\_s*' ..
388 'localblob\[1\] = 33\_s*' ..
389 '\d\+ PUSHNR 33\_s*' ..
390 '\d\+ PUSHNR 1\_s*' ..
391 '\d\+ LOAD $2\_s*' ..
392 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200393 '\d\+ RETURN void',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200394 res)
395enddef
396
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100397def s:ScriptFuncStoreIndex()
398 var d = {dd: {}}
399 d.dd[0] = 0
400enddef
401
402def Test_disassemble_store_index()
403 var res = execute('disass s:ScriptFuncStoreIndex')
404 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
405 'var d = {dd: {}}\_s*' ..
406 '\d PUSHS "dd"\_s*' ..
407 '\d NEWDICT size 0\_s*' ..
408 '\d NEWDICT size 1\_s*' ..
409 '\d STORE $0\_s*' ..
410 'd.dd\[0\] = 0\_s*' ..
411 '\d PUSHNR 0\_s*' ..
412 '\d PUSHNR 0\_s*' ..
413 '\d LOAD $0\_s*' ..
414 '\d MEMBER dd\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +0200415 '\d\+ USEDICT\_s*' ..
416 '\d\+ STOREINDEX any\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200417 '\d\+ RETURN void',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100418 res)
419enddef
420
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200421def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200422 var x: string
423 var y: string
424 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200425 [x, y; l] = g:stringlist
426enddef
427
428def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200429 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200430 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200432 '\d PUSHS "\[NULL\]"\_s*' ..
433 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200434 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200435 '\d PUSHS "\[NULL\]"\_s*' ..
436 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200437 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200438 '\d NEWLIST size 0\_s*' ..
Bram Moolenaar6e48b842021-08-10 22:52:02 +0200439 '\d SETTYPE list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200440 '\d STORE $2\_s*' ..
441 '\[x, y; l\] = g:stringlist\_s*' ..
442 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200443 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200444 '\d CHECKLEN >= 2\_s*' ..
445 '\d\+ ITEM 0\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200446 '\d\+ CHECKTYPE string stack\[-1\] arg 1\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200447 '\d\+ STORE $0\_s*' ..
448 '\d\+ ITEM 1\_s*' ..
Bram Moolenaar4270d8b2021-08-07 16:30:42 +0200449 '\d\+ CHECKTYPE string stack\[-1\] arg 2\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200450 '\d\+ STORE $1\_s*' ..
451 '\d\+ SLICE 2\_s*' ..
452 '\d\+ STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200453 '\d\+ RETURN void',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200454 res)
455enddef
456
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200457def s:ListAssignWithOp()
458 var a = 2
459 var b = 3
460 [a, b] += [4, 5]
461enddef
462
463def Test_disassemble_list_assign_with_op()
464 var res = execute('disass s:ListAssignWithOp')
465 assert_match('<SNR>\d*_ListAssignWithOp\_s*' ..
466 'var a = 2\_s*' ..
467 '\d STORE 2 in $0\_s*' ..
468 'var b = 3\_s*' ..
469 '\d STORE 3 in $1\_s*' ..
470 '\[a, b\] += \[4, 5\]\_s*' ..
471 '\d\+ PUSHNR 4\_s*' ..
472 '\d\+ PUSHNR 5\_s*' ..
473 '\d\+ NEWLIST size 2\_s*' ..
Bram Moolenaar035bd1c2021-06-21 19:44:11 +0200474 '\d\+ LOAD $0\_s*' ..
475 '\d\+ ITEM 0 with op\_s*' ..
476 '\d\+ OPNR +\_s*' ..
477 '\d\+ STORE $0\_s*' ..
478 '\d\+ LOAD $1\_s*' ..
479 '\d\+ ITEM 1 with op\_s*' ..
480 '\d\+ OPNR +\_s*' ..
481 '\d\+ STORE $1\_s*' ..
482 '\d\+ DROP\_s*' ..
483 '\d\+ RETURN void',
484 res)
485enddef
486
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200487def s:ListAdd()
488 var l: list<number> = []
489 add(l, 123)
490 add(l, g:aNumber)
491enddef
492
493def Test_disassemble_list_add()
494 var res = execute('disass s:ListAdd')
495 assert_match('<SNR>\d*_ListAdd\_s*' ..
496 'var l: list<number> = []\_s*' ..
497 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100498 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200499 '\d STORE $0\_s*' ..
500 'add(l, 123)\_s*' ..
501 '\d LOAD $0\_s*' ..
502 '\d PUSHNR 123\_s*' ..
503 '\d LISTAPPEND\_s*' ..
504 '\d DROP\_s*' ..
505 'add(l, g:aNumber)\_s*' ..
506 '\d LOAD $0\_s*' ..
507 '\d\+ LOADG g:aNumber\_s*' ..
508 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
509 '\d\+ LISTAPPEND\_s*' ..
510 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200511 '\d\+ RETURN void',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200512 res)
513enddef
514
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200515def s:BlobAdd()
516 var b: blob = 0z
517 add(b, 123)
518 add(b, g:aNumber)
519enddef
520
521def Test_disassemble_blob_add()
522 var res = execute('disass s:BlobAdd')
523 assert_match('<SNR>\d*_BlobAdd\_s*' ..
524 'var b: blob = 0z\_s*' ..
525 '\d PUSHBLOB 0z\_s*' ..
526 '\d STORE $0\_s*' ..
527 'add(b, 123)\_s*' ..
528 '\d LOAD $0\_s*' ..
529 '\d PUSHNR 123\_s*' ..
530 '\d BLOBAPPEND\_s*' ..
531 '\d DROP\_s*' ..
532 'add(b, g:aNumber)\_s*' ..
533 '\d LOAD $0\_s*' ..
534 '\d\+ LOADG g:aNumber\_s*' ..
535 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
536 '\d\+ BLOBAPPEND\_s*' ..
537 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200538 '\d\+ RETURN void',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200539 res)
540enddef
541
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200542def s:BlobIndexSlice()
543 var b: blob = 0z112233
544 echo b[1]
545 echo b[1 : 2]
546enddef
547
548def Test_disassemble_blob_index_slice()
549 var res = execute('disass s:BlobIndexSlice')
550 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
551 'var b: blob = 0z112233\_s*' ..
552 '\d PUSHBLOB 0z112233\_s*' ..
553 '\d STORE $0\_s*' ..
554 'echo b\[1\]\_s*' ..
555 '\d LOAD $0\_s*' ..
556 '\d PUSHNR 1\_s*' ..
557 '\d BLOBINDEX\_s*' ..
558 '\d ECHO 1\_s*' ..
559 'echo b\[1 : 2\]\_s*' ..
560 '\d LOAD $0\_s*' ..
561 '\d PUSHNR 1\_s*' ..
562 '\d\+ PUSHNR 2\_s*' ..
563 '\d\+ BLOBSLICE\_s*' ..
564 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200565 '\d\+ RETURN void',
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200566 res)
567enddef
568
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200569def s:ScriptFuncUnlet()
570 g:somevar = "value"
571 unlet g:somevar
572 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200573 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200574enddef
575
576def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200577 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200578 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
579 'g:somevar = "value"\_s*' ..
580 '\d PUSHS "value"\_s*' ..
581 '\d STOREG g:somevar\_s*' ..
582 'unlet g:somevar\_s*' ..
583 '\d UNLET g:somevar\_s*' ..
584 'unlet! g:somevar\_s*' ..
585 '\d UNLET! g:somevar\_s*' ..
586 'unlet $SOMEVAR\_s*' ..
587 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200588 res)
589enddef
590
Bram Moolenaaraacc9662021-08-13 19:40:51 +0200591def s:LockLocal()
592 var d = {a: 1}
593 lockvar d.a
594enddef
595
596def Test_disassemble_locl_local()
597 var res = execute('disass s:LockLocal')
598 assert_match('<SNR>\d*_LockLocal\_s*' ..
599 'var d = {a: 1}\_s*' ..
600 '\d PUSHS "a"\_s*' ..
601 '\d PUSHNR 1\_s*' ..
602 '\d NEWDICT size 1\_s*' ..
603 '\d STORE $0\_s*' ..
604 'lockvar d.a\_s*' ..
605 '\d LOAD $0\_s*' ..
606 '\d LOCKUNLOCK lockvar d.a\_s*',
607 res)
608enddef
609
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100610def s:ScriptFuncTry()
611 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200612 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100613 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200614 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100615 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200616 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100617 endtry
618enddef
619
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100620def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200621 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200622 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
623 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100624 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200625 'echo "yes"\_s*' ..
626 '\d PUSHS "yes"\_s*' ..
627 '\d ECHO 1\_s*' ..
628 'catch /fail/\_s*' ..
629 '\d JUMP -> \d\+\_s*' ..
630 '\d PUSH v:exception\_s*' ..
631 '\d PUSHS "fail"\_s*' ..
632 '\d COMPARESTRING =\~\_s*' ..
633 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
634 '\d CATCH\_s*' ..
635 'echo "no"\_s*' ..
636 '\d\+ PUSHS "no"\_s*' ..
637 '\d\+ ECHO 1\_s*' ..
638 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100639 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200640 'throw "end"\_s*' ..
641 '\d\+ PUSHS "end"\_s*' ..
642 '\d\+ THROW\_s*' ..
643 'endtry\_s*' ..
644 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200645 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100646enddef
647
648def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200649 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100650 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100651enddef
652
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100653def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200654 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200655 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200656 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200657 '\d PUSHNR 1\_s*' ..
658 '\d PUSHS "two"\_s*' ..
659 '\d PUSHNR 333\_s*' ..
660 '\d NEWLIST size 3\_s*' ..
661 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100662 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200663 '\d PUSHS "one"\_s*' ..
664 '\d PUSHNR 1\_s*' ..
665 '\d PUSHS "two"\_s*' ..
666 '\d PUSHS "val"\_s*' ..
667 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200668 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100669enddef
670
Bram Moolenaar6e949782020-04-13 17:21:00 +0200671def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100672 echo arg
673enddef
674
675func UserFunc()
676 echo 'nothing'
677endfunc
678
679func UserFuncWithArg(arg)
680 echo a:arg
681endfunc
682
683def s:ScriptFuncCall(): string
684 changenr()
685 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100686 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100687 FuncWithArg(343)
688 ScriptFuncNew()
689 s:ScriptFuncNew()
690 UserFunc()
691 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200692 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100693 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200694 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100695 FuncRefWithArg("bar")
696 return "yes"
697enddef
698
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100699def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200700 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200701 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
702 'changenr()\_s*' ..
703 '\d BCALL changenr(argc 0)\_s*' ..
704 '\d DROP\_s*' ..
705 'char2nr("abc")\_s*' ..
706 '\d PUSHS "abc"\_s*' ..
707 '\d BCALL char2nr(argc 1)\_s*' ..
708 '\d DROP\_s*' ..
709 'Test_disassemble_new()\_s*' ..
710 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
711 '\d DROP\_s*' ..
712 'FuncWithArg(343)\_s*' ..
713 '\d\+ PUSHNR 343\_s*' ..
714 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
715 '\d\+ DROP\_s*' ..
716 'ScriptFuncNew()\_s*' ..
717 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
718 '\d\+ DROP\_s*' ..
719 's:ScriptFuncNew()\_s*' ..
720 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
721 '\d\+ DROP\_s*' ..
722 'UserFunc()\_s*' ..
723 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
724 '\d\+ DROP\_s*' ..
725 'UserFuncWithArg("foo")\_s*' ..
726 '\d\+ PUSHS "foo"\_s*' ..
727 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
728 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200729 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200730 '\d\+ PUSHS "UserFunc"\_s*' ..
731 '\d\+ BCALL function(argc 1)\_s*' ..
732 '\d\+ STORE $0\_s*' ..
733 'FuncRef()\_s*' ..
734 '\d\+ LOAD $\d\_s*' ..
735 '\d\+ PCALL (argc 0)\_s*' ..
736 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200737 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200738 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
739 '\d\+ BCALL function(argc 1)\_s*' ..
740 '\d\+ STORE $1\_s*' ..
741 'FuncRefWithArg("bar")\_s*' ..
742 '\d\+ PUSHS "bar"\_s*' ..
743 '\d\+ LOAD $\d\_s*' ..
744 '\d\+ PCALL (argc 1)\_s*' ..
745 '\d\+ DROP\_s*' ..
746 'return "yes"\_s*' ..
747 '\d\+ PUSHS "yes"\_s*' ..
748 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200749 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100750enddef
751
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200752
753def s:CreateRefs()
754 var local = 'a'
755 def Append(arg: string)
756 local ..= arg
757 enddef
758 g:Append = Append
759 def Get(): string
760 return local
761 enddef
762 g:Get = Get
763enddef
764
765def Test_disassemble_closure()
766 CreateRefs()
767 var res = execute('disass g:Append')
768 assert_match('<lambda>\d\_s*' ..
769 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100770 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200771 '\d LOAD arg\[-1\]\_s*' ..
772 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100773 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200774 '\d RETURN void',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200775 res)
776
777 res = execute('disass g:Get')
778 assert_match('<lambda>\d\_s*' ..
779 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100780 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200781 '\d RETURN',
782 res)
783
784 unlet g:Append
785 unlet g:Get
786enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200787
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100788
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200789def EchoArg(arg: string): string
790 return arg
791enddef
792def RefThis(): func
793 return function('EchoArg')
794enddef
795def s:ScriptPCall()
796 RefThis()("text")
797enddef
798
799def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200800 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200801 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
802 'RefThis()("text")\_s*' ..
803 '\d DCALL RefThis(argc 0)\_s*' ..
804 '\d PUSHS "text"\_s*' ..
805 '\d PCALL top (argc 1)\_s*' ..
806 '\d PCALL end\_s*' ..
807 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +0200808 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200809 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200810enddef
811
812
Bram Moolenaara26b9702020-04-18 19:53:28 +0200813def s:FuncWithForwardCall(): string
814 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100815enddef
816
817def DefinedLater(arg: string): string
818 return arg
819enddef
820
821def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 assert_match('FuncWithForwardCall\_s*' ..
824 'return g:DefinedLater("yes")\_s*' ..
825 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200826 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200827 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200828 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100829
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200830 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100831 assert_equal('yes', FuncWithForwardCall())
832
Bram Moolenaara26b9702020-04-18 19:53:28 +0200833 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200834 assert_match('FuncWithForwardCall\_s*' ..
835 'return g:DefinedLater("yes")\_s*' ..
836 '\d PUSHS "yes"\_s*' ..
837 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200838 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200839 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100840enddef
841
842
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200843def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200844 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100845enddef
846
847def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200848 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200849 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200850 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200851 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200852 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200853 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200854 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200855 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
856 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200857 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200858 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200859 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200860 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200861 '\d 2STRING stack\[-1]\_s*' ..
862 '\d\+ CONCAT\_s*' ..
863 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200864 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100865enddef
866
867
Bram Moolenaar158906c2020-02-06 20:39:45 +0100868def HasEval()
869 if has("eval")
870 echo "yes"
871 else
872 echo "no"
873 endif
874enddef
875
876def HasNothing()
877 if has("nothing")
878 echo "yes"
879 else
880 echo "no"
881 endif
882enddef
883
884def HasSomething()
885 if has("nothing")
886 echo "nothing"
887 elseif has("something")
888 echo "something"
889 elseif has("eval")
890 echo "eval"
891 elseif has("less")
892 echo "less"
893 endif
894enddef
895
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100896def HasGuiRunning()
897 if has("gui_running")
898 echo "yes"
899 else
900 echo "no"
901 endif
902enddef
903
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100904def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200905 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200906 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200907 assert_match('HasEval\_s*' ..
908 'if has("eval")\_s*' ..
909 'echo "yes"\_s*' ..
910 '\d PUSHS "yes"\_s*' ..
911 '\d ECHO 1\_s*' ..
912 'else\_s*' ..
913 'echo "no"\_s*' ..
914 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200915 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100916 assert_notmatch('JUMP', instr)
917
Bram Moolenaard2c61702020-09-06 15:58:36 +0200918 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100919 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200920 assert_match('HasNothing\_s*' ..
921 'if has("nothing")\_s*' ..
922 'echo "yes"\_s*' ..
923 'else\_s*' ..
924 'echo "no"\_s*' ..
925 '\d PUSHS "no"\_s*' ..
926 '\d ECHO 1\_s*' ..
927 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200928 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100929 assert_notmatch('PUSHS "yes"', instr)
930 assert_notmatch('JUMP', instr)
931
Bram Moolenaard2c61702020-09-06 15:58:36 +0200932 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100933 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200934 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200935 'if has("nothing")\_s*' ..
936 'echo "nothing"\_s*' ..
937 'elseif has("something")\_s*' ..
938 'echo "something"\_s*' ..
939 'elseif has("eval")\_s*' ..
940 'echo "eval"\_s*' ..
941 '\d PUSHS "eval"\_s*' ..
942 '\d ECHO 1\_s*' ..
943 'elseif has("less").*' ..
944 'echo "less"\_s*' ..
945 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200946 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100947 assert_notmatch('PUSHS "nothing"', instr)
948 assert_notmatch('PUSHS "something"', instr)
949 assert_notmatch('PUSHS "less"', instr)
950 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100951
952 var result: string
953 var instr_expected: string
954 if has('gui')
955 if has('gui_running')
956 # GUI already running, always returns "yes"
957 result = "\nyes"
958 instr_expected = 'HasGuiRunning.*' ..
959 'if has("gui_running")\_s*' ..
960 ' echo "yes"\_s*' ..
961 '\d PUSHS "yes"\_s*' ..
962 '\d ECHO 1\_s*' ..
963 'else\_s*' ..
964 ' echo "no"\_s*' ..
965 'endif'
966 else
967 result = "\nno"
968 if has('unix')
969 # GUI not running but can start later, call has()
970 instr_expected = 'HasGuiRunning.*' ..
971 'if has("gui_running")\_s*' ..
972 '\d PUSHS "gui_running"\_s*' ..
973 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200974 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100975 '\d JUMP_IF_FALSE -> \d\_s*' ..
976 ' echo "yes"\_s*' ..
977 '\d PUSHS "yes"\_s*' ..
978 '\d ECHO 1\_s*' ..
979 'else\_s*' ..
980 '\d JUMP -> \d\_s*' ..
981 ' echo "no"\_s*' ..
982 '\d PUSHS "no"\_s*' ..
983 '\d ECHO 1\_s*' ..
984 'endif'
985 else
986 # GUI not running, always return "no"
987 instr_expected = 'HasGuiRunning.*' ..
988 'if has("gui_running")\_s*' ..
989 ' echo "yes"\_s*' ..
990 'else\_s*' ..
991 ' echo "no"\_s*' ..
992 '\d PUSHS "no"\_s*' ..
993 '\d ECHO 1\_s*' ..
994 'endif'
995 endif
996 endif
997 else
998 # GUI not supported, always return "no"
999 result = "\nno"
1000 instr_expected = 'HasGuiRunning.*' ..
1001 'if has("gui_running")\_s*' ..
1002 ' echo "yes"\_s*' ..
1003 'else\_s*' ..
1004 ' echo "no"\_s*' ..
1005 '\d PUSHS "no"\_s*' ..
1006 '\d ECHO 1\_s*' ..
1007 'endif'
1008 endif
1009
1010 assert_equal(result, execute('HasGuiRunning()'))
1011 instr = execute('disassemble HasGuiRunning')
1012 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +01001013enddef
1014
Bram Moolenaarefd88552020-06-18 20:50:10 +02001015def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001016 if 1 < 0
1017 return "maybe"
1018 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +02001019 if g:cond
1020 return "yes"
1021 else
1022 return "no"
1023 endif
1024enddef
1025
1026def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +02001027 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +02001028 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +01001029 'if 1 < 0\_s*' ..
1030 ' return "maybe"\_s*' ..
1031 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001032 'if g:cond\_s*' ..
1033 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001034 '1 COND2BOOL\_s*' ..
1035 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001036 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001037 '3 PUSHS "yes"\_s*' ..
1038 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +02001039 'else\_s*' ..
1040 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001041 '5 PUSHS "no"\_s*' ..
1042 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +02001043 instr)
1044enddef
1045
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001046def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +02001047 var Funky1: func
1048 var Funky2: func = function("len")
1049 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001050enddef
1051
1052def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +02001053 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001054 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001055 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001056 '0 PUSHFUNC "\[none]"\_s*' ..
1057 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001058 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001059 '2 PUSHS "len"\_s*' ..
1060 '3 BCALL function(argc 1)\_s*' ..
1061 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001063 '\d PUSHS "UserFunc"\_s*' ..
1064 '\d BCALL funcref(argc 1)\_s*' ..
1065 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001066 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001067 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001068enddef
1069
1070if has('channel')
1071 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +02001072 var job1: job
1073 var job2: job = job_start("donothing")
1074 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001075 enddef
1076endif
1077
1078def Test_disassemble_channel()
1079 CheckFeature channel
1080
Bram Moolenaarac564082020-09-27 19:05:33 +02001081 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001082 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001083 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001084 '\d PUSHJOB "no process"\_s*' ..
1085 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001086 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001087 '\d PUSHS "donothing"\_s*' ..
1088 '\d BCALL job_start(argc 1)\_s*' ..
1089 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001090 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001091 '\d PUSHCHANNEL 0\_s*' ..
1092 '\d STORE $2\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001093 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001094 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01001095enddef
1096
Bram Moolenaar777770f2020-02-06 21:27:08 +01001097def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001098 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001099 return F("x")
1100enddef
1101
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001102def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001103 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001104 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001105 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001106 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001107 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001108 '\d STORE $0\_s*' ..
1109 'return F("x")\_s*' ..
1110 '\d PUSHS "x"\_s*' ..
1111 '\d LOAD $0\_s*' ..
1112 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001113 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001114 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001115
Bram Moolenaarac564082020-09-27 19:05:33 +02001116 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001117 instr = execute('disassemble ' .. name)
1118 assert_match('<lambda>\d\+\_s*' ..
1119 'return "X" .. a .. "X"\_s*' ..
1120 '\d PUSHS "X"\_s*' ..
1121 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001122 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001123 '\d CONCAT\_s*' ..
1124 '\d PUSHS "X"\_s*' ..
1125 '\d CONCAT\_s*' ..
1126 '\d RETURN',
1127 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001128enddef
1129
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001130def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001131 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001132 return Ref(g:value)
1133enddef
1134
1135def Test_disassemble_lambda_with_type()
1136 g:value = 5
1137 assert_equal(15, LambdaWithType())
1138 var instr = execute('disassemble LambdaWithType')
1139 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001140 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001141 '\d FUNCREF <lambda>\d\+\_s*' ..
1142 '\d STORE $0\_s*' ..
1143 'return Ref(g:value)\_s*' ..
1144 '\d LOADG g:value\_s*' ..
1145 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001146 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001147 '\d PCALL (argc 1)\_s*' ..
1148 '\d RETURN',
1149 instr)
1150enddef
1151
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001152def NestedOuter()
1153 def g:Inner()
1154 echomsg "inner"
1155 enddef
1156enddef
1157
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001158def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001159 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001160 assert_match('NestedOuter\_s*' ..
1161 'def g:Inner()\_s*' ..
1162 'echomsg "inner"\_s*' ..
1163 'enddef\_s*' ..
1164 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001165 '\d RETURN void',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001166 instr)
1167enddef
1168
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001169def NestedDefList()
1170 def
1171 def Info
1172 def /Info
1173 def /Info/
1174enddef
1175
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001176def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001177 var instr = execute('disassemble NestedDefList')
1178 assert_match('NestedDefList\_s*' ..
1179 'def\_s*' ..
1180 '\d DEF \_s*' ..
1181 'def Info\_s*' ..
1182 '\d DEF Info\_s*' ..
1183 'def /Info\_s*' ..
1184 '\d DEF /Info\_s*' ..
1185 'def /Info/\_s*' ..
1186 '\d DEF /Info/\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001187 '\d RETURN void',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001188 instr)
1189enddef
1190
Bram Moolenaar6e949782020-04-13 17:21:00 +02001191def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001192 if arg == 1 && arg != 2 || arg == 4
1193 return 'yes'
1194 endif
1195 return 'no'
1196enddef
1197
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001198def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001199 assert_equal("yes", AndOr(1))
1200 assert_equal("no", AndOr(2))
1201 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001202 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001203 assert_match('AndOr\_s*' ..
1204 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1205 '\d LOAD arg\[-1]\_s*' ..
1206 '\d PUSHNR 1\_s*' ..
1207 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001208 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001209 '\d LOAD arg\[-1]\_s*' ..
1210 '\d PUSHNR 2\_s*' ..
1211 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001212 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001213 '\d LOAD arg\[-1]\_s*' ..
1214 '\d\+ PUSHNR 4\_s*' ..
1215 '\d\+ COMPAREANY ==\_s*' ..
1216 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001217 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001218enddef
1219
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001220def AndConstant(arg: any): string
1221 if true && arg
1222 return "yes"
1223 endif
1224 if false && arg
1225 return "never"
1226 endif
1227 return "no"
1228enddef
1229
1230def Test_disassemble_and_constant()
1231 assert_equal("yes", AndConstant(1))
1232 assert_equal("no", AndConstant(false))
1233 var instr = execute('disassemble AndConstant')
1234 assert_match('AndConstant\_s*' ..
1235 'if true && arg\_s*' ..
1236 '0 LOAD arg\[-1\]\_s*' ..
1237 '1 COND2BOOL\_s*' ..
1238 '2 JUMP_IF_FALSE -> 5\_s*' ..
1239 'return "yes"\_s*' ..
1240 '3 PUSHS "yes"\_s*' ..
1241 '4 RETURN\_s*' ..
1242 'endif\_s*' ..
1243 'if false && arg\_s*' ..
1244 'return "never"\_s*' ..
1245 'endif\_s*' ..
1246 'return "no"\_s*' ..
1247 '5 PUSHS "no"\_s*' ..
1248 '6 RETURN',
1249 instr)
1250enddef
1251
Bram Moolenaar04d05222020-02-06 22:06:54 +01001252def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001254 for i in range(3)
1255 res->add(i)
1256 endfor
1257 return res
1258enddef
1259
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001260def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001261 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001262 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001263 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001264 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001265 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001266 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001267 '\d STORE $0\_s*' ..
1268 'for i in range(3)\_s*' ..
1269 '\d STORE -1 in $1\_s*' ..
1270 '\d PUSHNR 3\_s*' ..
1271 '\d BCALL range(argc 1)\_s*' ..
1272 '\d FOR $1 -> \d\+\_s*' ..
1273 '\d STORE $2\_s*' ..
1274 'res->add(i)\_s*' ..
1275 '\d LOAD $0\_s*' ..
1276 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001277 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001278 '\d\+ DROP\_s*' ..
1279 'endfor\_s*' ..
1280 '\d\+ JUMP -> \d\+\_s*' ..
1281 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001282 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001283enddef
1284
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001285def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001286 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001287 for str in eval('["one", "two"]')
1288 res ..= str
1289 endfor
1290 return res
1291enddef
1292
1293def Test_disassemble_for_loop_eval()
1294 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001295 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001296 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001297 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001298 '\d PUSHS ""\_s*' ..
1299 '\d STORE $0\_s*' ..
1300 'for str in eval(''\["one", "two"\]'')\_s*' ..
1301 '\d STORE -1 in $1\_s*' ..
1302 '\d PUSHS "\["one", "two"\]"\_s*' ..
1303 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001304 '\d FOR $1 -> \d\+\_s*' ..
1305 '\d STORE $2\_s*' ..
1306 'res ..= str\_s*' ..
1307 '\d\+ LOAD $0\_s*' ..
1308 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarf5d52c92021-07-31 22:51:10 +02001309 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001310 '\d\+ CONCAT\_s*' ..
1311 '\d\+ STORE $0\_s*' ..
1312 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001313 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001314 '\d\+ DROP\_s*' ..
1315 'return res\_s*' ..
1316 '\d\+ LOAD $0\_s*' ..
1317 '\d\+ RETURN',
1318 instr)
1319enddef
1320
Bram Moolenaar792f7862020-11-23 08:31:18 +01001321def ForLoopUnpack()
1322 for [x1, x2] in [[1, 2], [3, 4]]
1323 echo x1 x2
1324 endfor
1325enddef
1326
1327def Test_disassemble_for_loop_unpack()
1328 var instr = execute('disassemble ForLoopUnpack')
1329 assert_match('ForLoopUnpack\_s*' ..
1330 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1331 '\d\+ STORE -1 in $0\_s*' ..
1332 '\d\+ PUSHNR 1\_s*' ..
1333 '\d\+ PUSHNR 2\_s*' ..
1334 '\d\+ NEWLIST size 2\_s*' ..
1335 '\d\+ PUSHNR 3\_s*' ..
1336 '\d\+ PUSHNR 4\_s*' ..
1337 '\d\+ NEWLIST size 2\_s*' ..
1338 '\d\+ NEWLIST size 2\_s*' ..
1339 '\d\+ FOR $0 -> 16\_s*' ..
1340 '\d\+ UNPACK 2\_s*' ..
1341 '\d\+ STORE $1\_s*' ..
1342 '\d\+ STORE $2\_s*' ..
1343 'echo x1 x2\_s*' ..
1344 '\d\+ LOAD $1\_s*' ..
1345 '\d\+ LOAD $2\_s*' ..
1346 '\d\+ ECHO 2\_s*' ..
1347 'endfor\_s*' ..
1348 '\d\+ JUMP -> 8\_s*' ..
1349 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001350 '\d\+ RETURN void',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001351 instr)
1352enddef
1353
Bram Moolenaarc150c092021-02-13 15:02:46 +01001354def ForLoopContinue()
1355 for nr in [1, 2]
1356 try
1357 echo "ok"
1358 try
1359 echo "deeper"
1360 catch
1361 continue
1362 endtry
1363 catch
1364 echo "not ok"
1365 endtry
1366 endfor
1367enddef
1368
1369def Test_disassemble_for_loop_continue()
1370 var instr = execute('disassemble ForLoopContinue')
1371 assert_match('ForLoopContinue\_s*' ..
1372 'for nr in \[1, 2]\_s*' ..
1373 '0 STORE -1 in $0\_s*' ..
1374 '1 PUSHNR 1\_s*' ..
1375 '2 PUSHNR 2\_s*' ..
1376 '3 NEWLIST size 2\_s*' ..
1377 '4 FOR $0 -> 22\_s*' ..
1378 '5 STORE $1\_s*' ..
1379 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001380 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001381 'echo "ok"\_s*' ..
1382 '7 PUSHS "ok"\_s*' ..
1383 '8 ECHO 1\_s*' ..
1384 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001385 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001386 'echo "deeper"\_s*' ..
1387 '10 PUSHS "deeper"\_s*' ..
1388 '11 ECHO 1\_s*' ..
1389 'catch\_s*' ..
1390 '12 JUMP -> 15\_s*' ..
1391 '13 CATCH\_s*' ..
1392 'continue\_s*' ..
1393 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1394 'endtry\_s*' ..
1395 '15 ENDTRY\_s*' ..
1396 'catch\_s*' ..
1397 '16 JUMP -> 20\_s*' ..
1398 '17 CATCH\_s*' ..
1399 'echo "not ok"\_s*' ..
1400 '18 PUSHS "not ok"\_s*' ..
1401 '19 ECHO 1\_s*' ..
1402 'endtry\_s*' ..
1403 '20 ENDTRY\_s*' ..
1404 'endfor\_s*' ..
1405 '21 JUMP -> 4\_s*' ..
1406 '\d\+ DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001407 '\d\+ RETURN void',
Bram Moolenaarc150c092021-02-13 15:02:46 +01001408 instr)
1409enddef
1410
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001411let g:number = 42
1412
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001413def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001414 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001415enddef
1416
1417def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001418 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001419 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001420 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001421 '\d PUSHNR 23\_s*' ..
1422 '\d LOADG g:number\_s*' ..
1423 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1424 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001425 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001426 '\d STORE $0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001427 '\d RETURN void\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001428 instr)
1429enddef
1430
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001431def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001432 var nr = 3
1433 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001434 nrres = nr - 7
1435 nrres = nr * 7
1436 nrres = nr / 7
1437 nrres = nr % 7
1438
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001440 anyres = g:number - 7
1441 anyres = g:number * 7
1442 anyres = g:number / 7
1443 anyres = g:number % 7
1444
1445 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001446 var fl = 3.0
1447 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001448 flres = fl - 7.0
1449 flres = fl * 7.0
1450 flres = fl / 7.0
1451 endif
1452enddef
1453
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001454def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001455 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001456 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001457 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001458 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001459 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001460 '\d LOAD $0.*' ..
1461 '\d PUSHNR 7.*' ..
1462 '\d OPNR +.*' ..
1463 '\d STORE $1.*' ..
1464 'nrres = nr - 7.*' ..
1465 '\d OPNR -.*' ..
1466 'nrres = nr \* 7.*' ..
1467 '\d OPNR \*.*' ..
1468 'nrres = nr / 7.*' ..
1469 '\d OPNR /.*' ..
1470 'nrres = nr % 7.*' ..
1471 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001472 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001473 '\d LOADG g:number.*' ..
1474 '\d PUSHNR 7.*' ..
1475 '\d OPANY +.*' ..
1476 '\d STORE $2.*' ..
1477 'anyres = g:number - 7.*' ..
1478 '\d OPANY -.*' ..
1479 'anyres = g:number \* 7.*' ..
1480 '\d OPANY \*.*' ..
1481 'anyres = g:number / 7.*' ..
1482 '\d OPANY /.*' ..
1483 'anyres = g:number % 7.*' ..
1484 '\d OPANY %.*',
1485 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001486 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001487 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001488 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001489 '\d PUSHF 3.0.*' ..
1490 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001491 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001492 '\d LOAD $3.*' ..
1493 '\d PUSHF 7.0.*' ..
1494 '\d OPFLOAT +.*' ..
1495 '\d STORE $4.*' ..
1496 'flres = fl - 7.0.*' ..
1497 '\d OPFLOAT -.*' ..
1498 'flres = fl \* 7.0.*' ..
1499 '\d OPFLOAT \*.*' ..
1500 'flres = fl / 7.0.*' ..
1501 '\d OPFLOAT /.*',
1502 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001503 endif
1504enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001505
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001506def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001507 var reslist = [1, 2] + [3, 4]
1508 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001509enddef
1510
1511def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001512 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001513 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001514 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001515 '\d PUSHNR 1.*' ..
1516 '\d PUSHNR 2.*' ..
1517 '\d NEWLIST size 2.*' ..
1518 '\d PUSHNR 3.*' ..
1519 '\d PUSHNR 4.*' ..
1520 '\d NEWLIST size 2.*' ..
1521 '\d ADDLIST.*' ..
1522 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001523 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001524 '\d PUSHBLOB 0z1122.*' ..
1525 '\d PUSHBLOB 0z3344.*' ..
1526 '\d ADDBLOB.*' ..
1527 '\d STORE $.*',
1528 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001529enddef
1530
1531let g:aa = 'aa'
1532def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001533 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001534 return res
1535enddef
1536
1537def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001538 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001539 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001540 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001541 '\d LOADG g:aa.*' ..
1542 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001543 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001544 '\d CONCAT.*' ..
1545 '\d STORE $.*',
1546 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001547 assert_equal('aabb', ConcatString())
1548enddef
1549
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001550def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001551 var s = "abcd"
1552 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001553 return res
1554enddef
1555
1556def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001557 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001558 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001559 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001560 '\d PUSHS "abcd"\_s*' ..
1561 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001562 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001563 '\d LOAD $0\_s*' ..
1564 '\d PUSHNR 1\_s*' ..
1565 '\d STRINDEX\_s*' ..
1566 '\d STORE $1\_s*',
1567 instr)
1568 assert_equal('b', StringIndex())
1569enddef
1570
Bram Moolenaared591872020-08-15 22:14:53 +02001571def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001572 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001573 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001574 return res
1575enddef
1576
1577def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001578 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001579 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001580 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001581 '\d PUSHS "abcd"\_s*' ..
1582 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001583 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001584 '\d LOAD $0\_s*' ..
1585 '\d PUSHNR 1\_s*' ..
1586 '\d PUSHNR 8\_s*' ..
1587 '\d STRSLICE\_s*' ..
1588 '\d STORE $1\_s*',
1589 instr)
1590 assert_equal('bcd', StringSlice())
1591enddef
1592
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001593def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001594 var l = [1, 2, 3]
1595 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001596 return res
1597enddef
1598
1599def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001600 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001601 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001602 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001603 '\d PUSHNR 1\_s*' ..
1604 '\d PUSHNR 2\_s*' ..
1605 '\d PUSHNR 3\_s*' ..
1606 '\d NEWLIST size 3\_s*' ..
1607 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001608 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001609 '\d LOAD $0\_s*' ..
1610 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001611 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001612 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001613 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001614 assert_equal(2, ListIndex())
1615enddef
1616
Bram Moolenaared591872020-08-15 22:14:53 +02001617def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001618 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001619 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001620 return res
1621enddef
1622
1623def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001625 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001626 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001627 '\d PUSHNR 1\_s*' ..
1628 '\d PUSHNR 2\_s*' ..
1629 '\d PUSHNR 3\_s*' ..
1630 '\d NEWLIST size 3\_s*' ..
1631 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001632 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001633 '\d LOAD $0\_s*' ..
1634 '\d PUSHNR 1\_s*' ..
1635 '\d PUSHNR 8\_s*' ..
1636 '\d LISTSLICE\_s*' ..
1637 '\d STORE $1\_s*',
1638 instr)
1639 assert_equal([2, 3], ListSlice())
1640enddef
1641
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001642def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001643 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001644 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001645 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001646 return res
1647enddef
1648
1649def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001650 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001651 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001652 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001653 '\d PUSHS "item"\_s*' ..
1654 '\d PUSHNR 1\_s*' ..
1655 '\d NEWDICT size 1\_s*' ..
1656 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001657 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001658 '\d\+ LOAD $0\_s*' ..
1659 '\d\+ MEMBER item\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001660 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001661 '\d\+ STORE $1\_s*' ..
1662 'res = d\["item"\]\_s*' ..
1663 '\d\+ LOAD $0\_s*' ..
1664 '\d\+ PUSHS "item"\_s*' ..
1665 '\d\+ MEMBER\_s*' ..
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02001666 '\d\+ USEDICT\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001667 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001668 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001669 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001670enddef
1671
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001672let somelist = [1, 2, 3, 4, 5]
1673def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001674 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001675 return res
1676enddef
1677
1678def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001679 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001680 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001681 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001682 '\d LOADG g:somelist\_s*' ..
1683 '\d PUSHNR 2\_s*' ..
1684 '\d ANYINDEX\_s*' ..
1685 '\d STORE $0\_s*' ..
1686 'return res\_s*' ..
1687 '\d LOAD $0\_s*' ..
1688 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1689 '\d RETURN',
1690 instr)
1691 assert_equal(3, AnyIndex())
1692enddef
1693
1694def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001695 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001696 return res
1697enddef
1698
1699def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001700 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001701 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001702 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001703 '\d LOADG g:somelist\_s*' ..
1704 '\d PUSHNR 1\_s*' ..
1705 '\d PUSHNR 3\_s*' ..
1706 '\d ANYSLICE\_s*' ..
1707 '\d STORE $0\_s*' ..
1708 'return res\_s*' ..
1709 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001710 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001711 '\d RETURN',
1712 instr)
1713 assert_equal([2, 3, 4], AnySlice())
1714enddef
1715
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001716def NegateNumber(): number
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001717 g:nr = 9
1718 var plus = +g:nr
1719 var minus = -g:nr
1720 return minus
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001721enddef
1722
1723def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001724 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001725 assert_match('NegateNumber\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001726 'g:nr = 9\_s*' ..
1727 '\d PUSHNR 9\_s*' ..
1728 '\d STOREG g:nr\_s*' ..
1729 'var plus = +g:nr\_s*' ..
1730 '\d LOADG g:nr\_s*' ..
1731 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1732 '\d STORE $0\_s*' ..
1733 'var minus = -g:nr\_s*' ..
1734 '\d LOADG g:nr\_s*' ..
1735 '\d CHECKTYPE number stack\[-1\]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001736 '\d NEGATENR\_s*' ..
Bram Moolenaarcd6b4f32021-08-15 20:36:28 +02001737 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001738 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001739 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001740enddef
1741
1742def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001743 var flag = true
1744 var invert = !flag
1745 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001746 return res
1747enddef
1748
1749def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001750 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001751 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001752 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001753 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001754 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001755 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001756 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001757 '\d INVERT -1 (!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001758 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001759 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001760 '\d LOAD $0\_s*' ..
Bram Moolenaar5fa9b242021-06-04 21:00:32 +02001761 '\d 2BOOL -1 (!!val)\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001762 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001763 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001764 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001765enddef
1766
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001767def ReturnBool(): bool
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001768 var one = 1
1769 var zero = 0
1770 var name: bool = one && zero || one
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001771 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001772enddef
1773
1774def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001775 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001776 assert_match('ReturnBool\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001777 'var one = 1\_s*' ..
1778 '0 STORE 1 in $0\_s*' ..
1779 'var zero = 0\_s*' ..
1780 '1 STORE 0 in $1\_s*' ..
1781 'var name: bool = one && zero || one\_s*' ..
1782 '2 LOAD $0\_s*' ..
1783 '3 COND2BOOL\_s*' ..
1784 '4 JUMP_IF_COND_FALSE -> 7\_s*' ..
1785 '5 LOAD $1\_s*' ..
1786 '6 COND2BOOL\_s*' ..
1787 '7 JUMP_IF_COND_TRUE -> 10\_s*' ..
1788 '8 LOAD $0\_s*' ..
1789 '9 COND2BOOL\_s*' ..
1790 '10 STORE $2\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001791 'return name\_s*' ..
Bram Moolenaar1a7ee4d2021-09-16 16:15:07 +02001792 '\d\+ LOAD $2\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001793 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001794 instr)
1795 assert_equal(true, InvertBool())
1796enddef
1797
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001798def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001799 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001800 ['true == isFalse', 'COMPAREBOOL =='],
1801 ['true != isFalse', 'COMPAREBOOL !='],
1802 ['v:none == isNull', 'COMPARESPECIAL =='],
1803 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001804
Bram Moolenaara5565e42020-05-09 15:44:01 +02001805 ['111 == aNumber', 'COMPARENR =='],
1806 ['111 != aNumber', 'COMPARENR !='],
1807 ['111 > aNumber', 'COMPARENR >'],
1808 ['111 < aNumber', 'COMPARENR <'],
1809 ['111 >= aNumber', 'COMPARENR >='],
1810 ['111 <= aNumber', 'COMPARENR <='],
1811 ['111 =~ aNumber', 'COMPARENR =\~'],
1812 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001813
Bram Moolenaara5565e42020-05-09 15:44:01 +02001814 ['"xx" != aString', 'COMPARESTRING !='],
1815 ['"xx" > aString', 'COMPARESTRING >'],
1816 ['"xx" < aString', 'COMPARESTRING <'],
1817 ['"xx" >= aString', 'COMPARESTRING >='],
1818 ['"xx" <= aString', 'COMPARESTRING <='],
1819 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1820 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1821 ['"xx" is aString', 'COMPARESTRING is'],
1822 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001823
Bram Moolenaara5565e42020-05-09 15:44:01 +02001824 ['0z11 == aBlob', 'COMPAREBLOB =='],
1825 ['0z11 != aBlob', 'COMPAREBLOB !='],
1826 ['0z11 is aBlob', 'COMPAREBLOB is'],
1827 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001828
Bram Moolenaara5565e42020-05-09 15:44:01 +02001829 ['[1, 2] == aList', 'COMPARELIST =='],
1830 ['[1, 2] != aList', 'COMPARELIST !='],
1831 ['[1, 2] is aList', 'COMPARELIST is'],
1832 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001833
Bram Moolenaare0de1712020-12-02 17:36:54 +01001834 ['{a: 1} == aDict', 'COMPAREDICT =='],
1835 ['{a: 1} != aDict', 'COMPAREDICT !='],
1836 ['{a: 1} is aDict', 'COMPAREDICT is'],
1837 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001838
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001839 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1840 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1841 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1842 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001843
1844 ['77 == g:xx', 'COMPAREANY =='],
1845 ['77 != g:xx', 'COMPAREANY !='],
1846 ['77 > g:xx', 'COMPAREANY >'],
1847 ['77 < g:xx', 'COMPAREANY <'],
1848 ['77 >= g:xx', 'COMPAREANY >='],
1849 ['77 <= g:xx', 'COMPAREANY <='],
1850 ['77 =~ g:xx', 'COMPAREANY =\~'],
1851 ['77 !~ g:xx', 'COMPAREANY !\~'],
1852 ['77 is g:xx', 'COMPAREANY is'],
1853 ['77 isnot g:xx', 'COMPAREANY isnot'],
1854 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001855 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001856 if has('float')
1857 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001858 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1859 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1860 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1861 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1862 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1863 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1864 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1865 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001866 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001867 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001868 endif
1869
Bram Moolenaarac564082020-09-27 19:05:33 +02001870 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001871 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001872 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001873 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001874 ' var isFalse = false',
1875 ' var isNull = v:null',
1876 ' var aNumber = 222',
1877 ' var aString = "yy"',
1878 ' var aBlob = 0z22',
1879 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001880 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001881 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001882 ' if ' .. case[0],
1883 ' echo 42'
1884 ' endif',
1885 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001886 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001887 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001888 assert_match('TestCase' .. nr .. '.*' ..
1889 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1890 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001891 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001892 '\d ' .. case[1] .. '.*' ..
1893 '\d JUMP_IF_FALSE -> \d\+.*',
1894 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001895
1896 nr += 1
1897 endfor
1898
Bram Moolenaar22da5592020-03-19 14:52:20 +01001899 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001900enddef
1901
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001902def s:FalsyOp()
1903 echo g:flag ?? "yes"
1904 echo [] ?? "empty list"
1905 echo "" ?? "empty string"
1906enddef
1907
1908def Test_dsassemble_falsy_op()
1909 var res = execute('disass s:FalsyOp')
1910 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1911 'echo g:flag ?? "yes"\_s*' ..
1912 '0 LOADG g:flag\_s*' ..
1913 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1914 '2 PUSHS "yes"\_s*' ..
1915 '3 ECHO 1\_s*' ..
1916 'echo \[\] ?? "empty list"\_s*' ..
1917 '4 NEWLIST size 0\_s*' ..
1918 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1919 '6 PUSHS "empty list"\_s*' ..
1920 '7 ECHO 1\_s*' ..
1921 'echo "" ?? "empty string"\_s*' ..
1922 '\d\+ PUSHS "empty string"\_s*' ..
1923 '\d\+ ECHO 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001924 '\d\+ RETURN void',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001925 res)
1926enddef
1927
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001928def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001929 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001930 ['"xx" == "yy"', false],
1931 ['"aa" == "aa"', true],
1932 ['has("eval") ? true : false', true],
1933 ['has("asdf") ? true : false', false],
1934 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001935
Bram Moolenaarac564082020-09-27 19:05:33 +02001936 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001937 for case in cases
1938 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001939 ' if ' .. case[0],
1940 ' echo 42'
1941 ' endif',
1942 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001943 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001944 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001945 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001946 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001947 assert_match('TestCase' .. nr .. '.*' ..
1948 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1949 '\d PUSHNR 42.*' ..
1950 '\d ECHO 1.*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001951 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001952 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001953 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001954 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001955 assert_match('TestCase' .. nr .. '.*' ..
1956 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1957 'echo 42[ \n]*' ..
1958 'endif[ \n]*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001959 '\d RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001960 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001961 endif
1962
1963 nr += 1
1964 endfor
1965
1966 delete('Xdisassemble')
1967enddef
1968
Bram Moolenaarad39c092020-02-26 18:23:43 +01001969def s:Execute()
1970 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001971 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001972 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001973 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001974 execute 'help ' .. tag
1975enddef
1976
1977def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001978 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001979 assert_match('\<SNR>\d*_Execute\_s*' ..
1980 "execute 'help vim9.txt'\\_s*" ..
1981 '\d PUSHS "help vim9.txt"\_s*' ..
1982 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001983 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001984 '\d PUSHS "help vim9.txt"\_s*' ..
1985 '\d STORE $0\_s*' ..
1986 'execute cmd\_s*' ..
1987 '\d LOAD $0\_s*' ..
1988 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001989 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001990 '\d PUSHS "vim9.txt"\_s*' ..
1991 '\d STORE $1\_s*' ..
1992 "execute 'help ' .. tag\\_s*" ..
1993 '\d\+ PUSHS "help "\_s*' ..
1994 '\d\+ LOAD $1\_s*' ..
1995 '\d\+ CONCAT\_s*' ..
1996 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02001997 '\d\+ RETURN void',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001998 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001999enddef
2000
Bram Moolenaare4eed8c2021-12-01 15:22:56 +00002001def s:OnlyRange()
2002 :$
2003 :123
2004 :'m
2005enddef
2006
2007def Test_disassemble_range_only()
2008 var res = execute('disass s:OnlyRange')
2009 assert_match('\<SNR>\d*_OnlyRange\_s*' ..
2010 ':$\_s*' ..
2011 '\d EXECRANGE $\_s*' ..
2012 ':123\_s*' ..
2013 '\d EXECRANGE 123\_s*' ..
2014 ':''m\_s*' ..
2015 '\d EXECRANGE ''m\_s*' ..
2016 '\d\+ RETURN void',
2017 res)
2018enddef
2019
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002020def s:Echomsg()
2021 echomsg 'some' 'message'
Bram Moolenaar7de62622021-08-07 15:05:47 +02002022 echoconsole 'nothing'
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002023 echoerr 'went' .. 'wrong'
2024enddef
2025
2026def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02002027 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002028 assert_match('\<SNR>\d*_Echomsg\_s*' ..
2029 "echomsg 'some' 'message'\\_s*" ..
2030 '\d PUSHS "some"\_s*' ..
2031 '\d PUSHS "message"\_s*' ..
2032 '\d ECHOMSG 2\_s*' ..
Bram Moolenaar7de62622021-08-07 15:05:47 +02002033 "echoconsole 'nothing'\\_s*" ..
2034 '\d PUSHS "nothing"\_s*' ..
2035 '\d ECHOCONSOLE 1\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002036 "echoerr 'went' .. 'wrong'\\_s*" ..
2037 '\d PUSHS "wentwrong"\_s*' ..
2038 '\d ECHOERR 1\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002039 '\d RETURN void',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02002040 res)
2041enddef
2042
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002043def SomeStringArg(arg: string)
2044 echo arg
2045enddef
2046
2047def SomeAnyArg(arg: any)
2048 echo arg
2049enddef
2050
2051def SomeStringArgAndReturn(arg: string): string
2052 return arg
2053enddef
2054
2055def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002056 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002057 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
2058 '\d *echo arg.*' ..
2059 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002060 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002061
Bram Moolenaarac564082020-09-27 19:05:33 +02002062 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002063 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
2064 '\d *echo arg\_s*' ..
2065 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002066 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002067
Bram Moolenaarac564082020-09-27 19:05:33 +02002068 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002069 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
2070 '\d *return arg\_s*' ..
2071 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02002072 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01002073enddef
2074
Bram Moolenaar09689a02020-05-09 22:50:08 +02002075def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02002076 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02002077 vim9script
2078 def FuncOne(): string
2079 return FuncTwo()
2080 enddef
2081 def FuncTwo(): string
2082 return 'two'
2083 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02002084 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02002085 END
2086 writefile(lines, 'Xdisassemble')
2087 source Xdisassemble
2088
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02002089 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002090 assert_match('\<SNR>\d*_FuncOne\_s*' ..
2091 'return FuncTwo()\_s*' ..
2092 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02002093 '\d RETURN',
2094 g:res_FuncOne)
2095
2096 delete('Xdisassemble')
2097 unlet g:res_FuncOne
2098enddef
2099
Bram Moolenaar61a89812020-05-07 16:58:17 +02002100def s:ConcatStrings(): string
2101 return 'one' .. 'two' .. 'three'
2102enddef
2103
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002104def s:ComputeConst(): number
2105 return 2 + 3 * 4 / 6 + 7
2106enddef
2107
Bram Moolenaar1c747212020-05-09 18:28:34 +02002108def s:ComputeConstParen(): number
2109 return ((2 + 4) * (8 / 2)) / (3 + 4)
2110enddef
2111
Bram Moolenaar61a89812020-05-07 16:58:17 +02002112def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02002113 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002114 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
2115 "return 'one' .. 'two' .. 'three'\\_s*" ..
2116 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02002117 '\d RETURN',
2118 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002119
2120 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002121 assert_match('<SNR>\d*_ComputeConst\_s*' ..
2122 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
2123 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02002124 '\d RETURN',
2125 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02002126
2127 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02002128 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
2129 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
2130 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02002131 '\d RETURN',
2132 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02002133enddef
2134
Bram Moolenaar389df252020-07-09 21:20:47 +02002135def s:CallAppend()
2136 eval "some text"->append(2)
2137enddef
2138
2139def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02002140 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02002141 assert_match('<SNR>\d*_CallAppend\_s*' ..
2142 'eval "some text"->append(2)\_s*' ..
2143 '\d PUSHS "some text"\_s*' ..
2144 '\d PUSHNR 2\_s*' ..
2145 '\d SHUFFLE 2 up 1\_s*' ..
2146 '\d BCALL append(argc 2)\_s*' ..
2147 '\d DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002148 '\d RETURN void',
Bram Moolenaar389df252020-07-09 21:20:47 +02002149 res)
2150enddef
2151
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002152
2153def s:SilentMessage()
2154 silent echomsg "text"
2155 silent! echoerr "error"
2156enddef
2157
2158def Test_silent()
2159 var res = execute('disass s:SilentMessage')
2160 assert_match('<SNR>\d*_SilentMessage\_s*' ..
2161 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002162 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002163 '\d PUSHS "text"\_s*' ..
2164 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002165 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002166 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002167 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002168 '\d PUSHS "error"\_s*' ..
2169 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002170 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002171 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002172 res)
2173enddef
2174
2175def s:SilentIf()
2176 silent if 4 == g:five
2177 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002178 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002179enddef
2180
2181def Test_silent_if()
2182 var res = execute('disass s:SilentIf')
2183 assert_match('<SNR>\d*_SilentIf\_s*' ..
2184 'silent if 4 == g:five\_s*' ..
2185 '\d\+ CMDMOD silent\_s*' ..
2186 '\d\+ PUSHNR 4\_s*' ..
2187 '\d\+ LOADG g:five\_s*' ..
2188 '\d\+ COMPAREANY ==\_s*' ..
2189 '\d\+ CMDMOD_REV\_s*' ..
2190 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2191 'silent elseif 4 == g:five\_s*' ..
2192 '\d\+ JUMP -> \d\+\_s*' ..
2193 '\d\+ CMDMOD silent\_s*' ..
2194 '\d\+ PUSHNR 4\_s*' ..
2195 '\d\+ LOADG g:five\_s*' ..
2196 '\d\+ COMPAREANY ==\_s*' ..
2197 '\d\+ CMDMOD_REV\_s*' ..
2198 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002199 'endif\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002200 '\d\+ RETURN void',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002201 res)
2202enddef
2203
2204def s:SilentFor()
2205 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002206 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002207enddef
2208
2209def Test_silent_for()
2210 var res = execute('disass s:SilentFor')
2211 assert_match('<SNR>\d*_SilentFor\_s*' ..
2212 'silent for i in \[0\]\_s*' ..
2213 '\d CMDMOD silent\_s*' ..
2214 '\d STORE -1 in $0\_s*' ..
2215 '\d PUSHNR 0\_s*' ..
2216 '\d NEWLIST size 1\_s*' ..
2217 '\d CMDMOD_REV\_s*' ..
2218 '5 FOR $0 -> 8\_s*' ..
2219 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002220 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002221 '\d JUMP -> 5\_s*' ..
2222 '8 DROP\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002223 '\d RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002224 res)
2225enddef
2226
2227def s:SilentWhile()
2228 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002229 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002230enddef
2231
2232def Test_silent_while()
2233 var res = execute('disass s:SilentWhile')
2234 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2235 'silent while g:not\_s*' ..
2236 '0 CMDMOD silent\_s*' ..
2237 '\d LOADG g:not\_s*' ..
2238 '\d COND2BOOL\_s*' ..
2239 '\d CMDMOD_REV\_s*' ..
2240 '\d JUMP_IF_FALSE -> 6\_s*' ..
2241
Bram Moolenaarfa984412021-03-25 22:15:28 +01002242 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002243 '\d JUMP -> 0\_s*' ..
Bram Moolenaarf57b43c2021-06-15 22:13:27 +02002244 '6 RETURN void\_s*',
Bram Moolenaara91a7132021-03-25 21:12:15 +01002245 res)
2246enddef
2247
2248def s:SilentReturn(): string
2249 silent return "done"
2250enddef
2251
2252def Test_silent_return()
2253 var res = execute('disass s:SilentReturn')
2254 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2255 'silent return "done"\_s*' ..
2256 '\d CMDMOD silent\_s*' ..
2257 '\d PUSHS "done"\_s*' ..
2258 '\d CMDMOD_REV\_s*' ..
2259 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002260 res)
2261enddef
2262
Bram Moolenaarb2049902021-01-24 12:53:53 +01002263def s:Profiled(): string
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002264 # comment
Bram Moolenaarb2049902021-01-24 12:53:53 +01002265 echo "profiled"
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002266 # comment
Bram Moolenaar26d71162021-06-14 21:08:56 +02002267 var some = "some text"
Bram Moolenaarb2049902021-01-24 12:53:53 +01002268 return "done"
2269enddef
2270
2271def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002272 if !has('profile')
2273 MissingFeature 'profile'
2274 endif
Bram Moolenaare99d4222021-06-13 14:01:26 +02002275 var res = execute('disass profile s:Profiled')
Bram Moolenaarb2049902021-01-24 12:53:53 +01002276 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002277 '# comment\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002278 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002279 '\d PROFILE START line 2\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002280 '\d PUSHS "profiled"\_s*' ..
2281 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002282 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002283 'var some = "some text"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002284 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002285 '\d PROFILE START line 4\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002286 '\d PUSHS "some text"\_s*' ..
2287 '\d STORE $0\_s*' ..
2288 'return "done"\_s*' ..
2289 '\d PROFILE END\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002290 '\d PROFILE START line 5\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002291 '\d PUSHS "done"\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002292 '\d\+ RETURN\_s*' ..
2293 '\d\+ PROFILE END',
Bram Moolenaarb2049902021-01-24 12:53:53 +01002294 res)
2295enddef
2296
Bram Moolenaare99d4222021-06-13 14:01:26 +02002297def Test_debugged()
2298 var res = execute('disass debug s:Profiled')
2299 assert_match('<SNR>\d*_Profiled\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002300 '# comment\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002301 'echo "profiled"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002302 '\d DEBUG line 1-2 varcount 0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002303 '\d PUSHS "profiled"\_s*' ..
2304 '\d ECHO 1\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002305 '# comment\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002306 'var some = "some text"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002307 '\d DEBUG line 3-4 varcount 0\_s*' ..
Bram Moolenaar26d71162021-06-14 21:08:56 +02002308 '\d PUSHS "some text"\_s*' ..
2309 '\d STORE $0\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002310 'return "done"\_s*' ..
Bram Moolenaar8cec9272021-06-23 20:20:53 +02002311 '\d DEBUG line 5-5 varcount 1\_s*' ..
Bram Moolenaare99d4222021-06-13 14:01:26 +02002312 '\d PUSHS "done"\_s*' ..
2313 '\d RETURN\_s*',
2314 res)
2315enddef
2316
Bram Moolenaar90770b72021-11-30 20:57:38 +00002317def s:ElseifConstant()
2318 if g:value
2319 echo "one"
2320 elseif true
2321 echo "true"
2322 elseif false
2323 echo "false"
2324 endif
2325enddef
2326
2327def Test_debug_elseif_constant()
2328 var res = execute('disass s:ElseifConstant')
2329 assert_match('<SNR>\d*_ElseifConstant\_s*' ..
2330 'if g:value\_s*' ..
2331 '0 LOADG g:value\_s*' ..
2332 '1 COND2BOOL\_s*' ..
2333 '2 JUMP_IF_FALSE -> 6\_s*' ..
2334 'echo "one"\_s*' ..
2335 '3 PUSHS "one"\_s*' ..
2336 '4 ECHO 1\_s*' ..
2337 'elseif true\_s*' ..
2338 '5 JUMP -> 8\_s*' ..
2339 'echo "true"\_s*' ..
2340 '6 PUSHS "true"\_s*' ..
2341 '7 ECHO 1\_s*' ..
2342 'elseif false\_s*' ..
2343 'echo "false"\_s*' ..
2344 'endif\_s*' ..
2345 '\d RETURN void*',
2346 res)
2347enddef
2348
Bram Moolenaar093165c2021-08-22 13:35:31 +02002349def s:DebugElseif()
2350 var b = false
2351 if b
2352 eval 1 + 0
2353 silent elseif !b
2354 eval 2 + 0
2355 endif
2356enddef
2357
2358def Test_debug_elseif()
2359 var res = execute('disass debug s:DebugElseif')
2360 assert_match('<SNR>\d*_DebugElseif\_s*' ..
2361 'var b = false\_s*' ..
2362 '0 DEBUG line 1-1 varcount 0\_s*' ..
2363 '1 PUSH false\_s*' ..
2364 '2 STORE $0\_s*' ..
2365
2366 'if b\_s*' ..
2367 '3 DEBUG line 2-2 varcount 1\_s*' ..
2368 '4 LOAD $0\_s*' ..
2369 '5 JUMP_IF_FALSE -> 10\_s*' ..
2370
2371 'eval 1 + 0\_s*' ..
2372 '6 DEBUG line 3-3 varcount 1\_s*' ..
2373 '7 PUSHNR 1\_s*' ..
2374 '8 DROP\_s*' ..
2375
2376 'silent elseif !b\_s*' ..
2377 '9 JUMP -> 20\_s*' ..
2378 '10 CMDMOD silent\_s*' ..
2379 '11 DEBUG line 4-4 varcount 1\_s*' ..
2380 '12 LOAD $0\_s*' ..
2381 '13 INVERT -1 (!val)\_s*' ..
2382 '14 CMDMOD_REV\_s*' ..
2383 '15 JUMP_IF_FALSE -> 20\_s*' ..
2384
2385 'eval 2 + 0\_s*' ..
2386 '16 DEBUG line 5-5 varcount 1\_s*' ..
2387 '17 PUSHNR 2\_s*' ..
2388 '18 DROP\_s*' ..
2389
2390 'endif\_s*' ..
2391 '19 DEBUG line 6-6 varcount 1\_s*' ..
2392 '20 RETURN void*',
2393 res)
2394enddef
2395
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002396func Legacy() dict
2397 echo 'legacy'
2398endfunc
2399
2400def s:UseMember()
2401 var d = {func: Legacy}
2402 var v = d.func()
2403enddef
2404
2405def Test_disassemble_dict_stack()
2406 var res = execute('disass s:UseMember')
2407 assert_match('<SNR>\d*_UseMember\_s*' ..
2408 'var d = {func: Legacy}\_s*' ..
2409 '\d PUSHS "func"\_s*' ..
2410 '\d PUSHFUNC "Legacy"\_s*' ..
2411 '\d NEWDICT size 1\_s*' ..
2412 '\d STORE $0\_s*' ..
2413
2414 'var v = d.func()\_s*' ..
2415 '\d LOAD $0\_s*' ..
2416 '\d MEMBER func\_s*' ..
2417 '\d PCALL top (argc 0)\_s*' ..
2418 '\d PCALL end\_s*' ..
2419 '\d CLEARDICT\_s*' ..
2420 '\d\+ STORE $1\_s*' ..
2421 '\d\+ RETURN void*',
2422 res)
2423enddef
2424
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002425def s:EchoMessages()
2426 echohl ErrorMsg | echom v:exception | echohl NONE
2427enddef
2428
2429def Test_disassemble_nextcmd()
2430 # splitting commands and removing trailing blanks should not change the line
2431 var res = execute('disass s:EchoMessages')
2432 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2433 'echohl ErrorMsg | echom v:exception | echohl NONE',
2434 res)
2435enddef
2436
Bram Moolenaar6db660b2021-08-01 14:08:54 +02002437def Test_disassemble_after_reload()
2438 var lines =<< trim END
2439 vim9script
2440 if exists('g:ThisFunc')
2441 finish
2442 endif
2443 var name: any
2444 def g:ThisFunc(): number
2445 g:name = name
2446 return 0
2447 enddef
2448 def g:ThatFunc(): number
2449 name = g:name
2450 return 0
2451 enddef
2452 END
2453 lines->writefile('Xreload.vim')
2454
2455 source Xreload.vim
2456 g:ThisFunc()
2457 g:ThatFunc()
2458
2459 source Xreload.vim
2460 var res = execute('disass g:ThisFunc')
2461 assert_match('ThisFunc\_s*' ..
2462 'g:name = name\_s*' ..
2463 '\d LOADSCRIPT \[deleted\] from .*/Xreload.vim\_s*' ..
2464 '\d STOREG g:name\_s*' ..
2465 'return 0\_s*' ..
2466 '\d PUSHNR 0\_s*' ..
2467 '\d RETURN\_s*',
2468 res)
2469
2470 res = execute('disass g:ThatFunc')
2471 assert_match('ThatFunc\_s*' ..
2472 'name = g:name\_s*' ..
2473 '\d LOADG g:name\_s*' ..
2474 '\d STORESCRIPT \[deleted\] in .*/Xreload.vim\_s*' ..
2475 'return 0\_s*' ..
2476 '\d PUSHNR 0\_s*' ..
2477 '\d RETURN\_s*',
2478 res)
2479
2480 delete('Xreload.vim')
2481 delfunc g:ThisFunc
2482 delfunc g:ThatFunc
2483enddef
2484
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002485
Bram Moolenaarb1b6f4d2021-09-13 18:25:54 +02002486
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002487" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker