blob: 1c24f77accf91fbd2f5a714dba1ae19095c9344c [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 Moolenaarac564082020-09-27 19:05:33 +02005" TODO: remove later
6let v:disallow_let = 1
7
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01008func NotCompiled()
9 echo "not"
10endfunc
11
12let s:scriptvar = 4
13let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020014let b:buffervar = 'b'
15let w:windowvar = 'w'
16let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017
18def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020019 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010020 buffers
21 echo arg
22 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020023 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010024 echo v:version
25 echo s:scriptvar
26 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020027 echo get(g:, "global")
Bram Moolenaard3aac292020-04-19 14:32:17 +020028 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020029 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020030 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020031 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020032 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020033 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010034 echo &tabstop
35 echo $ENVVAR
36 echo @z
37enddef
38
Bram Moolenaarf2460a32020-02-07 22:09:54 +010039def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010040 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020041 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010042 assert_fails('disass', 'E471:')
43 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020044 assert_fails('disass 234', 'E129:')
45 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010046
Bram Moolenaarac564082020-09-27 19:05:33 +020047 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020048 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
49 'buffers.*' ..
50 ' EXEC \+buffers.*' ..
51 ' LOAD arg\[-1\].*' ..
52 ' LOAD $0.*' ..
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020053 ' LOADOPT &lines.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020054 ' LOADV v:version.*' ..
55 ' LOADS s:scriptvar from .*test_vim9_disassemble.vim.*' ..
56 ' LOADG g:globalvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020057 'echo get(g:, "global")\_s*' ..
58 '\d\+ LOAD g:\_s*' ..
59 '\d\+ PUSHS "global"\_s*' ..
60 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020061 ' LOADB b:buffervar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020062 'echo get(b:, "buffer")\_s*' ..
63 '\d\+ LOAD b:\_s*' ..
64 '\d\+ PUSHS "buffer"\_s*' ..
65 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020066 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020067 'echo get(w:, "window")\_s*' ..
68 '\d\+ LOAD w:\_s*' ..
69 '\d\+ PUSHS "window"\_s*' ..
70 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020071 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020072 'echo get(t:, "tab")\_s*' ..
73 '\d\+ LOAD t:\_s*' ..
74 '\d\+ PUSHS "tab"\_s*' ..
75 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020076 ' LOADENV $ENVVAR.*' ..
77 ' LOADREG @z.*',
78 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010079enddef
80
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020081def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +020082 var filename = "file"
83 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020084 edit the`=filename``=filenr`.txt
85enddef
86
87def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +020088 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020089 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +020090 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020091 '\d PUSHS "file"\_s*' ..
92 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +020093 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +020094 '\d STORE 123 in $1\_s*' ..
95 ' edit the`=filename``=filenr`.txt\_s*' ..
96 '\d PUSHS "edit the"\_s*' ..
97 '\d LOAD $0\_s*' ..
98 '\d LOAD $1\_s*' ..
99 '\d 2STRING stack\[-1\]\_s*' ..
100 '\d\+ PUSHS ".txt"\_s*' ..
101 '\d\+ EXECCONCAT 4\_s*' ..
102 '\d\+ PUSHNR 0\_s*' ..
103 '\d\+ RETURN',
104 res)
105enddef
106
107def s:YankRange()
108 norm! m[jjm]
109 :'[,']yank
110enddef
111
112def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200113 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200114 assert_match('<SNR>\d*_YankRange.*' ..
115 ' norm! m\[jjm\]\_s*' ..
116 '\d EXEC norm! m\[jjm\]\_s*' ..
117 ' :''\[,''\]yank\_s*' ..
118 '\d EXEC :''\[,''\]yank\_s*' ..
119 '\d PUSHNR 0\_s*' ..
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200120 '\d RETURN',
121 res)
122enddef
123
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200124def s:PutExpr()
125 :3put ="text"
126enddef
127
128def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200129 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200130 assert_match('<SNR>\d*_PutExpr.*' ..
131 ' :3put ="text"\_s*' ..
132 '\d PUSHS "text"\_s*' ..
133 '\d PUT = 3\_s*' ..
134 '\d PUSHNR 0\_s*' ..
135 '\d RETURN',
136 res)
137enddef
138
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100139def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200140 var localbool = true
141 var localspec = v:none
142 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100143 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200144 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100145 endif
146enddef
147
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100148def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200149 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200150 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
151 'localbool = true.*' ..
152 ' PUSH v:true.*' ..
153 'localspec = v:none.*' ..
154 ' PUSH v:none.*' ..
155 'localblob = 0z1234.*' ..
156 ' PUSHBLOB 0z1234.*',
157 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100158 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200159 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
160 'localfloat = 1.234.*' ..
161 ' PUSHF 1.234.*',
162 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100163 endif
164enddef
165
166def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200167 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100168 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200169 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100170 localstr = 'xyz'
171 v:char = 'abc'
172 s:scriptvar = 'sv'
173 g:globalvar = 'gv'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200174 b:buffervar = 'bv'
175 w:windowvar = 'wv'
176 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100177 &tabstop = 8
178 $ENVVAR = 'ev'
179 @z = 'rv'
180enddef
181
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100182def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200183 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200184 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200185 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200186 'localnr = 2.*' ..
187 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200188 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200189 'localstr = ''xyz''.*' ..
190 ' STORE $1.*' ..
191 'v:char = ''abc''.*' ..
192 'STOREV v:char.*' ..
193 's:scriptvar = ''sv''.*' ..
194 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
195 'g:globalvar = ''gv''.*' ..
196 ' STOREG g:globalvar.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200197 'b:buffervar = ''bv''.*' ..
198 ' STOREB b:buffervar.*' ..
199 'w:windowvar = ''wv''.*' ..
200 ' STOREW w:windowvar.*' ..
201 't:tabpagevar = ''tv''.*' ..
202 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200203 '&tabstop = 8.*' ..
204 ' STOREOPT &tabstop.*' ..
205 '$ENVVAR = ''ev''.*' ..
206 ' STOREENV $ENVVAR.*' ..
207 '@z = ''rv''.*' ..
208 ' STOREREG @z.*',
209 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100210enddef
211
Bram Moolenaarcb790402020-05-15 20:53:00 +0200212def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200213 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200214 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200215 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200216 localdict["a"] = 456
217enddef
218
219def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200220 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200221 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200222 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200223 '\d NEWLIST size 0\_s*' ..
224 '\d STORE $0\_s*' ..
225 'locallist\[0\] = 123\_s*' ..
226 '\d PUSHNR 123\_s*' ..
227 '\d PUSHNR 0\_s*' ..
228 '\d LOAD $0\_s*' ..
229 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200230 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200231 '\d NEWDICT size 0\_s*' ..
232 '\d STORE $1\_s*' ..
233 'localdict\["a"\] = 456\_s*' ..
234 '\d\+ PUSHNR 456\_s*' ..
235 '\d\+ PUSHS "a"\_s*' ..
236 '\d\+ LOAD $1\_s*' ..
237 '\d\+ STOREDICT\_s*' ..
238 '\d\+ PUSHNR 0\_s*' ..
239 '\d\+ RETURN',
240 res)
241enddef
242
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200243def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200244 var x: string
245 var y: string
246 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200247 [x, y; l] = g:stringlist
248enddef
249
250def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200251 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200252 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200253 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200254 '\d PUSHS "\[NULL\]"\_s*' ..
255 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200257 '\d PUSHS "\[NULL\]"\_s*' ..
258 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200259 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200260 '\d NEWLIST size 0\_s*' ..
261 '\d STORE $2\_s*' ..
262 '\[x, y; l\] = g:stringlist\_s*' ..
263 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200264 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200265 '\d CHECKLEN >= 2\_s*' ..
266 '\d\+ ITEM 0\_s*' ..
267 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
268 '\d\+ STORE $0\_s*' ..
269 '\d\+ ITEM 1\_s*' ..
270 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
271 '\d\+ STORE $1\_s*' ..
272 '\d\+ SLICE 2\_s*' ..
273 '\d\+ STORE $2\_s*' ..
274 '\d\+ PUSHNR 0\_s*' ..
275 '\d\+ RETURN',
276 res)
277enddef
278
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200279def s:ScriptFuncUnlet()
280 g:somevar = "value"
281 unlet g:somevar
282 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200283 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200284enddef
285
286def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200287 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200288 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
289 'g:somevar = "value"\_s*' ..
290 '\d PUSHS "value"\_s*' ..
291 '\d STOREG g:somevar\_s*' ..
292 'unlet g:somevar\_s*' ..
293 '\d UNLET g:somevar\_s*' ..
294 'unlet! g:somevar\_s*' ..
295 '\d UNLET! g:somevar\_s*' ..
296 'unlet $SOMEVAR\_s*' ..
297 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200298 res)
299enddef
300
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100301def s:ScriptFuncTry()
302 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200303 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100304 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200305 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100306 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200307 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100308 endtry
309enddef
310
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100311def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200312 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200313 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
314 'try\_s*' ..
315 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
316 'echo "yes"\_s*' ..
317 '\d PUSHS "yes"\_s*' ..
318 '\d ECHO 1\_s*' ..
319 'catch /fail/\_s*' ..
320 '\d JUMP -> \d\+\_s*' ..
321 '\d PUSH v:exception\_s*' ..
322 '\d PUSHS "fail"\_s*' ..
323 '\d COMPARESTRING =\~\_s*' ..
324 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
325 '\d CATCH\_s*' ..
326 'echo "no"\_s*' ..
327 '\d\+ PUSHS "no"\_s*' ..
328 '\d\+ ECHO 1\_s*' ..
329 'finally\_s*' ..
330 'throw "end"\_s*' ..
331 '\d\+ PUSHS "end"\_s*' ..
332 '\d\+ THROW\_s*' ..
333 'endtry\_s*' ..
334 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200335 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100336enddef
337
338def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200339 var ll = [1, "two", 333]
340 var dd = #{one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100341enddef
342
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100343def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200344 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200345 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200346 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200347 '\d PUSHNR 1\_s*' ..
348 '\d PUSHS "two"\_s*' ..
349 '\d PUSHNR 333\_s*' ..
350 '\d NEWLIST size 3\_s*' ..
351 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200352 'var dd = #{one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200353 '\d PUSHS "one"\_s*' ..
354 '\d PUSHNR 1\_s*' ..
355 '\d PUSHS "two"\_s*' ..
356 '\d PUSHS "val"\_s*' ..
357 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200358 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100359enddef
360
Bram Moolenaar6e949782020-04-13 17:21:00 +0200361def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100362 echo arg
363enddef
364
365func UserFunc()
366 echo 'nothing'
367endfunc
368
369func UserFuncWithArg(arg)
370 echo a:arg
371endfunc
372
373def s:ScriptFuncCall(): string
374 changenr()
375 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100376 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100377 FuncWithArg(343)
378 ScriptFuncNew()
379 s:ScriptFuncNew()
380 UserFunc()
381 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200382 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100383 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200384 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100385 FuncRefWithArg("bar")
386 return "yes"
387enddef
388
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100389def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200390 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200391 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
392 'changenr()\_s*' ..
393 '\d BCALL changenr(argc 0)\_s*' ..
394 '\d DROP\_s*' ..
395 'char2nr("abc")\_s*' ..
396 '\d PUSHS "abc"\_s*' ..
397 '\d BCALL char2nr(argc 1)\_s*' ..
398 '\d DROP\_s*' ..
399 'Test_disassemble_new()\_s*' ..
400 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
401 '\d DROP\_s*' ..
402 'FuncWithArg(343)\_s*' ..
403 '\d\+ PUSHNR 343\_s*' ..
404 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
405 '\d\+ DROP\_s*' ..
406 'ScriptFuncNew()\_s*' ..
407 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
408 '\d\+ DROP\_s*' ..
409 's:ScriptFuncNew()\_s*' ..
410 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
411 '\d\+ DROP\_s*' ..
412 'UserFunc()\_s*' ..
413 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
414 '\d\+ DROP\_s*' ..
415 'UserFuncWithArg("foo")\_s*' ..
416 '\d\+ PUSHS "foo"\_s*' ..
417 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
418 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200419 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200420 '\d\+ PUSHS "UserFunc"\_s*' ..
421 '\d\+ BCALL function(argc 1)\_s*' ..
422 '\d\+ STORE $0\_s*' ..
423 'FuncRef()\_s*' ..
424 '\d\+ LOAD $\d\_s*' ..
425 '\d\+ PCALL (argc 0)\_s*' ..
426 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200427 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200428 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
429 '\d\+ BCALL function(argc 1)\_s*' ..
430 '\d\+ STORE $1\_s*' ..
431 'FuncRefWithArg("bar")\_s*' ..
432 '\d\+ PUSHS "bar"\_s*' ..
433 '\d\+ LOAD $\d\_s*' ..
434 '\d\+ PCALL (argc 1)\_s*' ..
435 '\d\+ DROP\_s*' ..
436 'return "yes"\_s*' ..
437 '\d\+ PUSHS "yes"\_s*' ..
438 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200439 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100440enddef
441
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200442def s:CreateRefs()
Bram Moolenaarac564082020-09-27 19:05:33 +0200443 var local = 'a'
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200444 def Append(arg: string)
445 local ..= arg
446 enddef
447 g:Append = Append
448 def Get(): string
449 return local
450 enddef
451 g:Get = Get
452enddef
453
454def Test_disassemble_closure()
455 CreateRefs()
Bram Moolenaarac564082020-09-27 19:05:33 +0200456 var res = execute('disass g:Append')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200457 assert_match('<lambda>\d\_s*' ..
458 'local ..= arg\_s*' ..
459 '\d LOADOUTER $0\_s*' ..
460 '\d LOAD arg\[-1\]\_s*' ..
461 '\d CONCAT\_s*' ..
462 '\d STOREOUTER $0\_s*' ..
463 '\d PUSHNR 0\_s*' ..
464 '\d RETURN',
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200465 res)
466
467 res = execute('disass g:Get')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200468 assert_match('<lambda>\d\_s*' ..
469 'return local\_s*' ..
470 '\d LOADOUTER $0\_s*' ..
471 '\d RETURN',
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200472 res)
473
474 unlet g:Append
475 unlet g:Get
476enddef
477
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100478
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200479def EchoArg(arg: string): string
480 return arg
481enddef
482def RefThis(): func
483 return function('EchoArg')
484enddef
485def s:ScriptPCall()
486 RefThis()("text")
487enddef
488
489def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200490 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200491 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
492 'RefThis()("text")\_s*' ..
493 '\d DCALL RefThis(argc 0)\_s*' ..
494 '\d PUSHS "text"\_s*' ..
495 '\d PCALL top (argc 1)\_s*' ..
496 '\d PCALL end\_s*' ..
497 '\d DROP\_s*' ..
498 '\d PUSHNR 0\_s*' ..
499 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200500 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200501enddef
502
503
Bram Moolenaara26b9702020-04-18 19:53:28 +0200504def s:FuncWithForwardCall(): string
505 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100506enddef
507
508def DefinedLater(arg: string): string
509 return arg
510enddef
511
512def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200513 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200514 assert_match('FuncWithForwardCall\_s*' ..
515 'return g:DefinedLater("yes")\_s*' ..
516 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200517 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200518 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200519 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100520
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200521 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100522 assert_equal('yes', FuncWithForwardCall())
523
Bram Moolenaara26b9702020-04-18 19:53:28 +0200524 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200525 assert_match('FuncWithForwardCall\_s*' ..
526 'return g:DefinedLater("yes")\_s*' ..
527 '\d PUSHS "yes"\_s*' ..
528 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200529 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200530 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100531enddef
532
533
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100534def FuncWithDefault(arg: string = 'default'): string
535 return arg
536enddef
537
538def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200539 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200540 assert_match('FuncWithDefault\_s*' ..
541 '\d PUSHS "default"\_s*' ..
542 '\d STORE arg\[-1]\_s*' ..
543 'return arg\_s*' ..
544 '\d LOAD arg\[-1]\_s*' ..
545 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200546 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100547enddef
548
549
Bram Moolenaar158906c2020-02-06 20:39:45 +0100550def HasEval()
551 if has("eval")
552 echo "yes"
553 else
554 echo "no"
555 endif
556enddef
557
558def HasNothing()
559 if has("nothing")
560 echo "yes"
561 else
562 echo "no"
563 endif
564enddef
565
566def HasSomething()
567 if has("nothing")
568 echo "nothing"
569 elseif has("something")
570 echo "something"
571 elseif has("eval")
572 echo "eval"
573 elseif has("less")
574 echo "less"
575 endif
576enddef
577
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100578def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200579 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200580 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200581 assert_match('HasEval\_s*' ..
582 'if has("eval")\_s*' ..
583 'echo "yes"\_s*' ..
584 '\d PUSHS "yes"\_s*' ..
585 '\d ECHO 1\_s*' ..
586 'else\_s*' ..
587 'echo "no"\_s*' ..
588 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200589 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100590 assert_notmatch('JUMP', instr)
591
Bram Moolenaard2c61702020-09-06 15:58:36 +0200592 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100593 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200594 assert_match('HasNothing\_s*' ..
595 'if has("nothing")\_s*' ..
596 'echo "yes"\_s*' ..
597 'else\_s*' ..
598 'echo "no"\_s*' ..
599 '\d PUSHS "no"\_s*' ..
600 '\d ECHO 1\_s*' ..
601 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200602 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100603 assert_notmatch('PUSHS "yes"', instr)
604 assert_notmatch('JUMP', instr)
605
Bram Moolenaard2c61702020-09-06 15:58:36 +0200606 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100607 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200608 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200609 'if has("nothing")\_s*' ..
610 'echo "nothing"\_s*' ..
611 'elseif has("something")\_s*' ..
612 'echo "something"\_s*' ..
613 'elseif has("eval")\_s*' ..
614 'echo "eval"\_s*' ..
615 '\d PUSHS "eval"\_s*' ..
616 '\d ECHO 1\_s*' ..
617 'elseif has("less").*' ..
618 'echo "less"\_s*' ..
619 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200620 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100621 assert_notmatch('PUSHS "nothing"', instr)
622 assert_notmatch('PUSHS "something"', instr)
623 assert_notmatch('PUSHS "less"', instr)
624 assert_notmatch('JUMP', instr)
625enddef
626
Bram Moolenaarefd88552020-06-18 20:50:10 +0200627def ReturnInIf(): string
628 if g:cond
629 return "yes"
630 else
631 return "no"
632 endif
633enddef
634
635def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200636 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200637 assert_match('ReturnInIf\_s*' ..
638 'if g:cond\_s*' ..
639 '0 LOADG g:cond\_s*' ..
640 '1 JUMP_IF_FALSE -> 4\_s*' ..
641 'return "yes"\_s*' ..
642 '2 PUSHS "yes"\_s*' ..
643 '3 RETURN\_s*' ..
644 'else\_s*' ..
645 ' return "no"\_s*' ..
646 '4 PUSHS "no"\_s*' ..
647 '5 RETURN$',
648 instr)
649enddef
650
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100651def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200652 var Funky1: func
653 var Funky2: func = function("len")
654 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100655enddef
656
657def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200658 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200659 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200660 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200661 '0 PUSHFUNC "\[none]"\_s*' ..
662 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200663 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200664 '2 PUSHS "len"\_s*' ..
665 '3 BCALL function(argc 1)\_s*' ..
666 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200667 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200668 '\d PUSHS "UserFunc"\_s*' ..
669 '\d BCALL funcref(argc 1)\_s*' ..
670 '\d STORE $2\_s*' ..
671 '\d PUSHNR 0\_s*' ..
672 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200673 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100674enddef
675
676if has('channel')
677 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200678 var job1: job
679 var job2: job = job_start("donothing")
680 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100681 enddef
682endif
683
684def Test_disassemble_channel()
685 CheckFeature channel
686
Bram Moolenaarac564082020-09-27 19:05:33 +0200687 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200688 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200689 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200690 '\d PUSHJOB "no process"\_s*' ..
691 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200692 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200693 '\d PUSHS "donothing"\_s*' ..
694 '\d BCALL job_start(argc 1)\_s*' ..
695 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200696 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200697 '\d PUSHCHANNEL 0\_s*' ..
698 '\d STORE $2\_s*' ..
699 '\d PUSHNR 0\_s*' ..
700 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200701 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100702enddef
703
Bram Moolenaar777770f2020-02-06 21:27:08 +0100704def WithLambda(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200705 var F = {a -> "X" .. a .. "X"}
Bram Moolenaar777770f2020-02-06 21:27:08 +0100706 return F("x")
707enddef
708
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100709def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100710 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200711 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200712 assert_match('WithLambda\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200713 'var F = {a -> "X" .. a .. "X"}\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200714 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200715 '\d STORE $0\_s*' ..
716 'return F("x")\_s*' ..
717 '\d PUSHS "x"\_s*' ..
718 '\d LOAD $0\_s*' ..
719 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200720 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200721 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200722
Bram Moolenaarac564082020-09-27 19:05:33 +0200723 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200724 instr = execute('disassemble ' .. name)
725 assert_match('<lambda>\d\+\_s*' ..
726 'return "X" .. a .. "X"\_s*' ..
727 '\d PUSHS "X"\_s*' ..
728 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200729 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200730 '\d CONCAT\_s*' ..
731 '\d PUSHS "X"\_s*' ..
732 '\d CONCAT\_s*' ..
733 '\d RETURN',
734 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100735enddef
736
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200737def NestedOuter()
738 def g:Inner()
739 echomsg "inner"
740 enddef
741enddef
742
743def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200744 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200745 assert_match('NestedOuter\_s*' ..
746 'def g:Inner()\_s*' ..
747 'echomsg "inner"\_s*' ..
748 'enddef\_s*' ..
749 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
750 '\d PUSHNR 0\_s*' ..
751 '\d RETURN',
752 instr)
753enddef
754
Bram Moolenaar6e949782020-04-13 17:21:00 +0200755def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100756 if arg == 1 && arg != 2 || arg == 4
757 return 'yes'
758 endif
759 return 'no'
760enddef
761
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100762def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100763 assert_equal("yes", AndOr(1))
764 assert_equal("no", AndOr(2))
765 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200766 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200767 assert_match('AndOr\_s*' ..
768 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
769 '\d LOAD arg\[-1]\_s*' ..
770 '\d PUSHNR 1\_s*' ..
771 '\d COMPAREANY ==\_s*' ..
772 '\d JUMP_AND_KEEP_IF_FALSE -> \d\+\_s*' ..
773 '\d LOAD arg\[-1]\_s*' ..
774 '\d PUSHNR 2\_s*' ..
775 '\d COMPAREANY !=\_s*' ..
776 '\d JUMP_AND_KEEP_IF_TRUE -> \d\+\_s*' ..
777 '\d LOAD arg\[-1]\_s*' ..
778 '\d\+ PUSHNR 4\_s*' ..
779 '\d\+ COMPAREANY ==\_s*' ..
780 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200781 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100782enddef
783
Bram Moolenaar04d05222020-02-06 22:06:54 +0100784def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +0200785 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +0100786 for i in range(3)
787 res->add(i)
788 endfor
789 return res
790enddef
791
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100792def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +0100793 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +0200794 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200795 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200796 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200797 '\d NEWLIST size 0\_s*' ..
798 '\d STORE $0\_s*' ..
799 'for i in range(3)\_s*' ..
800 '\d STORE -1 in $1\_s*' ..
801 '\d PUSHNR 3\_s*' ..
802 '\d BCALL range(argc 1)\_s*' ..
803 '\d FOR $1 -> \d\+\_s*' ..
804 '\d STORE $2\_s*' ..
805 'res->add(i)\_s*' ..
806 '\d LOAD $0\_s*' ..
807 '\d LOAD $2\_s*' ..
808 '\d\+ BCALL add(argc 2)\_s*' ..
809 '\d\+ DROP\_s*' ..
810 'endfor\_s*' ..
811 '\d\+ JUMP -> \d\+\_s*' ..
812 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200813 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +0100814enddef
815
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200816def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200817 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200818 for str in eval('["one", "two"]')
819 res ..= str
820 endfor
821 return res
822enddef
823
824def Test_disassemble_for_loop_eval()
825 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +0200826 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200827 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200828 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200829 '\d PUSHS ""\_s*' ..
830 '\d STORE $0\_s*' ..
831 'for str in eval(''\["one", "two"\]'')\_s*' ..
832 '\d STORE -1 in $1\_s*' ..
833 '\d PUSHS "\["one", "two"\]"\_s*' ..
834 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200835 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +0200836 '\d FOR $1 -> \d\+\_s*' ..
837 '\d STORE $2\_s*' ..
838 'res ..= str\_s*' ..
839 '\d\+ LOAD $0\_s*' ..
840 '\d\+ LOAD $2\_s*' ..
841 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
842 '\d\+ CONCAT\_s*' ..
843 '\d\+ STORE $0\_s*' ..
844 'endfor\_s*' ..
845 '\d\+ JUMP -> 6\_s*' ..
846 '\d\+ DROP\_s*' ..
847 'return res\_s*' ..
848 '\d\+ LOAD $0\_s*' ..
849 '\d\+ RETURN',
850 instr)
851enddef
852
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100853let g:number = 42
854
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200855def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +0200856 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200857enddef
858
859def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +0200860 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200861 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200862 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +0200863 '\d PUSHNR 23\_s*' ..
864 '\d LOADG g:number\_s*' ..
865 '\d CHECKTYPE number stack\[-1\]\_s*' ..
866 '\d NEWLIST size 2\_s*' ..
867 '\d STORE $0\_s*' ..
868 '\d PUSHNR 0\_s*' ..
869 '\d RETURN\_s*',
870 instr)
871enddef
872
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100873def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +0200874 var nr = 3
875 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100876 nrres = nr - 7
877 nrres = nr * 7
878 nrres = nr / 7
879 nrres = nr % 7
880
Bram Moolenaarac564082020-09-27 19:05:33 +0200881 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100882 anyres = g:number - 7
883 anyres = g:number * 7
884 anyres = g:number / 7
885 anyres = g:number % 7
886
887 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200888 var fl = 3.0
889 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100890 flres = fl - 7.0
891 flres = fl * 7.0
892 flres = fl / 7.0
893 endif
894enddef
895
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100896def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +0200897 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200898 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200899 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200900 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200901 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200902 '\d LOAD $0.*' ..
903 '\d PUSHNR 7.*' ..
904 '\d OPNR +.*' ..
905 '\d STORE $1.*' ..
906 'nrres = nr - 7.*' ..
907 '\d OPNR -.*' ..
908 'nrres = nr \* 7.*' ..
909 '\d OPNR \*.*' ..
910 'nrres = nr / 7.*' ..
911 '\d OPNR /.*' ..
912 'nrres = nr % 7.*' ..
913 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200914 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200915 '\d LOADG g:number.*' ..
916 '\d PUSHNR 7.*' ..
917 '\d OPANY +.*' ..
918 '\d STORE $2.*' ..
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 'anyres = g:number % 7.*' ..
926 '\d OPANY %.*',
927 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100928 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200929 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200930 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200931 '\d PUSHF 3.0.*' ..
932 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200933 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200934 '\d LOAD $3.*' ..
935 '\d PUSHF 7.0.*' ..
936 '\d OPFLOAT +.*' ..
937 '\d STORE $4.*' ..
938 'flres = fl - 7.0.*' ..
939 '\d OPFLOAT -.*' ..
940 'flres = fl \* 7.0.*' ..
941 '\d OPFLOAT \*.*' ..
942 'flres = fl / 7.0.*' ..
943 '\d OPFLOAT /.*',
944 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +0100945 endif
946enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100947
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100948def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +0200949 var reslist = [1, 2] + [3, 4]
950 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100951enddef
952
953def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +0200954 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200955 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200956 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200957 '\d PUSHNR 1.*' ..
958 '\d PUSHNR 2.*' ..
959 '\d NEWLIST size 2.*' ..
960 '\d PUSHNR 3.*' ..
961 '\d PUSHNR 4.*' ..
962 '\d NEWLIST size 2.*' ..
963 '\d ADDLIST.*' ..
964 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200965 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200966 '\d PUSHBLOB 0z1122.*' ..
967 '\d PUSHBLOB 0z3344.*' ..
968 '\d ADDBLOB.*' ..
969 '\d STORE $.*',
970 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100971enddef
972
973let g:aa = 'aa'
974def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200975 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100976 return res
977enddef
978
979def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +0200980 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200981 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200982 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200983 '\d LOADG g:aa.*' ..
984 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200985 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200986 '\d CONCAT.*' ..
987 '\d STORE $.*',
988 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +0100989 assert_equal('aabb', ConcatString())
990enddef
991
Bram Moolenaar11107ba2020-08-15 21:10:16 +0200992def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +0200993 var s = "abcd"
994 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +0200995 return res
996enddef
997
998def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +0200999 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001000 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001001 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001002 '\d PUSHS "abcd"\_s*' ..
1003 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001004 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001005 '\d LOAD $0\_s*' ..
1006 '\d PUSHNR 1\_s*' ..
1007 '\d STRINDEX\_s*' ..
1008 '\d STORE $1\_s*',
1009 instr)
1010 assert_equal('b', StringIndex())
1011enddef
1012
Bram Moolenaared591872020-08-15 22:14:53 +02001013def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001014 var s = "abcd"
1015 var res = s[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001016 return res
1017enddef
1018
1019def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001020 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001021 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001022 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001023 '\d PUSHS "abcd"\_s*' ..
1024 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001025 'var res = s\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001026 '\d LOAD $0\_s*' ..
1027 '\d PUSHNR 1\_s*' ..
1028 '\d PUSHNR 8\_s*' ..
1029 '\d STRSLICE\_s*' ..
1030 '\d STORE $1\_s*',
1031 instr)
1032 assert_equal('bcd', StringSlice())
1033enddef
1034
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001035def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001036 var l = [1, 2, 3]
1037 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001038 return res
1039enddef
1040
1041def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001042 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001043 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001044 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001045 '\d PUSHNR 1\_s*' ..
1046 '\d PUSHNR 2\_s*' ..
1047 '\d PUSHNR 3\_s*' ..
1048 '\d NEWLIST size 3\_s*' ..
1049 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001050 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001051 '\d LOAD $0\_s*' ..
1052 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001053 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001054 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001055 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001056 assert_equal(2, ListIndex())
1057enddef
1058
Bram Moolenaared591872020-08-15 22:14:53 +02001059def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001060 var l = [1, 2, 3]
1061 var res = l[1:8]
Bram Moolenaared591872020-08-15 22:14:53 +02001062 return res
1063enddef
1064
1065def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001066 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001067 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001068 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001069 '\d PUSHNR 1\_s*' ..
1070 '\d PUSHNR 2\_s*' ..
1071 '\d PUSHNR 3\_s*' ..
1072 '\d NEWLIST size 3\_s*' ..
1073 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001074 'var res = l\[1:8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001075 '\d LOAD $0\_s*' ..
1076 '\d PUSHNR 1\_s*' ..
1077 '\d PUSHNR 8\_s*' ..
1078 '\d LISTSLICE\_s*' ..
1079 '\d STORE $1\_s*',
1080 instr)
1081 assert_equal([2, 3], ListSlice())
1082enddef
1083
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001084def DictMember(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001085 var d = #{item: 1}
1086 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001087 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001088 return res
1089enddef
1090
1091def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001092 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001093 assert_match('DictMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001094 'var d = #{item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001095 '\d PUSHS "item"\_s*' ..
1096 '\d PUSHNR 1\_s*' ..
1097 '\d NEWDICT size 1\_s*' ..
1098 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001099 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001100 '\d\+ LOAD $0\_s*' ..
1101 '\d\+ MEMBER item\_s*' ..
1102 '\d\+ STORE $1\_s*' ..
1103 'res = d\["item"\]\_s*' ..
1104 '\d\+ LOAD $0\_s*' ..
1105 '\d\+ PUSHS "item"\_s*' ..
1106 '\d\+ MEMBER\_s*' ..
1107 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001108 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001109 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001110enddef
1111
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001112let somelist = [1, 2, 3, 4, 5]
1113def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001114 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001115 return res
1116enddef
1117
1118def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001119 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001120 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001121 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001122 '\d LOADG g:somelist\_s*' ..
1123 '\d PUSHNR 2\_s*' ..
1124 '\d ANYINDEX\_s*' ..
1125 '\d STORE $0\_s*' ..
1126 'return res\_s*' ..
1127 '\d LOAD $0\_s*' ..
1128 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1129 '\d RETURN',
1130 instr)
1131 assert_equal(3, AnyIndex())
1132enddef
1133
1134def AnySlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001135 var res = g:somelist[1:3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001136 return res
1137enddef
1138
1139def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001140 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001141 assert_match('AnySlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001142 'var res = g:somelist\[1:3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001143 '\d LOADG g:somelist\_s*' ..
1144 '\d PUSHNR 1\_s*' ..
1145 '\d PUSHNR 3\_s*' ..
1146 '\d ANYSLICE\_s*' ..
1147 '\d STORE $0\_s*' ..
1148 'return res\_s*' ..
1149 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001150 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001151 '\d RETURN',
1152 instr)
1153 assert_equal([2, 3, 4], AnySlice())
1154enddef
1155
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001156def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001157 var nr = 9
1158 var plus = +nr
1159 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001160 return res
1161enddef
1162
1163def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001164 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001165 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001167 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001168 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001169 '\d LOAD $0\_s*' ..
1170 '\d CHECKNR\_s*' ..
1171 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001172 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001173 '\d LOAD $0\_s*' ..
1174 '\d NEGATENR\_s*' ..
1175 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001176 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001177 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001178enddef
1179
1180def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001181 var flag = true
1182 var invert = !flag
1183 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001184 return res
1185enddef
1186
1187def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001188 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001189 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001190 'var flag = true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001191 '\d PUSH v:true\_s*' ..
1192 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001193 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001194 '\d LOAD $0\_s*' ..
1195 '\d INVERT (!val)\_s*' ..
1196 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001197 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001198 '\d LOAD $0\_s*' ..
1199 '\d 2BOOL (!!val)\_s*' ..
1200 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001201 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001202 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001203enddef
1204
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001205def ReturnBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001206 var var: bool = "no" && [] || 123
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001207 return var
1208enddef
1209
1210def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001211 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001212 assert_match('ReturnBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001213 'var var: bool = "no" && \[\] || 123\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001214 '0 PUSHS "no"\_s*' ..
1215 '1 JUMP_AND_KEEP_IF_FALSE -> 3\_s*' ..
1216 '2 NEWLIST size 0\_s*' ..
1217 '3 JUMP_AND_KEEP_IF_TRUE -> 5\_s*' ..
1218 '4 PUSHNR 123\_s*' ..
1219 '5 2BOOL (!!val)\_s*' ..
1220 '\d STORE $0\_s*' ..
1221 'return var\_s*' ..
1222 '\d LOAD $0\_s*' ..
1223 '\d RETURN',
1224 instr)
1225 assert_equal(true, InvertBool())
1226enddef
1227
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001228def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001229 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001230 ['true == isFalse', 'COMPAREBOOL =='],
1231 ['true != isFalse', 'COMPAREBOOL !='],
1232 ['v:none == isNull', 'COMPARESPECIAL =='],
1233 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001234
Bram Moolenaara5565e42020-05-09 15:44:01 +02001235 ['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 =\~'],
1242 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001243
Bram Moolenaara5565e42020-05-09 15:44:01 +02001244 ['"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" !~ aString', 'COMPARESTRING !\~'],
1251 ['"xx" is aString', 'COMPARESTRING is'],
1252 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001253
Bram Moolenaara5565e42020-05-09 15:44:01 +02001254 ['0z11 == aBlob', 'COMPAREBLOB =='],
1255 ['0z11 != aBlob', 'COMPAREBLOB !='],
1256 ['0z11 is aBlob', 'COMPAREBLOB is'],
1257 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001258
Bram Moolenaara5565e42020-05-09 15:44:01 +02001259 ['[1, 2] == aList', 'COMPARELIST =='],
1260 ['[1, 2] != aList', 'COMPARELIST !='],
1261 ['[1, 2] is aList', 'COMPARELIST is'],
1262 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001263
Bram Moolenaara5565e42020-05-09 15:44:01 +02001264 ['#{a: 1} == aDict', 'COMPAREDICT =='],
1265 ['#{a: 1} != aDict', 'COMPAREDICT !='],
1266 ['#{a: 1} is aDict', 'COMPAREDICT is'],
1267 ['#{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001268
1269 ['{->33} == {->44}', 'COMPAREFUNC =='],
1270 ['{->33} != {->44}', 'COMPAREFUNC !='],
1271 ['{->33} is {->44}', 'COMPAREFUNC is'],
1272 ['{->33} isnot {->44}', 'COMPAREFUNC isnot'],
1273
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 !~ g:xx', 'COMPAREANY !\~'],
1282 ['77 is g:xx', 'COMPAREANY is'],
1283 ['77 isnot g:xx', 'COMPAREANY isnot'],
1284 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001285 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001286 if has('float')
1287 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001288 ['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 =\~'],
1295 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001296 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001297 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001298 endif
1299
Bram Moolenaarac564082020-09-27 19:05:33 +02001300 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001301 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001302 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001303 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001304 ' var isFalse = false',
1305 ' var isNull = v:null',
1306 ' var aNumber = 222',
1307 ' var aString = "yy"',
1308 ' var aBlob = 0z22',
1309 ' var aList = [3, 4]',
1310 ' var aDict = #{x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001311 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001312 ' if ' .. case[0],
1313 ' echo 42'
1314 ' endif',
1315 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001316 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001318 assert_match('TestCase' .. nr .. '.*' ..
1319 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1320 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001321 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001322 '\d ' .. case[1] .. '.*' ..
1323 '\d JUMP_IF_FALSE -> \d\+.*',
1324 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001325
1326 nr += 1
1327 endfor
1328
Bram Moolenaar22da5592020-03-19 14:52:20 +01001329 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001330enddef
1331
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001332def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001333 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001334 ['"xx" == "yy"', false],
1335 ['"aa" == "aa"', true],
1336 ['has("eval") ? true : false', true],
1337 ['has("asdf") ? true : false', false],
1338 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001339
Bram Moolenaarac564082020-09-27 19:05:33 +02001340 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001341 for case in cases
1342 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001343 ' if ' .. case[0],
1344 ' echo 42'
1345 ' endif',
1346 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001347 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001348 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001349 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001350 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001351 assert_match('TestCase' .. nr .. '.*' ..
1352 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1353 '\d PUSHNR 42.*' ..
1354 '\d ECHO 1.*' ..
1355 '\d PUSHNR 0.*' ..
1356 '\d RETURN.*',
1357 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001358 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001359 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001360 assert_match('TestCase' .. nr .. '.*' ..
1361 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1362 'echo 42[ \n]*' ..
1363 'endif[ \n]*' ..
1364 '\s*\d PUSHNR 0.*' ..
1365 '\d RETURN.*',
1366 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001367 endif
1368
1369 nr += 1
1370 endfor
1371
1372 delete('Xdisassemble')
1373enddef
1374
Bram Moolenaarad39c092020-02-26 18:23:43 +01001375def s:Execute()
1376 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001377 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001378 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001379 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001380 execute 'help ' .. tag
1381enddef
1382
1383def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001384 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001385 assert_match('\<SNR>\d*_Execute\_s*' ..
1386 "execute 'help vim9.txt'\\_s*" ..
1387 '\d PUSHS "help vim9.txt"\_s*' ..
1388 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001389 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001390 '\d PUSHS "help vim9.txt"\_s*' ..
1391 '\d STORE $0\_s*' ..
1392 'execute cmd\_s*' ..
1393 '\d LOAD $0\_s*' ..
1394 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001395 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001396 '\d PUSHS "vim9.txt"\_s*' ..
1397 '\d STORE $1\_s*' ..
1398 "execute 'help ' .. tag\\_s*" ..
1399 '\d\+ PUSHS "help "\_s*' ..
1400 '\d\+ LOAD $1\_s*' ..
1401 '\d\+ CONCAT\_s*' ..
1402 '\d\+ EXECUTE 1\_s*' ..
1403 '\d\+ PUSHNR 0\_s*' ..
1404 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001405 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001406enddef
1407
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001408def s:Echomsg()
1409 echomsg 'some' 'message'
1410 echoerr 'went' .. 'wrong'
1411enddef
1412
1413def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001414 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001415 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1416 "echomsg 'some' 'message'\\_s*" ..
1417 '\d PUSHS "some"\_s*' ..
1418 '\d PUSHS "message"\_s*' ..
1419 '\d ECHOMSG 2\_s*' ..
1420 "echoerr 'went' .. 'wrong'\\_s*" ..
1421 '\d PUSHS "wentwrong"\_s*' ..
1422 '\d ECHOERR 1\_s*' ..
1423 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001424 '\d RETURN',
1425 res)
1426enddef
1427
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001428def SomeStringArg(arg: string)
1429 echo arg
1430enddef
1431
1432def SomeAnyArg(arg: any)
1433 echo arg
1434enddef
1435
1436def SomeStringArgAndReturn(arg: string): string
1437 return arg
1438enddef
1439
1440def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001441 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001442 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1443 '\d *echo arg.*' ..
1444 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001445 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001446
Bram Moolenaarac564082020-09-27 19:05:33 +02001447 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001448 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1449 '\d *echo arg\_s*' ..
1450 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001451 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001452
Bram Moolenaarac564082020-09-27 19:05:33 +02001453 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001454 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1455 '\d *return arg\_s*' ..
1456 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001457 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001458enddef
1459
Bram Moolenaar09689a02020-05-09 22:50:08 +02001460def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001461 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001462 vim9script
1463 def FuncOne(): string
1464 return FuncTwo()
1465 enddef
1466 def FuncTwo(): string
1467 return 'two'
1468 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001469 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001470 END
1471 writefile(lines, 'Xdisassemble')
1472 source Xdisassemble
1473
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001474 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001475 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1476 'return FuncTwo()\_s*' ..
1477 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001478 '\d RETURN',
1479 g:res_FuncOne)
1480
1481 delete('Xdisassemble')
1482 unlet g:res_FuncOne
1483enddef
1484
Bram Moolenaar61a89812020-05-07 16:58:17 +02001485def s:ConcatStrings(): string
1486 return 'one' .. 'two' .. 'three'
1487enddef
1488
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001489def s:ComputeConst(): number
1490 return 2 + 3 * 4 / 6 + 7
1491enddef
1492
Bram Moolenaar1c747212020-05-09 18:28:34 +02001493def s:ComputeConstParen(): number
1494 return ((2 + 4) * (8 / 2)) / (3 + 4)
1495enddef
1496
Bram Moolenaar61a89812020-05-07 16:58:17 +02001497def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001498 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001499 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1500 "return 'one' .. 'two' .. 'three'\\_s*" ..
1501 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001502 '\d RETURN',
1503 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001504
1505 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001506 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1507 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1508 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001509 '\d RETURN',
1510 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001511
1512 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001513 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1514 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1515 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001516 '\d RETURN',
1517 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001518enddef
1519
Bram Moolenaar389df252020-07-09 21:20:47 +02001520def s:CallAppend()
1521 eval "some text"->append(2)
1522enddef
1523
1524def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001525 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001526 assert_match('<SNR>\d*_CallAppend\_s*' ..
1527 'eval "some text"->append(2)\_s*' ..
1528 '\d PUSHS "some text"\_s*' ..
1529 '\d PUSHNR 2\_s*' ..
1530 '\d SHUFFLE 2 up 1\_s*' ..
1531 '\d BCALL append(argc 2)\_s*' ..
1532 '\d DROP\_s*' ..
1533 '\d PUSHNR 0\_s*' ..
1534 '\d RETURN',
1535 res)
1536enddef
1537
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001538" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker