blob: e6b3751452cbd26ffd47b8e5955a10b44b75c33d [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
124def s:YankRange()
125 norm! m[jjm]
126 :'[,']yank
127enddef
128
129def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200130 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200131 assert_match('<SNR>\d*_YankRange.*' ..
132 ' norm! m\[jjm\]\_s*' ..
133 '\d EXEC norm! m\[jjm\]\_s*' ..
134 ' :''\[,''\]yank\_s*' ..
135 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100136 '\d RETURN 0',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200137 res)
138enddef
139
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200140def s:PutExpr()
141 :3put ="text"
142enddef
143
144def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200145 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200146 assert_match('<SNR>\d*_PutExpr.*' ..
147 ' :3put ="text"\_s*' ..
148 '\d PUSHS "text"\_s*' ..
149 '\d PUT = 3\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100150 '\d RETURN 0',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200151 res)
152enddef
153
Bram Moolenaar08597872020-12-10 19:43:40 +0100154def s:PutRange()
155 :$-2put a
156enddef
157
158def Test_disassemble_put_range()
159 var res = execute('disass s:PutRange')
160 assert_match('<SNR>\d*_PutRange.*' ..
161 ' :$-2put a\_s*' ..
162 '\d RANGE $-2\_s*' ..
163 '\d PUT a range\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100164 '\d RETURN 0',
Bram Moolenaar08597872020-12-10 19:43:40 +0100165 res)
166enddef
167
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100168def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200169 var localbool = true
170 var localspec = v:none
171 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100172 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200173 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100174 endif
175enddef
176
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100177def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200178 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200179 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
180 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100181 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200182 'localspec = v:none.*' ..
183 ' PUSH v:none.*' ..
184 'localblob = 0z1234.*' ..
185 ' PUSHBLOB 0z1234.*',
186 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100187 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200188 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
189 'localfloat = 1.234.*' ..
190 ' PUSHF 1.234.*',
191 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100192 endif
193enddef
194
195def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200196 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100197 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200198 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100199 localstr = 'xyz'
200 v:char = 'abc'
201 s:scriptvar = 'sv'
202 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100203 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200204 b:buffervar = 'bv'
205 w:windowvar = 'wv'
206 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100207 &tabstop = 8
208 $ENVVAR = 'ev'
209 @z = 'rv'
210enddef
211
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100212def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200213 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200214 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200215 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200216 'localnr = 2.*' ..
217 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200218 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200219 'localstr = ''xyz''.*' ..
220 ' STORE $1.*' ..
221 'v:char = ''abc''.*' ..
222 'STOREV v:char.*' ..
223 's:scriptvar = ''sv''.*' ..
224 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
225 'g:globalvar = ''gv''.*' ..
226 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100227 'g:auto#var = ''av''.*' ..
228 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200229 'b:buffervar = ''bv''.*' ..
230 ' STOREB b:buffervar.*' ..
231 'w:windowvar = ''wv''.*' ..
232 ' STOREW w:windowvar.*' ..
233 't:tabpagevar = ''tv''.*' ..
234 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200235 '&tabstop = 8.*' ..
236 ' STOREOPT &tabstop.*' ..
237 '$ENVVAR = ''ev''.*' ..
238 ' STOREENV $ENVVAR.*' ..
239 '@z = ''rv''.*' ..
240 ' STOREREG @z.*',
241 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100242enddef
243
Bram Moolenaarcb790402020-05-15 20:53:00 +0200244def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200245 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200246 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200247 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200248 localdict["a"] = 456
Bram Moolenaar51e93322021-04-17 20:44:56 +0200249 var localblob: blob = 0z1122
250 localblob[1] = 33
Bram Moolenaarcb790402020-05-15 20:53:00 +0200251enddef
252
253def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200254 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200255 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200257 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100258 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200259 '\d STORE $0\_s*' ..
260 'locallist\[0\] = 123\_s*' ..
261 '\d PUSHNR 123\_s*' ..
262 '\d PUSHNR 0\_s*' ..
263 '\d LOAD $0\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200264 '\d STOREINDEX list\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200265 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200266 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100267 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200268 '\d STORE $1\_s*' ..
269 'localdict\["a"\] = 456\_s*' ..
270 '\d\+ PUSHNR 456\_s*' ..
271 '\d\+ PUSHS "a"\_s*' ..
272 '\d\+ LOAD $1\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200273 '\d\+ STOREINDEX dict\_s*' ..
274 'var localblob: blob = 0z1122\_s*' ..
275 '\d\+ PUSHBLOB 0z1122\_s*' ..
276 '\d\+ STORE $2\_s*' ..
277 'localblob\[1\] = 33\_s*' ..
278 '\d\+ PUSHNR 33\_s*' ..
279 '\d\+ PUSHNR 1\_s*' ..
280 '\d\+ LOAD $2\_s*' ..
281 '\d\+ STOREINDEX blob\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100282 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200283 res)
284enddef
285
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100286def s:ScriptFuncStoreIndex()
287 var d = {dd: {}}
288 d.dd[0] = 0
289enddef
290
291def Test_disassemble_store_index()
292 var res = execute('disass s:ScriptFuncStoreIndex')
293 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
294 'var d = {dd: {}}\_s*' ..
295 '\d PUSHS "dd"\_s*' ..
296 '\d NEWDICT size 0\_s*' ..
297 '\d NEWDICT size 1\_s*' ..
298 '\d STORE $0\_s*' ..
299 'd.dd\[0\] = 0\_s*' ..
300 '\d PUSHNR 0\_s*' ..
301 '\d PUSHNR 0\_s*' ..
302 '\d LOAD $0\_s*' ..
303 '\d MEMBER dd\_s*' ..
Bram Moolenaar51e93322021-04-17 20:44:56 +0200304 '\d STOREINDEX any\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100305 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100306 res)
307enddef
308
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200309def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200310 var x: string
311 var y: string
312 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200313 [x, y; l] = g:stringlist
314enddef
315
316def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200317 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200318 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200319 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200320 '\d PUSHS "\[NULL\]"\_s*' ..
321 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200322 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200323 '\d PUSHS "\[NULL\]"\_s*' ..
324 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200325 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200326 '\d NEWLIST size 0\_s*' ..
327 '\d STORE $2\_s*' ..
328 '\[x, y; l\] = g:stringlist\_s*' ..
329 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200330 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200331 '\d CHECKLEN >= 2\_s*' ..
332 '\d\+ ITEM 0\_s*' ..
333 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
334 '\d\+ STORE $0\_s*' ..
335 '\d\+ ITEM 1\_s*' ..
336 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
337 '\d\+ STORE $1\_s*' ..
338 '\d\+ SLICE 2\_s*' ..
339 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100340 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200341 res)
342enddef
343
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200344def s:ListAdd()
345 var l: list<number> = []
346 add(l, 123)
347 add(l, g:aNumber)
348enddef
349
350def Test_disassemble_list_add()
351 var res = execute('disass s:ListAdd')
352 assert_match('<SNR>\d*_ListAdd\_s*' ..
353 'var l: list<number> = []\_s*' ..
354 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100355 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200356 '\d STORE $0\_s*' ..
357 'add(l, 123)\_s*' ..
358 '\d LOAD $0\_s*' ..
359 '\d PUSHNR 123\_s*' ..
360 '\d LISTAPPEND\_s*' ..
361 '\d DROP\_s*' ..
362 'add(l, g:aNumber)\_s*' ..
363 '\d LOAD $0\_s*' ..
364 '\d\+ LOADG g:aNumber\_s*' ..
365 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
366 '\d\+ LISTAPPEND\_s*' ..
367 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100368 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200369 res)
370enddef
371
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200372def s:BlobAdd()
373 var b: blob = 0z
374 add(b, 123)
375 add(b, g:aNumber)
376enddef
377
378def Test_disassemble_blob_add()
379 var res = execute('disass s:BlobAdd')
380 assert_match('<SNR>\d*_BlobAdd\_s*' ..
381 'var b: blob = 0z\_s*' ..
382 '\d PUSHBLOB 0z\_s*' ..
383 '\d STORE $0\_s*' ..
384 'add(b, 123)\_s*' ..
385 '\d LOAD $0\_s*' ..
386 '\d PUSHNR 123\_s*' ..
387 '\d BLOBAPPEND\_s*' ..
388 '\d DROP\_s*' ..
389 'add(b, g:aNumber)\_s*' ..
390 '\d LOAD $0\_s*' ..
391 '\d\+ LOADG g:aNumber\_s*' ..
392 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
393 '\d\+ BLOBAPPEND\_s*' ..
394 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100395 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200396 res)
397enddef
398
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200399def s:BlobIndexSlice()
400 var b: blob = 0z112233
401 echo b[1]
402 echo b[1 : 2]
403enddef
404
405def Test_disassemble_blob_index_slice()
406 var res = execute('disass s:BlobIndexSlice')
407 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
408 'var b: blob = 0z112233\_s*' ..
409 '\d PUSHBLOB 0z112233\_s*' ..
410 '\d STORE $0\_s*' ..
411 'echo b\[1\]\_s*' ..
412 '\d LOAD $0\_s*' ..
413 '\d PUSHNR 1\_s*' ..
414 '\d BLOBINDEX\_s*' ..
415 '\d ECHO 1\_s*' ..
416 'echo b\[1 : 2\]\_s*' ..
417 '\d LOAD $0\_s*' ..
418 '\d PUSHNR 1\_s*' ..
419 '\d\+ PUSHNR 2\_s*' ..
420 '\d\+ BLOBSLICE\_s*' ..
421 '\d\+ ECHO 1\_s*' ..
422 '\d\+ RETURN 0',
423 res)
424enddef
425
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200426def s:ScriptFuncUnlet()
427 g:somevar = "value"
428 unlet g:somevar
429 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200430 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200431enddef
432
433def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200434 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200435 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
436 'g:somevar = "value"\_s*' ..
437 '\d PUSHS "value"\_s*' ..
438 '\d STOREG g:somevar\_s*' ..
439 'unlet g:somevar\_s*' ..
440 '\d UNLET g:somevar\_s*' ..
441 'unlet! g:somevar\_s*' ..
442 '\d UNLET! g:somevar\_s*' ..
443 'unlet $SOMEVAR\_s*' ..
444 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200445 res)
446enddef
447
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100448def s:ScriptFuncTry()
449 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200450 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100451 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200452 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100453 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200454 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100455 endtry
456enddef
457
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100458def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200459 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200460 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
461 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100462 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200463 'echo "yes"\_s*' ..
464 '\d PUSHS "yes"\_s*' ..
465 '\d ECHO 1\_s*' ..
466 'catch /fail/\_s*' ..
467 '\d JUMP -> \d\+\_s*' ..
468 '\d PUSH v:exception\_s*' ..
469 '\d PUSHS "fail"\_s*' ..
470 '\d COMPARESTRING =\~\_s*' ..
471 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
472 '\d CATCH\_s*' ..
473 'echo "no"\_s*' ..
474 '\d\+ PUSHS "no"\_s*' ..
475 '\d\+ ECHO 1\_s*' ..
476 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100477 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200478 'throw "end"\_s*' ..
479 '\d\+ PUSHS "end"\_s*' ..
480 '\d\+ THROW\_s*' ..
481 'endtry\_s*' ..
482 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200483 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100484enddef
485
486def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200487 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100488 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100489enddef
490
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100491def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200492 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200493 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200494 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200495 '\d PUSHNR 1\_s*' ..
496 '\d PUSHS "two"\_s*' ..
497 '\d PUSHNR 333\_s*' ..
498 '\d NEWLIST size 3\_s*' ..
499 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100500 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200501 '\d PUSHS "one"\_s*' ..
502 '\d PUSHNR 1\_s*' ..
503 '\d PUSHS "two"\_s*' ..
504 '\d PUSHS "val"\_s*' ..
505 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200506 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100507enddef
508
Bram Moolenaar6e949782020-04-13 17:21:00 +0200509def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100510 echo arg
511enddef
512
513func UserFunc()
514 echo 'nothing'
515endfunc
516
517func UserFuncWithArg(arg)
518 echo a:arg
519endfunc
520
521def s:ScriptFuncCall(): string
522 changenr()
523 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100524 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100525 FuncWithArg(343)
526 ScriptFuncNew()
527 s:ScriptFuncNew()
528 UserFunc()
529 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200530 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100531 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200532 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100533 FuncRefWithArg("bar")
534 return "yes"
535enddef
536
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100537def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200538 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200539 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
540 'changenr()\_s*' ..
541 '\d BCALL changenr(argc 0)\_s*' ..
542 '\d DROP\_s*' ..
543 'char2nr("abc")\_s*' ..
544 '\d PUSHS "abc"\_s*' ..
545 '\d BCALL char2nr(argc 1)\_s*' ..
546 '\d DROP\_s*' ..
547 'Test_disassemble_new()\_s*' ..
548 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
549 '\d DROP\_s*' ..
550 'FuncWithArg(343)\_s*' ..
551 '\d\+ PUSHNR 343\_s*' ..
552 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
553 '\d\+ DROP\_s*' ..
554 'ScriptFuncNew()\_s*' ..
555 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
556 '\d\+ DROP\_s*' ..
557 's:ScriptFuncNew()\_s*' ..
558 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
559 '\d\+ DROP\_s*' ..
560 'UserFunc()\_s*' ..
561 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
562 '\d\+ DROP\_s*' ..
563 'UserFuncWithArg("foo")\_s*' ..
564 '\d\+ PUSHS "foo"\_s*' ..
565 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
566 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200567 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200568 '\d\+ PUSHS "UserFunc"\_s*' ..
569 '\d\+ BCALL function(argc 1)\_s*' ..
570 '\d\+ STORE $0\_s*' ..
571 'FuncRef()\_s*' ..
572 '\d\+ LOAD $\d\_s*' ..
573 '\d\+ PCALL (argc 0)\_s*' ..
574 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200575 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200576 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
577 '\d\+ BCALL function(argc 1)\_s*' ..
578 '\d\+ STORE $1\_s*' ..
579 'FuncRefWithArg("bar")\_s*' ..
580 '\d\+ PUSHS "bar"\_s*' ..
581 '\d\+ LOAD $\d\_s*' ..
582 '\d\+ PCALL (argc 1)\_s*' ..
583 '\d\+ DROP\_s*' ..
584 'return "yes"\_s*' ..
585 '\d\+ PUSHS "yes"\_s*' ..
586 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200587 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100588enddef
589
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200590
591def s:CreateRefs()
592 var local = 'a'
593 def Append(arg: string)
594 local ..= arg
595 enddef
596 g:Append = Append
597 def Get(): string
598 return local
599 enddef
600 g:Get = Get
601enddef
602
603def Test_disassemble_closure()
604 CreateRefs()
605 var res = execute('disass g:Append')
606 assert_match('<lambda>\d\_s*' ..
607 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100608 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200609 '\d LOAD arg\[-1\]\_s*' ..
610 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100611 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100612 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200613 res)
614
615 res = execute('disass g:Get')
616 assert_match('<lambda>\d\_s*' ..
617 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100618 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200619 '\d RETURN',
620 res)
621
622 unlet g:Append
623 unlet g:Get
624enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200625
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100626
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200627def EchoArg(arg: string): string
628 return arg
629enddef
630def RefThis(): func
631 return function('EchoArg')
632enddef
633def s:ScriptPCall()
634 RefThis()("text")
635enddef
636
637def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200638 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200639 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
640 'RefThis()("text")\_s*' ..
641 '\d DCALL RefThis(argc 0)\_s*' ..
642 '\d PUSHS "text"\_s*' ..
643 '\d PCALL top (argc 1)\_s*' ..
644 '\d PCALL end\_s*' ..
645 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100646 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200647 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200648enddef
649
650
Bram Moolenaara26b9702020-04-18 19:53:28 +0200651def s:FuncWithForwardCall(): string
652 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100653enddef
654
655def DefinedLater(arg: string): string
656 return arg
657enddef
658
659def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200660 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200661 assert_match('FuncWithForwardCall\_s*' ..
662 'return g:DefinedLater("yes")\_s*' ..
663 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200664 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200665 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200666 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100667
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200668 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100669 assert_equal('yes', FuncWithForwardCall())
670
Bram Moolenaara26b9702020-04-18 19:53:28 +0200671 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200672 assert_match('FuncWithForwardCall\_s*' ..
673 'return g:DefinedLater("yes")\_s*' ..
674 '\d PUSHS "yes"\_s*' ..
675 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200676 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200677 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100678enddef
679
680
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200681def FuncWithDefault(arg: string = 'default', nr = 77): string
682 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100683enddef
684
685def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200686 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200687 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200688 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200689 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200690 '\d STORE arg\[-2]\_s*' ..
691 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
692 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200693 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200694 'return arg .. nr\_s*' ..
695 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200696 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200697 '\d 2STRING stack\[-1]\_s*' ..
698 '\d\+ CONCAT\_s*' ..
699 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200700 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100701enddef
702
703
Bram Moolenaar158906c2020-02-06 20:39:45 +0100704def HasEval()
705 if has("eval")
706 echo "yes"
707 else
708 echo "no"
709 endif
710enddef
711
712def HasNothing()
713 if has("nothing")
714 echo "yes"
715 else
716 echo "no"
717 endif
718enddef
719
720def HasSomething()
721 if has("nothing")
722 echo "nothing"
723 elseif has("something")
724 echo "something"
725 elseif has("eval")
726 echo "eval"
727 elseif has("less")
728 echo "less"
729 endif
730enddef
731
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100732def HasGuiRunning()
733 if has("gui_running")
734 echo "yes"
735 else
736 echo "no"
737 endif
738enddef
739
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100740def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200741 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200742 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200743 assert_match('HasEval\_s*' ..
744 'if has("eval")\_s*' ..
745 'echo "yes"\_s*' ..
746 '\d PUSHS "yes"\_s*' ..
747 '\d ECHO 1\_s*' ..
748 'else\_s*' ..
749 'echo "no"\_s*' ..
750 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200751 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100752 assert_notmatch('JUMP', instr)
753
Bram Moolenaard2c61702020-09-06 15:58:36 +0200754 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100755 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200756 assert_match('HasNothing\_s*' ..
757 'if has("nothing")\_s*' ..
758 'echo "yes"\_s*' ..
759 'else\_s*' ..
760 'echo "no"\_s*' ..
761 '\d PUSHS "no"\_s*' ..
762 '\d ECHO 1\_s*' ..
763 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200764 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100765 assert_notmatch('PUSHS "yes"', instr)
766 assert_notmatch('JUMP', instr)
767
Bram Moolenaard2c61702020-09-06 15:58:36 +0200768 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100769 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200770 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200771 'if has("nothing")\_s*' ..
772 'echo "nothing"\_s*' ..
773 'elseif has("something")\_s*' ..
774 'echo "something"\_s*' ..
775 'elseif has("eval")\_s*' ..
776 'echo "eval"\_s*' ..
777 '\d PUSHS "eval"\_s*' ..
778 '\d ECHO 1\_s*' ..
779 'elseif has("less").*' ..
780 'echo "less"\_s*' ..
781 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200782 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100783 assert_notmatch('PUSHS "nothing"', instr)
784 assert_notmatch('PUSHS "something"', instr)
785 assert_notmatch('PUSHS "less"', instr)
786 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100787
788 var result: string
789 var instr_expected: string
790 if has('gui')
791 if has('gui_running')
792 # GUI already running, always returns "yes"
793 result = "\nyes"
794 instr_expected = 'HasGuiRunning.*' ..
795 'if has("gui_running")\_s*' ..
796 ' echo "yes"\_s*' ..
797 '\d PUSHS "yes"\_s*' ..
798 '\d ECHO 1\_s*' ..
799 'else\_s*' ..
800 ' echo "no"\_s*' ..
801 'endif'
802 else
803 result = "\nno"
804 if has('unix')
805 # GUI not running but can start later, call has()
806 instr_expected = 'HasGuiRunning.*' ..
807 'if has("gui_running")\_s*' ..
808 '\d PUSHS "gui_running"\_s*' ..
809 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200810 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100811 '\d JUMP_IF_FALSE -> \d\_s*' ..
812 ' echo "yes"\_s*' ..
813 '\d PUSHS "yes"\_s*' ..
814 '\d ECHO 1\_s*' ..
815 'else\_s*' ..
816 '\d JUMP -> \d\_s*' ..
817 ' echo "no"\_s*' ..
818 '\d PUSHS "no"\_s*' ..
819 '\d ECHO 1\_s*' ..
820 'endif'
821 else
822 # GUI not running, always return "no"
823 instr_expected = 'HasGuiRunning.*' ..
824 'if has("gui_running")\_s*' ..
825 ' echo "yes"\_s*' ..
826 'else\_s*' ..
827 ' echo "no"\_s*' ..
828 '\d PUSHS "no"\_s*' ..
829 '\d ECHO 1\_s*' ..
830 'endif'
831 endif
832 endif
833 else
834 # GUI not supported, always return "no"
835 result = "\nno"
836 instr_expected = 'HasGuiRunning.*' ..
837 'if has("gui_running")\_s*' ..
838 ' echo "yes"\_s*' ..
839 'else\_s*' ..
840 ' echo "no"\_s*' ..
841 '\d PUSHS "no"\_s*' ..
842 '\d ECHO 1\_s*' ..
843 'endif'
844 endif
845
846 assert_equal(result, execute('HasGuiRunning()'))
847 instr = execute('disassemble HasGuiRunning')
848 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100849enddef
850
Bram Moolenaarefd88552020-06-18 20:50:10 +0200851def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100852 if 1 < 0
853 return "maybe"
854 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200855 if g:cond
856 return "yes"
857 else
858 return "no"
859 endif
860enddef
861
862def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200863 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200864 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100865 'if 1 < 0\_s*' ..
866 ' return "maybe"\_s*' ..
867 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200868 'if g:cond\_s*' ..
869 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100870 '1 COND2BOOL\_s*' ..
871 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200872 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100873 '3 PUSHS "yes"\_s*' ..
874 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200875 'else\_s*' ..
876 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100877 '5 PUSHS "no"\_s*' ..
878 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200879 instr)
880enddef
881
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100882def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200883 var Funky1: func
884 var Funky2: func = function("len")
885 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100886enddef
887
888def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200889 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200890 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200891 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200892 '0 PUSHFUNC "\[none]"\_s*' ..
893 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200894 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200895 '2 PUSHS "len"\_s*' ..
896 '3 BCALL function(argc 1)\_s*' ..
897 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200898 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200899 '\d PUSHS "UserFunc"\_s*' ..
900 '\d BCALL funcref(argc 1)\_s*' ..
901 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100902 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200903 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100904enddef
905
906if has('channel')
907 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200908 var job1: job
909 var job2: job = job_start("donothing")
910 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100911 enddef
912endif
913
914def Test_disassemble_channel()
915 CheckFeature channel
916
Bram Moolenaarac564082020-09-27 19:05:33 +0200917 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200918 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200919 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200920 '\d PUSHJOB "no process"\_s*' ..
921 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200922 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200923 '\d PUSHS "donothing"\_s*' ..
924 '\d BCALL job_start(argc 1)\_s*' ..
925 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200926 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200927 '\d PUSHCHANNEL 0\_s*' ..
928 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100929 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200930 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100931enddef
932
Bram Moolenaar777770f2020-02-06 21:27:08 +0100933def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100934 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100935 return F("x")
936enddef
937
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100938def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100939 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200940 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200941 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100942 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200943 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200944 '\d STORE $0\_s*' ..
945 'return F("x")\_s*' ..
946 '\d PUSHS "x"\_s*' ..
947 '\d LOAD $0\_s*' ..
948 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200949 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200950 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200951
Bram Moolenaarac564082020-09-27 19:05:33 +0200952 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200953 instr = execute('disassemble ' .. name)
954 assert_match('<lambda>\d\+\_s*' ..
955 'return "X" .. a .. "X"\_s*' ..
956 '\d PUSHS "X"\_s*' ..
957 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200958 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200959 '\d CONCAT\_s*' ..
960 '\d PUSHS "X"\_s*' ..
961 '\d CONCAT\_s*' ..
962 '\d RETURN',
963 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100964enddef
965
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100966def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100967 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100968 return Ref(g:value)
969enddef
970
971def Test_disassemble_lambda_with_type()
972 g:value = 5
973 assert_equal(15, LambdaWithType())
974 var instr = execute('disassemble LambdaWithType')
975 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100976 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100977 '\d FUNCREF <lambda>\d\+\_s*' ..
978 '\d STORE $0\_s*' ..
979 'return Ref(g:value)\_s*' ..
980 '\d LOADG g:value\_s*' ..
981 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +0100982 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100983 '\d PCALL (argc 1)\_s*' ..
984 '\d RETURN',
985 instr)
986enddef
987
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200988def NestedOuter()
989 def g:Inner()
990 echomsg "inner"
991 enddef
992enddef
993
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100994def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200995 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200996 assert_match('NestedOuter\_s*' ..
997 'def g:Inner()\_s*' ..
998 'echomsg "inner"\_s*' ..
999 'enddef\_s*' ..
1000 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001001 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +02001002 instr)
1003enddef
1004
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001005def NestedDefList()
1006 def
1007 def Info
1008 def /Info
1009 def /Info/
1010enddef
1011
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001012def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001013 var instr = execute('disassemble NestedDefList')
1014 assert_match('NestedDefList\_s*' ..
1015 'def\_s*' ..
1016 '\d DEF \_s*' ..
1017 'def Info\_s*' ..
1018 '\d DEF Info\_s*' ..
1019 'def /Info\_s*' ..
1020 '\d DEF /Info\_s*' ..
1021 'def /Info/\_s*' ..
1022 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001023 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001024 instr)
1025enddef
1026
Bram Moolenaar6e949782020-04-13 17:21:00 +02001027def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001028 if arg == 1 && arg != 2 || arg == 4
1029 return 'yes'
1030 endif
1031 return 'no'
1032enddef
1033
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001034def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001035 assert_equal("yes", AndOr(1))
1036 assert_equal("no", AndOr(2))
1037 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001038 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001039 assert_match('AndOr\_s*' ..
1040 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1041 '\d LOAD arg\[-1]\_s*' ..
1042 '\d PUSHNR 1\_s*' ..
1043 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001044 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001045 '\d LOAD arg\[-1]\_s*' ..
1046 '\d PUSHNR 2\_s*' ..
1047 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001048 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001049 '\d LOAD arg\[-1]\_s*' ..
1050 '\d\+ PUSHNR 4\_s*' ..
1051 '\d\+ COMPAREANY ==\_s*' ..
1052 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001053 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001054enddef
1055
Bram Moolenaar04d05222020-02-06 22:06:54 +01001056def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001057 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001058 for i in range(3)
1059 res->add(i)
1060 endfor
1061 return res
1062enddef
1063
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001064def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001065 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001066 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001067 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001068 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001069 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001070 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001071 '\d STORE $0\_s*' ..
1072 'for i in range(3)\_s*' ..
1073 '\d STORE -1 in $1\_s*' ..
1074 '\d PUSHNR 3\_s*' ..
1075 '\d BCALL range(argc 1)\_s*' ..
1076 '\d FOR $1 -> \d\+\_s*' ..
1077 '\d STORE $2\_s*' ..
1078 'res->add(i)\_s*' ..
1079 '\d LOAD $0\_s*' ..
1080 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001081 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001082 '\d\+ DROP\_s*' ..
1083 'endfor\_s*' ..
1084 '\d\+ JUMP -> \d\+\_s*' ..
1085 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001086 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001087enddef
1088
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001089def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001090 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001091 for str in eval('["one", "two"]')
1092 res ..= str
1093 endfor
1094 return res
1095enddef
1096
1097def Test_disassemble_for_loop_eval()
1098 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001099 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001100 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001101 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001102 '\d PUSHS ""\_s*' ..
1103 '\d STORE $0\_s*' ..
1104 'for str in eval(''\["one", "two"\]'')\_s*' ..
1105 '\d STORE -1 in $1\_s*' ..
1106 '\d PUSHS "\["one", "two"\]"\_s*' ..
1107 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001108 '\d FOR $1 -> \d\+\_s*' ..
1109 '\d STORE $2\_s*' ..
1110 'res ..= str\_s*' ..
1111 '\d\+ LOAD $0\_s*' ..
1112 '\d\+ LOAD $2\_s*' ..
1113 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1114 '\d\+ CONCAT\_s*' ..
1115 '\d\+ STORE $0\_s*' ..
1116 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001117 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001118 '\d\+ DROP\_s*' ..
1119 'return res\_s*' ..
1120 '\d\+ LOAD $0\_s*' ..
1121 '\d\+ RETURN',
1122 instr)
1123enddef
1124
Bram Moolenaar792f7862020-11-23 08:31:18 +01001125def ForLoopUnpack()
1126 for [x1, x2] in [[1, 2], [3, 4]]
1127 echo x1 x2
1128 endfor
1129enddef
1130
1131def Test_disassemble_for_loop_unpack()
1132 var instr = execute('disassemble ForLoopUnpack')
1133 assert_match('ForLoopUnpack\_s*' ..
1134 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1135 '\d\+ STORE -1 in $0\_s*' ..
1136 '\d\+ PUSHNR 1\_s*' ..
1137 '\d\+ PUSHNR 2\_s*' ..
1138 '\d\+ NEWLIST size 2\_s*' ..
1139 '\d\+ PUSHNR 3\_s*' ..
1140 '\d\+ PUSHNR 4\_s*' ..
1141 '\d\+ NEWLIST size 2\_s*' ..
1142 '\d\+ NEWLIST size 2\_s*' ..
1143 '\d\+ FOR $0 -> 16\_s*' ..
1144 '\d\+ UNPACK 2\_s*' ..
1145 '\d\+ STORE $1\_s*' ..
1146 '\d\+ STORE $2\_s*' ..
1147 'echo x1 x2\_s*' ..
1148 '\d\+ LOAD $1\_s*' ..
1149 '\d\+ LOAD $2\_s*' ..
1150 '\d\+ ECHO 2\_s*' ..
1151 'endfor\_s*' ..
1152 '\d\+ JUMP -> 8\_s*' ..
1153 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001154 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001155 instr)
1156enddef
1157
Bram Moolenaarc150c092021-02-13 15:02:46 +01001158def ForLoopContinue()
1159 for nr in [1, 2]
1160 try
1161 echo "ok"
1162 try
1163 echo "deeper"
1164 catch
1165 continue
1166 endtry
1167 catch
1168 echo "not ok"
1169 endtry
1170 endfor
1171enddef
1172
1173def Test_disassemble_for_loop_continue()
1174 var instr = execute('disassemble ForLoopContinue')
1175 assert_match('ForLoopContinue\_s*' ..
1176 'for nr in \[1, 2]\_s*' ..
1177 '0 STORE -1 in $0\_s*' ..
1178 '1 PUSHNR 1\_s*' ..
1179 '2 PUSHNR 2\_s*' ..
1180 '3 NEWLIST size 2\_s*' ..
1181 '4 FOR $0 -> 22\_s*' ..
1182 '5 STORE $1\_s*' ..
1183 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001184 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001185 'echo "ok"\_s*' ..
1186 '7 PUSHS "ok"\_s*' ..
1187 '8 ECHO 1\_s*' ..
1188 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001189 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001190 'echo "deeper"\_s*' ..
1191 '10 PUSHS "deeper"\_s*' ..
1192 '11 ECHO 1\_s*' ..
1193 'catch\_s*' ..
1194 '12 JUMP -> 15\_s*' ..
1195 '13 CATCH\_s*' ..
1196 'continue\_s*' ..
1197 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1198 'endtry\_s*' ..
1199 '15 ENDTRY\_s*' ..
1200 'catch\_s*' ..
1201 '16 JUMP -> 20\_s*' ..
1202 '17 CATCH\_s*' ..
1203 'echo "not ok"\_s*' ..
1204 '18 PUSHS "not ok"\_s*' ..
1205 '19 ECHO 1\_s*' ..
1206 'endtry\_s*' ..
1207 '20 ENDTRY\_s*' ..
1208 'endfor\_s*' ..
1209 '21 JUMP -> 4\_s*' ..
1210 '\d\+ DROP\_s*' ..
1211 '\d\+ RETURN 0',
1212 instr)
1213enddef
1214
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001215let g:number = 42
1216
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001217def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001218 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001219enddef
1220
1221def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001222 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001223 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001224 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001225 '\d PUSHNR 23\_s*' ..
1226 '\d LOADG g:number\_s*' ..
1227 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1228 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001229 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001230 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001231 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001232 instr)
1233enddef
1234
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001235def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001236 var nr = 3
1237 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001238 nrres = nr - 7
1239 nrres = nr * 7
1240 nrres = nr / 7
1241 nrres = nr % 7
1242
Bram Moolenaarac564082020-09-27 19:05:33 +02001243 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001244 anyres = g:number - 7
1245 anyres = g:number * 7
1246 anyres = g:number / 7
1247 anyres = g:number % 7
1248
1249 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001250 var fl = 3.0
1251 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001252 flres = fl - 7.0
1253 flres = fl * 7.0
1254 flres = fl / 7.0
1255 endif
1256enddef
1257
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001258def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001259 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001260 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001261 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001262 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001263 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001264 '\d LOAD $0.*' ..
1265 '\d PUSHNR 7.*' ..
1266 '\d OPNR +.*' ..
1267 '\d STORE $1.*' ..
1268 'nrres = nr - 7.*' ..
1269 '\d OPNR -.*' ..
1270 'nrres = nr \* 7.*' ..
1271 '\d OPNR \*.*' ..
1272 'nrres = nr / 7.*' ..
1273 '\d OPNR /.*' ..
1274 'nrres = nr % 7.*' ..
1275 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001276 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001277 '\d LOADG g:number.*' ..
1278 '\d PUSHNR 7.*' ..
1279 '\d OPANY +.*' ..
1280 '\d STORE $2.*' ..
1281 'anyres = g:number - 7.*' ..
1282 '\d OPANY -.*' ..
1283 'anyres = g:number \* 7.*' ..
1284 '\d OPANY \*.*' ..
1285 'anyres = g:number / 7.*' ..
1286 '\d OPANY /.*' ..
1287 'anyres = g:number % 7.*' ..
1288 '\d OPANY %.*',
1289 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001290 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001291 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001292 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001293 '\d PUSHF 3.0.*' ..
1294 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001295 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001296 '\d LOAD $3.*' ..
1297 '\d PUSHF 7.0.*' ..
1298 '\d OPFLOAT +.*' ..
1299 '\d STORE $4.*' ..
1300 'flres = fl - 7.0.*' ..
1301 '\d OPFLOAT -.*' ..
1302 'flres = fl \* 7.0.*' ..
1303 '\d OPFLOAT \*.*' ..
1304 'flres = fl / 7.0.*' ..
1305 '\d OPFLOAT /.*',
1306 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001307 endif
1308enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001309
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001310def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001311 var reslist = [1, 2] + [3, 4]
1312 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001313enddef
1314
1315def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001316 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001317 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001318 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001319 '\d PUSHNR 1.*' ..
1320 '\d PUSHNR 2.*' ..
1321 '\d NEWLIST size 2.*' ..
1322 '\d PUSHNR 3.*' ..
1323 '\d PUSHNR 4.*' ..
1324 '\d NEWLIST size 2.*' ..
1325 '\d ADDLIST.*' ..
1326 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001327 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001328 '\d PUSHBLOB 0z1122.*' ..
1329 '\d PUSHBLOB 0z3344.*' ..
1330 '\d ADDBLOB.*' ..
1331 '\d STORE $.*',
1332 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001333enddef
1334
1335let g:aa = 'aa'
1336def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001337 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001338 return res
1339enddef
1340
1341def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001342 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001343 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001344 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001345 '\d LOADG g:aa.*' ..
1346 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001347 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001348 '\d CONCAT.*' ..
1349 '\d STORE $.*',
1350 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001351 assert_equal('aabb', ConcatString())
1352enddef
1353
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001354def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001355 var s = "abcd"
1356 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001357 return res
1358enddef
1359
1360def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001361 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001362 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001363 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001364 '\d PUSHS "abcd"\_s*' ..
1365 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001367 '\d LOAD $0\_s*' ..
1368 '\d PUSHNR 1\_s*' ..
1369 '\d STRINDEX\_s*' ..
1370 '\d STORE $1\_s*',
1371 instr)
1372 assert_equal('b', StringIndex())
1373enddef
1374
Bram Moolenaared591872020-08-15 22:14:53 +02001375def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001376 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001377 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001378 return res
1379enddef
1380
1381def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001382 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001383 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001384 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001385 '\d PUSHS "abcd"\_s*' ..
1386 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001387 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001388 '\d LOAD $0\_s*' ..
1389 '\d PUSHNR 1\_s*' ..
1390 '\d PUSHNR 8\_s*' ..
1391 '\d STRSLICE\_s*' ..
1392 '\d STORE $1\_s*',
1393 instr)
1394 assert_equal('bcd', StringSlice())
1395enddef
1396
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001397def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001398 var l = [1, 2, 3]
1399 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001400 return res
1401enddef
1402
1403def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001404 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001405 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001406 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001407 '\d PUSHNR 1\_s*' ..
1408 '\d PUSHNR 2\_s*' ..
1409 '\d PUSHNR 3\_s*' ..
1410 '\d NEWLIST size 3\_s*' ..
1411 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001412 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001413 '\d LOAD $0\_s*' ..
1414 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001415 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001416 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001417 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001418 assert_equal(2, ListIndex())
1419enddef
1420
Bram Moolenaared591872020-08-15 22:14:53 +02001421def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001422 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001423 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001424 return res
1425enddef
1426
1427def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001428 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001429 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001430 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001431 '\d PUSHNR 1\_s*' ..
1432 '\d PUSHNR 2\_s*' ..
1433 '\d PUSHNR 3\_s*' ..
1434 '\d NEWLIST size 3\_s*' ..
1435 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001436 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001437 '\d LOAD $0\_s*' ..
1438 '\d PUSHNR 1\_s*' ..
1439 '\d PUSHNR 8\_s*' ..
1440 '\d LISTSLICE\_s*' ..
1441 '\d STORE $1\_s*',
1442 instr)
1443 assert_equal([2, 3], ListSlice())
1444enddef
1445
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001446def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001447 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001448 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001449 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001450 return res
1451enddef
1452
1453def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001454 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001455 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001456 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001457 '\d PUSHS "item"\_s*' ..
1458 '\d PUSHNR 1\_s*' ..
1459 '\d NEWDICT size 1\_s*' ..
1460 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001461 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001462 '\d\+ LOAD $0\_s*' ..
1463 '\d\+ MEMBER item\_s*' ..
1464 '\d\+ STORE $1\_s*' ..
1465 'res = d\["item"\]\_s*' ..
1466 '\d\+ LOAD $0\_s*' ..
1467 '\d\+ PUSHS "item"\_s*' ..
1468 '\d\+ MEMBER\_s*' ..
1469 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001470 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001471 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001472enddef
1473
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001474let somelist = [1, 2, 3, 4, 5]
1475def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001476 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001477 return res
1478enddef
1479
1480def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001481 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001482 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001483 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001484 '\d LOADG g:somelist\_s*' ..
1485 '\d PUSHNR 2\_s*' ..
1486 '\d ANYINDEX\_s*' ..
1487 '\d STORE $0\_s*' ..
1488 'return res\_s*' ..
1489 '\d LOAD $0\_s*' ..
1490 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1491 '\d RETURN',
1492 instr)
1493 assert_equal(3, AnyIndex())
1494enddef
1495
1496def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001497 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001498 return res
1499enddef
1500
1501def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001502 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001503 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001504 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001505 '\d LOADG g:somelist\_s*' ..
1506 '\d PUSHNR 1\_s*' ..
1507 '\d PUSHNR 3\_s*' ..
1508 '\d ANYSLICE\_s*' ..
1509 '\d STORE $0\_s*' ..
1510 'return res\_s*' ..
1511 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001512 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001513 '\d RETURN',
1514 instr)
1515 assert_equal([2, 3, 4], AnySlice())
1516enddef
1517
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001518def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001519 var nr = 9
1520 var plus = +nr
1521 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001522 return res
1523enddef
1524
1525def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001526 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001527 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001528 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001529 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001530 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001531 '\d LOAD $0\_s*' ..
1532 '\d CHECKNR\_s*' ..
1533 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001534 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001535 '\d LOAD $0\_s*' ..
1536 '\d NEGATENR\_s*' ..
1537 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001538 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001539 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001540enddef
1541
1542def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001543 var flag = true
1544 var invert = !flag
1545 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001546 return res
1547enddef
1548
1549def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001550 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001551 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001552 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001553 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001554 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001555 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001556 '\d LOAD $0\_s*' ..
1557 '\d INVERT (!val)\_s*' ..
1558 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001559 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001560 '\d LOAD $0\_s*' ..
1561 '\d 2BOOL (!!val)\_s*' ..
1562 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001563 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001564 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001565enddef
1566
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001567def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001568 var name: bool = 1 && 0 || 1
1569 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001570enddef
1571
1572def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001573 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001574 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001575 'var name: bool = 1 && 0 || 1\_s*' ..
1576 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001577 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001578 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1579 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001580 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001581 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1582 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001583 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001584 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001585 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001586 '\d\+ LOAD $0\_s*' ..
1587 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001588 instr)
1589 assert_equal(true, InvertBool())
1590enddef
1591
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001592def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001593 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001594 ['true == isFalse', 'COMPAREBOOL =='],
1595 ['true != isFalse', 'COMPAREBOOL !='],
1596 ['v:none == isNull', 'COMPARESPECIAL =='],
1597 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001598
Bram Moolenaara5565e42020-05-09 15:44:01 +02001599 ['111 == aNumber', 'COMPARENR =='],
1600 ['111 != aNumber', 'COMPARENR !='],
1601 ['111 > aNumber', 'COMPARENR >'],
1602 ['111 < aNumber', 'COMPARENR <'],
1603 ['111 >= aNumber', 'COMPARENR >='],
1604 ['111 <= aNumber', 'COMPARENR <='],
1605 ['111 =~ aNumber', 'COMPARENR =\~'],
1606 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001607
Bram Moolenaara5565e42020-05-09 15:44:01 +02001608 ['"xx" != aString', 'COMPARESTRING !='],
1609 ['"xx" > aString', 'COMPARESTRING >'],
1610 ['"xx" < aString', 'COMPARESTRING <'],
1611 ['"xx" >= aString', 'COMPARESTRING >='],
1612 ['"xx" <= aString', 'COMPARESTRING <='],
1613 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1614 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1615 ['"xx" is aString', 'COMPARESTRING is'],
1616 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001617
Bram Moolenaara5565e42020-05-09 15:44:01 +02001618 ['0z11 == aBlob', 'COMPAREBLOB =='],
1619 ['0z11 != aBlob', 'COMPAREBLOB !='],
1620 ['0z11 is aBlob', 'COMPAREBLOB is'],
1621 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001622
Bram Moolenaara5565e42020-05-09 15:44:01 +02001623 ['[1, 2] == aList', 'COMPARELIST =='],
1624 ['[1, 2] != aList', 'COMPARELIST !='],
1625 ['[1, 2] is aList', 'COMPARELIST is'],
1626 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001627
Bram Moolenaare0de1712020-12-02 17:36:54 +01001628 ['{a: 1} == aDict', 'COMPAREDICT =='],
1629 ['{a: 1} != aDict', 'COMPAREDICT !='],
1630 ['{a: 1} is aDict', 'COMPAREDICT is'],
1631 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001632
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001633 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1634 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1635 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1636 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001637
1638 ['77 == g:xx', 'COMPAREANY =='],
1639 ['77 != g:xx', 'COMPAREANY !='],
1640 ['77 > g:xx', 'COMPAREANY >'],
1641 ['77 < g:xx', 'COMPAREANY <'],
1642 ['77 >= g:xx', 'COMPAREANY >='],
1643 ['77 <= g:xx', 'COMPAREANY <='],
1644 ['77 =~ g:xx', 'COMPAREANY =\~'],
1645 ['77 !~ g:xx', 'COMPAREANY !\~'],
1646 ['77 is g:xx', 'COMPAREANY is'],
1647 ['77 isnot g:xx', 'COMPAREANY isnot'],
1648 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001649 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001650 if has('float')
1651 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001652 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1653 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1654 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1655 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1656 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1657 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1658 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1659 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001660 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001661 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001662 endif
1663
Bram Moolenaarac564082020-09-27 19:05:33 +02001664 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001665 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001666 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001667 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001668 ' var isFalse = false',
1669 ' var isNull = v:null',
1670 ' var aNumber = 222',
1671 ' var aString = "yy"',
1672 ' var aBlob = 0z22',
1673 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001674 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001675 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001676 ' if ' .. case[0],
1677 ' echo 42'
1678 ' endif',
1679 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001680 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001681 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001682 assert_match('TestCase' .. nr .. '.*' ..
1683 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1684 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001685 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001686 '\d ' .. case[1] .. '.*' ..
1687 '\d JUMP_IF_FALSE -> \d\+.*',
1688 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001689
1690 nr += 1
1691 endfor
1692
Bram Moolenaar22da5592020-03-19 14:52:20 +01001693 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001694enddef
1695
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001696def s:FalsyOp()
1697 echo g:flag ?? "yes"
1698 echo [] ?? "empty list"
1699 echo "" ?? "empty string"
1700enddef
1701
1702def Test_dsassemble_falsy_op()
1703 var res = execute('disass s:FalsyOp')
1704 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1705 'echo g:flag ?? "yes"\_s*' ..
1706 '0 LOADG g:flag\_s*' ..
1707 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1708 '2 PUSHS "yes"\_s*' ..
1709 '3 ECHO 1\_s*' ..
1710 'echo \[\] ?? "empty list"\_s*' ..
1711 '4 NEWLIST size 0\_s*' ..
1712 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1713 '6 PUSHS "empty list"\_s*' ..
1714 '7 ECHO 1\_s*' ..
1715 'echo "" ?? "empty string"\_s*' ..
1716 '\d\+ PUSHS "empty string"\_s*' ..
1717 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001718 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001719 res)
1720enddef
1721
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001722def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001723 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001724 ['"xx" == "yy"', false],
1725 ['"aa" == "aa"', true],
1726 ['has("eval") ? true : false', true],
1727 ['has("asdf") ? true : false', false],
1728 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001729
Bram Moolenaarac564082020-09-27 19:05:33 +02001730 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001731 for case in cases
1732 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001733 ' if ' .. case[0],
1734 ' echo 42'
1735 ' endif',
1736 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001737 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001738 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001739 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001740 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001741 assert_match('TestCase' .. nr .. '.*' ..
1742 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1743 '\d PUSHNR 42.*' ..
1744 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001745 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001746 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001747 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001748 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001749 assert_match('TestCase' .. nr .. '.*' ..
1750 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1751 'echo 42[ \n]*' ..
1752 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001753 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001754 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001755 endif
1756
1757 nr += 1
1758 endfor
1759
1760 delete('Xdisassemble')
1761enddef
1762
Bram Moolenaarad39c092020-02-26 18:23:43 +01001763def s:Execute()
1764 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001765 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001766 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001767 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001768 execute 'help ' .. tag
1769enddef
1770
1771def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001772 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001773 assert_match('\<SNR>\d*_Execute\_s*' ..
1774 "execute 'help vim9.txt'\\_s*" ..
1775 '\d PUSHS "help vim9.txt"\_s*' ..
1776 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001777 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001778 '\d PUSHS "help vim9.txt"\_s*' ..
1779 '\d STORE $0\_s*' ..
1780 'execute cmd\_s*' ..
1781 '\d LOAD $0\_s*' ..
1782 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001783 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001784 '\d PUSHS "vim9.txt"\_s*' ..
1785 '\d STORE $1\_s*' ..
1786 "execute 'help ' .. tag\\_s*" ..
1787 '\d\+ PUSHS "help "\_s*' ..
1788 '\d\+ LOAD $1\_s*' ..
1789 '\d\+ CONCAT\_s*' ..
1790 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001791 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001792 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001793enddef
1794
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001795def s:Echomsg()
1796 echomsg 'some' 'message'
1797 echoerr 'went' .. 'wrong'
1798enddef
1799
1800def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001801 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001802 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1803 "echomsg 'some' 'message'\\_s*" ..
1804 '\d PUSHS "some"\_s*' ..
1805 '\d PUSHS "message"\_s*' ..
1806 '\d ECHOMSG 2\_s*' ..
1807 "echoerr 'went' .. 'wrong'\\_s*" ..
1808 '\d PUSHS "wentwrong"\_s*' ..
1809 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001810 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001811 res)
1812enddef
1813
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001814def SomeStringArg(arg: string)
1815 echo arg
1816enddef
1817
1818def SomeAnyArg(arg: any)
1819 echo arg
1820enddef
1821
1822def SomeStringArgAndReturn(arg: string): string
1823 return arg
1824enddef
1825
1826def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001827 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001828 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1829 '\d *echo arg.*' ..
1830 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001831 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001832
Bram Moolenaarac564082020-09-27 19:05:33 +02001833 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001834 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1835 '\d *echo arg\_s*' ..
1836 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001837 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001838
Bram Moolenaarac564082020-09-27 19:05:33 +02001839 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001840 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1841 '\d *return arg\_s*' ..
1842 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001843 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001844enddef
1845
Bram Moolenaar09689a02020-05-09 22:50:08 +02001846def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001847 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001848 vim9script
1849 def FuncOne(): string
1850 return FuncTwo()
1851 enddef
1852 def FuncTwo(): string
1853 return 'two'
1854 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001855 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001856 END
1857 writefile(lines, 'Xdisassemble')
1858 source Xdisassemble
1859
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001860 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001861 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1862 'return FuncTwo()\_s*' ..
1863 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001864 '\d RETURN',
1865 g:res_FuncOne)
1866
1867 delete('Xdisassemble')
1868 unlet g:res_FuncOne
1869enddef
1870
Bram Moolenaar61a89812020-05-07 16:58:17 +02001871def s:ConcatStrings(): string
1872 return 'one' .. 'two' .. 'three'
1873enddef
1874
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001875def s:ComputeConst(): number
1876 return 2 + 3 * 4 / 6 + 7
1877enddef
1878
Bram Moolenaar1c747212020-05-09 18:28:34 +02001879def s:ComputeConstParen(): number
1880 return ((2 + 4) * (8 / 2)) / (3 + 4)
1881enddef
1882
Bram Moolenaar61a89812020-05-07 16:58:17 +02001883def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001884 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001885 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1886 "return 'one' .. 'two' .. 'three'\\_s*" ..
1887 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001888 '\d RETURN',
1889 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001890
1891 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001892 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1893 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1894 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001895 '\d RETURN',
1896 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001897
1898 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001899 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1900 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1901 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001902 '\d RETURN',
1903 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001904enddef
1905
Bram Moolenaar389df252020-07-09 21:20:47 +02001906def s:CallAppend()
1907 eval "some text"->append(2)
1908enddef
1909
1910def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001911 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001912 assert_match('<SNR>\d*_CallAppend\_s*' ..
1913 'eval "some text"->append(2)\_s*' ..
1914 '\d PUSHS "some text"\_s*' ..
1915 '\d PUSHNR 2\_s*' ..
1916 '\d SHUFFLE 2 up 1\_s*' ..
1917 '\d BCALL append(argc 2)\_s*' ..
1918 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001919 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001920 res)
1921enddef
1922
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001923
1924def s:SilentMessage()
1925 silent echomsg "text"
1926 silent! echoerr "error"
1927enddef
1928
1929def Test_silent()
1930 var res = execute('disass s:SilentMessage')
1931 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1932 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001933 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001934 '\d PUSHS "text"\_s*' ..
1935 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001936 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001937 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001938 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001939 '\d PUSHS "error"\_s*' ..
1940 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001941 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001942 '\d\+ RETURN 0',
1943 res)
1944enddef
1945
1946def s:SilentIf()
1947 silent if 4 == g:five
1948 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001949 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001950enddef
1951
1952def Test_silent_if()
1953 var res = execute('disass s:SilentIf')
1954 assert_match('<SNR>\d*_SilentIf\_s*' ..
1955 'silent if 4 == g:five\_s*' ..
1956 '\d\+ CMDMOD silent\_s*' ..
1957 '\d\+ PUSHNR 4\_s*' ..
1958 '\d\+ LOADG g:five\_s*' ..
1959 '\d\+ COMPAREANY ==\_s*' ..
1960 '\d\+ CMDMOD_REV\_s*' ..
1961 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1962 'silent elseif 4 == g:five\_s*' ..
1963 '\d\+ JUMP -> \d\+\_s*' ..
1964 '\d\+ CMDMOD silent\_s*' ..
1965 '\d\+ PUSHNR 4\_s*' ..
1966 '\d\+ LOADG g:five\_s*' ..
1967 '\d\+ COMPAREANY ==\_s*' ..
1968 '\d\+ CMDMOD_REV\_s*' ..
1969 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001970 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001971 '\d\+ RETURN 0',
1972 res)
1973enddef
1974
1975def s:SilentFor()
1976 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01001977 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01001978enddef
1979
1980def Test_silent_for()
1981 var res = execute('disass s:SilentFor')
1982 assert_match('<SNR>\d*_SilentFor\_s*' ..
1983 'silent for i in \[0\]\_s*' ..
1984 '\d CMDMOD silent\_s*' ..
1985 '\d STORE -1 in $0\_s*' ..
1986 '\d PUSHNR 0\_s*' ..
1987 '\d NEWLIST size 1\_s*' ..
1988 '\d CMDMOD_REV\_s*' ..
1989 '5 FOR $0 -> 8\_s*' ..
1990 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001991 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001992 '\d JUMP -> 5\_s*' ..
1993 '8 DROP\_s*' ..
1994 '\d RETURN 0\_s*',
1995 res)
1996enddef
1997
1998def s:SilentWhile()
1999 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01002000 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01002001enddef
2002
2003def Test_silent_while()
2004 var res = execute('disass s:SilentWhile')
2005 assert_match('<SNR>\d*_SilentWhile\_s*' ..
2006 'silent while g:not\_s*' ..
2007 '0 CMDMOD silent\_s*' ..
2008 '\d LOADG g:not\_s*' ..
2009 '\d COND2BOOL\_s*' ..
2010 '\d CMDMOD_REV\_s*' ..
2011 '\d JUMP_IF_FALSE -> 6\_s*' ..
2012
Bram Moolenaarfa984412021-03-25 22:15:28 +01002013 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002014 '\d JUMP -> 0\_s*' ..
2015 '6 RETURN 0\_s*',
2016 res)
2017enddef
2018
2019def s:SilentReturn(): string
2020 silent return "done"
2021enddef
2022
2023def Test_silent_return()
2024 var res = execute('disass s:SilentReturn')
2025 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2026 'silent return "done"\_s*' ..
2027 '\d CMDMOD silent\_s*' ..
2028 '\d PUSHS "done"\_s*' ..
2029 '\d CMDMOD_REV\_s*' ..
2030 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002031 res)
2032enddef
2033
Bram Moolenaarb2049902021-01-24 12:53:53 +01002034def s:Profiled(): string
2035 echo "profiled"
2036 return "done"
2037enddef
2038
2039def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002040 if !has('profile')
2041 MissingFeature 'profile'
2042 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002043 var res = execute('disass! s:Profiled')
2044 assert_match('<SNR>\d*_Profiled\_s*' ..
2045 'echo "profiled"\_s*' ..
2046 '\d PROFILE START line 1\_s*' ..
2047 '\d PUSHS "profiled"\_s*' ..
2048 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002049 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002050 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002051 '\d PROFILE START line 2\_s*' ..
2052 '\d PUSHS "done"\_s*' ..
2053 '\d RETURN\_s*' ..
2054 '\d PROFILE END',
2055 res)
2056enddef
2057
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002058def s:EchoMessages()
2059 echohl ErrorMsg | echom v:exception | echohl NONE
2060enddef
2061
2062def Test_disassemble_nextcmd()
2063 # splitting commands and removing trailing blanks should not change the line
2064 var res = execute('disass s:EchoMessages')
2065 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2066 'echohl ErrorMsg | echom v:exception | echohl NONE',
2067 res)
2068enddef
2069
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002070
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002071" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker