blob: fe1ce66ec5b3c71c82fb875d951333e704a1f1fa [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
18 echo arg
19 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020020 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010021 echo v:version
22 echo s:scriptvar
23 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020024 echo get(g:, "global")
Bram Moolenaard3aac292020-04-19 14:32:17 +020025 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020026 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010031 echo &tabstop
32 echo $ENVVAR
33 echo @z
34enddef
35
Bram Moolenaarf2460a32020-02-07 22:09:54 +010036def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010037 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020038 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010039 assert_fails('disass', 'E471:')
40 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020041 assert_fails('disass 234', 'E129:')
42 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010043
Bram Moolenaarac564082020-09-27 19:05:33 +020044 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020045 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
46 'buffers.*' ..
47 ' EXEC \+buffers.*' ..
48 ' LOAD arg\[-1\].*' ..
49 ' LOAD $0.*' ..
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020050 ' LOADOPT &lines.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020051 ' LOADV v:version.*' ..
52 ' LOADS s:scriptvar from .*test_vim9_disassemble.vim.*' ..
53 ' LOADG g:globalvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020054 'echo get(g:, "global")\_s*' ..
55 '\d\+ LOAD g:\_s*' ..
56 '\d\+ PUSHS "global"\_s*' ..
57 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020058 ' LOADB b:buffervar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020059 'echo get(b:, "buffer")\_s*' ..
60 '\d\+ LOAD b:\_s*' ..
61 '\d\+ PUSHS "buffer"\_s*' ..
62 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020063 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020064 'echo get(w:, "window")\_s*' ..
65 '\d\+ LOAD w:\_s*' ..
66 '\d\+ PUSHS "window"\_s*' ..
67 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020068 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(t:, "tab")\_s*' ..
70 '\d\+ LOAD t:\_s*' ..
71 '\d\+ PUSHS "tab"\_s*' ..
72 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020073 ' LOADENV $ENVVAR.*' ..
74 ' LOADREG @z.*',
75 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010076enddef
77
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020078def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +020079 var filename = "file"
80 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020081 edit the`=filename``=filenr`.txt
82enddef
83
84def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +020085 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020086 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +020087 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020088 '\d PUSHS "file"\_s*' ..
89 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +020090 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020091 '\d STORE 123 in $1\_s*' ..
92 ' edit the`=filename``=filenr`.txt\_s*' ..
93 '\d PUSHS "edit the"\_s*' ..
94 '\d LOAD $0\_s*' ..
95 '\d LOAD $1\_s*' ..
96 '\d 2STRING stack\[-1\]\_s*' ..
97 '\d\+ PUSHS ".txt"\_s*' ..
98 '\d\+ EXECCONCAT 4\_s*' ..
99 '\d\+ PUSHNR 0\_s*' ..
100 '\d\+ RETURN',
101 res)
102enddef
103
104def s:YankRange()
105 norm! m[jjm]
106 :'[,']yank
107enddef
108
109def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200110 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200111 assert_match('<SNR>\d*_YankRange.*' ..
112 ' norm! m\[jjm\]\_s*' ..
113 '\d EXEC norm! m\[jjm\]\_s*' ..
114 ' :''\[,''\]yank\_s*' ..
115 '\d EXEC :''\[,''\]yank\_s*' ..
116 '\d PUSHNR 0\_s*' ..
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200117 '\d RETURN',
118 res)
119enddef
120
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200121def s:PutExpr()
122 :3put ="text"
123enddef
124
125def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200126 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200127 assert_match('<SNR>\d*_PutExpr.*' ..
128 ' :3put ="text"\_s*' ..
129 '\d PUSHS "text"\_s*' ..
130 '\d PUT = 3\_s*' ..
131 '\d PUSHNR 0\_s*' ..
132 '\d RETURN',
133 res)
134enddef
135
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100136def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200137 var localbool = true
138 var localspec = v:none
139 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100140 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200141 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100142 endif
143enddef
144
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100145def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200146 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200147 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
148 'localbool = true.*' ..
149 ' PUSH v:true.*' ..
150 'localspec = v:none.*' ..
151 ' PUSH v:none.*' ..
152 'localblob = 0z1234.*' ..
153 ' PUSHBLOB 0z1234.*',
154 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100155 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200156 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
157 'localfloat = 1.234.*' ..
158 ' PUSHF 1.234.*',
159 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100160 endif
161enddef
162
163def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200164 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100165 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200166 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100167 localstr = 'xyz'
168 v:char = 'abc'
169 s:scriptvar = 'sv'
170 g:globalvar = 'gv'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200171 b:buffervar = 'bv'
172 w:windowvar = 'wv'
173 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100174 &tabstop = 8
175 $ENVVAR = 'ev'
176 @z = 'rv'
177enddef
178
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100179def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200180 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200181 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200182 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200183 'localnr = 2.*' ..
184 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200185 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200186 'localstr = ''xyz''.*' ..
187 ' STORE $1.*' ..
188 'v:char = ''abc''.*' ..
189 'STOREV v:char.*' ..
190 's:scriptvar = ''sv''.*' ..
191 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
192 'g:globalvar = ''gv''.*' ..
193 ' STOREG g:globalvar.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200194 'b:buffervar = ''bv''.*' ..
195 ' STOREB b:buffervar.*' ..
196 'w:windowvar = ''wv''.*' ..
197 ' STOREW w:windowvar.*' ..
198 't:tabpagevar = ''tv''.*' ..
199 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200200 '&tabstop = 8.*' ..
201 ' STOREOPT &tabstop.*' ..
202 '$ENVVAR = ''ev''.*' ..
203 ' STOREENV $ENVVAR.*' ..
204 '@z = ''rv''.*' ..
205 ' STOREREG @z.*',
206 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100207enddef
208
Bram Moolenaarcb790402020-05-15 20:53:00 +0200209def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200210 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200211 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200212 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200213 localdict["a"] = 456
214enddef
215
216def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200217 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200218 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200219 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200220 '\d NEWLIST size 0\_s*' ..
221 '\d STORE $0\_s*' ..
222 'locallist\[0\] = 123\_s*' ..
223 '\d PUSHNR 123\_s*' ..
224 '\d PUSHNR 0\_s*' ..
225 '\d LOAD $0\_s*' ..
226 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200227 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200228 '\d NEWDICT size 0\_s*' ..
229 '\d STORE $1\_s*' ..
230 'localdict\["a"\] = 456\_s*' ..
231 '\d\+ PUSHNR 456\_s*' ..
232 '\d\+ PUSHS "a"\_s*' ..
233 '\d\+ LOAD $1\_s*' ..
234 '\d\+ STOREDICT\_s*' ..
235 '\d\+ PUSHNR 0\_s*' ..
236 '\d\+ RETURN',
237 res)
238enddef
239
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200240def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200241 var x: string
242 var y: string
243 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200244 [x, y; l] = g:stringlist
245enddef
246
247def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200248 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200249 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200250 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200251 '\d PUSHS "\[NULL\]"\_s*' ..
252 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200253 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200254 '\d PUSHS "\[NULL\]"\_s*' ..
255 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200257 '\d NEWLIST size 0\_s*' ..
258 '\d STORE $2\_s*' ..
259 '\[x, y; l\] = g:stringlist\_s*' ..
260 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200261 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200262 '\d CHECKLEN >= 2\_s*' ..
263 '\d\+ ITEM 0\_s*' ..
264 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
265 '\d\+ STORE $0\_s*' ..
266 '\d\+ ITEM 1\_s*' ..
267 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
268 '\d\+ STORE $1\_s*' ..
269 '\d\+ SLICE 2\_s*' ..
270 '\d\+ STORE $2\_s*' ..
271 '\d\+ PUSHNR 0\_s*' ..
272 '\d\+ RETURN',
273 res)
274enddef
275
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200276def s:ListAdd()
277 var l: list<number> = []
278 add(l, 123)
279 add(l, g:aNumber)
280enddef
281
282def Test_disassemble_list_add()
283 var res = execute('disass s:ListAdd')
284 assert_match('<SNR>\d*_ListAdd\_s*' ..
285 'var l: list<number> = []\_s*' ..
286 '\d NEWLIST size 0\_s*' ..
287 '\d STORE $0\_s*' ..
288 'add(l, 123)\_s*' ..
289 '\d LOAD $0\_s*' ..
290 '\d PUSHNR 123\_s*' ..
291 '\d LISTAPPEND\_s*' ..
292 '\d DROP\_s*' ..
293 'add(l, g:aNumber)\_s*' ..
294 '\d LOAD $0\_s*' ..
295 '\d\+ LOADG g:aNumber\_s*' ..
296 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
297 '\d\+ LISTAPPEND\_s*' ..
298 '\d\+ DROP\_s*' ..
299 '\d\+ PUSHNR 0\_s*' ..
300 '\d\+ RETURN',
301 res)
302enddef
303
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200304def s:ScriptFuncUnlet()
305 g:somevar = "value"
306 unlet g:somevar
307 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200308 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200309enddef
310
311def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200312 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200313 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
314 'g:somevar = "value"\_s*' ..
315 '\d PUSHS "value"\_s*' ..
316 '\d STOREG g:somevar\_s*' ..
317 'unlet g:somevar\_s*' ..
318 '\d UNLET g:somevar\_s*' ..
319 'unlet! g:somevar\_s*' ..
320 '\d UNLET! g:somevar\_s*' ..
321 'unlet $SOMEVAR\_s*' ..
322 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200323 res)
324enddef
325
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100326def s:ScriptFuncTry()
327 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200328 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100329 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200330 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100331 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200332 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100333 endtry
334enddef
335
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100336def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200337 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200338 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
339 'try\_s*' ..
340 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
341 'echo "yes"\_s*' ..
342 '\d PUSHS "yes"\_s*' ..
343 '\d ECHO 1\_s*' ..
344 'catch /fail/\_s*' ..
345 '\d JUMP -> \d\+\_s*' ..
346 '\d PUSH v:exception\_s*' ..
347 '\d PUSHS "fail"\_s*' ..
348 '\d COMPARESTRING =\~\_s*' ..
349 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
350 '\d CATCH\_s*' ..
351 'echo "no"\_s*' ..
352 '\d\+ PUSHS "no"\_s*' ..
353 '\d\+ ECHO 1\_s*' ..
354 'finally\_s*' ..
355 'throw "end"\_s*' ..
356 '\d\+ PUSHS "end"\_s*' ..
357 '\d\+ THROW\_s*' ..
358 'endtry\_s*' ..
359 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200360 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100361enddef
362
363def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200364 var ll = [1, "two", 333]
365 var dd = #{one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100366enddef
367
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100368def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200369 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200370 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200371 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200372 '\d PUSHNR 1\_s*' ..
373 '\d PUSHS "two"\_s*' ..
374 '\d PUSHNR 333\_s*' ..
375 '\d NEWLIST size 3\_s*' ..
376 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200377 'var dd = #{one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200378 '\d PUSHS "one"\_s*' ..
379 '\d PUSHNR 1\_s*' ..
380 '\d PUSHS "two"\_s*' ..
381 '\d PUSHS "val"\_s*' ..
382 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200383 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100384enddef
385
Bram Moolenaar6e949782020-04-13 17:21:00 +0200386def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100387 echo arg
388enddef
389
390func UserFunc()
391 echo 'nothing'
392endfunc
393
394func UserFuncWithArg(arg)
395 echo a:arg
396endfunc
397
398def s:ScriptFuncCall(): string
399 changenr()
400 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100401 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100402 FuncWithArg(343)
403 ScriptFuncNew()
404 s:ScriptFuncNew()
405 UserFunc()
406 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200407 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100408 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200409 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100410 FuncRefWithArg("bar")
411 return "yes"
412enddef
413
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100414def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200415 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200416 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
417 'changenr()\_s*' ..
418 '\d BCALL changenr(argc 0)\_s*' ..
419 '\d DROP\_s*' ..
420 'char2nr("abc")\_s*' ..
421 '\d PUSHS "abc"\_s*' ..
422 '\d BCALL char2nr(argc 1)\_s*' ..
423 '\d DROP\_s*' ..
424 'Test_disassemble_new()\_s*' ..
425 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
426 '\d DROP\_s*' ..
427 'FuncWithArg(343)\_s*' ..
428 '\d\+ PUSHNR 343\_s*' ..
429 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
430 '\d\+ DROP\_s*' ..
431 'ScriptFuncNew()\_s*' ..
432 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
433 '\d\+ DROP\_s*' ..
434 's:ScriptFuncNew()\_s*' ..
435 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
436 '\d\+ DROP\_s*' ..
437 'UserFunc()\_s*' ..
438 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
439 '\d\+ DROP\_s*' ..
440 'UserFuncWithArg("foo")\_s*' ..
441 '\d\+ PUSHS "foo"\_s*' ..
442 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
443 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200444 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200445 '\d\+ PUSHS "UserFunc"\_s*' ..
446 '\d\+ BCALL function(argc 1)\_s*' ..
447 '\d\+ STORE $0\_s*' ..
448 'FuncRef()\_s*' ..
449 '\d\+ LOAD $\d\_s*' ..
450 '\d\+ PCALL (argc 0)\_s*' ..
451 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200452 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200453 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
454 '\d\+ BCALL function(argc 1)\_s*' ..
455 '\d\+ STORE $1\_s*' ..
456 'FuncRefWithArg("bar")\_s*' ..
457 '\d\+ PUSHS "bar"\_s*' ..
458 '\d\+ LOAD $\d\_s*' ..
459 '\d\+ PCALL (argc 1)\_s*' ..
460 '\d\+ DROP\_s*' ..
461 'return "yes"\_s*' ..
462 '\d\+ PUSHS "yes"\_s*' ..
463 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200464 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100465enddef
466
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200467
468def s:CreateRefs()
469 var local = 'a'
470 def Append(arg: string)
471 local ..= arg
472 enddef
473 g:Append = Append
474 def Get(): string
475 return local
476 enddef
477 g:Get = Get
478enddef
479
480def Test_disassemble_closure()
481 CreateRefs()
482 var res = execute('disass g:Append')
483 assert_match('<lambda>\d\_s*' ..
484 'local ..= arg\_s*' ..
485 '\d LOADOUTER $0\_s*' ..
486 '\d LOAD arg\[-1\]\_s*' ..
487 '\d CONCAT\_s*' ..
488 '\d STOREOUTER $0\_s*' ..
489 '\d PUSHNR 0\_s*' ..
490 '\d RETURN',
491 res)
492
493 res = execute('disass g:Get')
494 assert_match('<lambda>\d\_s*' ..
495 'return local\_s*' ..
496 '\d LOADOUTER $0\_s*' ..
497 '\d RETURN',
498 res)
499
500 unlet g:Append
501 unlet g:Get
502enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200503
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100504
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200505def EchoArg(arg: string): string
506 return arg
507enddef
508def RefThis(): func
509 return function('EchoArg')
510enddef
511def s:ScriptPCall()
512 RefThis()("text")
513enddef
514
515def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200516 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200517 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
518 'RefThis()("text")\_s*' ..
519 '\d DCALL RefThis(argc 0)\_s*' ..
520 '\d PUSHS "text"\_s*' ..
521 '\d PCALL top (argc 1)\_s*' ..
522 '\d PCALL end\_s*' ..
523 '\d DROP\_s*' ..
524 '\d PUSHNR 0\_s*' ..
525 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200526 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200527enddef
528
529
Bram Moolenaara26b9702020-04-18 19:53:28 +0200530def s:FuncWithForwardCall(): string
531 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100532enddef
533
534def DefinedLater(arg: string): string
535 return arg
536enddef
537
538def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200539 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200540 assert_match('FuncWithForwardCall\_s*' ..
541 'return g:DefinedLater("yes")\_s*' ..
542 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200543 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200544 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200545 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100546
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200547 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100548 assert_equal('yes', FuncWithForwardCall())
549
Bram Moolenaara26b9702020-04-18 19:53:28 +0200550 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200551 assert_match('FuncWithForwardCall\_s*' ..
552 'return g:DefinedLater("yes")\_s*' ..
553 '\d PUSHS "yes"\_s*' ..
554 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200555 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200556 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100557enddef
558
559
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100560def FuncWithDefault(arg: string = 'default'): string
561 return arg
562enddef
563
564def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200565 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200566 assert_match('FuncWithDefault\_s*' ..
567 '\d PUSHS "default"\_s*' ..
568 '\d STORE arg\[-1]\_s*' ..
569 'return arg\_s*' ..
570 '\d LOAD arg\[-1]\_s*' ..
571 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200572 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100573enddef
574
575
Bram Moolenaar158906c2020-02-06 20:39:45 +0100576def HasEval()
577 if has("eval")
578 echo "yes"
579 else
580 echo "no"
581 endif
582enddef
583
584def HasNothing()
585 if has("nothing")
586 echo "yes"
587 else
588 echo "no"
589 endif
590enddef
591
592def HasSomething()
593 if has("nothing")
594 echo "nothing"
595 elseif has("something")
596 echo "something"
597 elseif has("eval")
598 echo "eval"
599 elseif has("less")
600 echo "less"
601 endif
602enddef
603
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100604def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200605 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200606 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200607 assert_match('HasEval\_s*' ..
608 'if has("eval")\_s*' ..
609 'echo "yes"\_s*' ..
610 '\d PUSHS "yes"\_s*' ..
611 '\d ECHO 1\_s*' ..
612 'else\_s*' ..
613 'echo "no"\_s*' ..
614 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200615 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100616 assert_notmatch('JUMP', instr)
617
Bram Moolenaard2c61702020-09-06 15:58:36 +0200618 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100619 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200620 assert_match('HasNothing\_s*' ..
621 'if has("nothing")\_s*' ..
622 'echo "yes"\_s*' ..
623 'else\_s*' ..
624 'echo "no"\_s*' ..
625 '\d PUSHS "no"\_s*' ..
626 '\d ECHO 1\_s*' ..
627 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200628 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100629 assert_notmatch('PUSHS "yes"', instr)
630 assert_notmatch('JUMP', instr)
631
Bram Moolenaard2c61702020-09-06 15:58:36 +0200632 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100633 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200634 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200635 'if has("nothing")\_s*' ..
636 'echo "nothing"\_s*' ..
637 'elseif has("something")\_s*' ..
638 'echo "something"\_s*' ..
639 'elseif has("eval")\_s*' ..
640 'echo "eval"\_s*' ..
641 '\d PUSHS "eval"\_s*' ..
642 '\d ECHO 1\_s*' ..
643 'elseif has("less").*' ..
644 'echo "less"\_s*' ..
645 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200646 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100647 assert_notmatch('PUSHS "nothing"', instr)
648 assert_notmatch('PUSHS "something"', instr)
649 assert_notmatch('PUSHS "less"', instr)
650 assert_notmatch('JUMP', instr)
651enddef
652
Bram Moolenaarefd88552020-06-18 20:50:10 +0200653def ReturnInIf(): string
654 if g:cond
655 return "yes"
656 else
657 return "no"
658 endif
659enddef
660
661def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200662 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200663 assert_match('ReturnInIf\_s*' ..
664 'if g:cond\_s*' ..
665 '0 LOADG g:cond\_s*' ..
666 '1 JUMP_IF_FALSE -> 4\_s*' ..
667 'return "yes"\_s*' ..
668 '2 PUSHS "yes"\_s*' ..
669 '3 RETURN\_s*' ..
670 'else\_s*' ..
671 ' return "no"\_s*' ..
672 '4 PUSHS "no"\_s*' ..
673 '5 RETURN$',
674 instr)
675enddef
676
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100677def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200678 var Funky1: func
679 var Funky2: func = function("len")
680 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100681enddef
682
683def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200684 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200685 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200686 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200687 '0 PUSHFUNC "\[none]"\_s*' ..
688 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200689 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200690 '2 PUSHS "len"\_s*' ..
691 '3 BCALL function(argc 1)\_s*' ..
692 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200693 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200694 '\d PUSHS "UserFunc"\_s*' ..
695 '\d BCALL funcref(argc 1)\_s*' ..
696 '\d STORE $2\_s*' ..
697 '\d PUSHNR 0\_s*' ..
698 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200699 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100700enddef
701
702if has('channel')
703 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200704 var job1: job
705 var job2: job = job_start("donothing")
706 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100707 enddef
708endif
709
710def Test_disassemble_channel()
711 CheckFeature channel
712
Bram Moolenaarac564082020-09-27 19:05:33 +0200713 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200714 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200715 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200716 '\d PUSHJOB "no process"\_s*' ..
717 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200718 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200719 '\d PUSHS "donothing"\_s*' ..
720 '\d BCALL job_start(argc 1)\_s*' ..
721 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200722 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200723 '\d PUSHCHANNEL 0\_s*' ..
724 '\d STORE $2\_s*' ..
725 '\d PUSHNR 0\_s*' ..
726 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200727 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100728enddef
729
Bram Moolenaar777770f2020-02-06 21:27:08 +0100730def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200731 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100732 return F("x")
733enddef
734
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100735def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100736 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200737 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200738 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200739 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200740 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200741 '\d STORE $0\_s*' ..
742 'return F("x")\_s*' ..
743 '\d PUSHS "x"\_s*' ..
744 '\d LOAD $0\_s*' ..
745 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200746 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200747 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200748
Bram Moolenaarac564082020-09-27 19:05:33 +0200749 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200750 instr = execute('disassemble ' .. name)
751 assert_match('<lambda>\d\+\_s*' ..
752 'return "X" .. a .. "X"\_s*' ..
753 '\d PUSHS "X"\_s*' ..
754 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200755 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200756 '\d CONCAT\_s*' ..
757 '\d PUSHS "X"\_s*' ..
758 '\d CONCAT\_s*' ..
759 '\d RETURN',
760 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100761enddef
762
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200763def NestedOuter()
764 def g:Inner()
765 echomsg "inner"
766 enddef
767enddef
768
769def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200770 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200771 assert_match('NestedOuter\_s*' ..
772 'def g:Inner()\_s*' ..
773 'echomsg "inner"\_s*' ..
774 'enddef\_s*' ..
775 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
776 '\d PUSHNR 0\_s*' ..
777 '\d RETURN',
778 instr)
779enddef
780
Bram Moolenaar6e949782020-04-13 17:21:00 +0200781def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100782 if arg == 1 && arg != 2 || arg == 4
783 return 'yes'
784 endif
785 return 'no'
786enddef
787
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100788def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100789 assert_equal("yes", AndOr(1))
790 assert_equal("no", AndOr(2))
791 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200792 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200793 assert_match('AndOr\_s*' ..
794 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
795 '\d LOAD arg\[-1]\_s*' ..
796 '\d PUSHNR 1\_s*' ..
797 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200798 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200799 '\d LOAD arg\[-1]\_s*' ..
800 '\d PUSHNR 2\_s*' ..
801 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200802 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200803 '\d LOAD arg\[-1]\_s*' ..
804 '\d\+ PUSHNR 4\_s*' ..
805 '\d\+ COMPAREANY ==\_s*' ..
806 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200807 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100808enddef
809
Bram Moolenaar04d05222020-02-06 22:06:54 +0100810def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +0200811 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +0100812 for i in range(3)
813 res->add(i)
814 endfor
815 return res
816enddef
817
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100818def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +0100819 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +0200820 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200821 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200822 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200823 '\d NEWLIST size 0\_s*' ..
824 '\d STORE $0\_s*' ..
825 'for i in range(3)\_s*' ..
826 '\d STORE -1 in $1\_s*' ..
827 '\d PUSHNR 3\_s*' ..
828 '\d BCALL range(argc 1)\_s*' ..
829 '\d FOR $1 -> \d\+\_s*' ..
830 '\d STORE $2\_s*' ..
831 'res->add(i)\_s*' ..
832 '\d LOAD $0\_s*' ..
833 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200834 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200835 '\d\+ DROP\_s*' ..
836 'endfor\_s*' ..
837 '\d\+ JUMP -> \d\+\_s*' ..
838 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200839 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +0100840enddef
841
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200842def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200843 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200844 for str in eval('["one", "two"]')
845 res ..= str
846 endfor
847 return res
848enddef
849
850def Test_disassemble_for_loop_eval()
851 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +0200852 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200853 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200855 '\d PUSHS ""\_s*' ..
856 '\d STORE $0\_s*' ..
857 'for str in eval(''\["one", "two"\]'')\_s*' ..
858 '\d STORE -1 in $1\_s*' ..
859 '\d PUSHS "\["one", "two"\]"\_s*' ..
860 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200861 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200862 '\d FOR $1 -> \d\+\_s*' ..
863 '\d STORE $2\_s*' ..
864 'res ..= str\_s*' ..
865 '\d\+ LOAD $0\_s*' ..
866 '\d\+ LOAD $2\_s*' ..
867 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
868 '\d\+ CONCAT\_s*' ..
869 '\d\+ STORE $0\_s*' ..
870 'endfor\_s*' ..
871 '\d\+ JUMP -> 6\_s*' ..
872 '\d\+ DROP\_s*' ..
873 'return res\_s*' ..
874 '\d\+ LOAD $0\_s*' ..
875 '\d\+ RETURN',
876 instr)
877enddef
878
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100879let g:number = 42
880
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200881def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +0200882 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200883enddef
884
885def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +0200886 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200887 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200888 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200889 '\d PUSHNR 23\_s*' ..
890 '\d LOADG g:number\_s*' ..
891 '\d CHECKTYPE number stack\[-1\]\_s*' ..
892 '\d NEWLIST size 2\_s*' ..
893 '\d STORE $0\_s*' ..
894 '\d PUSHNR 0\_s*' ..
895 '\d RETURN\_s*',
896 instr)
897enddef
898
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100899def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +0200900 var nr = 3
901 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100902 nrres = nr - 7
903 nrres = nr * 7
904 nrres = nr / 7
905 nrres = nr % 7
906
Bram Moolenaarac564082020-09-27 19:05:33 +0200907 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100908 anyres = g:number - 7
909 anyres = g:number * 7
910 anyres = g:number / 7
911 anyres = g:number % 7
912
913 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200914 var fl = 3.0
915 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100916 flres = fl - 7.0
917 flres = fl * 7.0
918 flres = fl / 7.0
919 endif
920enddef
921
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100922def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +0200923 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200924 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200925 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200926 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200927 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200928 '\d LOAD $0.*' ..
929 '\d PUSHNR 7.*' ..
930 '\d OPNR +.*' ..
931 '\d STORE $1.*' ..
932 'nrres = nr - 7.*' ..
933 '\d OPNR -.*' ..
934 'nrres = nr \* 7.*' ..
935 '\d OPNR \*.*' ..
936 'nrres = nr / 7.*' ..
937 '\d OPNR /.*' ..
938 'nrres = nr % 7.*' ..
939 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200940 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200941 '\d LOADG g:number.*' ..
942 '\d PUSHNR 7.*' ..
943 '\d OPANY +.*' ..
944 '\d STORE $2.*' ..
945 'anyres = g:number - 7.*' ..
946 '\d OPANY -.*' ..
947 'anyres = g:number \* 7.*' ..
948 '\d OPANY \*.*' ..
949 'anyres = g:number / 7.*' ..
950 '\d OPANY /.*' ..
951 'anyres = g:number % 7.*' ..
952 '\d OPANY %.*',
953 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100954 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200955 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200956 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200957 '\d PUSHF 3.0.*' ..
958 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200959 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200960 '\d LOAD $3.*' ..
961 '\d PUSHF 7.0.*' ..
962 '\d OPFLOAT +.*' ..
963 '\d STORE $4.*' ..
964 'flres = fl - 7.0.*' ..
965 '\d OPFLOAT -.*' ..
966 'flres = fl \* 7.0.*' ..
967 '\d OPFLOAT \*.*' ..
968 'flres = fl / 7.0.*' ..
969 '\d OPFLOAT /.*',
970 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100971 endif
972enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100973
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100974def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +0200975 var reslist = [1, 2] + [3, 4]
976 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100977enddef
978
979def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +0200980 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200981 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200982 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200983 '\d PUSHNR 1.*' ..
984 '\d PUSHNR 2.*' ..
985 '\d NEWLIST size 2.*' ..
986 '\d PUSHNR 3.*' ..
987 '\d PUSHNR 4.*' ..
988 '\d NEWLIST size 2.*' ..
989 '\d ADDLIST.*' ..
990 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200991 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200992 '\d PUSHBLOB 0z1122.*' ..
993 '\d PUSHBLOB 0z3344.*' ..
994 '\d ADDBLOB.*' ..
995 '\d STORE $.*',
996 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100997enddef
998
999let g:aa = 'aa'
1000def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001001 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001002 return res
1003enddef
1004
1005def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001006 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001007 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001008 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001009 '\d LOADG g:aa.*' ..
1010 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001011 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001012 '\d CONCAT.*' ..
1013 '\d STORE $.*',
1014 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001015 assert_equal('aabb', ConcatString())
1016enddef
1017
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001018def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001019 var s = "abcd"
1020 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001021 return res
1022enddef
1023
1024def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001025 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001026 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001027 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001028 '\d PUSHS "abcd"\_s*' ..
1029 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001030 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001031 '\d LOAD $0\_s*' ..
1032 '\d PUSHNR 1\_s*' ..
1033 '\d STRINDEX\_s*' ..
1034 '\d STORE $1\_s*',
1035 instr)
1036 assert_equal('b', StringIndex())
1037enddef
1038
Bram Moolenaared591872020-08-15 22:14:53 +02001039def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001040 var s = "abcd"
1041 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001042 return res
1043enddef
1044
1045def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001046 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001047 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001048 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001049 '\d PUSHS "abcd"\_s*' ..
1050 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001051 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001052 '\d LOAD $0\_s*' ..
1053 '\d PUSHNR 1\_s*' ..
1054 '\d PUSHNR 8\_s*' ..
1055 '\d STRSLICE\_s*' ..
1056 '\d STORE $1\_s*',
1057 instr)
1058 assert_equal('bcd', StringSlice())
1059enddef
1060
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001061def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 var l = [1, 2, 3]
1063 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001064 return res
1065enddef
1066
1067def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001068 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001069 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001070 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001071 '\d PUSHNR 1\_s*' ..
1072 '\d PUSHNR 2\_s*' ..
1073 '\d PUSHNR 3\_s*' ..
1074 '\d NEWLIST size 3\_s*' ..
1075 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001076 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001077 '\d LOAD $0\_s*' ..
1078 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001079 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001080 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001081 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001082 assert_equal(2, ListIndex())
1083enddef
1084
Bram Moolenaared591872020-08-15 22:14:53 +02001085def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001086 var l = [1, 2, 3]
1087 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001088 return res
1089enddef
1090
1091def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001092 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001093 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001094 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001095 '\d PUSHNR 1\_s*' ..
1096 '\d PUSHNR 2\_s*' ..
1097 '\d PUSHNR 3\_s*' ..
1098 '\d NEWLIST size 3\_s*' ..
1099 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001100 'var res = l\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001101 '\d LOAD $0\_s*' ..
1102 '\d PUSHNR 1\_s*' ..
1103 '\d PUSHNR 8\_s*' ..
1104 '\d LISTSLICE\_s*' ..
1105 '\d STORE $1\_s*',
1106 instr)
1107 assert_equal([2, 3], ListSlice())
1108enddef
1109
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001110def DictMember(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001111 var d = #{item: 1}
1112 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001113 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001114 return res
1115enddef
1116
1117def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001118 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001119 assert_match('DictMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001120 'var d = #{item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001121 '\d PUSHS "item"\_s*' ..
1122 '\d PUSHNR 1\_s*' ..
1123 '\d NEWDICT size 1\_s*' ..
1124 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001125 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001126 '\d\+ LOAD $0\_s*' ..
1127 '\d\+ MEMBER item\_s*' ..
1128 '\d\+ STORE $1\_s*' ..
1129 'res = d\["item"\]\_s*' ..
1130 '\d\+ LOAD $0\_s*' ..
1131 '\d\+ PUSHS "item"\_s*' ..
1132 '\d\+ MEMBER\_s*' ..
1133 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001134 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001135 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001136enddef
1137
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001138let somelist = [1, 2, 3, 4, 5]
1139def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001140 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001141 return res
1142enddef
1143
1144def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001145 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001146 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001147 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001148 '\d LOADG g:somelist\_s*' ..
1149 '\d PUSHNR 2\_s*' ..
1150 '\d ANYINDEX\_s*' ..
1151 '\d STORE $0\_s*' ..
1152 'return res\_s*' ..
1153 '\d LOAD $0\_s*' ..
1154 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1155 '\d RETURN',
1156 instr)
1157 assert_equal(3, AnyIndex())
1158enddef
1159
1160def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001161 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001162 return res
1163enddef
1164
1165def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001167 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001168 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001169 '\d LOADG g:somelist\_s*' ..
1170 '\d PUSHNR 1\_s*' ..
1171 '\d PUSHNR 3\_s*' ..
1172 '\d ANYSLICE\_s*' ..
1173 '\d STORE $0\_s*' ..
1174 'return res\_s*' ..
1175 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001176 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001177 '\d RETURN',
1178 instr)
1179 assert_equal([2, 3, 4], AnySlice())
1180enddef
1181
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001182def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001183 var nr = 9
1184 var plus = +nr
1185 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001186 return res
1187enddef
1188
1189def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001190 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001191 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001192 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001193 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001194 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001195 '\d LOAD $0\_s*' ..
1196 '\d CHECKNR\_s*' ..
1197 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001198 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001199 '\d LOAD $0\_s*' ..
1200 '\d NEGATENR\_s*' ..
1201 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001202 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001203 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001204enddef
1205
1206def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001207 var flag = true
1208 var invert = !flag
1209 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001210 return res
1211enddef
1212
1213def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001215 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001216 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001217 '\d PUSH v:true\_s*' ..
1218 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001219 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001220 '\d LOAD $0\_s*' ..
1221 '\d INVERT (!val)\_s*' ..
1222 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001223 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001224 '\d LOAD $0\_s*' ..
1225 '\d 2BOOL (!!val)\_s*' ..
1226 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001227 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001228 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001229enddef
1230
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001231def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001232 var name: bool = 1 && 0 || 1
1233 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001234enddef
1235
1236def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001237 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001238 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001239 'var name: bool = 1 && 0 || 1\_s*' ..
1240 '0 PUSHNR 1\_s*' ..
1241 '1 JUMP_IF_COND_FALSE -> 3\_s*' ..
1242 '2 PUSHNR 0\_s*' ..
1243 '3 COND2BOOL\_s*' ..
1244 '4 JUMP_IF_COND_TRUE -> 6\_s*' ..
1245 '5 PUSHNR 1\_s*' ..
1246 '6 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001247 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001248 'return name\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001249 '\d LOAD $0\_s*' ..
1250 '\d RETURN',
1251 instr)
1252 assert_equal(true, InvertBool())
1253enddef
1254
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001255def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001256 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001257 ['true == isFalse', 'COMPAREBOOL =='],
1258 ['true != isFalse', 'COMPAREBOOL !='],
1259 ['v:none == isNull', 'COMPARESPECIAL =='],
1260 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001261
Bram Moolenaara5565e42020-05-09 15:44:01 +02001262 ['111 == aNumber', 'COMPARENR =='],
1263 ['111 != aNumber', 'COMPARENR !='],
1264 ['111 > aNumber', 'COMPARENR >'],
1265 ['111 < aNumber', 'COMPARENR <'],
1266 ['111 >= aNumber', 'COMPARENR >='],
1267 ['111 <= aNumber', 'COMPARENR <='],
1268 ['111 =~ aNumber', 'COMPARENR =\~'],
1269 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001270
Bram Moolenaara5565e42020-05-09 15:44:01 +02001271 ['"xx" != aString', 'COMPARESTRING !='],
1272 ['"xx" > aString', 'COMPARESTRING >'],
1273 ['"xx" < aString', 'COMPARESTRING <'],
1274 ['"xx" >= aString', 'COMPARESTRING >='],
1275 ['"xx" <= aString', 'COMPARESTRING <='],
1276 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1277 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1278 ['"xx" is aString', 'COMPARESTRING is'],
1279 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001280
Bram Moolenaara5565e42020-05-09 15:44:01 +02001281 ['0z11 == aBlob', 'COMPAREBLOB =='],
1282 ['0z11 != aBlob', 'COMPAREBLOB !='],
1283 ['0z11 is aBlob', 'COMPAREBLOB is'],
1284 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001285
Bram Moolenaara5565e42020-05-09 15:44:01 +02001286 ['[1, 2] == aList', 'COMPARELIST =='],
1287 ['[1, 2] != aList', 'COMPARELIST !='],
1288 ['[1, 2] is aList', 'COMPARELIST is'],
1289 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001290
Bram Moolenaara5565e42020-05-09 15:44:01 +02001291 ['#{a: 1} == aDict', 'COMPAREDICT =='],
1292 ['#{a: 1} != aDict', 'COMPAREDICT !='],
1293 ['#{a: 1} is aDict', 'COMPAREDICT is'],
1294 ['#{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001295
1296 ['{->33} == {->44}', 'COMPAREFUNC =='],
1297 ['{->33} != {->44}', 'COMPAREFUNC !='],
1298 ['{->33} is {->44}', 'COMPAREFUNC is'],
1299 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1300
1301 ['77 == g:xx', 'COMPAREANY =='],
1302 ['77 != g:xx', 'COMPAREANY !='],
1303 ['77 > g:xx', 'COMPAREANY >'],
1304 ['77 < g:xx', 'COMPAREANY <'],
1305 ['77 >= g:xx', 'COMPAREANY >='],
1306 ['77 <= g:xx', 'COMPAREANY <='],
1307 ['77 =~ g:xx', 'COMPAREANY =\~'],
1308 ['77 !~ g:xx', 'COMPAREANY !\~'],
1309 ['77 is g:xx', 'COMPAREANY is'],
1310 ['77 isnot g:xx', 'COMPAREANY isnot'],
1311 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001312 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001313 if has('float')
1314 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001315 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1316 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1317 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1318 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1319 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1320 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1321 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1322 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001323 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001324 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001325 endif
1326
Bram Moolenaarac564082020-09-27 19:05:33 +02001327 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001328 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001329 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001330 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001331 ' var isFalse = false',
1332 ' var isNull = v:null',
1333 ' var aNumber = 222',
1334 ' var aString = "yy"',
1335 ' var aBlob = 0z22',
1336 ' var aList = [3, 4]',
1337 ' var aDict = #{x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001338 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001339 ' if ' .. case[0],
1340 ' echo 42'
1341 ' endif',
1342 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001343 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001344 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001345 assert_match('TestCase' .. nr .. '.*' ..
1346 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1347 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001348 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001349 '\d ' .. case[1] .. '.*' ..
1350 '\d JUMP_IF_FALSE -> \d\+.*',
1351 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001352
1353 nr += 1
1354 endfor
1355
Bram Moolenaar22da5592020-03-19 14:52:20 +01001356 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001357enddef
1358
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001359def s:FalsyOp()
1360 echo g:flag ?? "yes"
1361 echo [] ?? "empty list"
1362 echo "" ?? "empty string"
1363enddef
1364
1365def Test_dsassemble_falsy_op()
1366 var res = execute('disass s:FalsyOp')
1367 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1368 'echo g:flag ?? "yes"\_s*' ..
1369 '0 LOADG g:flag\_s*' ..
1370 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1371 '2 PUSHS "yes"\_s*' ..
1372 '3 ECHO 1\_s*' ..
1373 'echo \[\] ?? "empty list"\_s*' ..
1374 '4 NEWLIST size 0\_s*' ..
1375 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1376 '6 PUSHS "empty list"\_s*' ..
1377 '7 ECHO 1\_s*' ..
1378 'echo "" ?? "empty string"\_s*' ..
1379 '\d\+ PUSHS "empty string"\_s*' ..
1380 '\d\+ ECHO 1\_s*' ..
1381 '\d\+ PUSHNR 0\_s*' ..
1382 '\d\+ RETURN',
1383 res)
1384enddef
1385
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001386def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001387 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001388 ['"xx" == "yy"', false],
1389 ['"aa" == "aa"', true],
1390 ['has("eval") ? true : false', true],
1391 ['has("asdf") ? true : false', false],
1392 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001393
Bram Moolenaarac564082020-09-27 19:05:33 +02001394 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001395 for case in cases
1396 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001397 ' if ' .. case[0],
1398 ' echo 42'
1399 ' endif',
1400 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001401 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001402 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001403 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001404 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001405 assert_match('TestCase' .. nr .. '.*' ..
1406 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1407 '\d PUSHNR 42.*' ..
1408 '\d ECHO 1.*' ..
1409 '\d PUSHNR 0.*' ..
1410 '\d RETURN.*',
1411 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001412 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001413 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001414 assert_match('TestCase' .. nr .. '.*' ..
1415 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1416 'echo 42[ \n]*' ..
1417 'endif[ \n]*' ..
1418 '\s*\d PUSHNR 0.*' ..
1419 '\d RETURN.*',
1420 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001421 endif
1422
1423 nr += 1
1424 endfor
1425
1426 delete('Xdisassemble')
1427enddef
1428
Bram Moolenaarad39c092020-02-26 18:23:43 +01001429def s:Execute()
1430 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001431 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001432 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001433 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001434 execute 'help ' .. tag
1435enddef
1436
1437def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001438 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001439 assert_match('\<SNR>\d*_Execute\_s*' ..
1440 "execute 'help vim9.txt'\\_s*" ..
1441 '\d PUSHS "help vim9.txt"\_s*' ..
1442 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001443 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001444 '\d PUSHS "help vim9.txt"\_s*' ..
1445 '\d STORE $0\_s*' ..
1446 'execute cmd\_s*' ..
1447 '\d LOAD $0\_s*' ..
1448 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001449 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001450 '\d PUSHS "vim9.txt"\_s*' ..
1451 '\d STORE $1\_s*' ..
1452 "execute 'help ' .. tag\\_s*" ..
1453 '\d\+ PUSHS "help "\_s*' ..
1454 '\d\+ LOAD $1\_s*' ..
1455 '\d\+ CONCAT\_s*' ..
1456 '\d\+ EXECUTE 1\_s*' ..
1457 '\d\+ PUSHNR 0\_s*' ..
1458 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001459 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001460enddef
1461
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001462def s:Echomsg()
1463 echomsg 'some' 'message'
1464 echoerr 'went' .. 'wrong'
1465enddef
1466
1467def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001468 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001469 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1470 "echomsg 'some' 'message'\\_s*" ..
1471 '\d PUSHS "some"\_s*' ..
1472 '\d PUSHS "message"\_s*' ..
1473 '\d ECHOMSG 2\_s*' ..
1474 "echoerr 'went' .. 'wrong'\\_s*" ..
1475 '\d PUSHS "wentwrong"\_s*' ..
1476 '\d ECHOERR 1\_s*' ..
1477 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001478 '\d RETURN',
1479 res)
1480enddef
1481
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001482def SomeStringArg(arg: string)
1483 echo arg
1484enddef
1485
1486def SomeAnyArg(arg: any)
1487 echo arg
1488enddef
1489
1490def SomeStringArgAndReturn(arg: string): string
1491 return arg
1492enddef
1493
1494def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001495 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001496 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1497 '\d *echo arg.*' ..
1498 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001499 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001500
Bram Moolenaarac564082020-09-27 19:05:33 +02001501 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001502 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1503 '\d *echo arg\_s*' ..
1504 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001505 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001506
Bram Moolenaarac564082020-09-27 19:05:33 +02001507 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001508 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1509 '\d *return arg\_s*' ..
1510 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001511 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001512enddef
1513
Bram Moolenaar09689a02020-05-09 22:50:08 +02001514def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001515 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001516 vim9script
1517 def FuncOne(): string
1518 return FuncTwo()
1519 enddef
1520 def FuncTwo(): string
1521 return 'two'
1522 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001523 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001524 END
1525 writefile(lines, 'Xdisassemble')
1526 source Xdisassemble
1527
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001528 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001529 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1530 'return FuncTwo()\_s*' ..
1531 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001532 '\d RETURN',
1533 g:res_FuncOne)
1534
1535 delete('Xdisassemble')
1536 unlet g:res_FuncOne
1537enddef
1538
Bram Moolenaar61a89812020-05-07 16:58:17 +02001539def s:ConcatStrings(): string
1540 return 'one' .. 'two' .. 'three'
1541enddef
1542
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001543def s:ComputeConst(): number
1544 return 2 + 3 * 4 / 6 + 7
1545enddef
1546
Bram Moolenaar1c747212020-05-09 18:28:34 +02001547def s:ComputeConstParen(): number
1548 return ((2 + 4) * (8 / 2)) / (3 + 4)
1549enddef
1550
Bram Moolenaar61a89812020-05-07 16:58:17 +02001551def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001552 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001553 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1554 "return 'one' .. 'two' .. 'three'\\_s*" ..
1555 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001556 '\d RETURN',
1557 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001558
1559 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001560 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1561 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1562 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001563 '\d RETURN',
1564 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001565
1566 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001567 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1568 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1569 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001570 '\d RETURN',
1571 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001572enddef
1573
Bram Moolenaar389df252020-07-09 21:20:47 +02001574def s:CallAppend()
1575 eval "some text"->append(2)
1576enddef
1577
1578def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001579 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001580 assert_match('<SNR>\d*_CallAppend\_s*' ..
1581 'eval "some text"->append(2)\_s*' ..
1582 '\d PUSHS "some text"\_s*' ..
1583 '\d PUSHNR 2\_s*' ..
1584 '\d SHUFFLE 2 up 1\_s*' ..
1585 '\d BCALL append(argc 2)\_s*' ..
1586 '\d DROP\_s*' ..
1587 '\d PUSHNR 0\_s*' ..
1588 '\d RETURN',
1589 res)
1590enddef
1591
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001592" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker