blob: f233f5b82e2ee76fdfbbe94b34fdea5455afa0c1 [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 Moolenaard72c1bf2020-04-19 16:28:59 +0200276def s:ScriptFuncUnlet()
277 g:somevar = "value"
278 unlet g:somevar
279 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200280 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200281enddef
282
283def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200284 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200285 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
286 'g:somevar = "value"\_s*' ..
287 '\d PUSHS "value"\_s*' ..
288 '\d STOREG g:somevar\_s*' ..
289 'unlet g:somevar\_s*' ..
290 '\d UNLET g:somevar\_s*' ..
291 'unlet! g:somevar\_s*' ..
292 '\d UNLET! g:somevar\_s*' ..
293 'unlet $SOMEVAR\_s*' ..
294 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200295 res)
296enddef
297
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100298def s:ScriptFuncTry()
299 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200300 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100301 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200302 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100303 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200304 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100305 endtry
306enddef
307
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100308def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200310 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
311 'try\_s*' ..
312 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
313 'echo "yes"\_s*' ..
314 '\d PUSHS "yes"\_s*' ..
315 '\d ECHO 1\_s*' ..
316 'catch /fail/\_s*' ..
317 '\d JUMP -> \d\+\_s*' ..
318 '\d PUSH v:exception\_s*' ..
319 '\d PUSHS "fail"\_s*' ..
320 '\d COMPARESTRING =\~\_s*' ..
321 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
322 '\d CATCH\_s*' ..
323 'echo "no"\_s*' ..
324 '\d\+ PUSHS "no"\_s*' ..
325 '\d\+ ECHO 1\_s*' ..
326 'finally\_s*' ..
327 'throw "end"\_s*' ..
328 '\d\+ PUSHS "end"\_s*' ..
329 '\d\+ THROW\_s*' ..
330 'endtry\_s*' ..
331 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200332 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100333enddef
334
335def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200336 var ll = [1, "two", 333]
337 var dd = #{one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100338enddef
339
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100340def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200341 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200342 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200343 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200344 '\d PUSHNR 1\_s*' ..
345 '\d PUSHS "two"\_s*' ..
346 '\d PUSHNR 333\_s*' ..
347 '\d NEWLIST size 3\_s*' ..
348 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200349 'var dd = #{one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200350 '\d PUSHS "one"\_s*' ..
351 '\d PUSHNR 1\_s*' ..
352 '\d PUSHS "two"\_s*' ..
353 '\d PUSHS "val"\_s*' ..
354 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200355 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100356enddef
357
Bram Moolenaar6e949782020-04-13 17:21:00 +0200358def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100359 echo arg
360enddef
361
362func UserFunc()
363 echo 'nothing'
364endfunc
365
366func UserFuncWithArg(arg)
367 echo a:arg
368endfunc
369
370def s:ScriptFuncCall(): string
371 changenr()
372 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100373 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100374 FuncWithArg(343)
375 ScriptFuncNew()
376 s:ScriptFuncNew()
377 UserFunc()
378 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200379 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100380 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200381 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100382 FuncRefWithArg("bar")
383 return "yes"
384enddef
385
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100386def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200387 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200388 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
389 'changenr()\_s*' ..
390 '\d BCALL changenr(argc 0)\_s*' ..
391 '\d DROP\_s*' ..
392 'char2nr("abc")\_s*' ..
393 '\d PUSHS "abc"\_s*' ..
394 '\d BCALL char2nr(argc 1)\_s*' ..
395 '\d DROP\_s*' ..
396 'Test_disassemble_new()\_s*' ..
397 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
398 '\d DROP\_s*' ..
399 'FuncWithArg(343)\_s*' ..
400 '\d\+ PUSHNR 343\_s*' ..
401 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
402 '\d\+ DROP\_s*' ..
403 'ScriptFuncNew()\_s*' ..
404 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
405 '\d\+ DROP\_s*' ..
406 's:ScriptFuncNew()\_s*' ..
407 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
408 '\d\+ DROP\_s*' ..
409 'UserFunc()\_s*' ..
410 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
411 '\d\+ DROP\_s*' ..
412 'UserFuncWithArg("foo")\_s*' ..
413 '\d\+ PUSHS "foo"\_s*' ..
414 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
415 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200416 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200417 '\d\+ PUSHS "UserFunc"\_s*' ..
418 '\d\+ BCALL function(argc 1)\_s*' ..
419 '\d\+ STORE $0\_s*' ..
420 'FuncRef()\_s*' ..
421 '\d\+ LOAD $\d\_s*' ..
422 '\d\+ PCALL (argc 0)\_s*' ..
423 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200424 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200425 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
426 '\d\+ BCALL function(argc 1)\_s*' ..
427 '\d\+ STORE $1\_s*' ..
428 'FuncRefWithArg("bar")\_s*' ..
429 '\d\+ PUSHS "bar"\_s*' ..
430 '\d\+ LOAD $\d\_s*' ..
431 '\d\+ PCALL (argc 1)\_s*' ..
432 '\d\+ DROP\_s*' ..
433 'return "yes"\_s*' ..
434 '\d\+ PUSHS "yes"\_s*' ..
435 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200436 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100437enddef
438
Bram Moolenaar6a614212020-10-08 23:21:21 +0200439" TODO: fix memory leak and enable again
440"def s:CreateRefs()
441" var local = 'a'
442" def Append(arg: string)
443" local ..= arg
444" enddef
445" g:Append = Append
446" def Get(): string
447" return local
448" enddef
449" g:Get = Get
450"enddef
451"
452"def Test_disassemble_closure()
453" CreateRefs()
454" var res = execute('disass g:Append')
455" assert_match('<lambda>\d\_s*' ..
456" 'local ..= arg\_s*' ..
457" '\d LOADOUTER $0\_s*' ..
458" '\d LOAD arg\[-1\]\_s*' ..
459" '\d CONCAT\_s*' ..
460" '\d STOREOUTER $0\_s*' ..
461" '\d PUSHNR 0\_s*' ..
462" '\d RETURN',
463" res)
464"
465" res = execute('disass g:Get')
466" assert_match('<lambda>\d\_s*' ..
467" 'return local\_s*' ..
468" '\d LOADOUTER $0\_s*' ..
469" '\d RETURN',
470" res)
471"
472" unlet g:Append
473" unlet g:Get
474"enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200475
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100476
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200477def EchoArg(arg: string): string
478 return arg
479enddef
480def RefThis(): func
481 return function('EchoArg')
482enddef
483def s:ScriptPCall()
484 RefThis()("text")
485enddef
486
487def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200488 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200489 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
490 'RefThis()("text")\_s*' ..
491 '\d DCALL RefThis(argc 0)\_s*' ..
492 '\d PUSHS "text"\_s*' ..
493 '\d PCALL top (argc 1)\_s*' ..
494 '\d PCALL end\_s*' ..
495 '\d DROP\_s*' ..
496 '\d PUSHNR 0\_s*' ..
497 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200498 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200499enddef
500
501
Bram Moolenaara26b9702020-04-18 19:53:28 +0200502def s:FuncWithForwardCall(): string
503 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100504enddef
505
506def DefinedLater(arg: string): string
507 return arg
508enddef
509
510def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200511 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200512 assert_match('FuncWithForwardCall\_s*' ..
513 'return g:DefinedLater("yes")\_s*' ..
514 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200515 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200516 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200517 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100518
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200519 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100520 assert_equal('yes', FuncWithForwardCall())
521
Bram Moolenaara26b9702020-04-18 19:53:28 +0200522 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200523 assert_match('FuncWithForwardCall\_s*' ..
524 'return g:DefinedLater("yes")\_s*' ..
525 '\d PUSHS "yes"\_s*' ..
526 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200527 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200528 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100529enddef
530
531
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100532def FuncWithDefault(arg: string = 'default'): string
533 return arg
534enddef
535
536def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200537 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200538 assert_match('FuncWithDefault\_s*' ..
539 '\d PUSHS "default"\_s*' ..
540 '\d STORE arg\[-1]\_s*' ..
541 'return arg\_s*' ..
542 '\d LOAD arg\[-1]\_s*' ..
543 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200544 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100545enddef
546
547
Bram Moolenaar158906c2020-02-06 20:39:45 +0100548def HasEval()
549 if has("eval")
550 echo "yes"
551 else
552 echo "no"
553 endif
554enddef
555
556def HasNothing()
557 if has("nothing")
558 echo "yes"
559 else
560 echo "no"
561 endif
562enddef
563
564def HasSomething()
565 if has("nothing")
566 echo "nothing"
567 elseif has("something")
568 echo "something"
569 elseif has("eval")
570 echo "eval"
571 elseif has("less")
572 echo "less"
573 endif
574enddef
575
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100576def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200577 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200578 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200579 assert_match('HasEval\_s*' ..
580 'if has("eval")\_s*' ..
581 'echo "yes"\_s*' ..
582 '\d PUSHS "yes"\_s*' ..
583 '\d ECHO 1\_s*' ..
584 'else\_s*' ..
585 'echo "no"\_s*' ..
586 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200587 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100588 assert_notmatch('JUMP', instr)
589
Bram Moolenaard2c61702020-09-06 15:58:36 +0200590 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100591 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200592 assert_match('HasNothing\_s*' ..
593 'if has("nothing")\_s*' ..
594 'echo "yes"\_s*' ..
595 'else\_s*' ..
596 'echo "no"\_s*' ..
597 '\d PUSHS "no"\_s*' ..
598 '\d ECHO 1\_s*' ..
599 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200600 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100601 assert_notmatch('PUSHS "yes"', instr)
602 assert_notmatch('JUMP', instr)
603
Bram Moolenaard2c61702020-09-06 15:58:36 +0200604 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100605 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200606 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200607 'if has("nothing")\_s*' ..
608 'echo "nothing"\_s*' ..
609 'elseif has("something")\_s*' ..
610 'echo "something"\_s*' ..
611 'elseif has("eval")\_s*' ..
612 'echo "eval"\_s*' ..
613 '\d PUSHS "eval"\_s*' ..
614 '\d ECHO 1\_s*' ..
615 'elseif has("less").*' ..
616 'echo "less"\_s*' ..
617 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200618 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100619 assert_notmatch('PUSHS "nothing"', instr)
620 assert_notmatch('PUSHS "something"', instr)
621 assert_notmatch('PUSHS "less"', instr)
622 assert_notmatch('JUMP', instr)
623enddef
624
Bram Moolenaarefd88552020-06-18 20:50:10 +0200625def ReturnInIf(): string
626 if g:cond
627 return "yes"
628 else
629 return "no"
630 endif
631enddef
632
633def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200634 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200635 assert_match('ReturnInIf\_s*' ..
636 'if g:cond\_s*' ..
637 '0 LOADG g:cond\_s*' ..
638 '1 JUMP_IF_FALSE -> 4\_s*' ..
639 'return "yes"\_s*' ..
640 '2 PUSHS "yes"\_s*' ..
641 '3 RETURN\_s*' ..
642 'else\_s*' ..
643 ' return "no"\_s*' ..
644 '4 PUSHS "no"\_s*' ..
645 '5 RETURN$',
646 instr)
647enddef
648
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100649def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200650 var Funky1: func
651 var Funky2: func = function("len")
652 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100653enddef
654
655def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200656 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200657 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200658 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200659 '0 PUSHFUNC "\[none]"\_s*' ..
660 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200661 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200662 '2 PUSHS "len"\_s*' ..
663 '3 BCALL function(argc 1)\_s*' ..
664 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200665 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200666 '\d PUSHS "UserFunc"\_s*' ..
667 '\d BCALL funcref(argc 1)\_s*' ..
668 '\d STORE $2\_s*' ..
669 '\d PUSHNR 0\_s*' ..
670 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200671 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100672enddef
673
674if has('channel')
675 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200676 var job1: job
677 var job2: job = job_start("donothing")
678 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100679 enddef
680endif
681
682def Test_disassemble_channel()
683 CheckFeature channel
684
Bram Moolenaarac564082020-09-27 19:05:33 +0200685 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200686 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200687 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200688 '\d PUSHJOB "no process"\_s*' ..
689 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200690 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200691 '\d PUSHS "donothing"\_s*' ..
692 '\d BCALL job_start(argc 1)\_s*' ..
693 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200694 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200695 '\d PUSHCHANNEL 0\_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
Bram Moolenaar777770f2020-02-06 21:27:08 +0100702def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200703 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100704 return F("x")
705enddef
706
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100707def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100708 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200709 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200710 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200711 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200712 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200713 '\d STORE $0\_s*' ..
714 'return F("x")\_s*' ..
715 '\d PUSHS "x"\_s*' ..
716 '\d LOAD $0\_s*' ..
717 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200718 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200719 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200720
Bram Moolenaarac564082020-09-27 19:05:33 +0200721 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200722 instr = execute('disassemble ' .. name)
723 assert_match('<lambda>\d\+\_s*' ..
724 'return "X" .. a .. "X"\_s*' ..
725 '\d PUSHS "X"\_s*' ..
726 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200727 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200728 '\d CONCAT\_s*' ..
729 '\d PUSHS "X"\_s*' ..
730 '\d CONCAT\_s*' ..
731 '\d RETURN',
732 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100733enddef
734
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200735def NestedOuter()
736 def g:Inner()
737 echomsg "inner"
738 enddef
739enddef
740
741def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200742 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200743 assert_match('NestedOuter\_s*' ..
744 'def g:Inner()\_s*' ..
745 'echomsg "inner"\_s*' ..
746 'enddef\_s*' ..
747 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
748 '\d PUSHNR 0\_s*' ..
749 '\d RETURN',
750 instr)
751enddef
752
Bram Moolenaar6e949782020-04-13 17:21:00 +0200753def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100754 if arg == 1 && arg != 2 || arg == 4
755 return 'yes'
756 endif
757 return 'no'
758enddef
759
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100760def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100761 assert_equal("yes", AndOr(1))
762 assert_equal("no", AndOr(2))
763 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200764 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200765 assert_match('AndOr\_s*' ..
766 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
767 '\d LOAD arg\[-1]\_s*' ..
768 '\d PUSHNR 1\_s*' ..
769 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200770 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200771 '\d LOAD arg\[-1]\_s*' ..
772 '\d PUSHNR 2\_s*' ..
773 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200774 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200775 '\d LOAD arg\[-1]\_s*' ..
776 '\d\+ PUSHNR 4\_s*' ..
777 '\d\+ COMPAREANY ==\_s*' ..
778 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200779 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100780enddef
781
Bram Moolenaar04d05222020-02-06 22:06:54 +0100782def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +0200783 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +0100784 for i in range(3)
785 res->add(i)
786 endfor
787 return res
788enddef
789
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100790def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +0100791 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +0200792 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200793 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200794 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200795 '\d NEWLIST size 0\_s*' ..
796 '\d STORE $0\_s*' ..
797 'for i in range(3)\_s*' ..
798 '\d STORE -1 in $1\_s*' ..
799 '\d PUSHNR 3\_s*' ..
800 '\d BCALL range(argc 1)\_s*' ..
801 '\d FOR $1 -> \d\+\_s*' ..
802 '\d STORE $2\_s*' ..
803 'res->add(i)\_s*' ..
804 '\d LOAD $0\_s*' ..
805 '\d LOAD $2\_s*' ..
806 '\d\+ BCALL add(argc 2)\_s*' ..
807 '\d\+ DROP\_s*' ..
808 'endfor\_s*' ..
809 '\d\+ JUMP -> \d\+\_s*' ..
810 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200811 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +0100812enddef
813
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200814def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200815 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200816 for str in eval('["one", "two"]')
817 res ..= str
818 endfor
819 return res
820enddef
821
822def Test_disassemble_for_loop_eval()
823 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +0200824 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200825 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200826 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200827 '\d PUSHS ""\_s*' ..
828 '\d STORE $0\_s*' ..
829 'for str in eval(''\["one", "two"\]'')\_s*' ..
830 '\d STORE -1 in $1\_s*' ..
831 '\d PUSHS "\["one", "two"\]"\_s*' ..
832 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200833 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200834 '\d FOR $1 -> \d\+\_s*' ..
835 '\d STORE $2\_s*' ..
836 'res ..= str\_s*' ..
837 '\d\+ LOAD $0\_s*' ..
838 '\d\+ LOAD $2\_s*' ..
839 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
840 '\d\+ CONCAT\_s*' ..
841 '\d\+ STORE $0\_s*' ..
842 'endfor\_s*' ..
843 '\d\+ JUMP -> 6\_s*' ..
844 '\d\+ DROP\_s*' ..
845 'return res\_s*' ..
846 '\d\+ LOAD $0\_s*' ..
847 '\d\+ RETURN',
848 instr)
849enddef
850
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100851let g:number = 42
852
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200853def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200855enddef
856
857def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +0200858 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200859 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200860 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200861 '\d PUSHNR 23\_s*' ..
862 '\d LOADG g:number\_s*' ..
863 '\d CHECKTYPE number stack\[-1\]\_s*' ..
864 '\d NEWLIST size 2\_s*' ..
865 '\d STORE $0\_s*' ..
866 '\d PUSHNR 0\_s*' ..
867 '\d RETURN\_s*',
868 instr)
869enddef
870
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100871def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +0200872 var nr = 3
873 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100874 nrres = nr - 7
875 nrres = nr * 7
876 nrres = nr / 7
877 nrres = nr % 7
878
Bram Moolenaarac564082020-09-27 19:05:33 +0200879 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100880 anyres = g:number - 7
881 anyres = g:number * 7
882 anyres = g:number / 7
883 anyres = g:number % 7
884
885 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200886 var fl = 3.0
887 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100888 flres = fl - 7.0
889 flres = fl * 7.0
890 flres = fl / 7.0
891 endif
892enddef
893
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100894def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +0200895 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200896 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200897 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200898 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200899 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200900 '\d LOAD $0.*' ..
901 '\d PUSHNR 7.*' ..
902 '\d OPNR +.*' ..
903 '\d STORE $1.*' ..
904 'nrres = nr - 7.*' ..
905 '\d OPNR -.*' ..
906 'nrres = nr \* 7.*' ..
907 '\d OPNR \*.*' ..
908 'nrres = nr / 7.*' ..
909 '\d OPNR /.*' ..
910 'nrres = nr % 7.*' ..
911 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200912 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200913 '\d LOADG g:number.*' ..
914 '\d PUSHNR 7.*' ..
915 '\d OPANY +.*' ..
916 '\d STORE $2.*' ..
917 'anyres = g:number - 7.*' ..
918 '\d OPANY -.*' ..
919 'anyres = g:number \* 7.*' ..
920 '\d OPANY \*.*' ..
921 'anyres = g:number / 7.*' ..
922 '\d OPANY /.*' ..
923 'anyres = g:number % 7.*' ..
924 '\d OPANY %.*',
925 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100926 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200927 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200928 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200929 '\d PUSHF 3.0.*' ..
930 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200931 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200932 '\d LOAD $3.*' ..
933 '\d PUSHF 7.0.*' ..
934 '\d OPFLOAT +.*' ..
935 '\d STORE $4.*' ..
936 'flres = fl - 7.0.*' ..
937 '\d OPFLOAT -.*' ..
938 'flres = fl \* 7.0.*' ..
939 '\d OPFLOAT \*.*' ..
940 'flres = fl / 7.0.*' ..
941 '\d OPFLOAT /.*',
942 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100943 endif
944enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100945
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100946def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +0200947 var reslist = [1, 2] + [3, 4]
948 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100949enddef
950
951def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +0200952 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200953 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200954 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200955 '\d PUSHNR 1.*' ..
956 '\d PUSHNR 2.*' ..
957 '\d NEWLIST size 2.*' ..
958 '\d PUSHNR 3.*' ..
959 '\d PUSHNR 4.*' ..
960 '\d NEWLIST size 2.*' ..
961 '\d ADDLIST.*' ..
962 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200963 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200964 '\d PUSHBLOB 0z1122.*' ..
965 '\d PUSHBLOB 0z3344.*' ..
966 '\d ADDBLOB.*' ..
967 '\d STORE $.*',
968 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100969enddef
970
971let g:aa = 'aa'
972def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200973 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100974 return res
975enddef
976
977def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +0200978 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200979 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200980 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200981 '\d LOADG g:aa.*' ..
982 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200983 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200984 '\d CONCAT.*' ..
985 '\d STORE $.*',
986 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100987 assert_equal('aabb', ConcatString())
988enddef
989
Bram Moolenaar11107ba2020-08-15 21:10:16 +0200990def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200991 var s = "abcd"
992 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +0200993 return res
994enddef
995
996def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +0200997 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +0200998 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200999 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001000 '\d PUSHS "abcd"\_s*' ..
1001 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001002 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001003 '\d LOAD $0\_s*' ..
1004 '\d PUSHNR 1\_s*' ..
1005 '\d STRINDEX\_s*' ..
1006 '\d STORE $1\_s*',
1007 instr)
1008 assert_equal('b', StringIndex())
1009enddef
1010
Bram Moolenaared591872020-08-15 22:14:53 +02001011def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001012 var s = "abcd"
1013 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001014 return res
1015enddef
1016
1017def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001018 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001019 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001020 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001021 '\d PUSHS "abcd"\_s*' ..
1022 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001023 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001024 '\d LOAD $0\_s*' ..
1025 '\d PUSHNR 1\_s*' ..
1026 '\d PUSHNR 8\_s*' ..
1027 '\d STRSLICE\_s*' ..
1028 '\d STORE $1\_s*',
1029 instr)
1030 assert_equal('bcd', StringSlice())
1031enddef
1032
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001033def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001034 var l = [1, 2, 3]
1035 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001036 return res
1037enddef
1038
1039def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001040 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001041 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001042 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001043 '\d PUSHNR 1\_s*' ..
1044 '\d PUSHNR 2\_s*' ..
1045 '\d PUSHNR 3\_s*' ..
1046 '\d NEWLIST size 3\_s*' ..
1047 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001048 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001049 '\d LOAD $0\_s*' ..
1050 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001051 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001052 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001053 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001054 assert_equal(2, ListIndex())
1055enddef
1056
Bram Moolenaared591872020-08-15 22:14:53 +02001057def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001058 var l = [1, 2, 3]
1059 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001060 return res
1061enddef
1062
1063def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001064 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001065 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001066 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001067 '\d PUSHNR 1\_s*' ..
1068 '\d PUSHNR 2\_s*' ..
1069 '\d PUSHNR 3\_s*' ..
1070 '\d NEWLIST size 3\_s*' ..
1071 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001072 'var res = l\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001073 '\d LOAD $0\_s*' ..
1074 '\d PUSHNR 1\_s*' ..
1075 '\d PUSHNR 8\_s*' ..
1076 '\d LISTSLICE\_s*' ..
1077 '\d STORE $1\_s*',
1078 instr)
1079 assert_equal([2, 3], ListSlice())
1080enddef
1081
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001082def DictMember(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001083 var d = #{item: 1}
1084 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001085 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001086 return res
1087enddef
1088
1089def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001090 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001091 assert_match('DictMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001092 'var d = #{item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001093 '\d PUSHS "item"\_s*' ..
1094 '\d PUSHNR 1\_s*' ..
1095 '\d NEWDICT size 1\_s*' ..
1096 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001097 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001098 '\d\+ LOAD $0\_s*' ..
1099 '\d\+ MEMBER item\_s*' ..
1100 '\d\+ STORE $1\_s*' ..
1101 'res = d\["item"\]\_s*' ..
1102 '\d\+ LOAD $0\_s*' ..
1103 '\d\+ PUSHS "item"\_s*' ..
1104 '\d\+ MEMBER\_s*' ..
1105 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001106 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001107 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001108enddef
1109
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001110let somelist = [1, 2, 3, 4, 5]
1111def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001112 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001113 return res
1114enddef
1115
1116def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001117 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001118 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001119 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001120 '\d LOADG g:somelist\_s*' ..
1121 '\d PUSHNR 2\_s*' ..
1122 '\d ANYINDEX\_s*' ..
1123 '\d STORE $0\_s*' ..
1124 'return res\_s*' ..
1125 '\d LOAD $0\_s*' ..
1126 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1127 '\d RETURN',
1128 instr)
1129 assert_equal(3, AnyIndex())
1130enddef
1131
1132def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001133 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001134 return res
1135enddef
1136
1137def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001138 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001139 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001140 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001141 '\d LOADG g:somelist\_s*' ..
1142 '\d PUSHNR 1\_s*' ..
1143 '\d PUSHNR 3\_s*' ..
1144 '\d ANYSLICE\_s*' ..
1145 '\d STORE $0\_s*' ..
1146 'return res\_s*' ..
1147 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001148 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001149 '\d RETURN',
1150 instr)
1151 assert_equal([2, 3, 4], AnySlice())
1152enddef
1153
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001154def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001155 var nr = 9
1156 var plus = +nr
1157 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001158 return res
1159enddef
1160
1161def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001162 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001163 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001164 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001165 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001167 '\d LOAD $0\_s*' ..
1168 '\d CHECKNR\_s*' ..
1169 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001170 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001171 '\d LOAD $0\_s*' ..
1172 '\d NEGATENR\_s*' ..
1173 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001174 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001175 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001176enddef
1177
1178def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001179 var flag = true
1180 var invert = !flag
1181 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001182 return res
1183enddef
1184
1185def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001186 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001187 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001188 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001189 '\d PUSH v:true\_s*' ..
1190 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001191 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001192 '\d LOAD $0\_s*' ..
1193 '\d INVERT (!val)\_s*' ..
1194 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001195 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001196 '\d LOAD $0\_s*' ..
1197 '\d 2BOOL (!!val)\_s*' ..
1198 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001199 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001200 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001201enddef
1202
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001203def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001204 var name: bool = 1 && 0 || 1
1205 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001206enddef
1207
1208def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001209 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001210 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001211 'var name: bool = 1 && 0 || 1\_s*' ..
1212 '0 PUSHNR 1\_s*' ..
1213 '1 JUMP_IF_COND_FALSE -> 3\_s*' ..
1214 '2 PUSHNR 0\_s*' ..
1215 '3 COND2BOOL\_s*' ..
1216 '4 JUMP_IF_COND_TRUE -> 6\_s*' ..
1217 '5 PUSHNR 1\_s*' ..
1218 '6 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001219 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001220 'return name\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001221 '\d LOAD $0\_s*' ..
1222 '\d RETURN',
1223 instr)
1224 assert_equal(true, InvertBool())
1225enddef
1226
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001227def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001228 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001229 ['true == isFalse', 'COMPAREBOOL =='],
1230 ['true != isFalse', 'COMPAREBOOL !='],
1231 ['v:none == isNull', 'COMPARESPECIAL =='],
1232 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001233
Bram Moolenaara5565e42020-05-09 15:44:01 +02001234 ['111 == aNumber', 'COMPARENR =='],
1235 ['111 != aNumber', 'COMPARENR !='],
1236 ['111 > aNumber', 'COMPARENR >'],
1237 ['111 < aNumber', 'COMPARENR <'],
1238 ['111 >= aNumber', 'COMPARENR >='],
1239 ['111 <= aNumber', 'COMPARENR <='],
1240 ['111 =~ aNumber', 'COMPARENR =\~'],
1241 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001242
Bram Moolenaara5565e42020-05-09 15:44:01 +02001243 ['"xx" != aString', 'COMPARESTRING !='],
1244 ['"xx" > aString', 'COMPARESTRING >'],
1245 ['"xx" < aString', 'COMPARESTRING <'],
1246 ['"xx" >= aString', 'COMPARESTRING >='],
1247 ['"xx" <= aString', 'COMPARESTRING <='],
1248 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1249 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1250 ['"xx" is aString', 'COMPARESTRING is'],
1251 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001252
Bram Moolenaara5565e42020-05-09 15:44:01 +02001253 ['0z11 == aBlob', 'COMPAREBLOB =='],
1254 ['0z11 != aBlob', 'COMPAREBLOB !='],
1255 ['0z11 is aBlob', 'COMPAREBLOB is'],
1256 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001257
Bram Moolenaara5565e42020-05-09 15:44:01 +02001258 ['[1, 2] == aList', 'COMPARELIST =='],
1259 ['[1, 2] != aList', 'COMPARELIST !='],
1260 ['[1, 2] is aList', 'COMPARELIST is'],
1261 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001262
Bram Moolenaara5565e42020-05-09 15:44:01 +02001263 ['#{a: 1} == aDict', 'COMPAREDICT =='],
1264 ['#{a: 1} != aDict', 'COMPAREDICT !='],
1265 ['#{a: 1} is aDict', 'COMPAREDICT is'],
1266 ['#{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001267
1268 ['{->33} == {->44}', 'COMPAREFUNC =='],
1269 ['{->33} != {->44}', 'COMPAREFUNC !='],
1270 ['{->33} is {->44}', 'COMPAREFUNC is'],
1271 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1272
1273 ['77 == g:xx', 'COMPAREANY =='],
1274 ['77 != g:xx', 'COMPAREANY !='],
1275 ['77 > g:xx', 'COMPAREANY >'],
1276 ['77 < g:xx', 'COMPAREANY <'],
1277 ['77 >= g:xx', 'COMPAREANY >='],
1278 ['77 <= g:xx', 'COMPAREANY <='],
1279 ['77 =~ g:xx', 'COMPAREANY =\~'],
1280 ['77 !~ g:xx', 'COMPAREANY !\~'],
1281 ['77 is g:xx', 'COMPAREANY is'],
1282 ['77 isnot g:xx', 'COMPAREANY isnot'],
1283 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001285 if has('float')
1286 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001287 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1288 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1289 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1290 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1291 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1292 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1293 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1294 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001295 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001296 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001297 endif
1298
Bram Moolenaarac564082020-09-27 19:05:33 +02001299 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001300 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001301 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001302 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001303 ' var isFalse = false',
1304 ' var isNull = v:null',
1305 ' var aNumber = 222',
1306 ' var aString = "yy"',
1307 ' var aBlob = 0z22',
1308 ' var aList = [3, 4]',
1309 ' var aDict = #{x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001310 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001311 ' if ' .. case[0],
1312 ' echo 42'
1313 ' endif',
1314 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001315 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001316 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001317 assert_match('TestCase' .. nr .. '.*' ..
1318 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1319 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001320 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001321 '\d ' .. case[1] .. '.*' ..
1322 '\d JUMP_IF_FALSE -> \d\+.*',
1323 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001324
1325 nr += 1
1326 endfor
1327
Bram Moolenaar22da5592020-03-19 14:52:20 +01001328 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001329enddef
1330
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001331def s:FalsyOp()
1332 echo g:flag ?? "yes"
1333 echo [] ?? "empty list"
1334 echo "" ?? "empty string"
1335enddef
1336
1337def Test_dsassemble_falsy_op()
1338 var res = execute('disass s:FalsyOp')
1339 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1340 'echo g:flag ?? "yes"\_s*' ..
1341 '0 LOADG g:flag\_s*' ..
1342 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1343 '2 PUSHS "yes"\_s*' ..
1344 '3 ECHO 1\_s*' ..
1345 'echo \[\] ?? "empty list"\_s*' ..
1346 '4 NEWLIST size 0\_s*' ..
1347 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1348 '6 PUSHS "empty list"\_s*' ..
1349 '7 ECHO 1\_s*' ..
1350 'echo "" ?? "empty string"\_s*' ..
1351 '\d\+ PUSHS "empty string"\_s*' ..
1352 '\d\+ ECHO 1\_s*' ..
1353 '\d\+ PUSHNR 0\_s*' ..
1354 '\d\+ RETURN',
1355 res)
1356enddef
1357
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001358def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001359 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001360 ['"xx" == "yy"', false],
1361 ['"aa" == "aa"', true],
1362 ['has("eval") ? true : false', true],
1363 ['has("asdf") ? true : false', false],
1364 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001365
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001367 for case in cases
1368 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001369 ' if ' .. case[0],
1370 ' echo 42'
1371 ' endif',
1372 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001373 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001374 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001375 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001376 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001377 assert_match('TestCase' .. nr .. '.*' ..
1378 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1379 '\d PUSHNR 42.*' ..
1380 '\d ECHO 1.*' ..
1381 '\d PUSHNR 0.*' ..
1382 '\d RETURN.*',
1383 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001384 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001385 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001386 assert_match('TestCase' .. nr .. '.*' ..
1387 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1388 'echo 42[ \n]*' ..
1389 'endif[ \n]*' ..
1390 '\s*\d PUSHNR 0.*' ..
1391 '\d RETURN.*',
1392 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001393 endif
1394
1395 nr += 1
1396 endfor
1397
1398 delete('Xdisassemble')
1399enddef
1400
Bram Moolenaarad39c092020-02-26 18:23:43 +01001401def s:Execute()
1402 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001404 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001405 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001406 execute 'help ' .. tag
1407enddef
1408
1409def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001410 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001411 assert_match('\<SNR>\d*_Execute\_s*' ..
1412 "execute 'help vim9.txt'\\_s*" ..
1413 '\d PUSHS "help vim9.txt"\_s*' ..
1414 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001415 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001416 '\d PUSHS "help vim9.txt"\_s*' ..
1417 '\d STORE $0\_s*' ..
1418 'execute cmd\_s*' ..
1419 '\d LOAD $0\_s*' ..
1420 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001421 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001422 '\d PUSHS "vim9.txt"\_s*' ..
1423 '\d STORE $1\_s*' ..
1424 "execute 'help ' .. tag\\_s*" ..
1425 '\d\+ PUSHS "help "\_s*' ..
1426 '\d\+ LOAD $1\_s*' ..
1427 '\d\+ CONCAT\_s*' ..
1428 '\d\+ EXECUTE 1\_s*' ..
1429 '\d\+ PUSHNR 0\_s*' ..
1430 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001431 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001432enddef
1433
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001434def s:Echomsg()
1435 echomsg 'some' 'message'
1436 echoerr 'went' .. 'wrong'
1437enddef
1438
1439def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001441 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1442 "echomsg 'some' 'message'\\_s*" ..
1443 '\d PUSHS "some"\_s*' ..
1444 '\d PUSHS "message"\_s*' ..
1445 '\d ECHOMSG 2\_s*' ..
1446 "echoerr 'went' .. 'wrong'\\_s*" ..
1447 '\d PUSHS "wentwrong"\_s*' ..
1448 '\d ECHOERR 1\_s*' ..
1449 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001450 '\d RETURN',
1451 res)
1452enddef
1453
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001454def SomeStringArg(arg: string)
1455 echo arg
1456enddef
1457
1458def SomeAnyArg(arg: any)
1459 echo arg
1460enddef
1461
1462def SomeStringArgAndReturn(arg: string): string
1463 return arg
1464enddef
1465
1466def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001467 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001468 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1469 '\d *echo arg.*' ..
1470 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001471 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001472
Bram Moolenaarac564082020-09-27 19:05:33 +02001473 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001474 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1475 '\d *echo arg\_s*' ..
1476 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001477 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001478
Bram Moolenaarac564082020-09-27 19:05:33 +02001479 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001480 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1481 '\d *return arg\_s*' ..
1482 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001483 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001484enddef
1485
Bram Moolenaar09689a02020-05-09 22:50:08 +02001486def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001487 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001488 vim9script
1489 def FuncOne(): string
1490 return FuncTwo()
1491 enddef
1492 def FuncTwo(): string
1493 return 'two'
1494 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001495 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001496 END
1497 writefile(lines, 'Xdisassemble')
1498 source Xdisassemble
1499
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001500 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001501 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1502 'return FuncTwo()\_s*' ..
1503 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001504 '\d RETURN',
1505 g:res_FuncOne)
1506
1507 delete('Xdisassemble')
1508 unlet g:res_FuncOne
1509enddef
1510
Bram Moolenaar61a89812020-05-07 16:58:17 +02001511def s:ConcatStrings(): string
1512 return 'one' .. 'two' .. 'three'
1513enddef
1514
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001515def s:ComputeConst(): number
1516 return 2 + 3 * 4 / 6 + 7
1517enddef
1518
Bram Moolenaar1c747212020-05-09 18:28:34 +02001519def s:ComputeConstParen(): number
1520 return ((2 + 4) * (8 / 2)) / (3 + 4)
1521enddef
1522
Bram Moolenaar61a89812020-05-07 16:58:17 +02001523def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001524 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001525 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1526 "return 'one' .. 'two' .. 'three'\\_s*" ..
1527 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001528 '\d RETURN',
1529 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001530
1531 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001532 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1533 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1534 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001535 '\d RETURN',
1536 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001537
1538 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001539 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1540 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1541 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001542 '\d RETURN',
1543 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001544enddef
1545
Bram Moolenaar389df252020-07-09 21:20:47 +02001546def s:CallAppend()
1547 eval "some text"->append(2)
1548enddef
1549
1550def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001551 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001552 assert_match('<SNR>\d*_CallAppend\_s*' ..
1553 'eval "some text"->append(2)\_s*' ..
1554 '\d PUSHS "some text"\_s*' ..
1555 '\d PUSHNR 2\_s*' ..
1556 '\d SHUFFLE 2 up 1\_s*' ..
1557 '\d BCALL append(argc 2)\_s*' ..
1558 '\d DROP\_s*' ..
1559 '\d PUSHNR 0\_s*' ..
1560 '\d RETURN',
1561 res)
1562enddef
1563
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001564" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker