blob: 8a96bf27326e9c8316ce6fbc829c2bf97d9a729d [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100120 '\d\+ RETURN 0',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
Bram Moolenaar4c137212021-04-19 16:48:48 +0200124def s:Substitute()
125 var expr = "abc"
126 :%s/a/\=expr/&g#c
127enddef
128
129def Test_disassemble_substitute()
130 var res = execute('disass s:Substitute')
131 assert_match('<SNR>\d*_Substitute.*' ..
132 ' var expr = "abc"\_s*' ..
133 '\d PUSHS "abc"\_s*' ..
134 '\d STORE $0\_s*' ..
135 ' :%s/a/\\=expr/&g#c\_s*' ..
136 '\d SUBSTITUTE :%s/a/\\=expr/&g#c\_s*' ..
137 ' 0 LOAD $0\_s*' ..
138 ' -------------\_s*' ..
139 '\d RETURN 0',
140 res)
141enddef
142
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200143def s:YankRange()
144 norm! m[jjm]
145 :'[,']yank
146enddef
147
148def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200149 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200150 assert_match('<SNR>\d*_YankRange.*' ..
151 ' norm! m\[jjm\]\_s*' ..
152 '\d EXEC norm! m\[jjm\]\_s*' ..
153 ' :''\[,''\]yank\_s*' ..
154 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100155 '\d RETURN 0',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200156 res)
157enddef
158
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200159def s:PutExpr()
160 :3put ="text"
161enddef
162
163def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200164 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200165 assert_match('<SNR>\d*_PutExpr.*' ..
166 ' :3put ="text"\_s*' ..
167 '\d PUSHS "text"\_s*' ..
168 '\d PUT = 3\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100169 '\d RETURN 0',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200170 res)
171enddef
172
Bram Moolenaar08597872020-12-10 19:43:40 +0100173def s:PutRange()
174 :$-2put a
175enddef
176
177def Test_disassemble_put_range()
178 var res = execute('disass s:PutRange')
179 assert_match('<SNR>\d*_PutRange.*' ..
180 ' :$-2put a\_s*' ..
181 '\d RANGE $-2\_s*' ..
182 '\d PUT a range\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100183 '\d RETURN 0',
Bram Moolenaar08597872020-12-10 19:43:40 +0100184 res)
185enddef
186
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100187def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200188 var localbool = true
189 var localspec = v:none
190 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100191 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200192 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100193 endif
194enddef
195
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100196def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200197 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200198 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
199 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100200 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200201 'localspec = v:none.*' ..
202 ' PUSH v:none.*' ..
203 'localblob = 0z1234.*' ..
204 ' PUSHBLOB 0z1234.*',
205 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100206 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200207 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
208 'localfloat = 1.234.*' ..
209 ' PUSHF 1.234.*',
210 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100211 endif
212enddef
213
214def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200215 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100216 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200217 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100218 localstr = 'xyz'
219 v:char = 'abc'
220 s:scriptvar = 'sv'
221 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100222 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200223 b:buffervar = 'bv'
224 w:windowvar = 'wv'
225 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100226 &tabstop = 8
227 $ENVVAR = 'ev'
228 @z = 'rv'
229enddef
230
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100231def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200232 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200233 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200234 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200235 'localnr = 2.*' ..
236 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200237 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200238 'localstr = ''xyz''.*' ..
239 ' STORE $1.*' ..
240 'v:char = ''abc''.*' ..
241 'STOREV v:char.*' ..
242 's:scriptvar = ''sv''.*' ..
243 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
244 'g:globalvar = ''gv''.*' ..
245 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100246 'g:auto#var = ''av''.*' ..
247 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200248 'b:buffervar = ''bv''.*' ..
249 ' STOREB b:buffervar.*' ..
250 'w:windowvar = ''wv''.*' ..
251 ' STOREW w:windowvar.*' ..
252 't:tabpagevar = ''tv''.*' ..
253 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200254 '&tabstop = 8.*' ..
255 ' STOREOPT &tabstop.*' ..
256 '$ENVVAR = ''ev''.*' ..
257 ' STOREENV $ENVVAR.*' ..
258 '@z = ''rv''.*' ..
259 ' STOREREG @z.*',
260 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100261enddef
262
Bram Moolenaarcb790402020-05-15 20:53:00 +0200263def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200264 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200265 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200266 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200267 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200268 var localblob: blob = 0z1122
269 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200270enddef
271
272def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200273 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200274 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200275 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200276 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100277 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200278 '\d STORE $0\_s*' ..
279 'locallist\[0\] = 123\_s*' ..
280 '\d PUSHNR 123\_s*' ..
281 '\d PUSHNR 0\_s*' ..
282 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200283 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200284 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200285 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100286 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200287 '\d STORE $1\_s*' ..
288 'localdict\["a"\] = 456\_s*' ..
289 '\d\+ PUSHNR 456\_s*' ..
290 '\d\+ PUSHS "a"\_s*' ..
291 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200292 '\d\+ STOREINDEX dict\_s*' ..
293 'var localblob: blob = 0z1122\_s*' ..
294 '\d\+ PUSHBLOB 0z1122\_s*' ..
295 '\d\+ STORE $2\_s*' ..
296 'localblob\[1\] = 33\_s*' ..
297 '\d\+ PUSHNR 33\_s*' ..
298 '\d\+ PUSHNR 1\_s*' ..
299 '\d\+ LOAD $2\_s*' ..
300 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100301 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200302 res)
303enddef
304
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100305def s:ScriptFuncStoreIndex()
306 var d = {dd: {}}
307 d.dd[0] = 0
308enddef
309
310def Test_disassemble_store_index()
311 var res = execute('disass s:ScriptFuncStoreIndex')
312 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
313 'var d = {dd: {}}\_s*' ..
314 '\d PUSHS "dd"\_s*' ..
315 '\d NEWDICT size 0\_s*' ..
316 '\d NEWDICT size 1\_s*' ..
317 '\d STORE $0\_s*' ..
318 'd.dd\[0\] = 0\_s*' ..
319 '\d PUSHNR 0\_s*' ..
320 '\d PUSHNR 0\_s*' ..
321 '\d LOAD $0\_s*' ..
322 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200323 '\d STOREINDEX any\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100324 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100325 res)
326enddef
327
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200328def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200329 var x: string
330 var y: string
331 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200332 [x, y; l] = g:stringlist
333enddef
334
335def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200336 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200337 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200338 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200339 '\d PUSHS "\[NULL\]"\_s*' ..
340 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200341 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200342 '\d PUSHS "\[NULL\]"\_s*' ..
343 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200344 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200345 '\d NEWLIST size 0\_s*' ..
346 '\d STORE $2\_s*' ..
347 '\[x, y; l\] = g:stringlist\_s*' ..
348 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200349 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200350 '\d CHECKLEN >= 2\_s*' ..
351 '\d\+ ITEM 0\_s*' ..
352 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
353 '\d\+ STORE $0\_s*' ..
354 '\d\+ ITEM 1\_s*' ..
355 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
356 '\d\+ STORE $1\_s*' ..
357 '\d\+ SLICE 2\_s*' ..
358 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100359 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200360 res)
361enddef
362
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200363def s:ListAdd()
364 var l: list<number> = []
365 add(l, 123)
366 add(l, g:aNumber)
367enddef
368
369def Test_disassemble_list_add()
370 var res = execute('disass s:ListAdd')
371 assert_match('<SNR>\d*_ListAdd\_s*' ..
372 'var l: list<number> = []\_s*' ..
373 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100374 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200375 '\d STORE $0\_s*' ..
376 'add(l, 123)\_s*' ..
377 '\d LOAD $0\_s*' ..
378 '\d PUSHNR 123\_s*' ..
379 '\d LISTAPPEND\_s*' ..
380 '\d DROP\_s*' ..
381 'add(l, g:aNumber)\_s*' ..
382 '\d LOAD $0\_s*' ..
383 '\d\+ LOADG g:aNumber\_s*' ..
384 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
385 '\d\+ LISTAPPEND\_s*' ..
386 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100387 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200388 res)
389enddef
390
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200391def s:BlobAdd()
392 var b: blob = 0z
393 add(b, 123)
394 add(b, g:aNumber)
395enddef
396
397def Test_disassemble_blob_add()
398 var res = execute('disass s:BlobAdd')
399 assert_match('<SNR>\d*_BlobAdd\_s*' ..
400 'var b: blob = 0z\_s*' ..
401 '\d PUSHBLOB 0z\_s*' ..
402 '\d STORE $0\_s*' ..
403 'add(b, 123)\_s*' ..
404 '\d LOAD $0\_s*' ..
405 '\d PUSHNR 123\_s*' ..
406 '\d BLOBAPPEND\_s*' ..
407 '\d DROP\_s*' ..
408 'add(b, g:aNumber)\_s*' ..
409 '\d LOAD $0\_s*' ..
410 '\d\+ LOADG g:aNumber\_s*' ..
411 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
412 '\d\+ BLOBAPPEND\_s*' ..
413 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100414 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200415 res)
416enddef
417
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200418def s:BlobIndexSlice()
419 var b: blob = 0z112233
420 echo b[1]
421 echo b[1 : 2]
422enddef
423
424def Test_disassemble_blob_index_slice()
425 var res = execute('disass s:BlobIndexSlice')
426 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
427 'var b: blob = 0z112233\_s*' ..
428 '\d PUSHBLOB 0z112233\_s*' ..
429 '\d STORE $0\_s*' ..
430 'echo b\[1\]\_s*' ..
431 '\d LOAD $0\_s*' ..
432 '\d PUSHNR 1\_s*' ..
433 '\d BLOBINDEX\_s*' ..
434 '\d ECHO 1\_s*' ..
435 'echo b\[1 : 2\]\_s*' ..
436 '\d LOAD $0\_s*' ..
437 '\d PUSHNR 1\_s*' ..
438 '\d\+ PUSHNR 2\_s*' ..
439 '\d\+ BLOBSLICE\_s*' ..
440 '\d\+ ECHO 1\_s*' ..
441 '\d\+ RETURN 0',
442 res)
443enddef
444
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200445def s:ScriptFuncUnlet()
446 g:somevar = "value"
447 unlet g:somevar
448 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200449 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200450enddef
451
452def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200453 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200454 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
455 'g:somevar = "value"\_s*' ..
456 '\d PUSHS "value"\_s*' ..
457 '\d STOREG g:somevar\_s*' ..
458 'unlet g:somevar\_s*' ..
459 '\d UNLET g:somevar\_s*' ..
460 'unlet! g:somevar\_s*' ..
461 '\d UNLET! g:somevar\_s*' ..
462 'unlet $SOMEVAR\_s*' ..
463 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200464 res)
465enddef
466
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100467def s:ScriptFuncTry()
468 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200469 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100470 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200471 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100472 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200473 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100474 endtry
475enddef
476
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100477def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200478 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200479 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
480 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100481 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200482 'echo "yes"\_s*' ..
483 '\d PUSHS "yes"\_s*' ..
484 '\d ECHO 1\_s*' ..
485 'catch /fail/\_s*' ..
486 '\d JUMP -> \d\+\_s*' ..
487 '\d PUSH v:exception\_s*' ..
488 '\d PUSHS "fail"\_s*' ..
489 '\d COMPARESTRING =\~\_s*' ..
490 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
491 '\d CATCH\_s*' ..
492 'echo "no"\_s*' ..
493 '\d\+ PUSHS "no"\_s*' ..
494 '\d\+ ECHO 1\_s*' ..
495 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100496 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200497 'throw "end"\_s*' ..
498 '\d\+ PUSHS "end"\_s*' ..
499 '\d\+ THROW\_s*' ..
500 'endtry\_s*' ..
501 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200502 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100503enddef
504
505def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200506 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100507 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100508enddef
509
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100510def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200511 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200512 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200513 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200514 '\d PUSHNR 1\_s*' ..
515 '\d PUSHS "two"\_s*' ..
516 '\d PUSHNR 333\_s*' ..
517 '\d NEWLIST size 3\_s*' ..
518 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100519 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200520 '\d PUSHS "one"\_s*' ..
521 '\d PUSHNR 1\_s*' ..
522 '\d PUSHS "two"\_s*' ..
523 '\d PUSHS "val"\_s*' ..
524 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200525 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100526enddef
527
Bram Moolenaar6e949782020-04-13 17:21:00 +0200528def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100529 echo arg
530enddef
531
532func UserFunc()
533 echo 'nothing'
534endfunc
535
536func UserFuncWithArg(arg)
537 echo a:arg
538endfunc
539
540def s:ScriptFuncCall(): string
541 changenr()
542 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100543 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100544 FuncWithArg(343)
545 ScriptFuncNew()
546 s:ScriptFuncNew()
547 UserFunc()
548 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200549 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100550 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200551 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100552 FuncRefWithArg("bar")
553 return "yes"
554enddef
555
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100556def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200557 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200558 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
559 'changenr()\_s*' ..
560 '\d BCALL changenr(argc 0)\_s*' ..
561 '\d DROP\_s*' ..
562 'char2nr("abc")\_s*' ..
563 '\d PUSHS "abc"\_s*' ..
564 '\d BCALL char2nr(argc 1)\_s*' ..
565 '\d DROP\_s*' ..
566 'Test_disassemble_new()\_s*' ..
567 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
568 '\d DROP\_s*' ..
569 'FuncWithArg(343)\_s*' ..
570 '\d\+ PUSHNR 343\_s*' ..
571 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
572 '\d\+ DROP\_s*' ..
573 'ScriptFuncNew()\_s*' ..
574 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
575 '\d\+ DROP\_s*' ..
576 's:ScriptFuncNew()\_s*' ..
577 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
578 '\d\+ DROP\_s*' ..
579 'UserFunc()\_s*' ..
580 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
581 '\d\+ DROP\_s*' ..
582 'UserFuncWithArg("foo")\_s*' ..
583 '\d\+ PUSHS "foo"\_s*' ..
584 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
585 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200586 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200587 '\d\+ PUSHS "UserFunc"\_s*' ..
588 '\d\+ BCALL function(argc 1)\_s*' ..
589 '\d\+ STORE $0\_s*' ..
590 'FuncRef()\_s*' ..
591 '\d\+ LOAD $\d\_s*' ..
592 '\d\+ PCALL (argc 0)\_s*' ..
593 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200594 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200595 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
596 '\d\+ BCALL function(argc 1)\_s*' ..
597 '\d\+ STORE $1\_s*' ..
598 'FuncRefWithArg("bar")\_s*' ..
599 '\d\+ PUSHS "bar"\_s*' ..
600 '\d\+ LOAD $\d\_s*' ..
601 '\d\+ PCALL (argc 1)\_s*' ..
602 '\d\+ DROP\_s*' ..
603 'return "yes"\_s*' ..
604 '\d\+ PUSHS "yes"\_s*' ..
605 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200606 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100607enddef
608
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200609
610def s:CreateRefs()
611 var local = 'a'
612 def Append(arg: string)
613 local ..= arg
614 enddef
615 g:Append = Append
616 def Get(): string
617 return local
618 enddef
619 g:Get = Get
620enddef
621
622def Test_disassemble_closure()
623 CreateRefs()
624 var res = execute('disass g:Append')
625 assert_match('<lambda>\d\_s*' ..
626 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100627 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200628 '\d LOAD arg\[-1\]\_s*' ..
629 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100630 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100631 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200632 res)
633
634 res = execute('disass g:Get')
635 assert_match('<lambda>\d\_s*' ..
636 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100637 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200638 '\d RETURN',
639 res)
640
641 unlet g:Append
642 unlet g:Get
643enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200644
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100645
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200646def EchoArg(arg: string): string
647 return arg
648enddef
649def RefThis(): func
650 return function('EchoArg')
651enddef
652def s:ScriptPCall()
653 RefThis()("text")
654enddef
655
656def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200657 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200658 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
659 'RefThis()("text")\_s*' ..
660 '\d DCALL RefThis(argc 0)\_s*' ..
661 '\d PUSHS "text"\_s*' ..
662 '\d PCALL top (argc 1)\_s*' ..
663 '\d PCALL end\_s*' ..
664 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100665 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200666 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200667enddef
668
669
Bram Moolenaara26b9702020-04-18 19:53:28 +0200670def s:FuncWithForwardCall(): string
671 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100672enddef
673
674def DefinedLater(arg: string): string
675 return arg
676enddef
677
678def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200679 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200680 assert_match('FuncWithForwardCall\_s*' ..
681 'return g:DefinedLater("yes")\_s*' ..
682 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200683 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200684 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200685 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100686
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200687 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100688 assert_equal('yes', FuncWithForwardCall())
689
Bram Moolenaara26b9702020-04-18 19:53:28 +0200690 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200691 assert_match('FuncWithForwardCall\_s*' ..
692 'return g:DefinedLater("yes")\_s*' ..
693 '\d PUSHS "yes"\_s*' ..
694 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200695 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200696 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100697enddef
698
699
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200700def FuncWithDefault(arg: string = 'default', nr = 77): string
701 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100702enddef
703
704def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200705 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200706 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200707 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200708 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200709 '\d STORE arg\[-2]\_s*' ..
710 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
711 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200712 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200713 'return arg .. nr\_s*' ..
714 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200715 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200716 '\d 2STRING stack\[-1]\_s*' ..
717 '\d\+ CONCAT\_s*' ..
718 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200719 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100720enddef
721
722
Bram Moolenaar158906c2020-02-06 20:39:45 +0100723def HasEval()
724 if has("eval")
725 echo "yes"
726 else
727 echo "no"
728 endif
729enddef
730
731def HasNothing()
732 if has("nothing")
733 echo "yes"
734 else
735 echo "no"
736 endif
737enddef
738
739def HasSomething()
740 if has("nothing")
741 echo "nothing"
742 elseif has("something")
743 echo "something"
744 elseif has("eval")
745 echo "eval"
746 elseif has("less")
747 echo "less"
748 endif
749enddef
750
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100751def HasGuiRunning()
752 if has("gui_running")
753 echo "yes"
754 else
755 echo "no"
756 endif
757enddef
758
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100759def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200760 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200761 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200762 assert_match('HasEval\_s*' ..
763 'if has("eval")\_s*' ..
764 'echo "yes"\_s*' ..
765 '\d PUSHS "yes"\_s*' ..
766 '\d ECHO 1\_s*' ..
767 'else\_s*' ..
768 'echo "no"\_s*' ..
769 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200770 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100771 assert_notmatch('JUMP', instr)
772
Bram Moolenaard2c61702020-09-06 15:58:36 +0200773 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100774 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200775 assert_match('HasNothing\_s*' ..
776 'if has("nothing")\_s*' ..
777 'echo "yes"\_s*' ..
778 'else\_s*' ..
779 'echo "no"\_s*' ..
780 '\d PUSHS "no"\_s*' ..
781 '\d ECHO 1\_s*' ..
782 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200783 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100784 assert_notmatch('PUSHS "yes"', instr)
785 assert_notmatch('JUMP', instr)
786
Bram Moolenaard2c61702020-09-06 15:58:36 +0200787 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100788 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200789 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200790 'if has("nothing")\_s*' ..
791 'echo "nothing"\_s*' ..
792 'elseif has("something")\_s*' ..
793 'echo "something"\_s*' ..
794 'elseif has("eval")\_s*' ..
795 'echo "eval"\_s*' ..
796 '\d PUSHS "eval"\_s*' ..
797 '\d ECHO 1\_s*' ..
798 'elseif has("less").*' ..
799 'echo "less"\_s*' ..
800 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200801 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100802 assert_notmatch('PUSHS "nothing"', instr)
803 assert_notmatch('PUSHS "something"', instr)
804 assert_notmatch('PUSHS "less"', instr)
805 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100806
807 var result: string
808 var instr_expected: string
809 if has('gui')
810 if has('gui_running')
811 # GUI already running, always returns "yes"
812 result = "\nyes"
813 instr_expected = 'HasGuiRunning.*' ..
814 'if has("gui_running")\_s*' ..
815 ' echo "yes"\_s*' ..
816 '\d PUSHS "yes"\_s*' ..
817 '\d ECHO 1\_s*' ..
818 'else\_s*' ..
819 ' echo "no"\_s*' ..
820 'endif'
821 else
822 result = "\nno"
823 if has('unix')
824 # GUI not running but can start later, call has()
825 instr_expected = 'HasGuiRunning.*' ..
826 'if has("gui_running")\_s*' ..
827 '\d PUSHS "gui_running"\_s*' ..
828 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200829 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100830 '\d JUMP_IF_FALSE -> \d\_s*' ..
831 ' echo "yes"\_s*' ..
832 '\d PUSHS "yes"\_s*' ..
833 '\d ECHO 1\_s*' ..
834 'else\_s*' ..
835 '\d JUMP -> \d\_s*' ..
836 ' echo "no"\_s*' ..
837 '\d PUSHS "no"\_s*' ..
838 '\d ECHO 1\_s*' ..
839 'endif'
840 else
841 # GUI not running, always return "no"
842 instr_expected = 'HasGuiRunning.*' ..
843 'if has("gui_running")\_s*' ..
844 ' echo "yes"\_s*' ..
845 'else\_s*' ..
846 ' echo "no"\_s*' ..
847 '\d PUSHS "no"\_s*' ..
848 '\d ECHO 1\_s*' ..
849 'endif'
850 endif
851 endif
852 else
853 # GUI not supported, always return "no"
854 result = "\nno"
855 instr_expected = 'HasGuiRunning.*' ..
856 'if has("gui_running")\_s*' ..
857 ' echo "yes"\_s*' ..
858 'else\_s*' ..
859 ' echo "no"\_s*' ..
860 '\d PUSHS "no"\_s*' ..
861 '\d ECHO 1\_s*' ..
862 'endif'
863 endif
864
865 assert_equal(result, execute('HasGuiRunning()'))
866 instr = execute('disassemble HasGuiRunning')
867 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100868enddef
869
Bram Moolenaarefd88552020-06-18 20:50:10 +0200870def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100871 if 1 < 0
872 return "maybe"
873 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200874 if g:cond
875 return "yes"
876 else
877 return "no"
878 endif
879enddef
880
881def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200882 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200883 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100884 'if 1 < 0\_s*' ..
885 ' return "maybe"\_s*' ..
886 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200887 'if g:cond\_s*' ..
888 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100889 '1 COND2BOOL\_s*' ..
890 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200891 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100892 '3 PUSHS "yes"\_s*' ..
893 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200894 'else\_s*' ..
895 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100896 '5 PUSHS "no"\_s*' ..
897 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200898 instr)
899enddef
900
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100901def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200902 var Funky1: func
903 var Funky2: func = function("len")
904 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100905enddef
906
907def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200908 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200909 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200910 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200911 '0 PUSHFUNC "\[none]"\_s*' ..
912 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200913 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200914 '2 PUSHS "len"\_s*' ..
915 '3 BCALL function(argc 1)\_s*' ..
916 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200917 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200918 '\d PUSHS "UserFunc"\_s*' ..
919 '\d BCALL funcref(argc 1)\_s*' ..
920 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100921 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200922 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100923enddef
924
925if has('channel')
926 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200927 var job1: job
928 var job2: job = job_start("donothing")
929 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100930 enddef
931endif
932
933def Test_disassemble_channel()
934 CheckFeature channel
935
Bram Moolenaarac564082020-09-27 19:05:33 +0200936 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200937 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200938 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200939 '\d PUSHJOB "no process"\_s*' ..
940 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200941 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200942 '\d PUSHS "donothing"\_s*' ..
943 '\d BCALL job_start(argc 1)\_s*' ..
944 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200945 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200946 '\d PUSHCHANNEL 0\_s*' ..
947 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100948 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200949 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100950enddef
951
Bram Moolenaar777770f2020-02-06 21:27:08 +0100952def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100953 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100954 return F("x")
955enddef
956
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100957def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100958 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200959 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200960 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100961 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200962 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200963 '\d STORE $0\_s*' ..
964 'return F("x")\_s*' ..
965 '\d PUSHS "x"\_s*' ..
966 '\d LOAD $0\_s*' ..
967 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200968 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200969 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200970
Bram Moolenaarac564082020-09-27 19:05:33 +0200971 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200972 instr = execute('disassemble ' .. name)
973 assert_match('<lambda>\d\+\_s*' ..
974 'return "X" .. a .. "X"\_s*' ..
975 '\d PUSHS "X"\_s*' ..
976 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200977 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200978 '\d CONCAT\_s*' ..
979 '\d PUSHS "X"\_s*' ..
980 '\d CONCAT\_s*' ..
981 '\d RETURN',
982 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100983enddef
984
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100985def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100986 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100987 return Ref(g:value)
988enddef
989
990def Test_disassemble_lambda_with_type()
991 g:value = 5
992 assert_equal(15, LambdaWithType())
993 var instr = execute('disassemble LambdaWithType')
994 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100995 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100996 '\d FUNCREF <lambda>\d\+\_s*' ..
997 '\d STORE $0\_s*' ..
998 'return Ref(g:value)\_s*' ..
999 '\d LOADG g:value\_s*' ..
1000 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +01001001 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +01001002 '\d PCALL (argc 1)\_s*' ..
1003 '\d RETURN',
1004 instr)
1005enddef
1006
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001007def NestedOuter()
1008 def g:Inner()
1009 echomsg "inner"
1010 enddef
1011enddef
1012
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001013def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001014 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001015 assert_match('NestedOuter\_s*' ..
1016 'def g:Inner()\_s*' ..
1017 'echomsg "inner"\_s*' ..
1018 'enddef\_s*' ..
1019 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001020 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001021 instr)
1022enddef
1023
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001024def NestedDefList()
1025 def
1026 def Info
1027 def /Info
1028 def /Info/
1029enddef
1030
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001031def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001032 var instr = execute('disassemble NestedDefList')
1033 assert_match('NestedDefList\_s*' ..
1034 'def\_s*' ..
1035 '\d DEF \_s*' ..
1036 'def Info\_s*' ..
1037 '\d DEF Info\_s*' ..
1038 'def /Info\_s*' ..
1039 '\d DEF /Info\_s*' ..
1040 'def /Info/\_s*' ..
1041 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001042 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001043 instr)
1044enddef
1045
Bram Moolenaar6e949782020-04-13 17:21:00 +02001046def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001047 if arg == 1 && arg != 2 || arg == 4
1048 return 'yes'
1049 endif
1050 return 'no'
1051enddef
1052
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001053def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001054 assert_equal("yes", AndOr(1))
1055 assert_equal("no", AndOr(2))
1056 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001057 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001058 assert_match('AndOr\_s*' ..
1059 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1060 '\d LOAD arg\[-1]\_s*' ..
1061 '\d PUSHNR 1\_s*' ..
1062 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001063 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001064 '\d LOAD arg\[-1]\_s*' ..
1065 '\d PUSHNR 2\_s*' ..
1066 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001067 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001068 '\d LOAD arg\[-1]\_s*' ..
1069 '\d\+ PUSHNR 4\_s*' ..
1070 '\d\+ COMPAREANY ==\_s*' ..
1071 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001072 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001073enddef
1074
Bram Moolenaar04d05222020-02-06 22:06:54 +01001075def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001076 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001077 for i in range(3)
1078 res->add(i)
1079 endfor
1080 return res
1081enddef
1082
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001083def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001084 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001085 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001086 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001087 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001088 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001089 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001090 '\d STORE $0\_s*' ..
1091 'for i in range(3)\_s*' ..
1092 '\d STORE -1 in $1\_s*' ..
1093 '\d PUSHNR 3\_s*' ..
1094 '\d BCALL range(argc 1)\_s*' ..
1095 '\d FOR $1 -> \d\+\_s*' ..
1096 '\d STORE $2\_s*' ..
1097 'res->add(i)\_s*' ..
1098 '\d LOAD $0\_s*' ..
1099 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001100 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001101 '\d\+ DROP\_s*' ..
1102 'endfor\_s*' ..
1103 '\d\+ JUMP -> \d\+\_s*' ..
1104 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001105 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001106enddef
1107
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001108def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001109 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001110 for str in eval('["one", "two"]')
1111 res ..= str
1112 endfor
1113 return res
1114enddef
1115
1116def Test_disassemble_for_loop_eval()
1117 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001118 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001119 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001120 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001121 '\d PUSHS ""\_s*' ..
1122 '\d STORE $0\_s*' ..
1123 'for str in eval(''\["one", "two"\]'')\_s*' ..
1124 '\d STORE -1 in $1\_s*' ..
1125 '\d PUSHS "\["one", "two"\]"\_s*' ..
1126 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001127 '\d FOR $1 -> \d\+\_s*' ..
1128 '\d STORE $2\_s*' ..
1129 'res ..= str\_s*' ..
1130 '\d\+ LOAD $0\_s*' ..
1131 '\d\+ LOAD $2\_s*' ..
1132 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1133 '\d\+ CONCAT\_s*' ..
1134 '\d\+ STORE $0\_s*' ..
1135 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001136 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001137 '\d\+ DROP\_s*' ..
1138 'return res\_s*' ..
1139 '\d\+ LOAD $0\_s*' ..
1140 '\d\+ RETURN',
1141 instr)
1142enddef
1143
Bram Moolenaar792f7862020-11-23 08:31:18 +01001144def ForLoopUnpack()
1145 for [x1, x2] in [[1, 2], [3, 4]]
1146 echo x1 x2
1147 endfor
1148enddef
1149
1150def Test_disassemble_for_loop_unpack()
1151 var instr = execute('disassemble ForLoopUnpack')
1152 assert_match('ForLoopUnpack\_s*' ..
1153 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1154 '\d\+ STORE -1 in $0\_s*' ..
1155 '\d\+ PUSHNR 1\_s*' ..
1156 '\d\+ PUSHNR 2\_s*' ..
1157 '\d\+ NEWLIST size 2\_s*' ..
1158 '\d\+ PUSHNR 3\_s*' ..
1159 '\d\+ PUSHNR 4\_s*' ..
1160 '\d\+ NEWLIST size 2\_s*' ..
1161 '\d\+ NEWLIST size 2\_s*' ..
1162 '\d\+ FOR $0 -> 16\_s*' ..
1163 '\d\+ UNPACK 2\_s*' ..
1164 '\d\+ STORE $1\_s*' ..
1165 '\d\+ STORE $2\_s*' ..
1166 'echo x1 x2\_s*' ..
1167 '\d\+ LOAD $1\_s*' ..
1168 '\d\+ LOAD $2\_s*' ..
1169 '\d\+ ECHO 2\_s*' ..
1170 'endfor\_s*' ..
1171 '\d\+ JUMP -> 8\_s*' ..
1172 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001173 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001174 instr)
1175enddef
1176
Bram Moolenaarc150c092021-02-13 15:02:46 +01001177def ForLoopContinue()
1178 for nr in [1, 2]
1179 try
1180 echo "ok"
1181 try
1182 echo "deeper"
1183 catch
1184 continue
1185 endtry
1186 catch
1187 echo "not ok"
1188 endtry
1189 endfor
1190enddef
1191
1192def Test_disassemble_for_loop_continue()
1193 var instr = execute('disassemble ForLoopContinue')
1194 assert_match('ForLoopContinue\_s*' ..
1195 'for nr in \[1, 2]\_s*' ..
1196 '0 STORE -1 in $0\_s*' ..
1197 '1 PUSHNR 1\_s*' ..
1198 '2 PUSHNR 2\_s*' ..
1199 '3 NEWLIST size 2\_s*' ..
1200 '4 FOR $0 -> 22\_s*' ..
1201 '5 STORE $1\_s*' ..
1202 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001203 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001204 'echo "ok"\_s*' ..
1205 '7 PUSHS "ok"\_s*' ..
1206 '8 ECHO 1\_s*' ..
1207 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001208 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001209 'echo "deeper"\_s*' ..
1210 '10 PUSHS "deeper"\_s*' ..
1211 '11 ECHO 1\_s*' ..
1212 'catch\_s*' ..
1213 '12 JUMP -> 15\_s*' ..
1214 '13 CATCH\_s*' ..
1215 'continue\_s*' ..
1216 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1217 'endtry\_s*' ..
1218 '15 ENDTRY\_s*' ..
1219 'catch\_s*' ..
1220 '16 JUMP -> 20\_s*' ..
1221 '17 CATCH\_s*' ..
1222 'echo "not ok"\_s*' ..
1223 '18 PUSHS "not ok"\_s*' ..
1224 '19 ECHO 1\_s*' ..
1225 'endtry\_s*' ..
1226 '20 ENDTRY\_s*' ..
1227 'endfor\_s*' ..
1228 '21 JUMP -> 4\_s*' ..
1229 '\d\+ DROP\_s*' ..
1230 '\d\+ RETURN 0',
1231 instr)
1232enddef
1233
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001234let g:number = 42
1235
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001236def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001237 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001238enddef
1239
1240def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001241 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001242 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001243 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001244 '\d PUSHNR 23\_s*' ..
1245 '\d LOADG g:number\_s*' ..
1246 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1247 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001248 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001249 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001250 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001251 instr)
1252enddef
1253
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001254def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001255 var nr = 3
1256 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001257 nrres = nr - 7
1258 nrres = nr * 7
1259 nrres = nr / 7
1260 nrres = nr % 7
1261
Bram Moolenaarac564082020-09-27 19:05:33 +02001262 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001263 anyres = g:number - 7
1264 anyres = g:number * 7
1265 anyres = g:number / 7
1266 anyres = g:number % 7
1267
1268 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001269 var fl = 3.0
1270 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001271 flres = fl - 7.0
1272 flres = fl * 7.0
1273 flres = fl / 7.0
1274 endif
1275enddef
1276
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001277def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001278 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001279 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001280 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001281 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001282 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001283 '\d LOAD $0.*' ..
1284 '\d PUSHNR 7.*' ..
1285 '\d OPNR +.*' ..
1286 '\d STORE $1.*' ..
1287 'nrres = nr - 7.*' ..
1288 '\d OPNR -.*' ..
1289 'nrres = nr \* 7.*' ..
1290 '\d OPNR \*.*' ..
1291 'nrres = nr / 7.*' ..
1292 '\d OPNR /.*' ..
1293 'nrres = nr % 7.*' ..
1294 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001295 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001296 '\d LOADG g:number.*' ..
1297 '\d PUSHNR 7.*' ..
1298 '\d OPANY +.*' ..
1299 '\d STORE $2.*' ..
1300 'anyres = g:number - 7.*' ..
1301 '\d OPANY -.*' ..
1302 'anyres = g:number \* 7.*' ..
1303 '\d OPANY \*.*' ..
1304 'anyres = g:number / 7.*' ..
1305 '\d OPANY /.*' ..
1306 'anyres = g:number % 7.*' ..
1307 '\d OPANY %.*',
1308 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001309 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001310 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001311 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001312 '\d PUSHF 3.0.*' ..
1313 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001314 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001315 '\d LOAD $3.*' ..
1316 '\d PUSHF 7.0.*' ..
1317 '\d OPFLOAT +.*' ..
1318 '\d STORE $4.*' ..
1319 'flres = fl - 7.0.*' ..
1320 '\d OPFLOAT -.*' ..
1321 'flres = fl \* 7.0.*' ..
1322 '\d OPFLOAT \*.*' ..
1323 'flres = fl / 7.0.*' ..
1324 '\d OPFLOAT /.*',
1325 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001326 endif
1327enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001328
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001329def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001330 var reslist = [1, 2] + [3, 4]
1331 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001332enddef
1333
1334def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001335 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001336 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001337 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001338 '\d PUSHNR 1.*' ..
1339 '\d PUSHNR 2.*' ..
1340 '\d NEWLIST size 2.*' ..
1341 '\d PUSHNR 3.*' ..
1342 '\d PUSHNR 4.*' ..
1343 '\d NEWLIST size 2.*' ..
1344 '\d ADDLIST.*' ..
1345 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001346 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001347 '\d PUSHBLOB 0z1122.*' ..
1348 '\d PUSHBLOB 0z3344.*' ..
1349 '\d ADDBLOB.*' ..
1350 '\d STORE $.*',
1351 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001352enddef
1353
1354let g:aa = 'aa'
1355def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001356 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001357 return res
1358enddef
1359
1360def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001361 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001362 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001363 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001364 '\d LOADG g:aa.*' ..
1365 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001366 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001367 '\d CONCAT.*' ..
1368 '\d STORE $.*',
1369 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001370 assert_equal('aabb', ConcatString())
1371enddef
1372
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001373def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001374 var s = "abcd"
1375 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001376 return res
1377enddef
1378
1379def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001380 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001381 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001382 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001383 '\d PUSHS "abcd"\_s*' ..
1384 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001385 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001386 '\d LOAD $0\_s*' ..
1387 '\d PUSHNR 1\_s*' ..
1388 '\d STRINDEX\_s*' ..
1389 '\d STORE $1\_s*',
1390 instr)
1391 assert_equal('b', StringIndex())
1392enddef
1393
Bram Moolenaared591872020-08-15 22:14:53 +02001394def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001395 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001396 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001397 return res
1398enddef
1399
1400def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001401 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001402 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001403 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001404 '\d PUSHS "abcd"\_s*' ..
1405 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001406 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001407 '\d LOAD $0\_s*' ..
1408 '\d PUSHNR 1\_s*' ..
1409 '\d PUSHNR 8\_s*' ..
1410 '\d STRSLICE\_s*' ..
1411 '\d STORE $1\_s*',
1412 instr)
1413 assert_equal('bcd', StringSlice())
1414enddef
1415
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001416def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001417 var l = [1, 2, 3]
1418 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001419 return res
1420enddef
1421
1422def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001423 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001424 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001425 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001426 '\d PUSHNR 1\_s*' ..
1427 '\d PUSHNR 2\_s*' ..
1428 '\d PUSHNR 3\_s*' ..
1429 '\d NEWLIST size 3\_s*' ..
1430 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001431 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001432 '\d LOAD $0\_s*' ..
1433 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001434 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001435 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001436 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001437 assert_equal(2, ListIndex())
1438enddef
1439
Bram Moolenaared591872020-08-15 22:14:53 +02001440def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001441 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001442 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001443 return res
1444enddef
1445
1446def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001447 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001448 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001449 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001450 '\d PUSHNR 1\_s*' ..
1451 '\d PUSHNR 2\_s*' ..
1452 '\d PUSHNR 3\_s*' ..
1453 '\d NEWLIST size 3\_s*' ..
1454 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001455 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001456 '\d LOAD $0\_s*' ..
1457 '\d PUSHNR 1\_s*' ..
1458 '\d PUSHNR 8\_s*' ..
1459 '\d LISTSLICE\_s*' ..
1460 '\d STORE $1\_s*',
1461 instr)
1462 assert_equal([2, 3], ListSlice())
1463enddef
1464
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001465def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001466 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001467 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001468 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001469 return res
1470enddef
1471
1472def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001473 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001474 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001475 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001476 '\d PUSHS "item"\_s*' ..
1477 '\d PUSHNR 1\_s*' ..
1478 '\d NEWDICT size 1\_s*' ..
1479 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001480 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001481 '\d\+ LOAD $0\_s*' ..
1482 '\d\+ MEMBER item\_s*' ..
1483 '\d\+ STORE $1\_s*' ..
1484 'res = d\["item"\]\_s*' ..
1485 '\d\+ LOAD $0\_s*' ..
1486 '\d\+ PUSHS "item"\_s*' ..
1487 '\d\+ MEMBER\_s*' ..
1488 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001489 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001490 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001491enddef
1492
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001493let somelist = [1, 2, 3, 4, 5]
1494def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001495 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001496 return res
1497enddef
1498
1499def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001500 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001501 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001502 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001503 '\d LOADG g:somelist\_s*' ..
1504 '\d PUSHNR 2\_s*' ..
1505 '\d ANYINDEX\_s*' ..
1506 '\d STORE $0\_s*' ..
1507 'return res\_s*' ..
1508 '\d LOAD $0\_s*' ..
1509 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1510 '\d RETURN',
1511 instr)
1512 assert_equal(3, AnyIndex())
1513enddef
1514
1515def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001516 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001517 return res
1518enddef
1519
1520def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001521 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001522 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001523 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001524 '\d LOADG g:somelist\_s*' ..
1525 '\d PUSHNR 1\_s*' ..
1526 '\d PUSHNR 3\_s*' ..
1527 '\d ANYSLICE\_s*' ..
1528 '\d STORE $0\_s*' ..
1529 'return res\_s*' ..
1530 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001531 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001532 '\d RETURN',
1533 instr)
1534 assert_equal([2, 3, 4], AnySlice())
1535enddef
1536
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001537def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001538 var nr = 9
1539 var plus = +nr
1540 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001541 return res
1542enddef
1543
1544def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001545 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001546 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001547 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001548 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001549 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001550 '\d LOAD $0\_s*' ..
1551 '\d CHECKNR\_s*' ..
1552 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001553 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001554 '\d LOAD $0\_s*' ..
1555 '\d NEGATENR\_s*' ..
1556 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001557 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001558 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001559enddef
1560
1561def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001562 var flag = true
1563 var invert = !flag
1564 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001565 return res
1566enddef
1567
1568def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001569 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001570 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001571 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001572 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001573 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001574 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001575 '\d LOAD $0\_s*' ..
1576 '\d INVERT (!val)\_s*' ..
1577 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001578 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001579 '\d LOAD $0\_s*' ..
1580 '\d 2BOOL (!!val)\_s*' ..
1581 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001582 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001583 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001584enddef
1585
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001586def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001587 var name: bool = 1 && 0 || 1
1588 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001589enddef
1590
1591def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001592 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001593 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001594 'var name: bool = 1 && 0 || 1\_s*' ..
1595 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001596 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001597 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1598 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001599 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001600 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1601 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001602 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001603 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001604 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001605 '\d\+ LOAD $0\_s*' ..
1606 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001607 instr)
1608 assert_equal(true, InvertBool())
1609enddef
1610
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001611def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001612 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001613 ['true == isFalse', 'COMPAREBOOL =='],
1614 ['true != isFalse', 'COMPAREBOOL !='],
1615 ['v:none == isNull', 'COMPARESPECIAL =='],
1616 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001617
Bram Moolenaara5565e42020-05-09 15:44:01 +02001618 ['111 == aNumber', 'COMPARENR =='],
1619 ['111 != aNumber', 'COMPARENR !='],
1620 ['111 > aNumber', 'COMPARENR >'],
1621 ['111 < aNumber', 'COMPARENR <'],
1622 ['111 >= aNumber', 'COMPARENR >='],
1623 ['111 <= aNumber', 'COMPARENR <='],
1624 ['111 =~ aNumber', 'COMPARENR =\~'],
1625 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001626
Bram Moolenaara5565e42020-05-09 15:44:01 +02001627 ['"xx" != aString', 'COMPARESTRING !='],
1628 ['"xx" > aString', 'COMPARESTRING >'],
1629 ['"xx" < aString', 'COMPARESTRING <'],
1630 ['"xx" >= aString', 'COMPARESTRING >='],
1631 ['"xx" <= aString', 'COMPARESTRING <='],
1632 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1633 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1634 ['"xx" is aString', 'COMPARESTRING is'],
1635 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001636
Bram Moolenaara5565e42020-05-09 15:44:01 +02001637 ['0z11 == aBlob', 'COMPAREBLOB =='],
1638 ['0z11 != aBlob', 'COMPAREBLOB !='],
1639 ['0z11 is aBlob', 'COMPAREBLOB is'],
1640 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001641
Bram Moolenaara5565e42020-05-09 15:44:01 +02001642 ['[1, 2] == aList', 'COMPARELIST =='],
1643 ['[1, 2] != aList', 'COMPARELIST !='],
1644 ['[1, 2] is aList', 'COMPARELIST is'],
1645 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001646
Bram Moolenaare0de1712020-12-02 17:36:54 +01001647 ['{a: 1} == aDict', 'COMPAREDICT =='],
1648 ['{a: 1} != aDict', 'COMPAREDICT !='],
1649 ['{a: 1} is aDict', 'COMPAREDICT is'],
1650 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001651
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001652 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1653 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1654 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1655 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001656
1657 ['77 == g:xx', 'COMPAREANY =='],
1658 ['77 != g:xx', 'COMPAREANY !='],
1659 ['77 > g:xx', 'COMPAREANY >'],
1660 ['77 < g:xx', 'COMPAREANY <'],
1661 ['77 >= g:xx', 'COMPAREANY >='],
1662 ['77 <= g:xx', 'COMPAREANY <='],
1663 ['77 =~ g:xx', 'COMPAREANY =\~'],
1664 ['77 !~ g:xx', 'COMPAREANY !\~'],
1665 ['77 is g:xx', 'COMPAREANY is'],
1666 ['77 isnot g:xx', 'COMPAREANY isnot'],
1667 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001668 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001669 if has('float')
1670 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001671 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1672 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1673 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1674 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1675 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1676 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1677 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1678 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001679 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001680 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001681 endif
1682
Bram Moolenaarac564082020-09-27 19:05:33 +02001683 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001684 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001685 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001686 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001687 ' var isFalse = false',
1688 ' var isNull = v:null',
1689 ' var aNumber = 222',
1690 ' var aString = "yy"',
1691 ' var aBlob = 0z22',
1692 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001693 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001694 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001695 ' if ' .. case[0],
1696 ' echo 42'
1697 ' endif',
1698 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001699 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001700 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001701 assert_match('TestCase' .. nr .. '.*' ..
1702 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1703 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001704 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001705 '\d ' .. case[1] .. '.*' ..
1706 '\d JUMP_IF_FALSE -> \d\+.*',
1707 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001708
1709 nr += 1
1710 endfor
1711
Bram Moolenaar22da5592020-03-19 14:52:20 +01001712 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001713enddef
1714
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001715def s:FalsyOp()
1716 echo g:flag ?? "yes"
1717 echo [] ?? "empty list"
1718 echo "" ?? "empty string"
1719enddef
1720
1721def Test_dsassemble_falsy_op()
1722 var res = execute('disass s:FalsyOp')
1723 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1724 'echo g:flag ?? "yes"\_s*' ..
1725 '0 LOADG g:flag\_s*' ..
1726 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1727 '2 PUSHS "yes"\_s*' ..
1728 '3 ECHO 1\_s*' ..
1729 'echo \[\] ?? "empty list"\_s*' ..
1730 '4 NEWLIST size 0\_s*' ..
1731 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1732 '6 PUSHS "empty list"\_s*' ..
1733 '7 ECHO 1\_s*' ..
1734 'echo "" ?? "empty string"\_s*' ..
1735 '\d\+ PUSHS "empty string"\_s*' ..
1736 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001737 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001738 res)
1739enddef
1740
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001741def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001742 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001743 ['"xx" == "yy"', false],
1744 ['"aa" == "aa"', true],
1745 ['has("eval") ? true : false', true],
1746 ['has("asdf") ? true : false', false],
1747 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001748
Bram Moolenaarac564082020-09-27 19:05:33 +02001749 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001750 for case in cases
1751 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001752 ' if ' .. case[0],
1753 ' echo 42'
1754 ' endif',
1755 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001756 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001758 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001759 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001760 assert_match('TestCase' .. nr .. '.*' ..
1761 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1762 '\d PUSHNR 42.*' ..
1763 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001764 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001765 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001766 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001767 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001768 assert_match('TestCase' .. nr .. '.*' ..
1769 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1770 'echo 42[ \n]*' ..
1771 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001772 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001773 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001774 endif
1775
1776 nr += 1
1777 endfor
1778
1779 delete('Xdisassemble')
1780enddef
1781
Bram Moolenaarad39c092020-02-26 18:23:43 +01001782def s:Execute()
1783 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001784 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001785 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001786 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001787 execute 'help ' .. tag
1788enddef
1789
1790def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001791 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001792 assert_match('\<SNR>\d*_Execute\_s*' ..
1793 "execute 'help vim9.txt'\\_s*" ..
1794 '\d PUSHS "help vim9.txt"\_s*' ..
1795 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001796 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001797 '\d PUSHS "help vim9.txt"\_s*' ..
1798 '\d STORE $0\_s*' ..
1799 'execute cmd\_s*' ..
1800 '\d LOAD $0\_s*' ..
1801 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001802 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001803 '\d PUSHS "vim9.txt"\_s*' ..
1804 '\d STORE $1\_s*' ..
1805 "execute 'help ' .. tag\\_s*" ..
1806 '\d\+ PUSHS "help "\_s*' ..
1807 '\d\+ LOAD $1\_s*' ..
1808 '\d\+ CONCAT\_s*' ..
1809 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001810 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001811 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001812enddef
1813
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001814def s:Echomsg()
1815 echomsg 'some' 'message'
1816 echoerr 'went' .. 'wrong'
1817enddef
1818
1819def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001820 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001821 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1822 "echomsg 'some' 'message'\\_s*" ..
1823 '\d PUSHS "some"\_s*' ..
1824 '\d PUSHS "message"\_s*' ..
1825 '\d ECHOMSG 2\_s*' ..
1826 "echoerr 'went' .. 'wrong'\\_s*" ..
1827 '\d PUSHS "wentwrong"\_s*' ..
1828 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001829 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001830 res)
1831enddef
1832
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001833def SomeStringArg(arg: string)
1834 echo arg
1835enddef
1836
1837def SomeAnyArg(arg: any)
1838 echo arg
1839enddef
1840
1841def SomeStringArgAndReturn(arg: string): string
1842 return arg
1843enddef
1844
1845def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001846 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001847 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1848 '\d *echo arg.*' ..
1849 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001850 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001851
Bram Moolenaarac564082020-09-27 19:05:33 +02001852 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001853 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1854 '\d *echo arg\_s*' ..
1855 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001856 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001857
Bram Moolenaarac564082020-09-27 19:05:33 +02001858 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001859 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1860 '\d *return arg\_s*' ..
1861 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001862 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001863enddef
1864
Bram Moolenaar09689a02020-05-09 22:50:08 +02001865def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001866 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001867 vim9script
1868 def FuncOne(): string
1869 return FuncTwo()
1870 enddef
1871 def FuncTwo(): string
1872 return 'two'
1873 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001874 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001875 END
1876 writefile(lines, 'Xdisassemble')
1877 source Xdisassemble
1878
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001879 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001880 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1881 'return FuncTwo()\_s*' ..
1882 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001883 '\d RETURN',
1884 g:res_FuncOne)
1885
1886 delete('Xdisassemble')
1887 unlet g:res_FuncOne
1888enddef
1889
Bram Moolenaar61a89812020-05-07 16:58:17 +02001890def s:ConcatStrings(): string
1891 return 'one' .. 'two' .. 'three'
1892enddef
1893
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001894def s:ComputeConst(): number
1895 return 2 + 3 * 4 / 6 + 7
1896enddef
1897
Bram Moolenaar1c747212020-05-09 18:28:34 +02001898def s:ComputeConstParen(): number
1899 return ((2 + 4) * (8 / 2)) / (3 + 4)
1900enddef
1901
Bram Moolenaar61a89812020-05-07 16:58:17 +02001902def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001903 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001904 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1905 "return 'one' .. 'two' .. 'three'\\_s*" ..
1906 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001907 '\d RETURN',
1908 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001909
1910 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001911 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1912 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1913 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001914 '\d RETURN',
1915 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001916
1917 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001918 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1919 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1920 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001921 '\d RETURN',
1922 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001923enddef
1924
Bram Moolenaar389df252020-07-09 21:20:47 +02001925def s:CallAppend()
1926 eval "some text"->append(2)
1927enddef
1928
1929def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001930 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001931 assert_match('<SNR>\d*_CallAppend\_s*' ..
1932 'eval "some text"->append(2)\_s*' ..
1933 '\d PUSHS "some text"\_s*' ..
1934 '\d PUSHNR 2\_s*' ..
1935 '\d SHUFFLE 2 up 1\_s*' ..
1936 '\d BCALL append(argc 2)\_s*' ..
1937 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001938 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001939 res)
1940enddef
1941
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001942
1943def s:SilentMessage()
1944 silent echomsg "text"
1945 silent! echoerr "error"
1946enddef
1947
1948def Test_silent()
1949 var res = execute('disass s:SilentMessage')
1950 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1951 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001952 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001953 '\d PUSHS "text"\_s*' ..
1954 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001955 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001956 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001957 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001958 '\d PUSHS "error"\_s*' ..
1959 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001960 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001961 '\d\+ RETURN 0',
1962 res)
1963enddef
1964
1965def s:SilentIf()
1966 silent if 4 == g:five
1967 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001968 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001969enddef
1970
1971def Test_silent_if()
1972 var res = execute('disass s:SilentIf')
1973 assert_match('<SNR>\d*_SilentIf\_s*' ..
1974 'silent if 4 == g:five\_s*' ..
1975 '\d\+ CMDMOD silent\_s*' ..
1976 '\d\+ PUSHNR 4\_s*' ..
1977 '\d\+ LOADG g:five\_s*' ..
1978 '\d\+ COMPAREANY ==\_s*' ..
1979 '\d\+ CMDMOD_REV\_s*' ..
1980 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1981 'silent elseif 4 == g:five\_s*' ..
1982 '\d\+ JUMP -> \d\+\_s*' ..
1983 '\d\+ CMDMOD silent\_s*' ..
1984 '\d\+ PUSHNR 4\_s*' ..
1985 '\d\+ LOADG g:five\_s*' ..
1986 '\d\+ COMPAREANY ==\_s*' ..
1987 '\d\+ CMDMOD_REV\_s*' ..
1988 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001989 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001990 '\d\+ RETURN 0',
1991 res)
1992enddef
1993
1994def s:SilentFor()
1995 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01001996 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01001997enddef
1998
1999def Test_silent_for()
2000 var res = execute('disass s:SilentFor')
2001 assert_match('<SNR>\d*_SilentFor\_s*' ..
2002 'silent for i in \[0\]\_s*' ..
2003 '\d CMDMOD silent\_s*' ..
2004 '\d STORE -1 in $0\_s*' ..
2005 '\d PUSHNR 0\_s*' ..
2006 '\d NEWLIST size 1\_s*' ..
2007 '\d CMDMOD_REV\_s*' ..
2008 '5 FOR $0 -> 8\_s*' ..
2009 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01002010 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002011 '\d JUMP -> 5\_s*' ..
2012 '8 DROP\_s*' ..
2013 '\d RETURN 0\_s*',
2014 res)
2015enddef
2016
2017def s:SilentWhile()
2018 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002019 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002020enddef
2021
2022def Test_silent_while()
2023 var res = execute('disass s:SilentWhile')
2024 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2025 'silent while g:not\_s*' ..
2026 '0 CMDMOD silent\_s*' ..
2027 '\d LOADG g:not\_s*' ..
2028 '\d COND2BOOL\_s*' ..
2029 '\d CMDMOD_REV\_s*' ..
2030 '\d JUMP_IF_FALSE -> 6\_s*' ..
2031
Bram Moolenaarfa984412021-03-25 22:15:28 +01002032 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002033 '\d JUMP -> 0\_s*' ..
2034 '6 RETURN 0\_s*',
2035 res)
2036enddef
2037
2038def s:SilentReturn(): string
2039 silent return "done"
2040enddef
2041
2042def Test_silent_return()
2043 var res = execute('disass s:SilentReturn')
2044 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2045 'silent return "done"\_s*' ..
2046 '\d CMDMOD silent\_s*' ..
2047 '\d PUSHS "done"\_s*' ..
2048 '\d CMDMOD_REV\_s*' ..
2049 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002050 res)
2051enddef
2052
Bram Moolenaarb2049902021-01-24 12:53:53 +01002053def s:Profiled(): string
2054 echo "profiled"
2055 return "done"
2056enddef
2057
2058def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002059 if !has('profile')
2060 MissingFeature 'profile'
2061 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002062 var res = execute('disass! s:Profiled')
2063 assert_match('<SNR>\d*_Profiled\_s*' ..
2064 'echo "profiled"\_s*' ..
2065 '\d PROFILE START line 1\_s*' ..
2066 '\d PUSHS "profiled"\_s*' ..
2067 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002068 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002069 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002070 '\d PROFILE START line 2\_s*' ..
2071 '\d PUSHS "done"\_s*' ..
2072 '\d RETURN\_s*' ..
2073 '\d PROFILE END',
2074 res)
2075enddef
2076
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002077def s:EchoMessages()
2078 echohl ErrorMsg | echom v:exception | echohl NONE
2079enddef
2080
2081def Test_disassemble_nextcmd()
2082 # splitting commands and removing trailing blanks should not change the line
2083 var res = execute('disass s:EchoMessages')
2084 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2085 'echohl ErrorMsg | echom v:exception | echohl NONE',
2086 res)
2087enddef
2088
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002089
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002090" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker