blob: e7314e43f37ae7f2469aceb872cfc2485ae40b58 [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100120 '\d\+ RETURN 0',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
Bram Moolenaar4c137212021-04-19 16:48:48 +0200124def s:Substitute()
125 var expr = "abc"
126 :%s/a/\=expr/&g#c
127enddef
128
129def Test_disassemble_substitute()
130 var res = execute('disass s:Substitute')
131 assert_match('<SNR>\d*_Substitute.*' ..
132 ' var expr = "abc"\_s*' ..
133 '\d PUSHS "abc"\_s*' ..
134 '\d STORE $0\_s*' ..
135 ' :%s/a/\\=expr/&g#c\_s*' ..
136 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
137 ' 0 LOAD $0\_s*' ..
138 ' -------------\_s*' ..
139 '\d RETURN 0',
140 res)
141enddef
142
Bram Moolenaar2d1c57e2021-04-19 20:50:03 +0200143def s:RedirVar()
144 var result: string
145 redir =>> result
146 echo "text"
147 redir END
148enddef
149
150def Test_disassemble_redir_var()
151 var res = execute('disass s:RedirVar')
152 assert_match('<SNR>\d*_RedirVar.*' ..
153 ' var result: string\_s*' ..
154 '\d PUSHS "\[NULL\]"\_s*' ..
155 '\d STORE $0\_s*' ..
156 ' redir =>> result\_s*' ..
157 '\d REDIR\_s*' ..
158 ' echo "text"\_s*' ..
159 '\d PUSHS "text"\_s*' ..
160 '\d ECHO 1\_s*' ..
161 ' redir END\_s*' ..
162 '\d LOAD $0\_s*' ..
163 '\d REDIR END\_s*' ..
164 '\d CONCAT\_s*' ..
165 '\d STORE $0\_s*' ..
166 '\d RETURN 0',
167 res)
168enddef
169
Bram Moolenaar5f7d4c02021-05-05 21:31:39 +0200170def s:Cexpr()
171 var errors = "list of errors"
172 cexpr errors
173enddef
174
175def Test_disassemble_cexpr()
176 var res = execute('disass s:Cexpr')
177 assert_match('<SNR>\d*_Cexpr.*' ..
178 ' var errors = "list of errors"\_s*' ..
179 '\d PUSHS "list of errors"\_s*' ..
180 '\d STORE $0\_s*' ..
181 ' cexpr errors\_s*' ..
182 '\d CEXPR pre cexpr\_s*' ..
183 '\d LOAD $0\_s*' ..
184 '\d CEXPR core cexpr "cexpr errors"\_s*' ..
185 '\d RETURN 0',
186 res)
187enddef
188
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200189def s:YankRange()
190 norm! m[jjm]
191 :'[,']yank
192enddef
193
194def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200195 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200196 assert_match('<SNR>\d*_YankRange.*' ..
197 ' norm! m\[jjm\]\_s*' ..
198 '\d EXEC norm! m\[jjm\]\_s*' ..
199 ' :''\[,''\]yank\_s*' ..
200 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100201 '\d RETURN 0',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200202 res)
203enddef
204
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200205def s:PutExpr()
206 :3put ="text"
207enddef
208
209def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200210 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200211 assert_match('<SNR>\d*_PutExpr.*' ..
212 ' :3put ="text"\_s*' ..
213 '\d PUSHS "text"\_s*' ..
214 '\d PUT = 3\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100215 '\d RETURN 0',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200216 res)
217enddef
218
Bram Moolenaar08597872020-12-10 19:43:40 +0100219def s:PutRange()
220 :$-2put a
221enddef
222
223def Test_disassemble_put_range()
224 var res = execute('disass s:PutRange')
225 assert_match('<SNR>\d*_PutRange.*' ..
226 ' :$-2put a\_s*' ..
227 '\d RANGE $-2\_s*' ..
228 '\d PUT a range\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100229 '\d RETURN 0',
Bram Moolenaar08597872020-12-10 19:43:40 +0100230 res)
231enddef
232
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100233def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200234 var localbool = true
235 var localspec = v:none
236 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100237 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200238 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100239 endif
240enddef
241
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100242def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200243 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200244 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
245 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100246 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200247 'localspec = v:none.*' ..
248 ' PUSH v:none.*' ..
249 'localblob = 0z1234.*' ..
250 ' PUSHBLOB 0z1234.*',
251 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100252 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200253 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
254 'localfloat = 1.234.*' ..
255 ' PUSHF 1.234.*',
256 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100257 endif
258enddef
259
260def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200261 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100262 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200263 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100264 localstr = 'xyz'
265 v:char = 'abc'
266 s:scriptvar = 'sv'
267 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100268 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200269 b:buffervar = 'bv'
270 w:windowvar = 'wv'
271 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100272 &tabstop = 8
273 $ENVVAR = 'ev'
274 @z = 'rv'
275enddef
276
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100277def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200278 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200279 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200280 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200281 'localnr = 2.*' ..
282 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200283 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200284 'localstr = ''xyz''.*' ..
285 ' STORE $1.*' ..
286 'v:char = ''abc''.*' ..
287 'STOREV v:char.*' ..
288 's:scriptvar = ''sv''.*' ..
289 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
290 'g:globalvar = ''gv''.*' ..
291 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100292 'g:auto#var = ''av''.*' ..
293 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200294 'b:buffervar = ''bv''.*' ..
295 ' STOREB b:buffervar.*' ..
296 'w:windowvar = ''wv''.*' ..
297 ' STOREW w:windowvar.*' ..
298 't:tabpagevar = ''tv''.*' ..
299 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200300 '&tabstop = 8.*' ..
301 ' STOREOPT &tabstop.*' ..
302 '$ENVVAR = ''ev''.*' ..
303 ' STOREENV $ENVVAR.*' ..
304 '@z = ''rv''.*' ..
305 ' STOREREG @z.*',
306 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100307enddef
308
Bram Moolenaarcb790402020-05-15 20:53:00 +0200309def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200310 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200311 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200312 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200313 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200314 var localblob: blob = 0z1122
315 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200316enddef
317
318def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200319 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200320 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200321 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200322 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100323 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200324 '\d STORE $0\_s*' ..
325 'locallist\[0\] = 123\_s*' ..
326 '\d PUSHNR 123\_s*' ..
327 '\d PUSHNR 0\_s*' ..
328 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200329 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200330 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200331 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100332 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200333 '\d STORE $1\_s*' ..
334 'localdict\["a"\] = 456\_s*' ..
335 '\d\+ PUSHNR 456\_s*' ..
336 '\d\+ PUSHS "a"\_s*' ..
337 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200338 '\d\+ STOREINDEX dict\_s*' ..
339 'var localblob: blob = 0z1122\_s*' ..
340 '\d\+ PUSHBLOB 0z1122\_s*' ..
341 '\d\+ STORE $2\_s*' ..
342 'localblob\[1\] = 33\_s*' ..
343 '\d\+ PUSHNR 33\_s*' ..
344 '\d\+ PUSHNR 1\_s*' ..
345 '\d\+ LOAD $2\_s*' ..
346 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100347 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200348 res)
349enddef
350
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100351def s:ScriptFuncStoreIndex()
352 var d = {dd: {}}
353 d.dd[0] = 0
354enddef
355
356def Test_disassemble_store_index()
357 var res = execute('disass s:ScriptFuncStoreIndex')
358 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
359 'var d = {dd: {}}\_s*' ..
360 '\d PUSHS "dd"\_s*' ..
361 '\d NEWDICT size 0\_s*' ..
362 '\d NEWDICT size 1\_s*' ..
363 '\d STORE $0\_s*' ..
364 'd.dd\[0\] = 0\_s*' ..
365 '\d PUSHNR 0\_s*' ..
366 '\d PUSHNR 0\_s*' ..
367 '\d LOAD $0\_s*' ..
368 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200369 '\d STOREINDEX any\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100370 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100371 res)
372enddef
373
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200374def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200375 var x: string
376 var y: string
377 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200378 [x, y; l] = g:stringlist
379enddef
380
381def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200382 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200383 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200384 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200385 '\d PUSHS "\[NULL\]"\_s*' ..
386 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200387 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200388 '\d PUSHS "\[NULL\]"\_s*' ..
389 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200390 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200391 '\d NEWLIST size 0\_s*' ..
392 '\d STORE $2\_s*' ..
393 '\[x, y; l\] = g:stringlist\_s*' ..
394 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200395 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200396 '\d CHECKLEN >= 2\_s*' ..
397 '\d\+ ITEM 0\_s*' ..
398 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
399 '\d\+ STORE $0\_s*' ..
400 '\d\+ ITEM 1\_s*' ..
401 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
402 '\d\+ STORE $1\_s*' ..
403 '\d\+ SLICE 2\_s*' ..
404 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100405 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200406 res)
407enddef
408
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200409def s:ListAdd()
410 var l: list<number> = []
411 add(l, 123)
412 add(l, g:aNumber)
413enddef
414
415def Test_disassemble_list_add()
416 var res = execute('disass s:ListAdd')
417 assert_match('<SNR>\d*_ListAdd\_s*' ..
418 'var l: list<number> = []\_s*' ..
419 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100420 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200421 '\d STORE $0\_s*' ..
422 'add(l, 123)\_s*' ..
423 '\d LOAD $0\_s*' ..
424 '\d PUSHNR 123\_s*' ..
425 '\d LISTAPPEND\_s*' ..
426 '\d DROP\_s*' ..
427 'add(l, g:aNumber)\_s*' ..
428 '\d LOAD $0\_s*' ..
429 '\d\+ LOADG g:aNumber\_s*' ..
430 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
431 '\d\+ LISTAPPEND\_s*' ..
432 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100433 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200434 res)
435enddef
436
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200437def s:BlobAdd()
438 var b: blob = 0z
439 add(b, 123)
440 add(b, g:aNumber)
441enddef
442
443def Test_disassemble_blob_add()
444 var res = execute('disass s:BlobAdd')
445 assert_match('<SNR>\d*_BlobAdd\_s*' ..
446 'var b: blob = 0z\_s*' ..
447 '\d PUSHBLOB 0z\_s*' ..
448 '\d STORE $0\_s*' ..
449 'add(b, 123)\_s*' ..
450 '\d LOAD $0\_s*' ..
451 '\d PUSHNR 123\_s*' ..
452 '\d BLOBAPPEND\_s*' ..
453 '\d DROP\_s*' ..
454 'add(b, g:aNumber)\_s*' ..
455 '\d LOAD $0\_s*' ..
456 '\d\+ LOADG g:aNumber\_s*' ..
457 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
458 '\d\+ BLOBAPPEND\_s*' ..
459 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100460 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200461 res)
462enddef
463
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200464def s:BlobIndexSlice()
465 var b: blob = 0z112233
466 echo b[1]
467 echo b[1 : 2]
468enddef
469
470def Test_disassemble_blob_index_slice()
471 var res = execute('disass s:BlobIndexSlice')
472 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
473 'var b: blob = 0z112233\_s*' ..
474 '\d PUSHBLOB 0z112233\_s*' ..
475 '\d STORE $0\_s*' ..
476 'echo b\[1\]\_s*' ..
477 '\d LOAD $0\_s*' ..
478 '\d PUSHNR 1\_s*' ..
479 '\d BLOBINDEX\_s*' ..
480 '\d ECHO 1\_s*' ..
481 'echo b\[1 : 2\]\_s*' ..
482 '\d LOAD $0\_s*' ..
483 '\d PUSHNR 1\_s*' ..
484 '\d\+ PUSHNR 2\_s*' ..
485 '\d\+ BLOBSLICE\_s*' ..
486 '\d\+ ECHO 1\_s*' ..
487 '\d\+ RETURN 0',
488 res)
489enddef
490
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200491def s:ScriptFuncUnlet()
492 g:somevar = "value"
493 unlet g:somevar
494 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200495 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200496enddef
497
498def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200499 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200500 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
501 'g:somevar = "value"\_s*' ..
502 '\d PUSHS "value"\_s*' ..
503 '\d STOREG g:somevar\_s*' ..
504 'unlet g:somevar\_s*' ..
505 '\d UNLET g:somevar\_s*' ..
506 'unlet! g:somevar\_s*' ..
507 '\d UNLET! g:somevar\_s*' ..
508 'unlet $SOMEVAR\_s*' ..
509 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200510 res)
511enddef
512
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100513def s:ScriptFuncTry()
514 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200515 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100516 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200517 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100518 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200519 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100520 endtry
521enddef
522
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100523def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200524 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200525 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
526 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100527 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200528 'echo "yes"\_s*' ..
529 '\d PUSHS "yes"\_s*' ..
530 '\d ECHO 1\_s*' ..
531 'catch /fail/\_s*' ..
532 '\d JUMP -> \d\+\_s*' ..
533 '\d PUSH v:exception\_s*' ..
534 '\d PUSHS "fail"\_s*' ..
535 '\d COMPARESTRING =\~\_s*' ..
536 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
537 '\d CATCH\_s*' ..
538 'echo "no"\_s*' ..
539 '\d\+ PUSHS "no"\_s*' ..
540 '\d\+ ECHO 1\_s*' ..
541 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100542 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200543 'throw "end"\_s*' ..
544 '\d\+ PUSHS "end"\_s*' ..
545 '\d\+ THROW\_s*' ..
546 'endtry\_s*' ..
547 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200548 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100549enddef
550
551def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200552 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100553 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100554enddef
555
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100556def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200557 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200558 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200559 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200560 '\d PUSHNR 1\_s*' ..
561 '\d PUSHS "two"\_s*' ..
562 '\d PUSHNR 333\_s*' ..
563 '\d NEWLIST size 3\_s*' ..
564 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100565 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200566 '\d PUSHS "one"\_s*' ..
567 '\d PUSHNR 1\_s*' ..
568 '\d PUSHS "two"\_s*' ..
569 '\d PUSHS "val"\_s*' ..
570 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200571 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100572enddef
573
Bram Moolenaar6e949782020-04-13 17:21:00 +0200574def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100575 echo arg
576enddef
577
578func UserFunc()
579 echo 'nothing'
580endfunc
581
582func UserFuncWithArg(arg)
583 echo a:arg
584endfunc
585
586def s:ScriptFuncCall(): string
587 changenr()
588 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100589 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100590 FuncWithArg(343)
591 ScriptFuncNew()
592 s:ScriptFuncNew()
593 UserFunc()
594 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200595 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100596 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200597 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100598 FuncRefWithArg("bar")
599 return "yes"
600enddef
601
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100602def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200603 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200604 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
605 'changenr()\_s*' ..
606 '\d BCALL changenr(argc 0)\_s*' ..
607 '\d DROP\_s*' ..
608 'char2nr("abc")\_s*' ..
609 '\d PUSHS "abc"\_s*' ..
610 '\d BCALL char2nr(argc 1)\_s*' ..
611 '\d DROP\_s*' ..
612 'Test_disassemble_new()\_s*' ..
613 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
614 '\d DROP\_s*' ..
615 'FuncWithArg(343)\_s*' ..
616 '\d\+ PUSHNR 343\_s*' ..
617 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
618 '\d\+ DROP\_s*' ..
619 'ScriptFuncNew()\_s*' ..
620 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
621 '\d\+ DROP\_s*' ..
622 's:ScriptFuncNew()\_s*' ..
623 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
624 '\d\+ DROP\_s*' ..
625 'UserFunc()\_s*' ..
626 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
627 '\d\+ DROP\_s*' ..
628 'UserFuncWithArg("foo")\_s*' ..
629 '\d\+ PUSHS "foo"\_s*' ..
630 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
631 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200632 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200633 '\d\+ PUSHS "UserFunc"\_s*' ..
634 '\d\+ BCALL function(argc 1)\_s*' ..
635 '\d\+ STORE $0\_s*' ..
636 'FuncRef()\_s*' ..
637 '\d\+ LOAD $\d\_s*' ..
638 '\d\+ PCALL (argc 0)\_s*' ..
639 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200640 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200641 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
642 '\d\+ BCALL function(argc 1)\_s*' ..
643 '\d\+ STORE $1\_s*' ..
644 'FuncRefWithArg("bar")\_s*' ..
645 '\d\+ PUSHS "bar"\_s*' ..
646 '\d\+ LOAD $\d\_s*' ..
647 '\d\+ PCALL (argc 1)\_s*' ..
648 '\d\+ DROP\_s*' ..
649 'return "yes"\_s*' ..
650 '\d\+ PUSHS "yes"\_s*' ..
651 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200652 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100653enddef
654
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200655
656def s:CreateRefs()
657 var local = 'a'
658 def Append(arg: string)
659 local ..= arg
660 enddef
661 g:Append = Append
662 def Get(): string
663 return local
664 enddef
665 g:Get = Get
666enddef
667
668def Test_disassemble_closure()
669 CreateRefs()
670 var res = execute('disass g:Append')
671 assert_match('<lambda>\d\_s*' ..
672 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100673 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200674 '\d LOAD arg\[-1\]\_s*' ..
675 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100676 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100677 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200678 res)
679
680 res = execute('disass g:Get')
681 assert_match('<lambda>\d\_s*' ..
682 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100683 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200684 '\d RETURN',
685 res)
686
687 unlet g:Append
688 unlet g:Get
689enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200690
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100691
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200692def EchoArg(arg: string): string
693 return arg
694enddef
695def RefThis(): func
696 return function('EchoArg')
697enddef
698def s:ScriptPCall()
699 RefThis()("text")
700enddef
701
702def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200703 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200704 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
705 'RefThis()("text")\_s*' ..
706 '\d DCALL RefThis(argc 0)\_s*' ..
707 '\d PUSHS "text"\_s*' ..
708 '\d PCALL top (argc 1)\_s*' ..
709 '\d PCALL end\_s*' ..
710 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100711 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200712 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200713enddef
714
715
Bram Moolenaara26b9702020-04-18 19:53:28 +0200716def s:FuncWithForwardCall(): string
717 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100718enddef
719
720def DefinedLater(arg: string): string
721 return arg
722enddef
723
724def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200725 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200726 assert_match('FuncWithForwardCall\_s*' ..
727 'return g:DefinedLater("yes")\_s*' ..
728 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200729 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200730 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200731 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100732
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200733 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100734 assert_equal('yes', FuncWithForwardCall())
735
Bram Moolenaara26b9702020-04-18 19:53:28 +0200736 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200737 assert_match('FuncWithForwardCall\_s*' ..
738 'return g:DefinedLater("yes")\_s*' ..
739 '\d PUSHS "yes"\_s*' ..
740 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200741 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200742 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100743enddef
744
745
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200746def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200747 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100748enddef
749
750def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200751 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200752 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200753 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200754 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200755 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200756 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200757 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200758 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
759 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200760 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200761 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200762 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200763 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200764 '\d 2STRING stack\[-1]\_s*' ..
765 '\d\+ CONCAT\_s*' ..
766 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200767 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100768enddef
769
770
Bram Moolenaar158906c2020-02-06 20:39:45 +0100771def HasEval()
772 if has("eval")
773 echo "yes"
774 else
775 echo "no"
776 endif
777enddef
778
779def HasNothing()
780 if has("nothing")
781 echo "yes"
782 else
783 echo "no"
784 endif
785enddef
786
787def HasSomething()
788 if has("nothing")
789 echo "nothing"
790 elseif has("something")
791 echo "something"
792 elseif has("eval")
793 echo "eval"
794 elseif has("less")
795 echo "less"
796 endif
797enddef
798
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100799def HasGuiRunning()
800 if has("gui_running")
801 echo "yes"
802 else
803 echo "no"
804 endif
805enddef
806
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100807def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200808 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200809 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200810 assert_match('HasEval\_s*' ..
811 'if has("eval")\_s*' ..
812 'echo "yes"\_s*' ..
813 '\d PUSHS "yes"\_s*' ..
814 '\d ECHO 1\_s*' ..
815 'else\_s*' ..
816 'echo "no"\_s*' ..
817 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200818 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100819 assert_notmatch('JUMP', instr)
820
Bram Moolenaard2c61702020-09-06 15:58:36 +0200821 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100822 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 assert_match('HasNothing\_s*' ..
824 'if has("nothing")\_s*' ..
825 'echo "yes"\_s*' ..
826 'else\_s*' ..
827 'echo "no"\_s*' ..
828 '\d PUSHS "no"\_s*' ..
829 '\d ECHO 1\_s*' ..
830 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200831 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100832 assert_notmatch('PUSHS "yes"', instr)
833 assert_notmatch('JUMP', instr)
834
Bram Moolenaard2c61702020-09-06 15:58:36 +0200835 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100836 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200837 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200838 'if has("nothing")\_s*' ..
839 'echo "nothing"\_s*' ..
840 'elseif has("something")\_s*' ..
841 'echo "something"\_s*' ..
842 'elseif has("eval")\_s*' ..
843 'echo "eval"\_s*' ..
844 '\d PUSHS "eval"\_s*' ..
845 '\d ECHO 1\_s*' ..
846 'elseif has("less").*' ..
847 'echo "less"\_s*' ..
848 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200849 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100850 assert_notmatch('PUSHS "nothing"', instr)
851 assert_notmatch('PUSHS "something"', instr)
852 assert_notmatch('PUSHS "less"', instr)
853 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100854
855 var result: string
856 var instr_expected: string
857 if has('gui')
858 if has('gui_running')
859 # GUI already running, always returns "yes"
860 result = "\nyes"
861 instr_expected = 'HasGuiRunning.*' ..
862 'if has("gui_running")\_s*' ..
863 ' echo "yes"\_s*' ..
864 '\d PUSHS "yes"\_s*' ..
865 '\d ECHO 1\_s*' ..
866 'else\_s*' ..
867 ' echo "no"\_s*' ..
868 'endif'
869 else
870 result = "\nno"
871 if has('unix')
872 # GUI not running but can start later, call has()
873 instr_expected = 'HasGuiRunning.*' ..
874 'if has("gui_running")\_s*' ..
875 '\d PUSHS "gui_running"\_s*' ..
876 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200877 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100878 '\d JUMP_IF_FALSE -> \d\_s*' ..
879 ' echo "yes"\_s*' ..
880 '\d PUSHS "yes"\_s*' ..
881 '\d ECHO 1\_s*' ..
882 'else\_s*' ..
883 '\d JUMP -> \d\_s*' ..
884 ' echo "no"\_s*' ..
885 '\d PUSHS "no"\_s*' ..
886 '\d ECHO 1\_s*' ..
887 'endif'
888 else
889 # GUI not running, always return "no"
890 instr_expected = 'HasGuiRunning.*' ..
891 'if has("gui_running")\_s*' ..
892 ' echo "yes"\_s*' ..
893 'else\_s*' ..
894 ' echo "no"\_s*' ..
895 '\d PUSHS "no"\_s*' ..
896 '\d ECHO 1\_s*' ..
897 'endif'
898 endif
899 endif
900 else
901 # GUI not supported, always return "no"
902 result = "\nno"
903 instr_expected = 'HasGuiRunning.*' ..
904 'if has("gui_running")\_s*' ..
905 ' echo "yes"\_s*' ..
906 'else\_s*' ..
907 ' echo "no"\_s*' ..
908 '\d PUSHS "no"\_s*' ..
909 '\d ECHO 1\_s*' ..
910 'endif'
911 endif
912
913 assert_equal(result, execute('HasGuiRunning()'))
914 instr = execute('disassemble HasGuiRunning')
915 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100916enddef
917
Bram Moolenaarefd88552020-06-18 20:50:10 +0200918def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100919 if 1 < 0
920 return "maybe"
921 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200922 if g:cond
923 return "yes"
924 else
925 return "no"
926 endif
927enddef
928
929def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200930 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200931 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100932 'if 1 < 0\_s*' ..
933 ' return "maybe"\_s*' ..
934 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200935 'if g:cond\_s*' ..
936 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100937 '1 COND2BOOL\_s*' ..
938 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200939 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100940 '3 PUSHS "yes"\_s*' ..
941 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200942 'else\_s*' ..
943 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100944 '5 PUSHS "no"\_s*' ..
945 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200946 instr)
947enddef
948
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100949def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200950 var Funky1: func
951 var Funky2: func = function("len")
952 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100953enddef
954
955def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200956 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200957 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200958 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200959 '0 PUSHFUNC "\[none]"\_s*' ..
960 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200961 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200962 '2 PUSHS "len"\_s*' ..
963 '3 BCALL function(argc 1)\_s*' ..
964 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200965 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200966 '\d PUSHS "UserFunc"\_s*' ..
967 '\d BCALL funcref(argc 1)\_s*' ..
968 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100969 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200970 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100971enddef
972
973if has('channel')
974 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200975 var job1: job
976 var job2: job = job_start("donothing")
977 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100978 enddef
979endif
980
981def Test_disassemble_channel()
982 CheckFeature channel
983
Bram Moolenaarac564082020-09-27 19:05:33 +0200984 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200985 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200986 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200987 '\d PUSHJOB "no process"\_s*' ..
988 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200989 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200990 '\d PUSHS "donothing"\_s*' ..
991 '\d BCALL job_start(argc 1)\_s*' ..
992 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200993 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200994 '\d PUSHCHANNEL 0\_s*' ..
995 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100996 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200997 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100998enddef
999
Bram Moolenaar777770f2020-02-06 21:27:08 +01001000def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001001 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +01001002 return F("x")
1003enddef
1004
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001005def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001006 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +02001007 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001008 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001009 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +02001010 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001011 '\d STORE $0\_s*' ..
1012 'return F("x")\_s*' ..
1013 '\d PUSHS "x"\_s*' ..
1014 '\d LOAD $0\_s*' ..
1015 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +02001016 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001017 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001018
Bram Moolenaarac564082020-09-27 19:05:33 +02001019 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001020 instr = execute('disassemble ' .. name)
1021 assert_match('<lambda>\d\+\_s*' ..
1022 'return "X" .. a .. "X"\_s*' ..
1023 '\d PUSHS "X"\_s*' ..
1024 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001025 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001026 '\d CONCAT\_s*' ..
1027 '\d PUSHS "X"\_s*' ..
1028 '\d CONCAT\_s*' ..
1029 '\d RETURN',
1030 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001031enddef
1032
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001033def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001034 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001035 return Ref(g:value)
1036enddef
1037
1038def Test_disassemble_lambda_with_type()
1039 g:value = 5
1040 assert_equal(15, LambdaWithType())
1041 var instr = execute('disassemble LambdaWithType')
1042 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001043 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001044 '\d FUNCREF <lambda>\d\+\_s*' ..
1045 '\d STORE $0\_s*' ..
1046 'return Ref(g:value)\_s*' ..
1047 '\d LOADG g:value\_s*' ..
1048 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001049 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001050 '\d PCALL (argc 1)\_s*' ..
1051 '\d RETURN',
1052 instr)
1053enddef
1054
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001055def NestedOuter()
1056 def g:Inner()
1057 echomsg "inner"
1058 enddef
1059enddef
1060
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001061def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001063 assert_match('NestedOuter\_s*' ..
1064 'def g:Inner()\_s*' ..
1065 'echomsg "inner"\_s*' ..
1066 'enddef\_s*' ..
1067 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001068 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001069 instr)
1070enddef
1071
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001072def NestedDefList()
1073 def
1074 def Info
1075 def /Info
1076 def /Info/
1077enddef
1078
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001079def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001080 var instr = execute('disassemble NestedDefList')
1081 assert_match('NestedDefList\_s*' ..
1082 'def\_s*' ..
1083 '\d DEF \_s*' ..
1084 'def Info\_s*' ..
1085 '\d DEF Info\_s*' ..
1086 'def /Info\_s*' ..
1087 '\d DEF /Info\_s*' ..
1088 'def /Info/\_s*' ..
1089 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001090 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001091 instr)
1092enddef
1093
Bram Moolenaar6e949782020-04-13 17:21:00 +02001094def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001095 if arg == 1 && arg != 2 || arg == 4
1096 return 'yes'
1097 endif
1098 return 'no'
1099enddef
1100
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001101def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001102 assert_equal("yes", AndOr(1))
1103 assert_equal("no", AndOr(2))
1104 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001105 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001106 assert_match('AndOr\_s*' ..
1107 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1108 '\d LOAD arg\[-1]\_s*' ..
1109 '\d PUSHNR 1\_s*' ..
1110 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001111 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001112 '\d LOAD arg\[-1]\_s*' ..
1113 '\d PUSHNR 2\_s*' ..
1114 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001115 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001116 '\d LOAD arg\[-1]\_s*' ..
1117 '\d\+ PUSHNR 4\_s*' ..
1118 '\d\+ COMPAREANY ==\_s*' ..
1119 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001120 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001121enddef
1122
Bram Moolenaar04d05222020-02-06 22:06:54 +01001123def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001124 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001125 for i in range(3)
1126 res->add(i)
1127 endfor
1128 return res
1129enddef
1130
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001131def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001132 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001133 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001134 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001135 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001136 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001137 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001138 '\d STORE $0\_s*' ..
1139 'for i in range(3)\_s*' ..
1140 '\d STORE -1 in $1\_s*' ..
1141 '\d PUSHNR 3\_s*' ..
1142 '\d BCALL range(argc 1)\_s*' ..
1143 '\d FOR $1 -> \d\+\_s*' ..
1144 '\d STORE $2\_s*' ..
1145 'res->add(i)\_s*' ..
1146 '\d LOAD $0\_s*' ..
1147 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001148 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001149 '\d\+ DROP\_s*' ..
1150 'endfor\_s*' ..
1151 '\d\+ JUMP -> \d\+\_s*' ..
1152 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001153 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001154enddef
1155
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001156def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001157 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001158 for str in eval('["one", "two"]')
1159 res ..= str
1160 endfor
1161 return res
1162enddef
1163
1164def Test_disassemble_for_loop_eval()
1165 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001167 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001168 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001169 '\d PUSHS ""\_s*' ..
1170 '\d STORE $0\_s*' ..
1171 'for str in eval(''\["one", "two"\]'')\_s*' ..
1172 '\d STORE -1 in $1\_s*' ..
1173 '\d PUSHS "\["one", "two"\]"\_s*' ..
1174 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001175 '\d FOR $1 -> \d\+\_s*' ..
1176 '\d STORE $2\_s*' ..
1177 'res ..= str\_s*' ..
1178 '\d\+ LOAD $0\_s*' ..
1179 '\d\+ LOAD $2\_s*' ..
1180 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1181 '\d\+ CONCAT\_s*' ..
1182 '\d\+ STORE $0\_s*' ..
1183 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001184 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001185 '\d\+ DROP\_s*' ..
1186 'return res\_s*' ..
1187 '\d\+ LOAD $0\_s*' ..
1188 '\d\+ RETURN',
1189 instr)
1190enddef
1191
Bram Moolenaar792f7862020-11-23 08:31:18 +01001192def ForLoopUnpack()
1193 for [x1, x2] in [[1, 2], [3, 4]]
1194 echo x1 x2
1195 endfor
1196enddef
1197
1198def Test_disassemble_for_loop_unpack()
1199 var instr = execute('disassemble ForLoopUnpack')
1200 assert_match('ForLoopUnpack\_s*' ..
1201 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1202 '\d\+ STORE -1 in $0\_s*' ..
1203 '\d\+ PUSHNR 1\_s*' ..
1204 '\d\+ PUSHNR 2\_s*' ..
1205 '\d\+ NEWLIST size 2\_s*' ..
1206 '\d\+ PUSHNR 3\_s*' ..
1207 '\d\+ PUSHNR 4\_s*' ..
1208 '\d\+ NEWLIST size 2\_s*' ..
1209 '\d\+ NEWLIST size 2\_s*' ..
1210 '\d\+ FOR $0 -> 16\_s*' ..
1211 '\d\+ UNPACK 2\_s*' ..
1212 '\d\+ STORE $1\_s*' ..
1213 '\d\+ STORE $2\_s*' ..
1214 'echo x1 x2\_s*' ..
1215 '\d\+ LOAD $1\_s*' ..
1216 '\d\+ LOAD $2\_s*' ..
1217 '\d\+ ECHO 2\_s*' ..
1218 'endfor\_s*' ..
1219 '\d\+ JUMP -> 8\_s*' ..
1220 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001221 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001222 instr)
1223enddef
1224
Bram Moolenaarc150c092021-02-13 15:02:46 +01001225def ForLoopContinue()
1226 for nr in [1, 2]
1227 try
1228 echo "ok"
1229 try
1230 echo "deeper"
1231 catch
1232 continue
1233 endtry
1234 catch
1235 echo "not ok"
1236 endtry
1237 endfor
1238enddef
1239
1240def Test_disassemble_for_loop_continue()
1241 var instr = execute('disassemble ForLoopContinue')
1242 assert_match('ForLoopContinue\_s*' ..
1243 'for nr in \[1, 2]\_s*' ..
1244 '0 STORE -1 in $0\_s*' ..
1245 '1 PUSHNR 1\_s*' ..
1246 '2 PUSHNR 2\_s*' ..
1247 '3 NEWLIST size 2\_s*' ..
1248 '4 FOR $0 -> 22\_s*' ..
1249 '5 STORE $1\_s*' ..
1250 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001251 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001252 'echo "ok"\_s*' ..
1253 '7 PUSHS "ok"\_s*' ..
1254 '8 ECHO 1\_s*' ..
1255 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001256 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001257 'echo "deeper"\_s*' ..
1258 '10 PUSHS "deeper"\_s*' ..
1259 '11 ECHO 1\_s*' ..
1260 'catch\_s*' ..
1261 '12 JUMP -> 15\_s*' ..
1262 '13 CATCH\_s*' ..
1263 'continue\_s*' ..
1264 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1265 'endtry\_s*' ..
1266 '15 ENDTRY\_s*' ..
1267 'catch\_s*' ..
1268 '16 JUMP -> 20\_s*' ..
1269 '17 CATCH\_s*' ..
1270 'echo "not ok"\_s*' ..
1271 '18 PUSHS "not ok"\_s*' ..
1272 '19 ECHO 1\_s*' ..
1273 'endtry\_s*' ..
1274 '20 ENDTRY\_s*' ..
1275 'endfor\_s*' ..
1276 '21 JUMP -> 4\_s*' ..
1277 '\d\+ DROP\_s*' ..
1278 '\d\+ RETURN 0',
1279 instr)
1280enddef
1281
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001282let g:number = 42
1283
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001284def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001285 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001286enddef
1287
1288def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001289 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001290 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001291 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001292 '\d PUSHNR 23\_s*' ..
1293 '\d LOADG g:number\_s*' ..
1294 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1295 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001296 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001297 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001298 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001299 instr)
1300enddef
1301
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001302def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001303 var nr = 3
1304 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001305 nrres = nr - 7
1306 nrres = nr * 7
1307 nrres = nr / 7
1308 nrres = nr % 7
1309
Bram Moolenaarac564082020-09-27 19:05:33 +02001310 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001311 anyres = g:number - 7
1312 anyres = g:number * 7
1313 anyres = g:number / 7
1314 anyres = g:number % 7
1315
1316 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 var fl = 3.0
1318 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001319 flres = fl - 7.0
1320 flres = fl * 7.0
1321 flres = fl / 7.0
1322 endif
1323enddef
1324
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001325def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001326 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001327 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001328 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001329 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001330 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001331 '\d LOAD $0.*' ..
1332 '\d PUSHNR 7.*' ..
1333 '\d OPNR +.*' ..
1334 '\d STORE $1.*' ..
1335 'nrres = nr - 7.*' ..
1336 '\d OPNR -.*' ..
1337 'nrres = nr \* 7.*' ..
1338 '\d OPNR \*.*' ..
1339 'nrres = nr / 7.*' ..
1340 '\d OPNR /.*' ..
1341 'nrres = nr % 7.*' ..
1342 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001343 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001344 '\d LOADG g:number.*' ..
1345 '\d PUSHNR 7.*' ..
1346 '\d OPANY +.*' ..
1347 '\d STORE $2.*' ..
1348 'anyres = g:number - 7.*' ..
1349 '\d OPANY -.*' ..
1350 'anyres = g:number \* 7.*' ..
1351 '\d OPANY \*.*' ..
1352 'anyres = g:number / 7.*' ..
1353 '\d OPANY /.*' ..
1354 'anyres = g:number % 7.*' ..
1355 '\d OPANY %.*',
1356 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001357 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001358 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001359 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001360 '\d PUSHF 3.0.*' ..
1361 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001362 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001363 '\d LOAD $3.*' ..
1364 '\d PUSHF 7.0.*' ..
1365 '\d OPFLOAT +.*' ..
1366 '\d STORE $4.*' ..
1367 'flres = fl - 7.0.*' ..
1368 '\d OPFLOAT -.*' ..
1369 'flres = fl \* 7.0.*' ..
1370 '\d OPFLOAT \*.*' ..
1371 'flres = fl / 7.0.*' ..
1372 '\d OPFLOAT /.*',
1373 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001374 endif
1375enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001376
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001377def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001378 var reslist = [1, 2] + [3, 4]
1379 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001380enddef
1381
1382def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001383 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001384 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001385 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001386 '\d PUSHNR 1.*' ..
1387 '\d PUSHNR 2.*' ..
1388 '\d NEWLIST size 2.*' ..
1389 '\d PUSHNR 3.*' ..
1390 '\d PUSHNR 4.*' ..
1391 '\d NEWLIST size 2.*' ..
1392 '\d ADDLIST.*' ..
1393 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001394 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001395 '\d PUSHBLOB 0z1122.*' ..
1396 '\d PUSHBLOB 0z3344.*' ..
1397 '\d ADDBLOB.*' ..
1398 '\d STORE $.*',
1399 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001400enddef
1401
1402let g:aa = 'aa'
1403def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001404 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001405 return res
1406enddef
1407
1408def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001409 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001410 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001411 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001412 '\d LOADG g:aa.*' ..
1413 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001414 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001415 '\d CONCAT.*' ..
1416 '\d STORE $.*',
1417 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001418 assert_equal('aabb', ConcatString())
1419enddef
1420
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001421def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001422 var s = "abcd"
1423 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001424 return res
1425enddef
1426
1427def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001428 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001429 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001431 '\d PUSHS "abcd"\_s*' ..
1432 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001433 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001434 '\d LOAD $0\_s*' ..
1435 '\d PUSHNR 1\_s*' ..
1436 '\d STRINDEX\_s*' ..
1437 '\d STORE $1\_s*',
1438 instr)
1439 assert_equal('b', StringIndex())
1440enddef
1441
Bram Moolenaared591872020-08-15 22:14:53 +02001442def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001443 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001444 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001445 return res
1446enddef
1447
1448def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001449 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001450 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001451 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001452 '\d PUSHS "abcd"\_s*' ..
1453 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001454 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001455 '\d LOAD $0\_s*' ..
1456 '\d PUSHNR 1\_s*' ..
1457 '\d PUSHNR 8\_s*' ..
1458 '\d STRSLICE\_s*' ..
1459 '\d STORE $1\_s*',
1460 instr)
1461 assert_equal('bcd', StringSlice())
1462enddef
1463
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001464def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001465 var l = [1, 2, 3]
1466 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001467 return res
1468enddef
1469
1470def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001471 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001472 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001473 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001474 '\d PUSHNR 1\_s*' ..
1475 '\d PUSHNR 2\_s*' ..
1476 '\d PUSHNR 3\_s*' ..
1477 '\d NEWLIST size 3\_s*' ..
1478 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001479 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001480 '\d LOAD $0\_s*' ..
1481 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001482 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001483 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001484 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001485 assert_equal(2, ListIndex())
1486enddef
1487
Bram Moolenaared591872020-08-15 22:14:53 +02001488def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001489 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001490 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001491 return res
1492enddef
1493
1494def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001495 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001496 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001497 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001498 '\d PUSHNR 1\_s*' ..
1499 '\d PUSHNR 2\_s*' ..
1500 '\d PUSHNR 3\_s*' ..
1501 '\d NEWLIST size 3\_s*' ..
1502 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001503 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001504 '\d LOAD $0\_s*' ..
1505 '\d PUSHNR 1\_s*' ..
1506 '\d PUSHNR 8\_s*' ..
1507 '\d LISTSLICE\_s*' ..
1508 '\d STORE $1\_s*',
1509 instr)
1510 assert_equal([2, 3], ListSlice())
1511enddef
1512
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001513def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001514 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001515 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001516 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001517 return res
1518enddef
1519
1520def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001521 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001522 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001523 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001524 '\d PUSHS "item"\_s*' ..
1525 '\d PUSHNR 1\_s*' ..
1526 '\d NEWDICT size 1\_s*' ..
1527 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001528 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001529 '\d\+ LOAD $0\_s*' ..
1530 '\d\+ MEMBER item\_s*' ..
1531 '\d\+ STORE $1\_s*' ..
1532 'res = d\["item"\]\_s*' ..
1533 '\d\+ LOAD $0\_s*' ..
1534 '\d\+ PUSHS "item"\_s*' ..
1535 '\d\+ MEMBER\_s*' ..
1536 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001537 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001538 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001539enddef
1540
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001541let somelist = [1, 2, 3, 4, 5]
1542def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001543 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001544 return res
1545enddef
1546
1547def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001548 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001549 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001550 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001551 '\d LOADG g:somelist\_s*' ..
1552 '\d PUSHNR 2\_s*' ..
1553 '\d ANYINDEX\_s*' ..
1554 '\d STORE $0\_s*' ..
1555 'return res\_s*' ..
1556 '\d LOAD $0\_s*' ..
1557 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1558 '\d RETURN',
1559 instr)
1560 assert_equal(3, AnyIndex())
1561enddef
1562
1563def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001564 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001565 return res
1566enddef
1567
1568def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001569 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001570 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001571 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001572 '\d LOADG g:somelist\_s*' ..
1573 '\d PUSHNR 1\_s*' ..
1574 '\d PUSHNR 3\_s*' ..
1575 '\d ANYSLICE\_s*' ..
1576 '\d STORE $0\_s*' ..
1577 'return res\_s*' ..
1578 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001579 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001580 '\d RETURN',
1581 instr)
1582 assert_equal([2, 3, 4], AnySlice())
1583enddef
1584
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001585def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001586 var nr = 9
1587 var plus = +nr
1588 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001589 return res
1590enddef
1591
1592def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001593 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001594 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001595 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001596 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001597 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001598 '\d LOAD $0\_s*' ..
1599 '\d CHECKNR\_s*' ..
1600 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001601 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001602 '\d LOAD $0\_s*' ..
1603 '\d NEGATENR\_s*' ..
1604 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001605 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001606 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001607enddef
1608
1609def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001610 var flag = true
1611 var invert = !flag
1612 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001613 return res
1614enddef
1615
1616def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001617 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001618 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001619 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001620 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001621 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001622 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001623 '\d LOAD $0\_s*' ..
1624 '\d INVERT (!val)\_s*' ..
1625 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001626 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001627 '\d LOAD $0\_s*' ..
1628 '\d 2BOOL (!!val)\_s*' ..
1629 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001630 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001631 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001632enddef
1633
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001634def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001635 var name: bool = 1 && 0 || 1
1636 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001637enddef
1638
1639def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001640 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001641 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001642 'var name: bool = 1 && 0 || 1\_s*' ..
1643 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001644 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001645 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1646 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001647 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001648 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1649 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001650 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001651 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001652 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001653 '\d\+ LOAD $0\_s*' ..
1654 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001655 instr)
1656 assert_equal(true, InvertBool())
1657enddef
1658
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001659def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001660 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001661 ['true == isFalse', 'COMPAREBOOL =='],
1662 ['true != isFalse', 'COMPAREBOOL !='],
1663 ['v:none == isNull', 'COMPARESPECIAL =='],
1664 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001665
Bram Moolenaara5565e42020-05-09 15:44:01 +02001666 ['111 == aNumber', 'COMPARENR =='],
1667 ['111 != aNumber', 'COMPARENR !='],
1668 ['111 > aNumber', 'COMPARENR >'],
1669 ['111 < aNumber', 'COMPARENR <'],
1670 ['111 >= aNumber', 'COMPARENR >='],
1671 ['111 <= aNumber', 'COMPARENR <='],
1672 ['111 =~ aNumber', 'COMPARENR =\~'],
1673 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001674
Bram Moolenaara5565e42020-05-09 15:44:01 +02001675 ['"xx" != aString', 'COMPARESTRING !='],
1676 ['"xx" > aString', 'COMPARESTRING >'],
1677 ['"xx" < aString', 'COMPARESTRING <'],
1678 ['"xx" >= aString', 'COMPARESTRING >='],
1679 ['"xx" <= aString', 'COMPARESTRING <='],
1680 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1681 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1682 ['"xx" is aString', 'COMPARESTRING is'],
1683 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001684
Bram Moolenaara5565e42020-05-09 15:44:01 +02001685 ['0z11 == aBlob', 'COMPAREBLOB =='],
1686 ['0z11 != aBlob', 'COMPAREBLOB !='],
1687 ['0z11 is aBlob', 'COMPAREBLOB is'],
1688 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001689
Bram Moolenaara5565e42020-05-09 15:44:01 +02001690 ['[1, 2] == aList', 'COMPARELIST =='],
1691 ['[1, 2] != aList', 'COMPARELIST !='],
1692 ['[1, 2] is aList', 'COMPARELIST is'],
1693 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001694
Bram Moolenaare0de1712020-12-02 17:36:54 +01001695 ['{a: 1} == aDict', 'COMPAREDICT =='],
1696 ['{a: 1} != aDict', 'COMPAREDICT !='],
1697 ['{a: 1} is aDict', 'COMPAREDICT is'],
1698 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001699
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001700 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1701 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1702 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1703 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001704
1705 ['77 == g:xx', 'COMPAREANY =='],
1706 ['77 != g:xx', 'COMPAREANY !='],
1707 ['77 > g:xx', 'COMPAREANY >'],
1708 ['77 < g:xx', 'COMPAREANY <'],
1709 ['77 >= g:xx', 'COMPAREANY >='],
1710 ['77 <= g:xx', 'COMPAREANY <='],
1711 ['77 =~ g:xx', 'COMPAREANY =\~'],
1712 ['77 !~ g:xx', 'COMPAREANY !\~'],
1713 ['77 is g:xx', 'COMPAREANY is'],
1714 ['77 isnot g:xx', 'COMPAREANY isnot'],
1715 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001717 if has('float')
1718 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001719 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1720 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1721 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1722 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1723 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1724 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1725 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1726 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001727 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001728 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001729 endif
1730
Bram Moolenaarac564082020-09-27 19:05:33 +02001731 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001732 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001733 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001734 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001735 ' var isFalse = false',
1736 ' var isNull = v:null',
1737 ' var aNumber = 222',
1738 ' var aString = "yy"',
1739 ' var aBlob = 0z22',
1740 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001741 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001742 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001743 ' if ' .. case[0],
1744 ' echo 42'
1745 ' endif',
1746 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001747 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001748 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001749 assert_match('TestCase' .. nr .. '.*' ..
1750 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1751 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001752 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001753 '\d ' .. case[1] .. '.*' ..
1754 '\d JUMP_IF_FALSE -> \d\+.*',
1755 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001756
1757 nr += 1
1758 endfor
1759
Bram Moolenaar22da5592020-03-19 14:52:20 +01001760 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001761enddef
1762
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001763def s:FalsyOp()
1764 echo g:flag ?? "yes"
1765 echo [] ?? "empty list"
1766 echo "" ?? "empty string"
1767enddef
1768
1769def Test_dsassemble_falsy_op()
1770 var res = execute('disass s:FalsyOp')
1771 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1772 'echo g:flag ?? "yes"\_s*' ..
1773 '0 LOADG g:flag\_s*' ..
1774 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1775 '2 PUSHS "yes"\_s*' ..
1776 '3 ECHO 1\_s*' ..
1777 'echo \[\] ?? "empty list"\_s*' ..
1778 '4 NEWLIST size 0\_s*' ..
1779 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1780 '6 PUSHS "empty list"\_s*' ..
1781 '7 ECHO 1\_s*' ..
1782 'echo "" ?? "empty string"\_s*' ..
1783 '\d\+ PUSHS "empty string"\_s*' ..
1784 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001785 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001786 res)
1787enddef
1788
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001789def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001790 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001791 ['"xx" == "yy"', false],
1792 ['"aa" == "aa"', true],
1793 ['has("eval") ? true : false', true],
1794 ['has("asdf") ? true : false', false],
1795 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001796
Bram Moolenaarac564082020-09-27 19:05:33 +02001797 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001798 for case in cases
1799 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001800 ' if ' .. case[0],
1801 ' echo 42'
1802 ' endif',
1803 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001804 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001806 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001807 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001808 assert_match('TestCase' .. nr .. '.*' ..
1809 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1810 '\d PUSHNR 42.*' ..
1811 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001812 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001813 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001814 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001815 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001816 assert_match('TestCase' .. nr .. '.*' ..
1817 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1818 'echo 42[ \n]*' ..
1819 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001820 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001821 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001822 endif
1823
1824 nr += 1
1825 endfor
1826
1827 delete('Xdisassemble')
1828enddef
1829
Bram Moolenaarad39c092020-02-26 18:23:43 +01001830def s:Execute()
1831 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001832 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001833 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001834 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001835 execute 'help ' .. tag
1836enddef
1837
1838def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001839 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001840 assert_match('\<SNR>\d*_Execute\_s*' ..
1841 "execute 'help vim9.txt'\\_s*" ..
1842 '\d PUSHS "help vim9.txt"\_s*' ..
1843 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001844 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001845 '\d PUSHS "help vim9.txt"\_s*' ..
1846 '\d STORE $0\_s*' ..
1847 'execute cmd\_s*' ..
1848 '\d LOAD $0\_s*' ..
1849 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001850 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001851 '\d PUSHS "vim9.txt"\_s*' ..
1852 '\d STORE $1\_s*' ..
1853 "execute 'help ' .. tag\\_s*" ..
1854 '\d\+ PUSHS "help "\_s*' ..
1855 '\d\+ LOAD $1\_s*' ..
1856 '\d\+ CONCAT\_s*' ..
1857 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001858 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001859 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001860enddef
1861
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001862def s:Echomsg()
1863 echomsg 'some' 'message'
1864 echoerr 'went' .. 'wrong'
1865enddef
1866
1867def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001868 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001869 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1870 "echomsg 'some' 'message'\\_s*" ..
1871 '\d PUSHS "some"\_s*' ..
1872 '\d PUSHS "message"\_s*' ..
1873 '\d ECHOMSG 2\_s*' ..
1874 "echoerr 'went' .. 'wrong'\\_s*" ..
1875 '\d PUSHS "wentwrong"\_s*' ..
1876 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001877 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001878 res)
1879enddef
1880
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001881def SomeStringArg(arg: string)
1882 echo arg
1883enddef
1884
1885def SomeAnyArg(arg: any)
1886 echo arg
1887enddef
1888
1889def SomeStringArgAndReturn(arg: string): string
1890 return arg
1891enddef
1892
1893def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001894 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001895 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1896 '\d *echo arg.*' ..
1897 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001898 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001899
Bram Moolenaarac564082020-09-27 19:05:33 +02001900 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001901 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1902 '\d *echo arg\_s*' ..
1903 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001904 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001905
Bram Moolenaarac564082020-09-27 19:05:33 +02001906 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001907 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1908 '\d *return arg\_s*' ..
1909 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001910 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001911enddef
1912
Bram Moolenaar09689a02020-05-09 22:50:08 +02001913def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001914 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001915 vim9script
1916 def FuncOne(): string
1917 return FuncTwo()
1918 enddef
1919 def FuncTwo(): string
1920 return 'two'
1921 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001922 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001923 END
1924 writefile(lines, 'Xdisassemble')
1925 source Xdisassemble
1926
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001927 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001928 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1929 'return FuncTwo()\_s*' ..
1930 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001931 '\d RETURN',
1932 g:res_FuncOne)
1933
1934 delete('Xdisassemble')
1935 unlet g:res_FuncOne
1936enddef
1937
Bram Moolenaar61a89812020-05-07 16:58:17 +02001938def s:ConcatStrings(): string
1939 return 'one' .. 'two' .. 'three'
1940enddef
1941
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001942def s:ComputeConst(): number
1943 return 2 + 3 * 4 / 6 + 7
1944enddef
1945
Bram Moolenaar1c747212020-05-09 18:28:34 +02001946def s:ComputeConstParen(): number
1947 return ((2 + 4) * (8 / 2)) / (3 + 4)
1948enddef
1949
Bram Moolenaar61a89812020-05-07 16:58:17 +02001950def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001951 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001952 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1953 "return 'one' .. 'two' .. 'three'\\_s*" ..
1954 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001955 '\d RETURN',
1956 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001957
1958 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001959 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1960 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1961 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001962 '\d RETURN',
1963 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001964
1965 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001966 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1967 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1968 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001969 '\d RETURN',
1970 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001971enddef
1972
Bram Moolenaar389df252020-07-09 21:20:47 +02001973def s:CallAppend()
1974 eval "some text"->append(2)
1975enddef
1976
1977def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001978 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001979 assert_match('<SNR>\d*_CallAppend\_s*' ..
1980 'eval "some text"->append(2)\_s*' ..
1981 '\d PUSHS "some text"\_s*' ..
1982 '\d PUSHNR 2\_s*' ..
1983 '\d SHUFFLE 2 up 1\_s*' ..
1984 '\d BCALL append(argc 2)\_s*' ..
1985 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001986 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001987 res)
1988enddef
1989
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001990
1991def s:SilentMessage()
1992 silent echomsg "text"
1993 silent! echoerr "error"
1994enddef
1995
1996def Test_silent()
1997 var res = execute('disass s:SilentMessage')
1998 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1999 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002000 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002001 '\d PUSHS "text"\_s*' ..
2002 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002003 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002004 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002005 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002006 '\d PUSHS "error"\_s*' ..
2007 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02002008 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002009 '\d\+ RETURN 0',
2010 res)
2011enddef
2012
2013def s:SilentIf()
2014 silent if 4 == g:five
2015 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01002016 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01002017enddef
2018
2019def Test_silent_if()
2020 var res = execute('disass s:SilentIf')
2021 assert_match('<SNR>\d*_SilentIf\_s*' ..
2022 'silent if 4 == g:five\_s*' ..
2023 '\d\+ CMDMOD silent\_s*' ..
2024 '\d\+ PUSHNR 4\_s*' ..
2025 '\d\+ LOADG g:five\_s*' ..
2026 '\d\+ COMPAREANY ==\_s*' ..
2027 '\d\+ CMDMOD_REV\_s*' ..
2028 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2029 'silent elseif 4 == g:five\_s*' ..
2030 '\d\+ JUMP -> \d\+\_s*' ..
2031 '\d\+ CMDMOD silent\_s*' ..
2032 '\d\+ PUSHNR 4\_s*' ..
2033 '\d\+ LOADG g:five\_s*' ..
2034 '\d\+ COMPAREANY ==\_s*' ..
2035 '\d\+ CMDMOD_REV\_s*' ..
2036 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002037 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002038 '\d\+ RETURN 0',
2039 res)
2040enddef
2041
2042def s:SilentFor()
2043 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002044 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002045enddef
2046
2047def Test_silent_for()
2048 var res = execute('disass s:SilentFor')
2049 assert_match('<SNR>\d*_SilentFor\_s*' ..
2050 'silent for i in \[0\]\_s*' ..
2051 '\d CMDMOD silent\_s*' ..
2052 '\d STORE -1 in $0\_s*' ..
2053 '\d PUSHNR 0\_s*' ..
2054 '\d NEWLIST size 1\_s*' ..
2055 '\d CMDMOD_REV\_s*' ..
2056 '5 FOR $0 -> 8\_s*' ..
2057 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002058 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002059 '\d JUMP -> 5\_s*' ..
2060 '8 DROP\_s*' ..
2061 '\d RETURN 0\_s*',
2062 res)
2063enddef
2064
2065def s:SilentWhile()
2066 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002067 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002068enddef
2069
2070def Test_silent_while()
2071 var res = execute('disass s:SilentWhile')
2072 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2073 'silent while g:not\_s*' ..
2074 '0 CMDMOD silent\_s*' ..
2075 '\d LOADG g:not\_s*' ..
2076 '\d COND2BOOL\_s*' ..
2077 '\d CMDMOD_REV\_s*' ..
2078 '\d JUMP_IF_FALSE -> 6\_s*' ..
2079
Bram Moolenaarfa984412021-03-25 22:15:28 +01002080 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002081 '\d JUMP -> 0\_s*' ..
2082 '6 RETURN 0\_s*',
2083 res)
2084enddef
2085
2086def s:SilentReturn(): string
2087 silent return "done"
2088enddef
2089
2090def Test_silent_return()
2091 var res = execute('disass s:SilentReturn')
2092 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2093 'silent return "done"\_s*' ..
2094 '\d CMDMOD silent\_s*' ..
2095 '\d PUSHS "done"\_s*' ..
2096 '\d CMDMOD_REV\_s*' ..
2097 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002098 res)
2099enddef
2100
Bram Moolenaarb2049902021-01-24 12:53:53 +01002101def s:Profiled(): string
2102 echo "profiled"
2103 return "done"
2104enddef
2105
2106def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002107 if !has('profile')
2108 MissingFeature 'profile'
2109 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002110 var res = execute('disass! s:Profiled')
2111 assert_match('<SNR>\d*_Profiled\_s*' ..
2112 'echo "profiled"\_s*' ..
2113 '\d PROFILE START line 1\_s*' ..
2114 '\d PUSHS "profiled"\_s*' ..
2115 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002116 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002117 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002118 '\d PROFILE START line 2\_s*' ..
2119 '\d PUSHS "done"\_s*' ..
2120 '\d RETURN\_s*' ..
2121 '\d PROFILE END',
2122 res)
2123enddef
2124
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002125def s:EchoMessages()
2126 echohl ErrorMsg | echom v:exception | echohl NONE
2127enddef
2128
2129def Test_disassemble_nextcmd()
2130 # splitting commands and removing trailing blanks should not change the line
2131 var res = execute('disass s:EchoMessages')
2132 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2133 'echohl ErrorMsg | echom v:exception | echohl NONE',
2134 res)
2135enddef
2136
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002137
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002138" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker