blob: b1c1c18326e187c21d72fb2a84168a2743d17e98 [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 Moolenaar7c5ad342020-08-12 15:48:55 +0200170def s:YankRange()
171 norm! m[jjm]
172 :'[,']yank
173enddef
174
175def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200176 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200177 assert_match('<SNR>\d*_YankRange.*' ..
178 ' norm! m\[jjm\]\_s*' ..
179 '\d EXEC norm! m\[jjm\]\_s*' ..
180 ' :''\[,''\]yank\_s*' ..
181 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100182 '\d RETURN 0',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200183 res)
184enddef
185
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200186def s:PutExpr()
187 :3put ="text"
188enddef
189
190def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200191 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200192 assert_match('<SNR>\d*_PutExpr.*' ..
193 ' :3put ="text"\_s*' ..
194 '\d PUSHS "text"\_s*' ..
195 '\d PUT = 3\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100196 '\d RETURN 0',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200197 res)
198enddef
199
Bram Moolenaar08597872020-12-10 19:43:40 +0100200def s:PutRange()
201 :$-2put a
202enddef
203
204def Test_disassemble_put_range()
205 var res = execute('disass s:PutRange')
206 assert_match('<SNR>\d*_PutRange.*' ..
207 ' :$-2put a\_s*' ..
208 '\d RANGE $-2\_s*' ..
209 '\d PUT a range\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100210 '\d RETURN 0',
Bram Moolenaar08597872020-12-10 19:43:40 +0100211 res)
212enddef
213
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100214def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200215 var localbool = true
216 var localspec = v:none
217 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100218 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200219 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100220 endif
221enddef
222
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100223def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200224 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200225 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
226 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100227 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200228 'localspec = v:none.*' ..
229 ' PUSH v:none.*' ..
230 'localblob = 0z1234.*' ..
231 ' PUSHBLOB 0z1234.*',
232 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100233 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200234 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
235 'localfloat = 1.234.*' ..
236 ' PUSHF 1.234.*',
237 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100238 endif
239enddef
240
241def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200242 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100243 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200244 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100245 localstr = 'xyz'
246 v:char = 'abc'
247 s:scriptvar = 'sv'
248 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100249 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200250 b:buffervar = 'bv'
251 w:windowvar = 'wv'
252 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100253 &tabstop = 8
254 $ENVVAR = 'ev'
255 @z = 'rv'
256enddef
257
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100258def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200259 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200260 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200261 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200262 'localnr = 2.*' ..
263 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200264 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200265 'localstr = ''xyz''.*' ..
266 ' STORE $1.*' ..
267 'v:char = ''abc''.*' ..
268 'STOREV v:char.*' ..
269 's:scriptvar = ''sv''.*' ..
270 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
271 'g:globalvar = ''gv''.*' ..
272 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100273 'g:auto#var = ''av''.*' ..
274 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200275 'b:buffervar = ''bv''.*' ..
276 ' STOREB b:buffervar.*' ..
277 'w:windowvar = ''wv''.*' ..
278 ' STOREW w:windowvar.*' ..
279 't:tabpagevar = ''tv''.*' ..
280 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200281 '&tabstop = 8.*' ..
282 ' STOREOPT &tabstop.*' ..
283 '$ENVVAR = ''ev''.*' ..
284 ' STOREENV $ENVVAR.*' ..
285 '@z = ''rv''.*' ..
286 ' STOREREG @z.*',
287 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100288enddef
289
Bram Moolenaarcb790402020-05-15 20:53:00 +0200290def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200291 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200292 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200293 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200294 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200295 var localblob: blob = 0z1122
296 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200297enddef
298
299def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200300 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200301 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200302 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200303 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100304 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200305 '\d STORE $0\_s*' ..
306 'locallist\[0\] = 123\_s*' ..
307 '\d PUSHNR 123\_s*' ..
308 '\d PUSHNR 0\_s*' ..
309 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200310 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200311 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200312 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100313 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200314 '\d STORE $1\_s*' ..
315 'localdict\["a"\] = 456\_s*' ..
316 '\d\+ PUSHNR 456\_s*' ..
317 '\d\+ PUSHS "a"\_s*' ..
318 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200319 '\d\+ STOREINDEX dict\_s*' ..
320 'var localblob: blob = 0z1122\_s*' ..
321 '\d\+ PUSHBLOB 0z1122\_s*' ..
322 '\d\+ STORE $2\_s*' ..
323 'localblob\[1\] = 33\_s*' ..
324 '\d\+ PUSHNR 33\_s*' ..
325 '\d\+ PUSHNR 1\_s*' ..
326 '\d\+ LOAD $2\_s*' ..
327 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100328 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200329 res)
330enddef
331
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100332def s:ScriptFuncStoreIndex()
333 var d = {dd: {}}
334 d.dd[0] = 0
335enddef
336
337def Test_disassemble_store_index()
338 var res = execute('disass s:ScriptFuncStoreIndex')
339 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
340 'var d = {dd: {}}\_s*' ..
341 '\d PUSHS "dd"\_s*' ..
342 '\d NEWDICT size 0\_s*' ..
343 '\d NEWDICT size 1\_s*' ..
344 '\d STORE $0\_s*' ..
345 'd.dd\[0\] = 0\_s*' ..
346 '\d PUSHNR 0\_s*' ..
347 '\d PUSHNR 0\_s*' ..
348 '\d LOAD $0\_s*' ..
349 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200350 '\d STOREINDEX any\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100351 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100352 res)
353enddef
354
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200355def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200356 var x: string
357 var y: string
358 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200359 [x, y; l] = g:stringlist
360enddef
361
362def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200363 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200364 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200365 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200366 '\d PUSHS "\[NULL\]"\_s*' ..
367 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200368 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200369 '\d PUSHS "\[NULL\]"\_s*' ..
370 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200371 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200372 '\d NEWLIST size 0\_s*' ..
373 '\d STORE $2\_s*' ..
374 '\[x, y; l\] = g:stringlist\_s*' ..
375 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200376 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200377 '\d CHECKLEN >= 2\_s*' ..
378 '\d\+ ITEM 0\_s*' ..
379 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
380 '\d\+ STORE $0\_s*' ..
381 '\d\+ ITEM 1\_s*' ..
382 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
383 '\d\+ STORE $1\_s*' ..
384 '\d\+ SLICE 2\_s*' ..
385 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100386 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200387 res)
388enddef
389
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200390def s:ListAdd()
391 var l: list<number> = []
392 add(l, 123)
393 add(l, g:aNumber)
394enddef
395
396def Test_disassemble_list_add()
397 var res = execute('disass s:ListAdd')
398 assert_match('<SNR>\d*_ListAdd\_s*' ..
399 'var l: list<number> = []\_s*' ..
400 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100401 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200402 '\d STORE $0\_s*' ..
403 'add(l, 123)\_s*' ..
404 '\d LOAD $0\_s*' ..
405 '\d PUSHNR 123\_s*' ..
406 '\d LISTAPPEND\_s*' ..
407 '\d DROP\_s*' ..
408 'add(l, g:aNumber)\_s*' ..
409 '\d LOAD $0\_s*' ..
410 '\d\+ LOADG g:aNumber\_s*' ..
411 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
412 '\d\+ LISTAPPEND\_s*' ..
413 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100414 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200415 res)
416enddef
417
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200418def s:BlobAdd()
419 var b: blob = 0z
420 add(b, 123)
421 add(b, g:aNumber)
422enddef
423
424def Test_disassemble_blob_add()
425 var res = execute('disass s:BlobAdd')
426 assert_match('<SNR>\d*_BlobAdd\_s*' ..
427 'var b: blob = 0z\_s*' ..
428 '\d PUSHBLOB 0z\_s*' ..
429 '\d STORE $0\_s*' ..
430 'add(b, 123)\_s*' ..
431 '\d LOAD $0\_s*' ..
432 '\d PUSHNR 123\_s*' ..
433 '\d BLOBAPPEND\_s*' ..
434 '\d DROP\_s*' ..
435 'add(b, g:aNumber)\_s*' ..
436 '\d LOAD $0\_s*' ..
437 '\d\+ LOADG g:aNumber\_s*' ..
438 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
439 '\d\+ BLOBAPPEND\_s*' ..
440 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100441 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200442 res)
443enddef
444
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200445def s:BlobIndexSlice()
446 var b: blob = 0z112233
447 echo b[1]
448 echo b[1 : 2]
449enddef
450
451def Test_disassemble_blob_index_slice()
452 var res = execute('disass s:BlobIndexSlice')
453 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
454 'var b: blob = 0z112233\_s*' ..
455 '\d PUSHBLOB 0z112233\_s*' ..
456 '\d STORE $0\_s*' ..
457 'echo b\[1\]\_s*' ..
458 '\d LOAD $0\_s*' ..
459 '\d PUSHNR 1\_s*' ..
460 '\d BLOBINDEX\_s*' ..
461 '\d ECHO 1\_s*' ..
462 'echo b\[1 : 2\]\_s*' ..
463 '\d LOAD $0\_s*' ..
464 '\d PUSHNR 1\_s*' ..
465 '\d\+ PUSHNR 2\_s*' ..
466 '\d\+ BLOBSLICE\_s*' ..
467 '\d\+ ECHO 1\_s*' ..
468 '\d\+ RETURN 0',
469 res)
470enddef
471
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200472def s:ScriptFuncUnlet()
473 g:somevar = "value"
474 unlet g:somevar
475 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200476 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200477enddef
478
479def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200480 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200481 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
482 'g:somevar = "value"\_s*' ..
483 '\d PUSHS "value"\_s*' ..
484 '\d STOREG g:somevar\_s*' ..
485 'unlet g:somevar\_s*' ..
486 '\d UNLET g:somevar\_s*' ..
487 'unlet! g:somevar\_s*' ..
488 '\d UNLET! g:somevar\_s*' ..
489 'unlet $SOMEVAR\_s*' ..
490 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200491 res)
492enddef
493
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100494def s:ScriptFuncTry()
495 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200496 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100497 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200498 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100499 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200500 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100501 endtry
502enddef
503
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100504def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200505 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200506 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
507 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100508 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200509 'echo "yes"\_s*' ..
510 '\d PUSHS "yes"\_s*' ..
511 '\d ECHO 1\_s*' ..
512 'catch /fail/\_s*' ..
513 '\d JUMP -> \d\+\_s*' ..
514 '\d PUSH v:exception\_s*' ..
515 '\d PUSHS "fail"\_s*' ..
516 '\d COMPARESTRING =\~\_s*' ..
517 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
518 '\d CATCH\_s*' ..
519 'echo "no"\_s*' ..
520 '\d\+ PUSHS "no"\_s*' ..
521 '\d\+ ECHO 1\_s*' ..
522 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100523 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200524 'throw "end"\_s*' ..
525 '\d\+ PUSHS "end"\_s*' ..
526 '\d\+ THROW\_s*' ..
527 'endtry\_s*' ..
528 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200529 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100530enddef
531
532def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200533 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100534 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100535enddef
536
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100537def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200538 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200539 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200540 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200541 '\d PUSHNR 1\_s*' ..
542 '\d PUSHS "two"\_s*' ..
543 '\d PUSHNR 333\_s*' ..
544 '\d NEWLIST size 3\_s*' ..
545 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100546 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200547 '\d PUSHS "one"\_s*' ..
548 '\d PUSHNR 1\_s*' ..
549 '\d PUSHS "two"\_s*' ..
550 '\d PUSHS "val"\_s*' ..
551 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200552 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100553enddef
554
Bram Moolenaar6e949782020-04-13 17:21:00 +0200555def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100556 echo arg
557enddef
558
559func UserFunc()
560 echo 'nothing'
561endfunc
562
563func UserFuncWithArg(arg)
564 echo a:arg
565endfunc
566
567def s:ScriptFuncCall(): string
568 changenr()
569 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100570 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100571 FuncWithArg(343)
572 ScriptFuncNew()
573 s:ScriptFuncNew()
574 UserFunc()
575 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200576 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100577 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200578 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100579 FuncRefWithArg("bar")
580 return "yes"
581enddef
582
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100583def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200584 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200585 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
586 'changenr()\_s*' ..
587 '\d BCALL changenr(argc 0)\_s*' ..
588 '\d DROP\_s*' ..
589 'char2nr("abc")\_s*' ..
590 '\d PUSHS "abc"\_s*' ..
591 '\d BCALL char2nr(argc 1)\_s*' ..
592 '\d DROP\_s*' ..
593 'Test_disassemble_new()\_s*' ..
594 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
595 '\d DROP\_s*' ..
596 'FuncWithArg(343)\_s*' ..
597 '\d\+ PUSHNR 343\_s*' ..
598 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
599 '\d\+ DROP\_s*' ..
600 'ScriptFuncNew()\_s*' ..
601 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
602 '\d\+ DROP\_s*' ..
603 's:ScriptFuncNew()\_s*' ..
604 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
605 '\d\+ DROP\_s*' ..
606 'UserFunc()\_s*' ..
607 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
608 '\d\+ DROP\_s*' ..
609 'UserFuncWithArg("foo")\_s*' ..
610 '\d\+ PUSHS "foo"\_s*' ..
611 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
612 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200613 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200614 '\d\+ PUSHS "UserFunc"\_s*' ..
615 '\d\+ BCALL function(argc 1)\_s*' ..
616 '\d\+ STORE $0\_s*' ..
617 'FuncRef()\_s*' ..
618 '\d\+ LOAD $\d\_s*' ..
619 '\d\+ PCALL (argc 0)\_s*' ..
620 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200621 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200622 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
623 '\d\+ BCALL function(argc 1)\_s*' ..
624 '\d\+ STORE $1\_s*' ..
625 'FuncRefWithArg("bar")\_s*' ..
626 '\d\+ PUSHS "bar"\_s*' ..
627 '\d\+ LOAD $\d\_s*' ..
628 '\d\+ PCALL (argc 1)\_s*' ..
629 '\d\+ DROP\_s*' ..
630 'return "yes"\_s*' ..
631 '\d\+ PUSHS "yes"\_s*' ..
632 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200633 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100634enddef
635
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200636
637def s:CreateRefs()
638 var local = 'a'
639 def Append(arg: string)
640 local ..= arg
641 enddef
642 g:Append = Append
643 def Get(): string
644 return local
645 enddef
646 g:Get = Get
647enddef
648
649def Test_disassemble_closure()
650 CreateRefs()
651 var res = execute('disass g:Append')
652 assert_match('<lambda>\d\_s*' ..
653 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100654 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200655 '\d LOAD arg\[-1\]\_s*' ..
656 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100657 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100658 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200659 res)
660
661 res = execute('disass g:Get')
662 assert_match('<lambda>\d\_s*' ..
663 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100664 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200665 '\d RETURN',
666 res)
667
668 unlet g:Append
669 unlet g:Get
670enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200671
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100672
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200673def EchoArg(arg: string): string
674 return arg
675enddef
676def RefThis(): func
677 return function('EchoArg')
678enddef
679def s:ScriptPCall()
680 RefThis()("text")
681enddef
682
683def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200684 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200685 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
686 'RefThis()("text")\_s*' ..
687 '\d DCALL RefThis(argc 0)\_s*' ..
688 '\d PUSHS "text"\_s*' ..
689 '\d PCALL top (argc 1)\_s*' ..
690 '\d PCALL end\_s*' ..
691 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100692 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200693 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200694enddef
695
696
Bram Moolenaara26b9702020-04-18 19:53:28 +0200697def s:FuncWithForwardCall(): string
698 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100699enddef
700
701def DefinedLater(arg: string): string
702 return arg
703enddef
704
705def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200706 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200707 assert_match('FuncWithForwardCall\_s*' ..
708 'return g:DefinedLater("yes")\_s*' ..
709 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200710 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200711 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200712 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100713
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200714 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100715 assert_equal('yes', FuncWithForwardCall())
716
Bram Moolenaara26b9702020-04-18 19:53:28 +0200717 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200718 assert_match('FuncWithForwardCall\_s*' ..
719 'return g:DefinedLater("yes")\_s*' ..
720 '\d PUSHS "yes"\_s*' ..
721 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200722 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200723 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100724enddef
725
726
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200727def FuncWithDefault(l: number, arg: string = "default", nr = 77): string
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200728 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100729enddef
730
731def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200732 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200733 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200734 ' arg = "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200735 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200736 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200737 '\d STORE arg\[-2]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200738 ' nr = 77\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200739 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
740 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200741 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar9ce47ec2021-04-20 22:16:39 +0200742 ' return arg .. nr\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200743 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200744 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200745 '\d 2STRING stack\[-1]\_s*' ..
746 '\d\+ CONCAT\_s*' ..
747 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200748 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100749enddef
750
751
Bram Moolenaar158906c2020-02-06 20:39:45 +0100752def HasEval()
753 if has("eval")
754 echo "yes"
755 else
756 echo "no"
757 endif
758enddef
759
760def HasNothing()
761 if has("nothing")
762 echo "yes"
763 else
764 echo "no"
765 endif
766enddef
767
768def HasSomething()
769 if has("nothing")
770 echo "nothing"
771 elseif has("something")
772 echo "something"
773 elseif has("eval")
774 echo "eval"
775 elseif has("less")
776 echo "less"
777 endif
778enddef
779
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100780def HasGuiRunning()
781 if has("gui_running")
782 echo "yes"
783 else
784 echo "no"
785 endif
786enddef
787
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100788def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200789 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200790 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200791 assert_match('HasEval\_s*' ..
792 'if has("eval")\_s*' ..
793 'echo "yes"\_s*' ..
794 '\d PUSHS "yes"\_s*' ..
795 '\d ECHO 1\_s*' ..
796 'else\_s*' ..
797 'echo "no"\_s*' ..
798 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200799 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100800 assert_notmatch('JUMP', instr)
801
Bram Moolenaard2c61702020-09-06 15:58:36 +0200802 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100803 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200804 assert_match('HasNothing\_s*' ..
805 'if has("nothing")\_s*' ..
806 'echo "yes"\_s*' ..
807 'else\_s*' ..
808 'echo "no"\_s*' ..
809 '\d PUSHS "no"\_s*' ..
810 '\d ECHO 1\_s*' ..
811 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200812 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100813 assert_notmatch('PUSHS "yes"', instr)
814 assert_notmatch('JUMP', instr)
815
Bram Moolenaard2c61702020-09-06 15:58:36 +0200816 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100817 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200818 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200819 'if has("nothing")\_s*' ..
820 'echo "nothing"\_s*' ..
821 'elseif has("something")\_s*' ..
822 'echo "something"\_s*' ..
823 'elseif has("eval")\_s*' ..
824 'echo "eval"\_s*' ..
825 '\d PUSHS "eval"\_s*' ..
826 '\d ECHO 1\_s*' ..
827 'elseif has("less").*' ..
828 'echo "less"\_s*' ..
829 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200830 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100831 assert_notmatch('PUSHS "nothing"', instr)
832 assert_notmatch('PUSHS "something"', instr)
833 assert_notmatch('PUSHS "less"', instr)
834 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100835
836 var result: string
837 var instr_expected: string
838 if has('gui')
839 if has('gui_running')
840 # GUI already running, always returns "yes"
841 result = "\nyes"
842 instr_expected = 'HasGuiRunning.*' ..
843 'if has("gui_running")\_s*' ..
844 ' echo "yes"\_s*' ..
845 '\d PUSHS "yes"\_s*' ..
846 '\d ECHO 1\_s*' ..
847 'else\_s*' ..
848 ' echo "no"\_s*' ..
849 'endif'
850 else
851 result = "\nno"
852 if has('unix')
853 # GUI not running but can start later, call has()
854 instr_expected = 'HasGuiRunning.*' ..
855 'if has("gui_running")\_s*' ..
856 '\d PUSHS "gui_running"\_s*' ..
857 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200858 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100859 '\d JUMP_IF_FALSE -> \d\_s*' ..
860 ' echo "yes"\_s*' ..
861 '\d PUSHS "yes"\_s*' ..
862 '\d ECHO 1\_s*' ..
863 'else\_s*' ..
864 '\d JUMP -> \d\_s*' ..
865 ' echo "no"\_s*' ..
866 '\d PUSHS "no"\_s*' ..
867 '\d ECHO 1\_s*' ..
868 'endif'
869 else
870 # GUI not running, always return "no"
871 instr_expected = 'HasGuiRunning.*' ..
872 'if has("gui_running")\_s*' ..
873 ' echo "yes"\_s*' ..
874 'else\_s*' ..
875 ' echo "no"\_s*' ..
876 '\d PUSHS "no"\_s*' ..
877 '\d ECHO 1\_s*' ..
878 'endif'
879 endif
880 endif
881 else
882 # GUI not supported, always return "no"
883 result = "\nno"
884 instr_expected = 'HasGuiRunning.*' ..
885 'if has("gui_running")\_s*' ..
886 ' echo "yes"\_s*' ..
887 'else\_s*' ..
888 ' echo "no"\_s*' ..
889 '\d PUSHS "no"\_s*' ..
890 '\d ECHO 1\_s*' ..
891 'endif'
892 endif
893
894 assert_equal(result, execute('HasGuiRunning()'))
895 instr = execute('disassemble HasGuiRunning')
896 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100897enddef
898
Bram Moolenaarefd88552020-06-18 20:50:10 +0200899def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100900 if 1 < 0
901 return "maybe"
902 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200903 if g:cond
904 return "yes"
905 else
906 return "no"
907 endif
908enddef
909
910def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200911 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200912 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100913 'if 1 < 0\_s*' ..
914 ' return "maybe"\_s*' ..
915 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200916 'if g:cond\_s*' ..
917 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100918 '1 COND2BOOL\_s*' ..
919 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200920 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100921 '3 PUSHS "yes"\_s*' ..
922 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200923 'else\_s*' ..
924 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100925 '5 PUSHS "no"\_s*' ..
926 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200927 instr)
928enddef
929
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100930def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200931 var Funky1: func
932 var Funky2: func = function("len")
933 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100934enddef
935
936def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200937 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200938 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200939 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200940 '0 PUSHFUNC "\[none]"\_s*' ..
941 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200942 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200943 '2 PUSHS "len"\_s*' ..
944 '3 BCALL function(argc 1)\_s*' ..
945 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200946 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200947 '\d PUSHS "UserFunc"\_s*' ..
948 '\d BCALL funcref(argc 1)\_s*' ..
949 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100950 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200951 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100952enddef
953
954if has('channel')
955 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200956 var job1: job
957 var job2: job = job_start("donothing")
958 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100959 enddef
960endif
961
962def Test_disassemble_channel()
963 CheckFeature channel
964
Bram Moolenaarac564082020-09-27 19:05:33 +0200965 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200966 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200967 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200968 '\d PUSHJOB "no process"\_s*' ..
969 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200970 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200971 '\d PUSHS "donothing"\_s*' ..
972 '\d BCALL job_start(argc 1)\_s*' ..
973 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200974 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200975 '\d PUSHCHANNEL 0\_s*' ..
976 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100977 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200978 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100979enddef
980
Bram Moolenaar777770f2020-02-06 21:27:08 +0100981def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100982 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100983 return F("x")
984enddef
985
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100986def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100987 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200988 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200989 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100990 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200991 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200992 '\d STORE $0\_s*' ..
993 'return F("x")\_s*' ..
994 '\d PUSHS "x"\_s*' ..
995 '\d LOAD $0\_s*' ..
996 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200997 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200998 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200999
Bram Moolenaarac564082020-09-27 19:05:33 +02001000 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001001 instr = execute('disassemble ' .. name)
1002 assert_match('<lambda>\d\+\_s*' ..
1003 'return "X" .. a .. "X"\_s*' ..
1004 '\d PUSHS "X"\_s*' ..
1005 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001006 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001007 '\d CONCAT\_s*' ..
1008 '\d PUSHS "X"\_s*' ..
1009 '\d CONCAT\_s*' ..
1010 '\d RETURN',
1011 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001012enddef
1013
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001014def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001015 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001016 return Ref(g:value)
1017enddef
1018
1019def Test_disassemble_lambda_with_type()
1020 g:value = 5
1021 assert_equal(15, LambdaWithType())
1022 var instr = execute('disassemble LambdaWithType')
1023 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001024 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001025 '\d FUNCREF <lambda>\d\+\_s*' ..
1026 '\d STORE $0\_s*' ..
1027 'return Ref(g:value)\_s*' ..
1028 '\d LOADG g:value\_s*' ..
1029 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001030 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001031 '\d PCALL (argc 1)\_s*' ..
1032 '\d RETURN',
1033 instr)
1034enddef
1035
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001036def NestedOuter()
1037 def g:Inner()
1038 echomsg "inner"
1039 enddef
1040enddef
1041
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001042def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001043 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001044 assert_match('NestedOuter\_s*' ..
1045 'def g:Inner()\_s*' ..
1046 'echomsg "inner"\_s*' ..
1047 'enddef\_s*' ..
1048 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001049 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001050 instr)
1051enddef
1052
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001053def NestedDefList()
1054 def
1055 def Info
1056 def /Info
1057 def /Info/
1058enddef
1059
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001060def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001061 var instr = execute('disassemble NestedDefList')
1062 assert_match('NestedDefList\_s*' ..
1063 'def\_s*' ..
1064 '\d DEF \_s*' ..
1065 'def Info\_s*' ..
1066 '\d DEF Info\_s*' ..
1067 'def /Info\_s*' ..
1068 '\d DEF /Info\_s*' ..
1069 'def /Info/\_s*' ..
1070 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001071 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001072 instr)
1073enddef
1074
Bram Moolenaar6e949782020-04-13 17:21:00 +02001075def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001076 if arg == 1 && arg != 2 || arg == 4
1077 return 'yes'
1078 endif
1079 return 'no'
1080enddef
1081
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001082def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001083 assert_equal("yes", AndOr(1))
1084 assert_equal("no", AndOr(2))
1085 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001086 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001087 assert_match('AndOr\_s*' ..
1088 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1089 '\d LOAD arg\[-1]\_s*' ..
1090 '\d PUSHNR 1\_s*' ..
1091 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001092 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001093 '\d LOAD arg\[-1]\_s*' ..
1094 '\d PUSHNR 2\_s*' ..
1095 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001096 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001097 '\d LOAD arg\[-1]\_s*' ..
1098 '\d\+ PUSHNR 4\_s*' ..
1099 '\d\+ COMPAREANY ==\_s*' ..
1100 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001101 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001102enddef
1103
Bram Moolenaar04d05222020-02-06 22:06:54 +01001104def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001105 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001106 for i in range(3)
1107 res->add(i)
1108 endfor
1109 return res
1110enddef
1111
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001112def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001113 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001114 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001115 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001116 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001117 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001118 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001119 '\d STORE $0\_s*' ..
1120 'for i in range(3)\_s*' ..
1121 '\d STORE -1 in $1\_s*' ..
1122 '\d PUSHNR 3\_s*' ..
1123 '\d BCALL range(argc 1)\_s*' ..
1124 '\d FOR $1 -> \d\+\_s*' ..
1125 '\d STORE $2\_s*' ..
1126 'res->add(i)\_s*' ..
1127 '\d LOAD $0\_s*' ..
1128 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001129 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001130 '\d\+ DROP\_s*' ..
1131 'endfor\_s*' ..
1132 '\d\+ JUMP -> \d\+\_s*' ..
1133 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001134 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001135enddef
1136
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001137def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001138 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001139 for str in eval('["one", "two"]')
1140 res ..= str
1141 endfor
1142 return res
1143enddef
1144
1145def Test_disassemble_for_loop_eval()
1146 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001147 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001148 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001149 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001150 '\d PUSHS ""\_s*' ..
1151 '\d STORE $0\_s*' ..
1152 'for str in eval(''\["one", "two"\]'')\_s*' ..
1153 '\d STORE -1 in $1\_s*' ..
1154 '\d PUSHS "\["one", "two"\]"\_s*' ..
1155 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001156 '\d FOR $1 -> \d\+\_s*' ..
1157 '\d STORE $2\_s*' ..
1158 'res ..= str\_s*' ..
1159 '\d\+ LOAD $0\_s*' ..
1160 '\d\+ LOAD $2\_s*' ..
1161 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1162 '\d\+ CONCAT\_s*' ..
1163 '\d\+ STORE $0\_s*' ..
1164 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001165 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001166 '\d\+ DROP\_s*' ..
1167 'return res\_s*' ..
1168 '\d\+ LOAD $0\_s*' ..
1169 '\d\+ RETURN',
1170 instr)
1171enddef
1172
Bram Moolenaar792f7862020-11-23 08:31:18 +01001173def ForLoopUnpack()
1174 for [x1, x2] in [[1, 2], [3, 4]]
1175 echo x1 x2
1176 endfor
1177enddef
1178
1179def Test_disassemble_for_loop_unpack()
1180 var instr = execute('disassemble ForLoopUnpack')
1181 assert_match('ForLoopUnpack\_s*' ..
1182 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1183 '\d\+ STORE -1 in $0\_s*' ..
1184 '\d\+ PUSHNR 1\_s*' ..
1185 '\d\+ PUSHNR 2\_s*' ..
1186 '\d\+ NEWLIST size 2\_s*' ..
1187 '\d\+ PUSHNR 3\_s*' ..
1188 '\d\+ PUSHNR 4\_s*' ..
1189 '\d\+ NEWLIST size 2\_s*' ..
1190 '\d\+ NEWLIST size 2\_s*' ..
1191 '\d\+ FOR $0 -> 16\_s*' ..
1192 '\d\+ UNPACK 2\_s*' ..
1193 '\d\+ STORE $1\_s*' ..
1194 '\d\+ STORE $2\_s*' ..
1195 'echo x1 x2\_s*' ..
1196 '\d\+ LOAD $1\_s*' ..
1197 '\d\+ LOAD $2\_s*' ..
1198 '\d\+ ECHO 2\_s*' ..
1199 'endfor\_s*' ..
1200 '\d\+ JUMP -> 8\_s*' ..
1201 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001202 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001203 instr)
1204enddef
1205
Bram Moolenaarc150c092021-02-13 15:02:46 +01001206def ForLoopContinue()
1207 for nr in [1, 2]
1208 try
1209 echo "ok"
1210 try
1211 echo "deeper"
1212 catch
1213 continue
1214 endtry
1215 catch
1216 echo "not ok"
1217 endtry
1218 endfor
1219enddef
1220
1221def Test_disassemble_for_loop_continue()
1222 var instr = execute('disassemble ForLoopContinue')
1223 assert_match('ForLoopContinue\_s*' ..
1224 'for nr in \[1, 2]\_s*' ..
1225 '0 STORE -1 in $0\_s*' ..
1226 '1 PUSHNR 1\_s*' ..
1227 '2 PUSHNR 2\_s*' ..
1228 '3 NEWLIST size 2\_s*' ..
1229 '4 FOR $0 -> 22\_s*' ..
1230 '5 STORE $1\_s*' ..
1231 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001232 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001233 'echo "ok"\_s*' ..
1234 '7 PUSHS "ok"\_s*' ..
1235 '8 ECHO 1\_s*' ..
1236 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001237 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001238 'echo "deeper"\_s*' ..
1239 '10 PUSHS "deeper"\_s*' ..
1240 '11 ECHO 1\_s*' ..
1241 'catch\_s*' ..
1242 '12 JUMP -> 15\_s*' ..
1243 '13 CATCH\_s*' ..
1244 'continue\_s*' ..
1245 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1246 'endtry\_s*' ..
1247 '15 ENDTRY\_s*' ..
1248 'catch\_s*' ..
1249 '16 JUMP -> 20\_s*' ..
1250 '17 CATCH\_s*' ..
1251 'echo "not ok"\_s*' ..
1252 '18 PUSHS "not ok"\_s*' ..
1253 '19 ECHO 1\_s*' ..
1254 'endtry\_s*' ..
1255 '20 ENDTRY\_s*' ..
1256 'endfor\_s*' ..
1257 '21 JUMP -> 4\_s*' ..
1258 '\d\+ DROP\_s*' ..
1259 '\d\+ RETURN 0',
1260 instr)
1261enddef
1262
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001263let g:number = 42
1264
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001265def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001266 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001267enddef
1268
1269def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001270 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001271 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001272 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001273 '\d PUSHNR 23\_s*' ..
1274 '\d LOADG g:number\_s*' ..
1275 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1276 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001277 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001278 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001279 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001280 instr)
1281enddef
1282
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001283def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 var nr = 3
1285 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001286 nrres = nr - 7
1287 nrres = nr * 7
1288 nrres = nr / 7
1289 nrres = nr % 7
1290
Bram Moolenaarac564082020-09-27 19:05:33 +02001291 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001292 anyres = g:number - 7
1293 anyres = g:number * 7
1294 anyres = g:number / 7
1295 anyres = g:number % 7
1296
1297 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001298 var fl = 3.0
1299 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001300 flres = fl - 7.0
1301 flres = fl * 7.0
1302 flres = fl / 7.0
1303 endif
1304enddef
1305
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001306def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001307 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001308 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001309 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001310 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001311 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001312 '\d LOAD $0.*' ..
1313 '\d PUSHNR 7.*' ..
1314 '\d OPNR +.*' ..
1315 '\d STORE $1.*' ..
1316 'nrres = nr - 7.*' ..
1317 '\d OPNR -.*' ..
1318 'nrres = nr \* 7.*' ..
1319 '\d OPNR \*.*' ..
1320 'nrres = nr / 7.*' ..
1321 '\d OPNR /.*' ..
1322 'nrres = nr % 7.*' ..
1323 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001324 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001325 '\d LOADG g:number.*' ..
1326 '\d PUSHNR 7.*' ..
1327 '\d OPANY +.*' ..
1328 '\d STORE $2.*' ..
1329 'anyres = g:number - 7.*' ..
1330 '\d OPANY -.*' ..
1331 'anyres = g:number \* 7.*' ..
1332 '\d OPANY \*.*' ..
1333 'anyres = g:number / 7.*' ..
1334 '\d OPANY /.*' ..
1335 'anyres = g:number % 7.*' ..
1336 '\d OPANY %.*',
1337 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001338 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001339 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001340 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001341 '\d PUSHF 3.0.*' ..
1342 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001343 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001344 '\d LOAD $3.*' ..
1345 '\d PUSHF 7.0.*' ..
1346 '\d OPFLOAT +.*' ..
1347 '\d STORE $4.*' ..
1348 'flres = fl - 7.0.*' ..
1349 '\d OPFLOAT -.*' ..
1350 'flres = fl \* 7.0.*' ..
1351 '\d OPFLOAT \*.*' ..
1352 'flres = fl / 7.0.*' ..
1353 '\d OPFLOAT /.*',
1354 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001355 endif
1356enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001357
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001358def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001359 var reslist = [1, 2] + [3, 4]
1360 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001361enddef
1362
1363def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001364 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001365 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001367 '\d PUSHNR 1.*' ..
1368 '\d PUSHNR 2.*' ..
1369 '\d NEWLIST size 2.*' ..
1370 '\d PUSHNR 3.*' ..
1371 '\d PUSHNR 4.*' ..
1372 '\d NEWLIST size 2.*' ..
1373 '\d ADDLIST.*' ..
1374 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001375 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001376 '\d PUSHBLOB 0z1122.*' ..
1377 '\d PUSHBLOB 0z3344.*' ..
1378 '\d ADDBLOB.*' ..
1379 '\d STORE $.*',
1380 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001381enddef
1382
1383let g:aa = 'aa'
1384def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001385 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001386 return res
1387enddef
1388
1389def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001390 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001391 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001392 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001393 '\d LOADG g:aa.*' ..
1394 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001395 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001396 '\d CONCAT.*' ..
1397 '\d STORE $.*',
1398 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001399 assert_equal('aabb', ConcatString())
1400enddef
1401
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001402def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 var s = "abcd"
1404 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001405 return res
1406enddef
1407
1408def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001409 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001410 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001411 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001412 '\d PUSHS "abcd"\_s*' ..
1413 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001414 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001415 '\d LOAD $0\_s*' ..
1416 '\d PUSHNR 1\_s*' ..
1417 '\d STRINDEX\_s*' ..
1418 '\d STORE $1\_s*',
1419 instr)
1420 assert_equal('b', StringIndex())
1421enddef
1422
Bram Moolenaared591872020-08-15 22:14:53 +02001423def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001424 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001425 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001426 return res
1427enddef
1428
1429def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001431 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001432 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001433 '\d PUSHS "abcd"\_s*' ..
1434 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001435 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001436 '\d LOAD $0\_s*' ..
1437 '\d PUSHNR 1\_s*' ..
1438 '\d PUSHNR 8\_s*' ..
1439 '\d STRSLICE\_s*' ..
1440 '\d STORE $1\_s*',
1441 instr)
1442 assert_equal('bcd', StringSlice())
1443enddef
1444
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001445def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001446 var l = [1, 2, 3]
1447 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001448 return res
1449enddef
1450
1451def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001452 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001453 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001454 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001455 '\d PUSHNR 1\_s*' ..
1456 '\d PUSHNR 2\_s*' ..
1457 '\d PUSHNR 3\_s*' ..
1458 '\d NEWLIST size 3\_s*' ..
1459 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001460 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001461 '\d LOAD $0\_s*' ..
1462 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001463 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001464 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001465 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001466 assert_equal(2, ListIndex())
1467enddef
1468
Bram Moolenaared591872020-08-15 22:14:53 +02001469def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001470 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001471 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001472 return res
1473enddef
1474
1475def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001476 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001477 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001478 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001479 '\d PUSHNR 1\_s*' ..
1480 '\d PUSHNR 2\_s*' ..
1481 '\d PUSHNR 3\_s*' ..
1482 '\d NEWLIST size 3\_s*' ..
1483 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001484 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001485 '\d LOAD $0\_s*' ..
1486 '\d PUSHNR 1\_s*' ..
1487 '\d PUSHNR 8\_s*' ..
1488 '\d LISTSLICE\_s*' ..
1489 '\d STORE $1\_s*',
1490 instr)
1491 assert_equal([2, 3], ListSlice())
1492enddef
1493
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001494def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001495 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001496 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001497 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001498 return res
1499enddef
1500
1501def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001502 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001503 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001504 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001505 '\d PUSHS "item"\_s*' ..
1506 '\d PUSHNR 1\_s*' ..
1507 '\d NEWDICT size 1\_s*' ..
1508 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001509 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001510 '\d\+ LOAD $0\_s*' ..
1511 '\d\+ MEMBER item\_s*' ..
1512 '\d\+ STORE $1\_s*' ..
1513 'res = d\["item"\]\_s*' ..
1514 '\d\+ LOAD $0\_s*' ..
1515 '\d\+ PUSHS "item"\_s*' ..
1516 '\d\+ MEMBER\_s*' ..
1517 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001518 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001519 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001520enddef
1521
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001522let somelist = [1, 2, 3, 4, 5]
1523def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001524 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001525 return res
1526enddef
1527
1528def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001530 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001531 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001532 '\d LOADG g:somelist\_s*' ..
1533 '\d PUSHNR 2\_s*' ..
1534 '\d ANYINDEX\_s*' ..
1535 '\d STORE $0\_s*' ..
1536 'return res\_s*' ..
1537 '\d LOAD $0\_s*' ..
1538 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1539 '\d RETURN',
1540 instr)
1541 assert_equal(3, AnyIndex())
1542enddef
1543
1544def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001545 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001546 return res
1547enddef
1548
1549def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001550 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001551 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001552 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001553 '\d LOADG g:somelist\_s*' ..
1554 '\d PUSHNR 1\_s*' ..
1555 '\d PUSHNR 3\_s*' ..
1556 '\d ANYSLICE\_s*' ..
1557 '\d STORE $0\_s*' ..
1558 'return res\_s*' ..
1559 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001560 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001561 '\d RETURN',
1562 instr)
1563 assert_equal([2, 3, 4], AnySlice())
1564enddef
1565
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001566def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001567 var nr = 9
1568 var plus = +nr
1569 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001570 return res
1571enddef
1572
1573def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001574 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001575 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001576 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001577 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001578 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001579 '\d LOAD $0\_s*' ..
1580 '\d CHECKNR\_s*' ..
1581 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001582 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001583 '\d LOAD $0\_s*' ..
1584 '\d NEGATENR\_s*' ..
1585 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001586 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001587 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001588enddef
1589
1590def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001591 var flag = true
1592 var invert = !flag
1593 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001594 return res
1595enddef
1596
1597def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001598 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001599 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001600 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001601 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001602 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001603 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001604 '\d LOAD $0\_s*' ..
1605 '\d INVERT (!val)\_s*' ..
1606 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001607 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001608 '\d LOAD $0\_s*' ..
1609 '\d 2BOOL (!!val)\_s*' ..
1610 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001611 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001612 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001613enddef
1614
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001615def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001616 var name: bool = 1 && 0 || 1
1617 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001618enddef
1619
1620def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001621 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001622 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001623 'var name: bool = 1 && 0 || 1\_s*' ..
1624 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001625 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001626 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1627 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001628 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001629 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1630 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001631 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001632 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001633 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001634 '\d\+ LOAD $0\_s*' ..
1635 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001636 instr)
1637 assert_equal(true, InvertBool())
1638enddef
1639
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001640def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001641 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001642 ['true == isFalse', 'COMPAREBOOL =='],
1643 ['true != isFalse', 'COMPAREBOOL !='],
1644 ['v:none == isNull', 'COMPARESPECIAL =='],
1645 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001646
Bram Moolenaara5565e42020-05-09 15:44:01 +02001647 ['111 == aNumber', 'COMPARENR =='],
1648 ['111 != aNumber', 'COMPARENR !='],
1649 ['111 > aNumber', 'COMPARENR >'],
1650 ['111 < aNumber', 'COMPARENR <'],
1651 ['111 >= aNumber', 'COMPARENR >='],
1652 ['111 <= aNumber', 'COMPARENR <='],
1653 ['111 =~ aNumber', 'COMPARENR =\~'],
1654 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001655
Bram Moolenaara5565e42020-05-09 15:44:01 +02001656 ['"xx" != aString', 'COMPARESTRING !='],
1657 ['"xx" > aString', 'COMPARESTRING >'],
1658 ['"xx" < aString', 'COMPARESTRING <'],
1659 ['"xx" >= aString', 'COMPARESTRING >='],
1660 ['"xx" <= aString', 'COMPARESTRING <='],
1661 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1662 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1663 ['"xx" is aString', 'COMPARESTRING is'],
1664 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001665
Bram Moolenaara5565e42020-05-09 15:44:01 +02001666 ['0z11 == aBlob', 'COMPAREBLOB =='],
1667 ['0z11 != aBlob', 'COMPAREBLOB !='],
1668 ['0z11 is aBlob', 'COMPAREBLOB is'],
1669 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001670
Bram Moolenaara5565e42020-05-09 15:44:01 +02001671 ['[1, 2] == aList', 'COMPARELIST =='],
1672 ['[1, 2] != aList', 'COMPARELIST !='],
1673 ['[1, 2] is aList', 'COMPARELIST is'],
1674 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001675
Bram Moolenaare0de1712020-12-02 17:36:54 +01001676 ['{a: 1} == aDict', 'COMPAREDICT =='],
1677 ['{a: 1} != aDict', 'COMPAREDICT !='],
1678 ['{a: 1} is aDict', 'COMPAREDICT is'],
1679 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001680
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001681 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1682 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1683 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1684 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001685
1686 ['77 == g:xx', 'COMPAREANY =='],
1687 ['77 != g:xx', 'COMPAREANY !='],
1688 ['77 > g:xx', 'COMPAREANY >'],
1689 ['77 < g:xx', 'COMPAREANY <'],
1690 ['77 >= g:xx', 'COMPAREANY >='],
1691 ['77 <= g:xx', 'COMPAREANY <='],
1692 ['77 =~ g:xx', 'COMPAREANY =\~'],
1693 ['77 !~ g:xx', 'COMPAREANY !\~'],
1694 ['77 is g:xx', 'COMPAREANY is'],
1695 ['77 isnot g:xx', 'COMPAREANY isnot'],
1696 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001697 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001698 if has('float')
1699 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001700 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1701 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1702 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1703 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1704 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1705 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1706 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1707 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001708 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001709 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001710 endif
1711
Bram Moolenaarac564082020-09-27 19:05:33 +02001712 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001713 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001714 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001715 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001716 ' var isFalse = false',
1717 ' var isNull = v:null',
1718 ' var aNumber = 222',
1719 ' var aString = "yy"',
1720 ' var aBlob = 0z22',
1721 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001722 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001723 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001724 ' if ' .. case[0],
1725 ' echo 42'
1726 ' endif',
1727 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001728 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001729 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001730 assert_match('TestCase' .. nr .. '.*' ..
1731 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1732 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001733 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001734 '\d ' .. case[1] .. '.*' ..
1735 '\d JUMP_IF_FALSE -> \d\+.*',
1736 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001737
1738 nr += 1
1739 endfor
1740
Bram Moolenaar22da5592020-03-19 14:52:20 +01001741 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001742enddef
1743
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001744def s:FalsyOp()
1745 echo g:flag ?? "yes"
1746 echo [] ?? "empty list"
1747 echo "" ?? "empty string"
1748enddef
1749
1750def Test_dsassemble_falsy_op()
1751 var res = execute('disass s:FalsyOp')
1752 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1753 'echo g:flag ?? "yes"\_s*' ..
1754 '0 LOADG g:flag\_s*' ..
1755 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1756 '2 PUSHS "yes"\_s*' ..
1757 '3 ECHO 1\_s*' ..
1758 'echo \[\] ?? "empty list"\_s*' ..
1759 '4 NEWLIST size 0\_s*' ..
1760 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1761 '6 PUSHS "empty list"\_s*' ..
1762 '7 ECHO 1\_s*' ..
1763 'echo "" ?? "empty string"\_s*' ..
1764 '\d\+ PUSHS "empty string"\_s*' ..
1765 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001766 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001767 res)
1768enddef
1769
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001770def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001771 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001772 ['"xx" == "yy"', false],
1773 ['"aa" == "aa"', true],
1774 ['has("eval") ? true : false', true],
1775 ['has("asdf") ? true : false', false],
1776 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001777
Bram Moolenaarac564082020-09-27 19:05:33 +02001778 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001779 for case in cases
1780 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001781 ' if ' .. case[0],
1782 ' echo 42'
1783 ' endif',
1784 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001785 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001786 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001787 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001788 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001789 assert_match('TestCase' .. nr .. '.*' ..
1790 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1791 '\d PUSHNR 42.*' ..
1792 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001793 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001794 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001795 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001796 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001797 assert_match('TestCase' .. nr .. '.*' ..
1798 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1799 'echo 42[ \n]*' ..
1800 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001801 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001802 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001803 endif
1804
1805 nr += 1
1806 endfor
1807
1808 delete('Xdisassemble')
1809enddef
1810
Bram Moolenaarad39c092020-02-26 18:23:43 +01001811def s:Execute()
1812 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001813 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001814 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001815 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001816 execute 'help ' .. tag
1817enddef
1818
1819def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001820 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001821 assert_match('\<SNR>\d*_Execute\_s*' ..
1822 "execute 'help vim9.txt'\\_s*" ..
1823 '\d PUSHS "help vim9.txt"\_s*' ..
1824 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001825 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001826 '\d PUSHS "help vim9.txt"\_s*' ..
1827 '\d STORE $0\_s*' ..
1828 'execute cmd\_s*' ..
1829 '\d LOAD $0\_s*' ..
1830 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001831 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001832 '\d PUSHS "vim9.txt"\_s*' ..
1833 '\d STORE $1\_s*' ..
1834 "execute 'help ' .. tag\\_s*" ..
1835 '\d\+ PUSHS "help "\_s*' ..
1836 '\d\+ LOAD $1\_s*' ..
1837 '\d\+ CONCAT\_s*' ..
1838 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001839 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001840 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001841enddef
1842
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001843def s:Echomsg()
1844 echomsg 'some' 'message'
1845 echoerr 'went' .. 'wrong'
1846enddef
1847
1848def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001849 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001850 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1851 "echomsg 'some' 'message'\\_s*" ..
1852 '\d PUSHS "some"\_s*' ..
1853 '\d PUSHS "message"\_s*' ..
1854 '\d ECHOMSG 2\_s*' ..
1855 "echoerr 'went' .. 'wrong'\\_s*" ..
1856 '\d PUSHS "wentwrong"\_s*' ..
1857 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001858 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001859 res)
1860enddef
1861
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001862def SomeStringArg(arg: string)
1863 echo arg
1864enddef
1865
1866def SomeAnyArg(arg: any)
1867 echo arg
1868enddef
1869
1870def SomeStringArgAndReturn(arg: string): string
1871 return arg
1872enddef
1873
1874def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001875 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001876 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1877 '\d *echo arg.*' ..
1878 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001879 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001880
Bram Moolenaarac564082020-09-27 19:05:33 +02001881 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001882 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1883 '\d *echo arg\_s*' ..
1884 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001885 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001886
Bram Moolenaarac564082020-09-27 19:05:33 +02001887 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001888 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1889 '\d *return arg\_s*' ..
1890 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001891 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001892enddef
1893
Bram Moolenaar09689a02020-05-09 22:50:08 +02001894def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001895 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001896 vim9script
1897 def FuncOne(): string
1898 return FuncTwo()
1899 enddef
1900 def FuncTwo(): string
1901 return 'two'
1902 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001903 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001904 END
1905 writefile(lines, 'Xdisassemble')
1906 source Xdisassemble
1907
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001908 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001909 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1910 'return FuncTwo()\_s*' ..
1911 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001912 '\d RETURN',
1913 g:res_FuncOne)
1914
1915 delete('Xdisassemble')
1916 unlet g:res_FuncOne
1917enddef
1918
Bram Moolenaar61a89812020-05-07 16:58:17 +02001919def s:ConcatStrings(): string
1920 return 'one' .. 'two' .. 'three'
1921enddef
1922
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001923def s:ComputeConst(): number
1924 return 2 + 3 * 4 / 6 + 7
1925enddef
1926
Bram Moolenaar1c747212020-05-09 18:28:34 +02001927def s:ComputeConstParen(): number
1928 return ((2 + 4) * (8 / 2)) / (3 + 4)
1929enddef
1930
Bram Moolenaar61a89812020-05-07 16:58:17 +02001931def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001932 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001933 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1934 "return 'one' .. 'two' .. 'three'\\_s*" ..
1935 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001936 '\d RETURN',
1937 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001938
1939 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001940 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1941 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1942 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001943 '\d RETURN',
1944 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001945
1946 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001947 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1948 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1949 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001950 '\d RETURN',
1951 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001952enddef
1953
Bram Moolenaar389df252020-07-09 21:20:47 +02001954def s:CallAppend()
1955 eval "some text"->append(2)
1956enddef
1957
1958def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001959 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001960 assert_match('<SNR>\d*_CallAppend\_s*' ..
1961 'eval "some text"->append(2)\_s*' ..
1962 '\d PUSHS "some text"\_s*' ..
1963 '\d PUSHNR 2\_s*' ..
1964 '\d SHUFFLE 2 up 1\_s*' ..
1965 '\d BCALL append(argc 2)\_s*' ..
1966 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001967 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001968 res)
1969enddef
1970
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001971
1972def s:SilentMessage()
1973 silent echomsg "text"
1974 silent! echoerr "error"
1975enddef
1976
1977def Test_silent()
1978 var res = execute('disass s:SilentMessage')
1979 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1980 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001981 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001982 '\d PUSHS "text"\_s*' ..
1983 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001984 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001985 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001986 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001987 '\d PUSHS "error"\_s*' ..
1988 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001989 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001990 '\d\+ RETURN 0',
1991 res)
1992enddef
1993
1994def s:SilentIf()
1995 silent if 4 == g:five
1996 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001997 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001998enddef
1999
2000def Test_silent_if()
2001 var res = execute('disass s:SilentIf')
2002 assert_match('<SNR>\d*_SilentIf\_s*' ..
2003 'silent if 4 == g:five\_s*' ..
2004 '\d\+ CMDMOD silent\_s*' ..
2005 '\d\+ PUSHNR 4\_s*' ..
2006 '\d\+ LOADG g:five\_s*' ..
2007 '\d\+ COMPAREANY ==\_s*' ..
2008 '\d\+ CMDMOD_REV\_s*' ..
2009 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2010 'silent elseif 4 == g:five\_s*' ..
2011 '\d\+ JUMP -> \d\+\_s*' ..
2012 '\d\+ CMDMOD silent\_s*' ..
2013 '\d\+ PUSHNR 4\_s*' ..
2014 '\d\+ LOADG g:five\_s*' ..
2015 '\d\+ COMPAREANY ==\_s*' ..
2016 '\d\+ CMDMOD_REV\_s*' ..
2017 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002018 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002019 '\d\+ RETURN 0',
2020 res)
2021enddef
2022
2023def s:SilentFor()
2024 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002025 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002026enddef
2027
2028def Test_silent_for()
2029 var res = execute('disass s:SilentFor')
2030 assert_match('<SNR>\d*_SilentFor\_s*' ..
2031 'silent for i in \[0\]\_s*' ..
2032 '\d CMDMOD silent\_s*' ..
2033 '\d STORE -1 in $0\_s*' ..
2034 '\d PUSHNR 0\_s*' ..
2035 '\d NEWLIST size 1\_s*' ..
2036 '\d CMDMOD_REV\_s*' ..
2037 '5 FOR $0 -> 8\_s*' ..
2038 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002039 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002040 '\d JUMP -> 5\_s*' ..
2041 '8 DROP\_s*' ..
2042 '\d RETURN 0\_s*',
2043 res)
2044enddef
2045
2046def s:SilentWhile()
2047 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002048 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002049enddef
2050
2051def Test_silent_while()
2052 var res = execute('disass s:SilentWhile')
2053 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2054 'silent while g:not\_s*' ..
2055 '0 CMDMOD silent\_s*' ..
2056 '\d LOADG g:not\_s*' ..
2057 '\d COND2BOOL\_s*' ..
2058 '\d CMDMOD_REV\_s*' ..
2059 '\d JUMP_IF_FALSE -> 6\_s*' ..
2060
Bram Moolenaarfa984412021-03-25 22:15:28 +01002061 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002062 '\d JUMP -> 0\_s*' ..
2063 '6 RETURN 0\_s*',
2064 res)
2065enddef
2066
2067def s:SilentReturn(): string
2068 silent return "done"
2069enddef
2070
2071def Test_silent_return()
2072 var res = execute('disass s:SilentReturn')
2073 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2074 'silent return "done"\_s*' ..
2075 '\d CMDMOD silent\_s*' ..
2076 '\d PUSHS "done"\_s*' ..
2077 '\d CMDMOD_REV\_s*' ..
2078 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002079 res)
2080enddef
2081
Bram Moolenaarb2049902021-01-24 12:53:53 +01002082def s:Profiled(): string
2083 echo "profiled"
2084 return "done"
2085enddef
2086
2087def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002088 if !has('profile')
2089 MissingFeature 'profile'
2090 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002091 var res = execute('disass! s:Profiled')
2092 assert_match('<SNR>\d*_Profiled\_s*' ..
2093 'echo "profiled"\_s*' ..
2094 '\d PROFILE START line 1\_s*' ..
2095 '\d PUSHS "profiled"\_s*' ..
2096 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002097 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002098 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002099 '\d PROFILE START line 2\_s*' ..
2100 '\d PUSHS "done"\_s*' ..
2101 '\d RETURN\_s*' ..
2102 '\d PROFILE END',
2103 res)
2104enddef
2105
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002106def s:EchoMessages()
2107 echohl ErrorMsg | echom v:exception | echohl NONE
2108enddef
2109
2110def Test_disassemble_nextcmd()
2111 # splitting commands and removing trailing blanks should not change the line
2112 var res = execute('disass s:EchoMessages')
2113 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2114 'echohl ErrorMsg | echom v:exception | echohl NONE',
2115 res)
2116enddef
2117
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002118
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002119" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker