blob: bf88d9396a6da1bf425ecbcc33d0ac95e43303e6 [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 Moolenaar38a3bfa2021-03-29 22:14:55 +0200727def FuncWithDefault(arg: string = 'default', nr = 77): string
728 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 Moolenaar38a3bfa2021-03-29 22:14:55 +0200734 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200735 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200736 '\d STORE arg\[-2]\_s*' ..
737 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
738 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200739 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200740 'return arg .. nr\_s*' ..
741 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200742 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200743 '\d 2STRING stack\[-1]\_s*' ..
744 '\d\+ CONCAT\_s*' ..
745 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200746 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100747enddef
748
749
Bram Moolenaar158906c2020-02-06 20:39:45 +0100750def HasEval()
751 if has("eval")
752 echo "yes"
753 else
754 echo "no"
755 endif
756enddef
757
758def HasNothing()
759 if has("nothing")
760 echo "yes"
761 else
762 echo "no"
763 endif
764enddef
765
766def HasSomething()
767 if has("nothing")
768 echo "nothing"
769 elseif has("something")
770 echo "something"
771 elseif has("eval")
772 echo "eval"
773 elseif has("less")
774 echo "less"
775 endif
776enddef
777
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100778def HasGuiRunning()
779 if has("gui_running")
780 echo "yes"
781 else
782 echo "no"
783 endif
784enddef
785
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100786def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200787 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200788 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200789 assert_match('HasEval\_s*' ..
790 'if has("eval")\_s*' ..
791 'echo "yes"\_s*' ..
792 '\d PUSHS "yes"\_s*' ..
793 '\d ECHO 1\_s*' ..
794 'else\_s*' ..
795 'echo "no"\_s*' ..
796 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200797 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100798 assert_notmatch('JUMP', instr)
799
Bram Moolenaard2c61702020-09-06 15:58:36 +0200800 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100801 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200802 assert_match('HasNothing\_s*' ..
803 'if has("nothing")\_s*' ..
804 'echo "yes"\_s*' ..
805 'else\_s*' ..
806 'echo "no"\_s*' ..
807 '\d PUSHS "no"\_s*' ..
808 '\d ECHO 1\_s*' ..
809 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200810 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100811 assert_notmatch('PUSHS "yes"', instr)
812 assert_notmatch('JUMP', instr)
813
Bram Moolenaard2c61702020-09-06 15:58:36 +0200814 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100815 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200816 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200817 'if has("nothing")\_s*' ..
818 'echo "nothing"\_s*' ..
819 'elseif has("something")\_s*' ..
820 'echo "something"\_s*' ..
821 'elseif has("eval")\_s*' ..
822 'echo "eval"\_s*' ..
823 '\d PUSHS "eval"\_s*' ..
824 '\d ECHO 1\_s*' ..
825 'elseif has("less").*' ..
826 'echo "less"\_s*' ..
827 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200828 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100829 assert_notmatch('PUSHS "nothing"', instr)
830 assert_notmatch('PUSHS "something"', instr)
831 assert_notmatch('PUSHS "less"', instr)
832 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100833
834 var result: string
835 var instr_expected: string
836 if has('gui')
837 if has('gui_running')
838 # GUI already running, always returns "yes"
839 result = "\nyes"
840 instr_expected = 'HasGuiRunning.*' ..
841 'if has("gui_running")\_s*' ..
842 ' echo "yes"\_s*' ..
843 '\d PUSHS "yes"\_s*' ..
844 '\d ECHO 1\_s*' ..
845 'else\_s*' ..
846 ' echo "no"\_s*' ..
847 'endif'
848 else
849 result = "\nno"
850 if has('unix')
851 # GUI not running but can start later, call has()
852 instr_expected = 'HasGuiRunning.*' ..
853 'if has("gui_running")\_s*' ..
854 '\d PUSHS "gui_running"\_s*' ..
855 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200856 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100857 '\d JUMP_IF_FALSE -> \d\_s*' ..
858 ' echo "yes"\_s*' ..
859 '\d PUSHS "yes"\_s*' ..
860 '\d ECHO 1\_s*' ..
861 'else\_s*' ..
862 '\d JUMP -> \d\_s*' ..
863 ' echo "no"\_s*' ..
864 '\d PUSHS "no"\_s*' ..
865 '\d ECHO 1\_s*' ..
866 'endif'
867 else
868 # GUI not running, always return "no"
869 instr_expected = 'HasGuiRunning.*' ..
870 'if has("gui_running")\_s*' ..
871 ' echo "yes"\_s*' ..
872 'else\_s*' ..
873 ' echo "no"\_s*' ..
874 '\d PUSHS "no"\_s*' ..
875 '\d ECHO 1\_s*' ..
876 'endif'
877 endif
878 endif
879 else
880 # GUI not supported, always return "no"
881 result = "\nno"
882 instr_expected = 'HasGuiRunning.*' ..
883 'if has("gui_running")\_s*' ..
884 ' echo "yes"\_s*' ..
885 'else\_s*' ..
886 ' echo "no"\_s*' ..
887 '\d PUSHS "no"\_s*' ..
888 '\d ECHO 1\_s*' ..
889 'endif'
890 endif
891
892 assert_equal(result, execute('HasGuiRunning()'))
893 instr = execute('disassemble HasGuiRunning')
894 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100895enddef
896
Bram Moolenaarefd88552020-06-18 20:50:10 +0200897def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100898 if 1 < 0
899 return "maybe"
900 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200901 if g:cond
902 return "yes"
903 else
904 return "no"
905 endif
906enddef
907
908def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200909 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200910 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100911 'if 1 < 0\_s*' ..
912 ' return "maybe"\_s*' ..
913 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200914 'if g:cond\_s*' ..
915 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100916 '1 COND2BOOL\_s*' ..
917 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200918 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100919 '3 PUSHS "yes"\_s*' ..
920 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200921 'else\_s*' ..
922 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100923 '5 PUSHS "no"\_s*' ..
924 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200925 instr)
926enddef
927
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100928def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200929 var Funky1: func
930 var Funky2: func = function("len")
931 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100932enddef
933
934def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200935 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200936 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200937 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200938 '0 PUSHFUNC "\[none]"\_s*' ..
939 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200940 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200941 '2 PUSHS "len"\_s*' ..
942 '3 BCALL function(argc 1)\_s*' ..
943 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200944 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200945 '\d PUSHS "UserFunc"\_s*' ..
946 '\d BCALL funcref(argc 1)\_s*' ..
947 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100948 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200949 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100950enddef
951
952if has('channel')
953 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200954 var job1: job
955 var job2: job = job_start("donothing")
956 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100957 enddef
958endif
959
960def Test_disassemble_channel()
961 CheckFeature channel
962
Bram Moolenaarac564082020-09-27 19:05:33 +0200963 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200964 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200965 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200966 '\d PUSHJOB "no process"\_s*' ..
967 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200968 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200969 '\d PUSHS "donothing"\_s*' ..
970 '\d BCALL job_start(argc 1)\_s*' ..
971 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200972 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200973 '\d PUSHCHANNEL 0\_s*' ..
974 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100975 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200976 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100977enddef
978
Bram Moolenaar777770f2020-02-06 21:27:08 +0100979def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100980 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100981 return F("x")
982enddef
983
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100984def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100985 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200986 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200987 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100988 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200989 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200990 '\d STORE $0\_s*' ..
991 'return F("x")\_s*' ..
992 '\d PUSHS "x"\_s*' ..
993 '\d LOAD $0\_s*' ..
994 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200995 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200996 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200997
Bram Moolenaarac564082020-09-27 19:05:33 +0200998 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200999 instr = execute('disassemble ' .. name)
1000 assert_match('<lambda>\d\+\_s*' ..
1001 'return "X" .. a .. "X"\_s*' ..
1002 '\d PUSHS "X"\_s*' ..
1003 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001004 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +02001005 '\d CONCAT\_s*' ..
1006 '\d PUSHS "X"\_s*' ..
1007 '\d CONCAT\_s*' ..
1008 '\d RETURN',
1009 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001010enddef
1011
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001012def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001013 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001014 return Ref(g:value)
1015enddef
1016
1017def Test_disassemble_lambda_with_type()
1018 g:value = 5
1019 assert_equal(15, LambdaWithType())
1020 var instr = execute('disassemble LambdaWithType')
1021 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001022 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001023 '\d FUNCREF <lambda>\d\+\_s*' ..
1024 '\d STORE $0\_s*' ..
1025 'return Ref(g:value)\_s*' ..
1026 '\d LOADG g:value\_s*' ..
1027 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001028 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001029 '\d PCALL (argc 1)\_s*' ..
1030 '\d RETURN',
1031 instr)
1032enddef
1033
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001034def NestedOuter()
1035 def g:Inner()
1036 echomsg "inner"
1037 enddef
1038enddef
1039
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001040def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001041 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001042 assert_match('NestedOuter\_s*' ..
1043 'def g:Inner()\_s*' ..
1044 'echomsg "inner"\_s*' ..
1045 'enddef\_s*' ..
1046 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001047 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001048 instr)
1049enddef
1050
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001051def NestedDefList()
1052 def
1053 def Info
1054 def /Info
1055 def /Info/
1056enddef
1057
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001058def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001059 var instr = execute('disassemble NestedDefList')
1060 assert_match('NestedDefList\_s*' ..
1061 'def\_s*' ..
1062 '\d DEF \_s*' ..
1063 'def Info\_s*' ..
1064 '\d DEF Info\_s*' ..
1065 'def /Info\_s*' ..
1066 '\d DEF /Info\_s*' ..
1067 'def /Info/\_s*' ..
1068 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001069 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001070 instr)
1071enddef
1072
Bram Moolenaar6e949782020-04-13 17:21:00 +02001073def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001074 if arg == 1 && arg != 2 || arg == 4
1075 return 'yes'
1076 endif
1077 return 'no'
1078enddef
1079
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001080def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001081 assert_equal("yes", AndOr(1))
1082 assert_equal("no", AndOr(2))
1083 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001084 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001085 assert_match('AndOr\_s*' ..
1086 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1087 '\d LOAD arg\[-1]\_s*' ..
1088 '\d PUSHNR 1\_s*' ..
1089 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001090 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001091 '\d LOAD arg\[-1]\_s*' ..
1092 '\d PUSHNR 2\_s*' ..
1093 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001094 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001095 '\d LOAD arg\[-1]\_s*' ..
1096 '\d\+ PUSHNR 4\_s*' ..
1097 '\d\+ COMPAREANY ==\_s*' ..
1098 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001099 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001100enddef
1101
Bram Moolenaar04d05222020-02-06 22:06:54 +01001102def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001103 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001104 for i in range(3)
1105 res->add(i)
1106 endfor
1107 return res
1108enddef
1109
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001110def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001111 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001112 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001113 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001114 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001115 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001116 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001117 '\d STORE $0\_s*' ..
1118 'for i in range(3)\_s*' ..
1119 '\d STORE -1 in $1\_s*' ..
1120 '\d PUSHNR 3\_s*' ..
1121 '\d BCALL range(argc 1)\_s*' ..
1122 '\d FOR $1 -> \d\+\_s*' ..
1123 '\d STORE $2\_s*' ..
1124 'res->add(i)\_s*' ..
1125 '\d LOAD $0\_s*' ..
1126 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001127 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001128 '\d\+ DROP\_s*' ..
1129 'endfor\_s*' ..
1130 '\d\+ JUMP -> \d\+\_s*' ..
1131 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001132 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001133enddef
1134
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001135def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001136 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001137 for str in eval('["one", "two"]')
1138 res ..= str
1139 endfor
1140 return res
1141enddef
1142
1143def Test_disassemble_for_loop_eval()
1144 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001145 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001146 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001147 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001148 '\d PUSHS ""\_s*' ..
1149 '\d STORE $0\_s*' ..
1150 'for str in eval(''\["one", "two"\]'')\_s*' ..
1151 '\d STORE -1 in $1\_s*' ..
1152 '\d PUSHS "\["one", "two"\]"\_s*' ..
1153 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001154 '\d FOR $1 -> \d\+\_s*' ..
1155 '\d STORE $2\_s*' ..
1156 'res ..= str\_s*' ..
1157 '\d\+ LOAD $0\_s*' ..
1158 '\d\+ LOAD $2\_s*' ..
1159 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1160 '\d\+ CONCAT\_s*' ..
1161 '\d\+ STORE $0\_s*' ..
1162 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001163 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001164 '\d\+ DROP\_s*' ..
1165 'return res\_s*' ..
1166 '\d\+ LOAD $0\_s*' ..
1167 '\d\+ RETURN',
1168 instr)
1169enddef
1170
Bram Moolenaar792f7862020-11-23 08:31:18 +01001171def ForLoopUnpack()
1172 for [x1, x2] in [[1, 2], [3, 4]]
1173 echo x1 x2
1174 endfor
1175enddef
1176
1177def Test_disassemble_for_loop_unpack()
1178 var instr = execute('disassemble ForLoopUnpack')
1179 assert_match('ForLoopUnpack\_s*' ..
1180 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1181 '\d\+ STORE -1 in $0\_s*' ..
1182 '\d\+ PUSHNR 1\_s*' ..
1183 '\d\+ PUSHNR 2\_s*' ..
1184 '\d\+ NEWLIST size 2\_s*' ..
1185 '\d\+ PUSHNR 3\_s*' ..
1186 '\d\+ PUSHNR 4\_s*' ..
1187 '\d\+ NEWLIST size 2\_s*' ..
1188 '\d\+ NEWLIST size 2\_s*' ..
1189 '\d\+ FOR $0 -> 16\_s*' ..
1190 '\d\+ UNPACK 2\_s*' ..
1191 '\d\+ STORE $1\_s*' ..
1192 '\d\+ STORE $2\_s*' ..
1193 'echo x1 x2\_s*' ..
1194 '\d\+ LOAD $1\_s*' ..
1195 '\d\+ LOAD $2\_s*' ..
1196 '\d\+ ECHO 2\_s*' ..
1197 'endfor\_s*' ..
1198 '\d\+ JUMP -> 8\_s*' ..
1199 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001200 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001201 instr)
1202enddef
1203
Bram Moolenaarc150c092021-02-13 15:02:46 +01001204def ForLoopContinue()
1205 for nr in [1, 2]
1206 try
1207 echo "ok"
1208 try
1209 echo "deeper"
1210 catch
1211 continue
1212 endtry
1213 catch
1214 echo "not ok"
1215 endtry
1216 endfor
1217enddef
1218
1219def Test_disassemble_for_loop_continue()
1220 var instr = execute('disassemble ForLoopContinue')
1221 assert_match('ForLoopContinue\_s*' ..
1222 'for nr in \[1, 2]\_s*' ..
1223 '0 STORE -1 in $0\_s*' ..
1224 '1 PUSHNR 1\_s*' ..
1225 '2 PUSHNR 2\_s*' ..
1226 '3 NEWLIST size 2\_s*' ..
1227 '4 FOR $0 -> 22\_s*' ..
1228 '5 STORE $1\_s*' ..
1229 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001230 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001231 'echo "ok"\_s*' ..
1232 '7 PUSHS "ok"\_s*' ..
1233 '8 ECHO 1\_s*' ..
1234 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001235 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001236 'echo "deeper"\_s*' ..
1237 '10 PUSHS "deeper"\_s*' ..
1238 '11 ECHO 1\_s*' ..
1239 'catch\_s*' ..
1240 '12 JUMP -> 15\_s*' ..
1241 '13 CATCH\_s*' ..
1242 'continue\_s*' ..
1243 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1244 'endtry\_s*' ..
1245 '15 ENDTRY\_s*' ..
1246 'catch\_s*' ..
1247 '16 JUMP -> 20\_s*' ..
1248 '17 CATCH\_s*' ..
1249 'echo "not ok"\_s*' ..
1250 '18 PUSHS "not ok"\_s*' ..
1251 '19 ECHO 1\_s*' ..
1252 'endtry\_s*' ..
1253 '20 ENDTRY\_s*' ..
1254 'endfor\_s*' ..
1255 '21 JUMP -> 4\_s*' ..
1256 '\d\+ DROP\_s*' ..
1257 '\d\+ RETURN 0',
1258 instr)
1259enddef
1260
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001261let g:number = 42
1262
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001263def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001264 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001265enddef
1266
1267def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001268 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001269 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001270 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001271 '\d PUSHNR 23\_s*' ..
1272 '\d LOADG g:number\_s*' ..
1273 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1274 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001275 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001276 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001277 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001278 instr)
1279enddef
1280
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001281def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001282 var nr = 3
1283 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001284 nrres = nr - 7
1285 nrres = nr * 7
1286 nrres = nr / 7
1287 nrres = nr % 7
1288
Bram Moolenaarac564082020-09-27 19:05:33 +02001289 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001290 anyres = g:number - 7
1291 anyres = g:number * 7
1292 anyres = g:number / 7
1293 anyres = g:number % 7
1294
1295 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001296 var fl = 3.0
1297 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001298 flres = fl - 7.0
1299 flres = fl * 7.0
1300 flres = fl / 7.0
1301 endif
1302enddef
1303
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001304def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001305 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001306 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001307 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001308 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001309 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001310 '\d LOAD $0.*' ..
1311 '\d PUSHNR 7.*' ..
1312 '\d OPNR +.*' ..
1313 '\d STORE $1.*' ..
1314 'nrres = nr - 7.*' ..
1315 '\d OPNR -.*' ..
1316 'nrres = nr \* 7.*' ..
1317 '\d OPNR \*.*' ..
1318 'nrres = nr / 7.*' ..
1319 '\d OPNR /.*' ..
1320 'nrres = nr % 7.*' ..
1321 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001322 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001323 '\d LOADG g:number.*' ..
1324 '\d PUSHNR 7.*' ..
1325 '\d OPANY +.*' ..
1326 '\d STORE $2.*' ..
1327 'anyres = g:number - 7.*' ..
1328 '\d OPANY -.*' ..
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 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001336 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001337 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001338 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001339 '\d PUSHF 3.0.*' ..
1340 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001341 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001342 '\d LOAD $3.*' ..
1343 '\d PUSHF 7.0.*' ..
1344 '\d OPFLOAT +.*' ..
1345 '\d STORE $4.*' ..
1346 'flres = fl - 7.0.*' ..
1347 '\d OPFLOAT -.*' ..
1348 'flres = fl \* 7.0.*' ..
1349 '\d OPFLOAT \*.*' ..
1350 'flres = fl / 7.0.*' ..
1351 '\d OPFLOAT /.*',
1352 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001353 endif
1354enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001355
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001356def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001357 var reslist = [1, 2] + [3, 4]
1358 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001359enddef
1360
1361def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001362 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001363 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001364 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001365 '\d PUSHNR 1.*' ..
1366 '\d PUSHNR 2.*' ..
1367 '\d NEWLIST size 2.*' ..
1368 '\d PUSHNR 3.*' ..
1369 '\d PUSHNR 4.*' ..
1370 '\d NEWLIST size 2.*' ..
1371 '\d ADDLIST.*' ..
1372 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001373 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001374 '\d PUSHBLOB 0z1122.*' ..
1375 '\d PUSHBLOB 0z3344.*' ..
1376 '\d ADDBLOB.*' ..
1377 '\d STORE $.*',
1378 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001379enddef
1380
1381let g:aa = 'aa'
1382def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001383 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001384 return res
1385enddef
1386
1387def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001388 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001389 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001390 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001391 '\d LOADG g:aa.*' ..
1392 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001393 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001394 '\d CONCAT.*' ..
1395 '\d STORE $.*',
1396 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001397 assert_equal('aabb', ConcatString())
1398enddef
1399
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001400def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001401 var s = "abcd"
1402 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001403 return res
1404enddef
1405
1406def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001407 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001408 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001409 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001410 '\d PUSHS "abcd"\_s*' ..
1411 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001412 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001413 '\d LOAD $0\_s*' ..
1414 '\d PUSHNR 1\_s*' ..
1415 '\d STRINDEX\_s*' ..
1416 '\d STORE $1\_s*',
1417 instr)
1418 assert_equal('b', StringIndex())
1419enddef
1420
Bram Moolenaared591872020-08-15 22:14:53 +02001421def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001422 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001423 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001424 return res
1425enddef
1426
1427def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001428 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001429 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001431 '\d PUSHS "abcd"\_s*' ..
1432 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001433 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001434 '\d LOAD $0\_s*' ..
1435 '\d PUSHNR 1\_s*' ..
1436 '\d PUSHNR 8\_s*' ..
1437 '\d STRSLICE\_s*' ..
1438 '\d STORE $1\_s*',
1439 instr)
1440 assert_equal('bcd', StringSlice())
1441enddef
1442
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001443def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001444 var l = [1, 2, 3]
1445 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001446 return res
1447enddef
1448
1449def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001450 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001451 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001452 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001453 '\d PUSHNR 1\_s*' ..
1454 '\d PUSHNR 2\_s*' ..
1455 '\d PUSHNR 3\_s*' ..
1456 '\d NEWLIST size 3\_s*' ..
1457 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001458 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001459 '\d LOAD $0\_s*' ..
1460 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001461 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001462 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001463 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001464 assert_equal(2, ListIndex())
1465enddef
1466
Bram Moolenaared591872020-08-15 22:14:53 +02001467def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001468 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001469 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001470 return res
1471enddef
1472
1473def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001474 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001475 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001476 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001477 '\d PUSHNR 1\_s*' ..
1478 '\d PUSHNR 2\_s*' ..
1479 '\d PUSHNR 3\_s*' ..
1480 '\d NEWLIST size 3\_s*' ..
1481 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001482 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001483 '\d LOAD $0\_s*' ..
1484 '\d PUSHNR 1\_s*' ..
1485 '\d PUSHNR 8\_s*' ..
1486 '\d LISTSLICE\_s*' ..
1487 '\d STORE $1\_s*',
1488 instr)
1489 assert_equal([2, 3], ListSlice())
1490enddef
1491
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001492def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001493 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001494 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001495 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001496 return res
1497enddef
1498
1499def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001500 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001501 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001502 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001503 '\d PUSHS "item"\_s*' ..
1504 '\d PUSHNR 1\_s*' ..
1505 '\d NEWDICT size 1\_s*' ..
1506 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001507 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001508 '\d\+ LOAD $0\_s*' ..
1509 '\d\+ MEMBER item\_s*' ..
1510 '\d\+ STORE $1\_s*' ..
1511 'res = d\["item"\]\_s*' ..
1512 '\d\+ LOAD $0\_s*' ..
1513 '\d\+ PUSHS "item"\_s*' ..
1514 '\d\+ MEMBER\_s*' ..
1515 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001516 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001517 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001518enddef
1519
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001520let somelist = [1, 2, 3, 4, 5]
1521def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001522 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001523 return res
1524enddef
1525
1526def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001527 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001528 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001530 '\d LOADG g:somelist\_s*' ..
1531 '\d PUSHNR 2\_s*' ..
1532 '\d ANYINDEX\_s*' ..
1533 '\d STORE $0\_s*' ..
1534 'return res\_s*' ..
1535 '\d LOAD $0\_s*' ..
1536 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1537 '\d RETURN',
1538 instr)
1539 assert_equal(3, AnyIndex())
1540enddef
1541
1542def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001543 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001544 return res
1545enddef
1546
1547def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001548 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001549 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001550 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001551 '\d LOADG g:somelist\_s*' ..
1552 '\d PUSHNR 1\_s*' ..
1553 '\d PUSHNR 3\_s*' ..
1554 '\d ANYSLICE\_s*' ..
1555 '\d STORE $0\_s*' ..
1556 'return res\_s*' ..
1557 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001558 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001559 '\d RETURN',
1560 instr)
1561 assert_equal([2, 3, 4], AnySlice())
1562enddef
1563
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001564def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001565 var nr = 9
1566 var plus = +nr
1567 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001568 return res
1569enddef
1570
1571def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001572 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001573 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001574 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001575 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001576 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001577 '\d LOAD $0\_s*' ..
1578 '\d CHECKNR\_s*' ..
1579 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001580 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001581 '\d LOAD $0\_s*' ..
1582 '\d NEGATENR\_s*' ..
1583 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001584 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001585 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001586enddef
1587
1588def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001589 var flag = true
1590 var invert = !flag
1591 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001592 return res
1593enddef
1594
1595def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001596 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001597 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001598 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001599 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001600 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001601 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001602 '\d LOAD $0\_s*' ..
1603 '\d INVERT (!val)\_s*' ..
1604 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001605 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001606 '\d LOAD $0\_s*' ..
1607 '\d 2BOOL (!!val)\_s*' ..
1608 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001609 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001610 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001611enddef
1612
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001613def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001614 var name: bool = 1 && 0 || 1
1615 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001616enddef
1617
1618def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001619 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001620 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001621 'var name: bool = 1 && 0 || 1\_s*' ..
1622 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001623 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001624 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1625 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001626 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001627 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1628 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001629 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001630 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001631 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001632 '\d\+ LOAD $0\_s*' ..
1633 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001634 instr)
1635 assert_equal(true, InvertBool())
1636enddef
1637
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001638def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001639 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001640 ['true == isFalse', 'COMPAREBOOL =='],
1641 ['true != isFalse', 'COMPAREBOOL !='],
1642 ['v:none == isNull', 'COMPARESPECIAL =='],
1643 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001644
Bram Moolenaara5565e42020-05-09 15:44:01 +02001645 ['111 == aNumber', 'COMPARENR =='],
1646 ['111 != aNumber', 'COMPARENR !='],
1647 ['111 > aNumber', 'COMPARENR >'],
1648 ['111 < aNumber', 'COMPARENR <'],
1649 ['111 >= aNumber', 'COMPARENR >='],
1650 ['111 <= aNumber', 'COMPARENR <='],
1651 ['111 =~ aNumber', 'COMPARENR =\~'],
1652 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001653
Bram Moolenaara5565e42020-05-09 15:44:01 +02001654 ['"xx" != aString', 'COMPARESTRING !='],
1655 ['"xx" > aString', 'COMPARESTRING >'],
1656 ['"xx" < aString', 'COMPARESTRING <'],
1657 ['"xx" >= aString', 'COMPARESTRING >='],
1658 ['"xx" <= aString', 'COMPARESTRING <='],
1659 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1660 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1661 ['"xx" is aString', 'COMPARESTRING is'],
1662 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001663
Bram Moolenaara5565e42020-05-09 15:44:01 +02001664 ['0z11 == aBlob', 'COMPAREBLOB =='],
1665 ['0z11 != aBlob', 'COMPAREBLOB !='],
1666 ['0z11 is aBlob', 'COMPAREBLOB is'],
1667 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001668
Bram Moolenaara5565e42020-05-09 15:44:01 +02001669 ['[1, 2] == aList', 'COMPARELIST =='],
1670 ['[1, 2] != aList', 'COMPARELIST !='],
1671 ['[1, 2] is aList', 'COMPARELIST is'],
1672 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001673
Bram Moolenaare0de1712020-12-02 17:36:54 +01001674 ['{a: 1} == aDict', 'COMPAREDICT =='],
1675 ['{a: 1} != aDict', 'COMPAREDICT !='],
1676 ['{a: 1} is aDict', 'COMPAREDICT is'],
1677 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001678
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001679 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1680 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1681 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1682 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001683
1684 ['77 == g:xx', 'COMPAREANY =='],
1685 ['77 != g:xx', 'COMPAREANY !='],
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 is g:xx', 'COMPAREANY is'],
1693 ['77 isnot g:xx', 'COMPAREANY isnot'],
1694 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001695 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001696 if has('float')
1697 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001698 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1699 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1700 ['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 !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001706 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001707 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001708 endif
1709
Bram Moolenaarac564082020-09-27 19:05:33 +02001710 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001711 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001712 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001713 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001714 ' var isFalse = false',
1715 ' var isNull = v:null',
1716 ' var aNumber = 222',
1717 ' var aString = "yy"',
1718 ' var aBlob = 0z22',
1719 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001720 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001721 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001722 ' if ' .. case[0],
1723 ' echo 42'
1724 ' endif',
1725 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001726 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001727 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001728 assert_match('TestCase' .. nr .. '.*' ..
1729 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1730 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001731 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001732 '\d ' .. case[1] .. '.*' ..
1733 '\d JUMP_IF_FALSE -> \d\+.*',
1734 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001735
1736 nr += 1
1737 endfor
1738
Bram Moolenaar22da5592020-03-19 14:52:20 +01001739 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001740enddef
1741
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001742def s:FalsyOp()
1743 echo g:flag ?? "yes"
1744 echo [] ?? "empty list"
1745 echo "" ?? "empty string"
1746enddef
1747
1748def Test_dsassemble_falsy_op()
1749 var res = execute('disass s:FalsyOp')
1750 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1751 'echo g:flag ?? "yes"\_s*' ..
1752 '0 LOADG g:flag\_s*' ..
1753 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1754 '2 PUSHS "yes"\_s*' ..
1755 '3 ECHO 1\_s*' ..
1756 'echo \[\] ?? "empty list"\_s*' ..
1757 '4 NEWLIST size 0\_s*' ..
1758 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1759 '6 PUSHS "empty list"\_s*' ..
1760 '7 ECHO 1\_s*' ..
1761 'echo "" ?? "empty string"\_s*' ..
1762 '\d\+ PUSHS "empty string"\_s*' ..
1763 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001764 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001765 res)
1766enddef
1767
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001768def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001769 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001770 ['"xx" == "yy"', false],
1771 ['"aa" == "aa"', true],
1772 ['has("eval") ? true : false', true],
1773 ['has("asdf") ? true : false', false],
1774 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001775
Bram Moolenaarac564082020-09-27 19:05:33 +02001776 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001777 for case in cases
1778 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001779 ' if ' .. case[0],
1780 ' echo 42'
1781 ' endif',
1782 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001783 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001784 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001785 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001786 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001787 assert_match('TestCase' .. nr .. '.*' ..
1788 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1789 '\d PUSHNR 42.*' ..
1790 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001791 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001792 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001793 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001794 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001795 assert_match('TestCase' .. nr .. '.*' ..
1796 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1797 'echo 42[ \n]*' ..
1798 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001799 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001800 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001801 endif
1802
1803 nr += 1
1804 endfor
1805
1806 delete('Xdisassemble')
1807enddef
1808
Bram Moolenaarad39c092020-02-26 18:23:43 +01001809def s:Execute()
1810 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001811 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001812 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001813 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001814 execute 'help ' .. tag
1815enddef
1816
1817def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001818 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001819 assert_match('\<SNR>\d*_Execute\_s*' ..
1820 "execute 'help vim9.txt'\\_s*" ..
1821 '\d PUSHS "help vim9.txt"\_s*' ..
1822 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001823 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001824 '\d PUSHS "help vim9.txt"\_s*' ..
1825 '\d STORE $0\_s*' ..
1826 'execute cmd\_s*' ..
1827 '\d LOAD $0\_s*' ..
1828 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001829 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001830 '\d PUSHS "vim9.txt"\_s*' ..
1831 '\d STORE $1\_s*' ..
1832 "execute 'help ' .. tag\\_s*" ..
1833 '\d\+ PUSHS "help "\_s*' ..
1834 '\d\+ LOAD $1\_s*' ..
1835 '\d\+ CONCAT\_s*' ..
1836 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001837 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001838 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001839enddef
1840
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001841def s:Echomsg()
1842 echomsg 'some' 'message'
1843 echoerr 'went' .. 'wrong'
1844enddef
1845
1846def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001847 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001848 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1849 "echomsg 'some' 'message'\\_s*" ..
1850 '\d PUSHS "some"\_s*' ..
1851 '\d PUSHS "message"\_s*' ..
1852 '\d ECHOMSG 2\_s*' ..
1853 "echoerr 'went' .. 'wrong'\\_s*" ..
1854 '\d PUSHS "wentwrong"\_s*' ..
1855 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001856 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001857 res)
1858enddef
1859
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001860def SomeStringArg(arg: string)
1861 echo arg
1862enddef
1863
1864def SomeAnyArg(arg: any)
1865 echo arg
1866enddef
1867
1868def SomeStringArgAndReturn(arg: string): string
1869 return arg
1870enddef
1871
1872def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001873 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001874 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1875 '\d *echo arg.*' ..
1876 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001877 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001878
Bram Moolenaarac564082020-09-27 19:05:33 +02001879 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001880 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1881 '\d *echo arg\_s*' ..
1882 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001883 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001884
Bram Moolenaarac564082020-09-27 19:05:33 +02001885 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001886 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1887 '\d *return arg\_s*' ..
1888 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001889 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001890enddef
1891
Bram Moolenaar09689a02020-05-09 22:50:08 +02001892def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001893 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001894 vim9script
1895 def FuncOne(): string
1896 return FuncTwo()
1897 enddef
1898 def FuncTwo(): string
1899 return 'two'
1900 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001901 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001902 END
1903 writefile(lines, 'Xdisassemble')
1904 source Xdisassemble
1905
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001906 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001907 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1908 'return FuncTwo()\_s*' ..
1909 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001910 '\d RETURN',
1911 g:res_FuncOne)
1912
1913 delete('Xdisassemble')
1914 unlet g:res_FuncOne
1915enddef
1916
Bram Moolenaar61a89812020-05-07 16:58:17 +02001917def s:ConcatStrings(): string
1918 return 'one' .. 'two' .. 'three'
1919enddef
1920
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001921def s:ComputeConst(): number
1922 return 2 + 3 * 4 / 6 + 7
1923enddef
1924
Bram Moolenaar1c747212020-05-09 18:28:34 +02001925def s:ComputeConstParen(): number
1926 return ((2 + 4) * (8 / 2)) / (3 + 4)
1927enddef
1928
Bram Moolenaar61a89812020-05-07 16:58:17 +02001929def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001930 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001931 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1932 "return 'one' .. 'two' .. 'three'\\_s*" ..
1933 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001934 '\d RETURN',
1935 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001936
1937 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001938 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1939 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1940 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001941 '\d RETURN',
1942 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001943
1944 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001945 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1946 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1947 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001948 '\d RETURN',
1949 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001950enddef
1951
Bram Moolenaar389df252020-07-09 21:20:47 +02001952def s:CallAppend()
1953 eval "some text"->append(2)
1954enddef
1955
1956def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001957 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001958 assert_match('<SNR>\d*_CallAppend\_s*' ..
1959 'eval "some text"->append(2)\_s*' ..
1960 '\d PUSHS "some text"\_s*' ..
1961 '\d PUSHNR 2\_s*' ..
1962 '\d SHUFFLE 2 up 1\_s*' ..
1963 '\d BCALL append(argc 2)\_s*' ..
1964 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001965 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001966 res)
1967enddef
1968
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001969
1970def s:SilentMessage()
1971 silent echomsg "text"
1972 silent! echoerr "error"
1973enddef
1974
1975def Test_silent()
1976 var res = execute('disass s:SilentMessage')
1977 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1978 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001979 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001980 '\d PUSHS "text"\_s*' ..
1981 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001982 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001983 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001984 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001985 '\d PUSHS "error"\_s*' ..
1986 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001987 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001988 '\d\+ RETURN 0',
1989 res)
1990enddef
1991
1992def s:SilentIf()
1993 silent if 4 == g:five
1994 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001995 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001996enddef
1997
1998def Test_silent_if()
1999 var res = execute('disass s:SilentIf')
2000 assert_match('<SNR>\d*_SilentIf\_s*' ..
2001 'silent if 4 == g:five\_s*' ..
2002 '\d\+ CMDMOD silent\_s*' ..
2003 '\d\+ PUSHNR 4\_s*' ..
2004 '\d\+ LOADG g:five\_s*' ..
2005 '\d\+ COMPAREANY ==\_s*' ..
2006 '\d\+ CMDMOD_REV\_s*' ..
2007 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
2008 'silent elseif 4 == g:five\_s*' ..
2009 '\d\+ JUMP -> \d\+\_s*' ..
2010 '\d\+ CMDMOD silent\_s*' ..
2011 '\d\+ PUSHNR 4\_s*' ..
2012 '\d\+ LOADG g:five\_s*' ..
2013 '\d\+ COMPAREANY ==\_s*' ..
2014 '\d\+ CMDMOD_REV\_s*' ..
2015 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002016 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002017 '\d\+ RETURN 0',
2018 res)
2019enddef
2020
2021def s:SilentFor()
2022 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01002023 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01002024enddef
2025
2026def Test_silent_for()
2027 var res = execute('disass s:SilentFor')
2028 assert_match('<SNR>\d*_SilentFor\_s*' ..
2029 'silent for i in \[0\]\_s*' ..
2030 '\d CMDMOD silent\_s*' ..
2031 '\d STORE -1 in $0\_s*' ..
2032 '\d PUSHNR 0\_s*' ..
2033 '\d NEWLIST size 1\_s*' ..
2034 '\d CMDMOD_REV\_s*' ..
2035 '5 FOR $0 -> 8\_s*' ..
2036 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002037 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002038 '\d JUMP -> 5\_s*' ..
2039 '8 DROP\_s*' ..
2040 '\d RETURN 0\_s*',
2041 res)
2042enddef
2043
2044def s:SilentWhile()
2045 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002046 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002047enddef
2048
2049def Test_silent_while()
2050 var res = execute('disass s:SilentWhile')
2051 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2052 'silent while g:not\_s*' ..
2053 '0 CMDMOD silent\_s*' ..
2054 '\d LOADG g:not\_s*' ..
2055 '\d COND2BOOL\_s*' ..
2056 '\d CMDMOD_REV\_s*' ..
2057 '\d JUMP_IF_FALSE -> 6\_s*' ..
2058
Bram Moolenaarfa984412021-03-25 22:15:28 +01002059 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002060 '\d JUMP -> 0\_s*' ..
2061 '6 RETURN 0\_s*',
2062 res)
2063enddef
2064
2065def s:SilentReturn(): string
2066 silent return "done"
2067enddef
2068
2069def Test_silent_return()
2070 var res = execute('disass s:SilentReturn')
2071 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2072 'silent return "done"\_s*' ..
2073 '\d CMDMOD silent\_s*' ..
2074 '\d PUSHS "done"\_s*' ..
2075 '\d CMDMOD_REV\_s*' ..
2076 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002077 res)
2078enddef
2079
Bram Moolenaarb2049902021-01-24 12:53:53 +01002080def s:Profiled(): string
2081 echo "profiled"
2082 return "done"
2083enddef
2084
2085def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002086 if !has('profile')
2087 MissingFeature 'profile'
2088 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002089 var res = execute('disass! s:Profiled')
2090 assert_match('<SNR>\d*_Profiled\_s*' ..
2091 'echo "profiled"\_s*' ..
2092 '\d PROFILE START line 1\_s*' ..
2093 '\d PUSHS "profiled"\_s*' ..
2094 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002095 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002096 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002097 '\d PROFILE START line 2\_s*' ..
2098 '\d PUSHS "done"\_s*' ..
2099 '\d RETURN\_s*' ..
2100 '\d PROFILE END',
2101 res)
2102enddef
2103
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002104def s:EchoMessages()
2105 echohl ErrorMsg | echom v:exception | echohl NONE
2106enddef
2107
2108def Test_disassemble_nextcmd()
2109 # splitting commands and removing trailing blanks should not change the line
2110 var res = execute('disass s:EchoMessages')
2111 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2112 'echohl ErrorMsg | echom v:exception | echohl NONE',
2113 res)
2114enddef
2115
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002116
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002117" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker