blob: 3ea2ad9a4086c4e6006e83a940109179f3f8fbc3 [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
249enddef
250
251def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200252 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200253 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200254 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200255 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100256 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200257 '\d STORE $0\_s*' ..
258 'locallist\[0\] = 123\_s*' ..
259 '\d PUSHNR 123\_s*' ..
260 '\d PUSHNR 0\_s*' ..
261 '\d LOAD $0\_s*' ..
262 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200263 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200264 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100265 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200266 '\d STORE $1\_s*' ..
267 'localdict\["a"\] = 456\_s*' ..
268 '\d\+ PUSHNR 456\_s*' ..
269 '\d\+ PUSHS "a"\_s*' ..
270 '\d\+ LOAD $1\_s*' ..
271 '\d\+ STOREDICT\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100272 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200273 res)
274enddef
275
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100276def s:ScriptFuncStoreIndex()
277 var d = {dd: {}}
278 d.dd[0] = 0
279enddef
280
281def Test_disassemble_store_index()
282 var res = execute('disass s:ScriptFuncStoreIndex')
283 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
284 'var d = {dd: {}}\_s*' ..
285 '\d PUSHS "dd"\_s*' ..
286 '\d NEWDICT size 0\_s*' ..
287 '\d NEWDICT size 1\_s*' ..
288 '\d STORE $0\_s*' ..
289 'd.dd\[0\] = 0\_s*' ..
290 '\d PUSHNR 0\_s*' ..
291 '\d PUSHNR 0\_s*' ..
292 '\d LOAD $0\_s*' ..
293 '\d MEMBER dd\_s*' ..
294 '\d STOREINDEX\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100295 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100296 res)
297enddef
298
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200299def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200300 var x: string
301 var y: string
302 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200303 [x, y; l] = g:stringlist
304enddef
305
306def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200307 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200308 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200310 '\d PUSHS "\[NULL\]"\_s*' ..
311 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200312 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200313 '\d PUSHS "\[NULL\]"\_s*' ..
314 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200315 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200316 '\d NEWLIST size 0\_s*' ..
317 '\d STORE $2\_s*' ..
318 '\[x, y; l\] = g:stringlist\_s*' ..
319 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200320 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200321 '\d CHECKLEN >= 2\_s*' ..
322 '\d\+ ITEM 0\_s*' ..
323 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
324 '\d\+ STORE $0\_s*' ..
325 '\d\+ ITEM 1\_s*' ..
326 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
327 '\d\+ STORE $1\_s*' ..
328 '\d\+ SLICE 2\_s*' ..
329 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100330 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200331 res)
332enddef
333
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200334def s:ListAdd()
335 var l: list<number> = []
336 add(l, 123)
337 add(l, g:aNumber)
338enddef
339
340def Test_disassemble_list_add()
341 var res = execute('disass s:ListAdd')
342 assert_match('<SNR>\d*_ListAdd\_s*' ..
343 'var l: list<number> = []\_s*' ..
344 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100345 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200346 '\d STORE $0\_s*' ..
347 'add(l, 123)\_s*' ..
348 '\d LOAD $0\_s*' ..
349 '\d PUSHNR 123\_s*' ..
350 '\d LISTAPPEND\_s*' ..
351 '\d DROP\_s*' ..
352 'add(l, g:aNumber)\_s*' ..
353 '\d LOAD $0\_s*' ..
354 '\d\+ LOADG g:aNumber\_s*' ..
355 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
356 '\d\+ LISTAPPEND\_s*' ..
357 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100358 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200359 res)
360enddef
361
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200362def s:BlobAdd()
363 var b: blob = 0z
364 add(b, 123)
365 add(b, g:aNumber)
366enddef
367
368def Test_disassemble_blob_add()
369 var res = execute('disass s:BlobAdd')
370 assert_match('<SNR>\d*_BlobAdd\_s*' ..
371 'var b: blob = 0z\_s*' ..
372 '\d PUSHBLOB 0z\_s*' ..
373 '\d STORE $0\_s*' ..
374 'add(b, 123)\_s*' ..
375 '\d LOAD $0\_s*' ..
376 '\d PUSHNR 123\_s*' ..
377 '\d BLOBAPPEND\_s*' ..
378 '\d DROP\_s*' ..
379 'add(b, g:aNumber)\_s*' ..
380 '\d LOAD $0\_s*' ..
381 '\d\+ LOADG g:aNumber\_s*' ..
382 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
383 '\d\+ BLOBAPPEND\_s*' ..
384 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100385 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200386 res)
387enddef
388
Bram Moolenaarf62d7392021-04-14 12:40:00 +0200389def s:BlobIndexSlice()
390 var b: blob = 0z112233
391 echo b[1]
392 echo b[1 : 2]
393enddef
394
395def Test_disassemble_blob_index_slice()
396 var res = execute('disass s:BlobIndexSlice')
397 assert_match('<SNR>\d*_BlobIndexSlice\_s*' ..
398 'var b: blob = 0z112233\_s*' ..
399 '\d PUSHBLOB 0z112233\_s*' ..
400 '\d STORE $0\_s*' ..
401 'echo b\[1\]\_s*' ..
402 '\d LOAD $0\_s*' ..
403 '\d PUSHNR 1\_s*' ..
404 '\d BLOBINDEX\_s*' ..
405 '\d ECHO 1\_s*' ..
406 'echo b\[1 : 2\]\_s*' ..
407 '\d LOAD $0\_s*' ..
408 '\d PUSHNR 1\_s*' ..
409 '\d\+ PUSHNR 2\_s*' ..
410 '\d\+ BLOBSLICE\_s*' ..
411 '\d\+ ECHO 1\_s*' ..
412 '\d\+ RETURN 0',
413 res)
414enddef
415
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200416def s:ScriptFuncUnlet()
417 g:somevar = "value"
418 unlet g:somevar
419 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200420 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200421enddef
422
423def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200424 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200425 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
426 'g:somevar = "value"\_s*' ..
427 '\d PUSHS "value"\_s*' ..
428 '\d STOREG g:somevar\_s*' ..
429 'unlet g:somevar\_s*' ..
430 '\d UNLET g:somevar\_s*' ..
431 'unlet! g:somevar\_s*' ..
432 '\d UNLET! g:somevar\_s*' ..
433 'unlet $SOMEVAR\_s*' ..
434 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200435 res)
436enddef
437
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100438def s:ScriptFuncTry()
439 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200440 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100441 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200442 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100443 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200444 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100445 endtry
446enddef
447
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100448def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200449 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200450 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
451 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100452 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200453 'echo "yes"\_s*' ..
454 '\d PUSHS "yes"\_s*' ..
455 '\d ECHO 1\_s*' ..
456 'catch /fail/\_s*' ..
457 '\d JUMP -> \d\+\_s*' ..
458 '\d PUSH v:exception\_s*' ..
459 '\d PUSHS "fail"\_s*' ..
460 '\d COMPARESTRING =\~\_s*' ..
461 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
462 '\d CATCH\_s*' ..
463 'echo "no"\_s*' ..
464 '\d\+ PUSHS "no"\_s*' ..
465 '\d\+ ECHO 1\_s*' ..
466 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100467 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200468 'throw "end"\_s*' ..
469 '\d\+ PUSHS "end"\_s*' ..
470 '\d\+ THROW\_s*' ..
471 'endtry\_s*' ..
472 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200473 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100474enddef
475
476def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200477 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100478 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100479enddef
480
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100481def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200482 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200483 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200484 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200485 '\d PUSHNR 1\_s*' ..
486 '\d PUSHS "two"\_s*' ..
487 '\d PUSHNR 333\_s*' ..
488 '\d NEWLIST size 3\_s*' ..
489 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100490 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200491 '\d PUSHS "one"\_s*' ..
492 '\d PUSHNR 1\_s*' ..
493 '\d PUSHS "two"\_s*' ..
494 '\d PUSHS "val"\_s*' ..
495 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200496 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100497enddef
498
Bram Moolenaar6e949782020-04-13 17:21:00 +0200499def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100500 echo arg
501enddef
502
503func UserFunc()
504 echo 'nothing'
505endfunc
506
507func UserFuncWithArg(arg)
508 echo a:arg
509endfunc
510
511def s:ScriptFuncCall(): string
512 changenr()
513 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100514 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100515 FuncWithArg(343)
516 ScriptFuncNew()
517 s:ScriptFuncNew()
518 UserFunc()
519 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200520 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100521 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200522 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100523 FuncRefWithArg("bar")
524 return "yes"
525enddef
526
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100527def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200528 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200529 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
530 'changenr()\_s*' ..
531 '\d BCALL changenr(argc 0)\_s*' ..
532 '\d DROP\_s*' ..
533 'char2nr("abc")\_s*' ..
534 '\d PUSHS "abc"\_s*' ..
535 '\d BCALL char2nr(argc 1)\_s*' ..
536 '\d DROP\_s*' ..
537 'Test_disassemble_new()\_s*' ..
538 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
539 '\d DROP\_s*' ..
540 'FuncWithArg(343)\_s*' ..
541 '\d\+ PUSHNR 343\_s*' ..
542 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
543 '\d\+ DROP\_s*' ..
544 'ScriptFuncNew()\_s*' ..
545 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
546 '\d\+ DROP\_s*' ..
547 's:ScriptFuncNew()\_s*' ..
548 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
549 '\d\+ DROP\_s*' ..
550 'UserFunc()\_s*' ..
551 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
552 '\d\+ DROP\_s*' ..
553 'UserFuncWithArg("foo")\_s*' ..
554 '\d\+ PUSHS "foo"\_s*' ..
555 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
556 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200557 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200558 '\d\+ PUSHS "UserFunc"\_s*' ..
559 '\d\+ BCALL function(argc 1)\_s*' ..
560 '\d\+ STORE $0\_s*' ..
561 'FuncRef()\_s*' ..
562 '\d\+ LOAD $\d\_s*' ..
563 '\d\+ PCALL (argc 0)\_s*' ..
564 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200565 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200566 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
567 '\d\+ BCALL function(argc 1)\_s*' ..
568 '\d\+ STORE $1\_s*' ..
569 'FuncRefWithArg("bar")\_s*' ..
570 '\d\+ PUSHS "bar"\_s*' ..
571 '\d\+ LOAD $\d\_s*' ..
572 '\d\+ PCALL (argc 1)\_s*' ..
573 '\d\+ DROP\_s*' ..
574 'return "yes"\_s*' ..
575 '\d\+ PUSHS "yes"\_s*' ..
576 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200577 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100578enddef
579
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200580
581def s:CreateRefs()
582 var local = 'a'
583 def Append(arg: string)
584 local ..= arg
585 enddef
586 g:Append = Append
587 def Get(): string
588 return local
589 enddef
590 g:Get = Get
591enddef
592
593def Test_disassemble_closure()
594 CreateRefs()
595 var res = execute('disass g:Append')
596 assert_match('<lambda>\d\_s*' ..
597 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100598 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200599 '\d LOAD arg\[-1\]\_s*' ..
600 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100601 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100602 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200603 res)
604
605 res = execute('disass g:Get')
606 assert_match('<lambda>\d\_s*' ..
607 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100608 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200609 '\d RETURN',
610 res)
611
612 unlet g:Append
613 unlet g:Get
614enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200615
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100616
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200617def EchoArg(arg: string): string
618 return arg
619enddef
620def RefThis(): func
621 return function('EchoArg')
622enddef
623def s:ScriptPCall()
624 RefThis()("text")
625enddef
626
627def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200628 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200629 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
630 'RefThis()("text")\_s*' ..
631 '\d DCALL RefThis(argc 0)\_s*' ..
632 '\d PUSHS "text"\_s*' ..
633 '\d PCALL top (argc 1)\_s*' ..
634 '\d PCALL end\_s*' ..
635 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100636 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200637 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200638enddef
639
640
Bram Moolenaara26b9702020-04-18 19:53:28 +0200641def s:FuncWithForwardCall(): string
642 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100643enddef
644
645def DefinedLater(arg: string): string
646 return arg
647enddef
648
649def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200650 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200651 assert_match('FuncWithForwardCall\_s*' ..
652 'return g:DefinedLater("yes")\_s*' ..
653 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200654 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200655 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200656 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100657
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200658 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100659 assert_equal('yes', FuncWithForwardCall())
660
Bram Moolenaara26b9702020-04-18 19:53:28 +0200661 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200662 assert_match('FuncWithForwardCall\_s*' ..
663 'return g:DefinedLater("yes")\_s*' ..
664 '\d PUSHS "yes"\_s*' ..
665 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200666 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200667 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100668enddef
669
670
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200671def FuncWithDefault(arg: string = 'default', nr = 77): string
672 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100673enddef
674
675def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200676 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200677 assert_match('FuncWithDefault\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200678 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200679 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200680 '\d STORE arg\[-2]\_s*' ..
681 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
682 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200683 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200684 'return arg .. nr\_s*' ..
685 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200686 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200687 '\d 2STRING stack\[-1]\_s*' ..
688 '\d\+ CONCAT\_s*' ..
689 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200690 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100691enddef
692
693
Bram Moolenaar158906c2020-02-06 20:39:45 +0100694def HasEval()
695 if has("eval")
696 echo "yes"
697 else
698 echo "no"
699 endif
700enddef
701
702def HasNothing()
703 if has("nothing")
704 echo "yes"
705 else
706 echo "no"
707 endif
708enddef
709
710def HasSomething()
711 if has("nothing")
712 echo "nothing"
713 elseif has("something")
714 echo "something"
715 elseif has("eval")
716 echo "eval"
717 elseif has("less")
718 echo "less"
719 endif
720enddef
721
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100722def HasGuiRunning()
723 if has("gui_running")
724 echo "yes"
725 else
726 echo "no"
727 endif
728enddef
729
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100730def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200731 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200732 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200733 assert_match('HasEval\_s*' ..
734 'if has("eval")\_s*' ..
735 'echo "yes"\_s*' ..
736 '\d PUSHS "yes"\_s*' ..
737 '\d ECHO 1\_s*' ..
738 'else\_s*' ..
739 'echo "no"\_s*' ..
740 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200741 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100742 assert_notmatch('JUMP', instr)
743
Bram Moolenaard2c61702020-09-06 15:58:36 +0200744 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100745 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200746 assert_match('HasNothing\_s*' ..
747 'if has("nothing")\_s*' ..
748 'echo "yes"\_s*' ..
749 'else\_s*' ..
750 'echo "no"\_s*' ..
751 '\d PUSHS "no"\_s*' ..
752 '\d ECHO 1\_s*' ..
753 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200754 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100755 assert_notmatch('PUSHS "yes"', instr)
756 assert_notmatch('JUMP', instr)
757
Bram Moolenaard2c61702020-09-06 15:58:36 +0200758 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100759 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200760 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200761 'if has("nothing")\_s*' ..
762 'echo "nothing"\_s*' ..
763 'elseif has("something")\_s*' ..
764 'echo "something"\_s*' ..
765 'elseif has("eval")\_s*' ..
766 'echo "eval"\_s*' ..
767 '\d PUSHS "eval"\_s*' ..
768 '\d ECHO 1\_s*' ..
769 'elseif has("less").*' ..
770 'echo "less"\_s*' ..
771 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200772 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100773 assert_notmatch('PUSHS "nothing"', instr)
774 assert_notmatch('PUSHS "something"', instr)
775 assert_notmatch('PUSHS "less"', instr)
776 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100777
778 var result: string
779 var instr_expected: string
780 if has('gui')
781 if has('gui_running')
782 # GUI already running, always returns "yes"
783 result = "\nyes"
784 instr_expected = 'HasGuiRunning.*' ..
785 'if has("gui_running")\_s*' ..
786 ' echo "yes"\_s*' ..
787 '\d PUSHS "yes"\_s*' ..
788 '\d ECHO 1\_s*' ..
789 'else\_s*' ..
790 ' echo "no"\_s*' ..
791 'endif'
792 else
793 result = "\nno"
794 if has('unix')
795 # GUI not running but can start later, call has()
796 instr_expected = 'HasGuiRunning.*' ..
797 'if has("gui_running")\_s*' ..
798 '\d PUSHS "gui_running"\_s*' ..
799 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200800 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100801 '\d JUMP_IF_FALSE -> \d\_s*' ..
802 ' echo "yes"\_s*' ..
803 '\d PUSHS "yes"\_s*' ..
804 '\d ECHO 1\_s*' ..
805 'else\_s*' ..
806 '\d JUMP -> \d\_s*' ..
807 ' echo "no"\_s*' ..
808 '\d PUSHS "no"\_s*' ..
809 '\d ECHO 1\_s*' ..
810 'endif'
811 else
812 # GUI not running, always return "no"
813 instr_expected = 'HasGuiRunning.*' ..
814 'if has("gui_running")\_s*' ..
815 ' echo "yes"\_s*' ..
816 'else\_s*' ..
817 ' echo "no"\_s*' ..
818 '\d PUSHS "no"\_s*' ..
819 '\d ECHO 1\_s*' ..
820 'endif'
821 endif
822 endif
823 else
824 # GUI not supported, always return "no"
825 result = "\nno"
826 instr_expected = 'HasGuiRunning.*' ..
827 'if has("gui_running")\_s*' ..
828 ' echo "yes"\_s*' ..
829 'else\_s*' ..
830 ' echo "no"\_s*' ..
831 '\d PUSHS "no"\_s*' ..
832 '\d ECHO 1\_s*' ..
833 'endif'
834 endif
835
836 assert_equal(result, execute('HasGuiRunning()'))
837 instr = execute('disassemble HasGuiRunning')
838 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100839enddef
840
Bram Moolenaarefd88552020-06-18 20:50:10 +0200841def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100842 if 1 < 0
843 return "maybe"
844 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200845 if g:cond
846 return "yes"
847 else
848 return "no"
849 endif
850enddef
851
852def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200853 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200854 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100855 'if 1 < 0\_s*' ..
856 ' return "maybe"\_s*' ..
857 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200858 'if g:cond\_s*' ..
859 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100860 '1 COND2BOOL\_s*' ..
861 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200862 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100863 '3 PUSHS "yes"\_s*' ..
864 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200865 'else\_s*' ..
866 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100867 '5 PUSHS "no"\_s*' ..
868 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200869 instr)
870enddef
871
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100872def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200873 var Funky1: func
874 var Funky2: func = function("len")
875 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100876enddef
877
878def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200879 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200880 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200881 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200882 '0 PUSHFUNC "\[none]"\_s*' ..
883 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200884 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200885 '2 PUSHS "len"\_s*' ..
886 '3 BCALL function(argc 1)\_s*' ..
887 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200888 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200889 '\d PUSHS "UserFunc"\_s*' ..
890 '\d BCALL funcref(argc 1)\_s*' ..
891 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100892 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200893 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100894enddef
895
896if has('channel')
897 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200898 var job1: job
899 var job2: job = job_start("donothing")
900 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100901 enddef
902endif
903
904def Test_disassemble_channel()
905 CheckFeature channel
906
Bram Moolenaarac564082020-09-27 19:05:33 +0200907 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200908 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200909 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200910 '\d PUSHJOB "no process"\_s*' ..
911 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200912 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200913 '\d PUSHS "donothing"\_s*' ..
914 '\d BCALL job_start(argc 1)\_s*' ..
915 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200916 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200917 '\d PUSHCHANNEL 0\_s*' ..
918 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100919 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200920 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100921enddef
922
Bram Moolenaar777770f2020-02-06 21:27:08 +0100923def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100924 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100925 return F("x")
926enddef
927
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100928def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100929 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200930 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200931 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100932 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200933 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200934 '\d STORE $0\_s*' ..
935 'return F("x")\_s*' ..
936 '\d PUSHS "x"\_s*' ..
937 '\d LOAD $0\_s*' ..
938 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200939 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200940 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200941
Bram Moolenaarac564082020-09-27 19:05:33 +0200942 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200943 instr = execute('disassemble ' .. name)
944 assert_match('<lambda>\d\+\_s*' ..
945 'return "X" .. a .. "X"\_s*' ..
946 '\d PUSHS "X"\_s*' ..
947 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200948 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200949 '\d CONCAT\_s*' ..
950 '\d PUSHS "X"\_s*' ..
951 '\d CONCAT\_s*' ..
952 '\d RETURN',
953 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100954enddef
955
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100956def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100957 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100958 return Ref(g:value)
959enddef
960
961def Test_disassemble_lambda_with_type()
962 g:value = 5
963 assert_equal(15, LambdaWithType())
964 var instr = execute('disassemble LambdaWithType')
965 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100966 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100967 '\d FUNCREF <lambda>\d\+\_s*' ..
968 '\d STORE $0\_s*' ..
969 'return Ref(g:value)\_s*' ..
970 '\d LOADG g:value\_s*' ..
971 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +0100972 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100973 '\d PCALL (argc 1)\_s*' ..
974 '\d RETURN',
975 instr)
976enddef
977
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200978def NestedOuter()
979 def g:Inner()
980 echomsg "inner"
981 enddef
982enddef
983
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100984def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200985 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200986 assert_match('NestedOuter\_s*' ..
987 'def g:Inner()\_s*' ..
988 'echomsg "inner"\_s*' ..
989 'enddef\_s*' ..
990 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100991 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200992 instr)
993enddef
994
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100995def NestedDefList()
996 def
997 def Info
998 def /Info
999 def /Info/
1000enddef
1001
Bram Moolenaar8863bda2021-03-17 18:42:08 +01001002def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001003 var instr = execute('disassemble NestedDefList')
1004 assert_match('NestedDefList\_s*' ..
1005 'def\_s*' ..
1006 '\d DEF \_s*' ..
1007 'def Info\_s*' ..
1008 '\d DEF Info\_s*' ..
1009 'def /Info\_s*' ..
1010 '\d DEF /Info\_s*' ..
1011 'def /Info/\_s*' ..
1012 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001013 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +01001014 instr)
1015enddef
1016
Bram Moolenaar6e949782020-04-13 17:21:00 +02001017def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +01001018 if arg == 1 && arg != 2 || arg == 4
1019 return 'yes'
1020 endif
1021 return 'no'
1022enddef
1023
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001024def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001025 assert_equal("yes", AndOr(1))
1026 assert_equal("no", AndOr(2))
1027 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001028 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001029 assert_match('AndOr\_s*' ..
1030 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1031 '\d LOAD arg\[-1]\_s*' ..
1032 '\d PUSHNR 1\_s*' ..
1033 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001034 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001035 '\d LOAD arg\[-1]\_s*' ..
1036 '\d PUSHNR 2\_s*' ..
1037 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001038 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001039 '\d LOAD arg\[-1]\_s*' ..
1040 '\d\+ PUSHNR 4\_s*' ..
1041 '\d\+ COMPAREANY ==\_s*' ..
1042 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001043 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001044enddef
1045
Bram Moolenaar04d05222020-02-06 22:06:54 +01001046def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001047 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001048 for i in range(3)
1049 res->add(i)
1050 endfor
1051 return res
1052enddef
1053
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001054def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001055 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001056 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001057 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001058 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001059 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001060 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001061 '\d STORE $0\_s*' ..
1062 'for i in range(3)\_s*' ..
1063 '\d STORE -1 in $1\_s*' ..
1064 '\d PUSHNR 3\_s*' ..
1065 '\d BCALL range(argc 1)\_s*' ..
1066 '\d FOR $1 -> \d\+\_s*' ..
1067 '\d STORE $2\_s*' ..
1068 'res->add(i)\_s*' ..
1069 '\d LOAD $0\_s*' ..
1070 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001071 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001072 '\d\+ DROP\_s*' ..
1073 'endfor\_s*' ..
1074 '\d\+ JUMP -> \d\+\_s*' ..
1075 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001076 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001077enddef
1078
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001079def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001080 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001081 for str in eval('["one", "two"]')
1082 res ..= str
1083 endfor
1084 return res
1085enddef
1086
1087def Test_disassemble_for_loop_eval()
1088 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001089 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001090 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001091 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001092 '\d PUSHS ""\_s*' ..
1093 '\d STORE $0\_s*' ..
1094 'for str in eval(''\["one", "two"\]'')\_s*' ..
1095 '\d STORE -1 in $1\_s*' ..
1096 '\d PUSHS "\["one", "two"\]"\_s*' ..
1097 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001098 '\d FOR $1 -> \d\+\_s*' ..
1099 '\d STORE $2\_s*' ..
1100 'res ..= str\_s*' ..
1101 '\d\+ LOAD $0\_s*' ..
1102 '\d\+ LOAD $2\_s*' ..
1103 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1104 '\d\+ CONCAT\_s*' ..
1105 '\d\+ STORE $0\_s*' ..
1106 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001107 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001108 '\d\+ DROP\_s*' ..
1109 'return res\_s*' ..
1110 '\d\+ LOAD $0\_s*' ..
1111 '\d\+ RETURN',
1112 instr)
1113enddef
1114
Bram Moolenaar792f7862020-11-23 08:31:18 +01001115def ForLoopUnpack()
1116 for [x1, x2] in [[1, 2], [3, 4]]
1117 echo x1 x2
1118 endfor
1119enddef
1120
1121def Test_disassemble_for_loop_unpack()
1122 var instr = execute('disassemble ForLoopUnpack')
1123 assert_match('ForLoopUnpack\_s*' ..
1124 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1125 '\d\+ STORE -1 in $0\_s*' ..
1126 '\d\+ PUSHNR 1\_s*' ..
1127 '\d\+ PUSHNR 2\_s*' ..
1128 '\d\+ NEWLIST size 2\_s*' ..
1129 '\d\+ PUSHNR 3\_s*' ..
1130 '\d\+ PUSHNR 4\_s*' ..
1131 '\d\+ NEWLIST size 2\_s*' ..
1132 '\d\+ NEWLIST size 2\_s*' ..
1133 '\d\+ FOR $0 -> 16\_s*' ..
1134 '\d\+ UNPACK 2\_s*' ..
1135 '\d\+ STORE $1\_s*' ..
1136 '\d\+ STORE $2\_s*' ..
1137 'echo x1 x2\_s*' ..
1138 '\d\+ LOAD $1\_s*' ..
1139 '\d\+ LOAD $2\_s*' ..
1140 '\d\+ ECHO 2\_s*' ..
1141 'endfor\_s*' ..
1142 '\d\+ JUMP -> 8\_s*' ..
1143 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001144 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001145 instr)
1146enddef
1147
Bram Moolenaarc150c092021-02-13 15:02:46 +01001148def ForLoopContinue()
1149 for nr in [1, 2]
1150 try
1151 echo "ok"
1152 try
1153 echo "deeper"
1154 catch
1155 continue
1156 endtry
1157 catch
1158 echo "not ok"
1159 endtry
1160 endfor
1161enddef
1162
1163def Test_disassemble_for_loop_continue()
1164 var instr = execute('disassemble ForLoopContinue')
1165 assert_match('ForLoopContinue\_s*' ..
1166 'for nr in \[1, 2]\_s*' ..
1167 '0 STORE -1 in $0\_s*' ..
1168 '1 PUSHNR 1\_s*' ..
1169 '2 PUSHNR 2\_s*' ..
1170 '3 NEWLIST size 2\_s*' ..
1171 '4 FOR $0 -> 22\_s*' ..
1172 '5 STORE $1\_s*' ..
1173 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001174 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001175 'echo "ok"\_s*' ..
1176 '7 PUSHS "ok"\_s*' ..
1177 '8 ECHO 1\_s*' ..
1178 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001179 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001180 'echo "deeper"\_s*' ..
1181 '10 PUSHS "deeper"\_s*' ..
1182 '11 ECHO 1\_s*' ..
1183 'catch\_s*' ..
1184 '12 JUMP -> 15\_s*' ..
1185 '13 CATCH\_s*' ..
1186 'continue\_s*' ..
1187 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1188 'endtry\_s*' ..
1189 '15 ENDTRY\_s*' ..
1190 'catch\_s*' ..
1191 '16 JUMP -> 20\_s*' ..
1192 '17 CATCH\_s*' ..
1193 'echo "not ok"\_s*' ..
1194 '18 PUSHS "not ok"\_s*' ..
1195 '19 ECHO 1\_s*' ..
1196 'endtry\_s*' ..
1197 '20 ENDTRY\_s*' ..
1198 'endfor\_s*' ..
1199 '21 JUMP -> 4\_s*' ..
1200 '\d\+ DROP\_s*' ..
1201 '\d\+ RETURN 0',
1202 instr)
1203enddef
1204
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001205let g:number = 42
1206
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001207def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001208 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001209enddef
1210
1211def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001212 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001213 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001214 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001215 '\d PUSHNR 23\_s*' ..
1216 '\d LOADG g:number\_s*' ..
1217 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1218 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001219 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001220 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001221 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001222 instr)
1223enddef
1224
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001225def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001226 var nr = 3
1227 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001228 nrres = nr - 7
1229 nrres = nr * 7
1230 nrres = nr / 7
1231 nrres = nr % 7
1232
Bram Moolenaarac564082020-09-27 19:05:33 +02001233 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001234 anyres = g:number - 7
1235 anyres = g:number * 7
1236 anyres = g:number / 7
1237 anyres = g:number % 7
1238
1239 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001240 var fl = 3.0
1241 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001242 flres = fl - 7.0
1243 flres = fl * 7.0
1244 flres = fl / 7.0
1245 endif
1246enddef
1247
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001248def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001249 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001250 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001251 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001252 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001254 '\d LOAD $0.*' ..
1255 '\d PUSHNR 7.*' ..
1256 '\d OPNR +.*' ..
1257 '\d STORE $1.*' ..
1258 'nrres = nr - 7.*' ..
1259 '\d OPNR -.*' ..
1260 'nrres = nr \* 7.*' ..
1261 '\d OPNR \*.*' ..
1262 'nrres = nr / 7.*' ..
1263 '\d OPNR /.*' ..
1264 'nrres = nr % 7.*' ..
1265 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001266 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001267 '\d LOADG g:number.*' ..
1268 '\d PUSHNR 7.*' ..
1269 '\d OPANY +.*' ..
1270 '\d STORE $2.*' ..
1271 'anyres = g:number - 7.*' ..
1272 '\d OPANY -.*' ..
1273 'anyres = g:number \* 7.*' ..
1274 '\d OPANY \*.*' ..
1275 'anyres = g:number / 7.*' ..
1276 '\d OPANY /.*' ..
1277 'anyres = g:number % 7.*' ..
1278 '\d OPANY %.*',
1279 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001280 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001281 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001282 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001283 '\d PUSHF 3.0.*' ..
1284 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001285 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001286 '\d LOAD $3.*' ..
1287 '\d PUSHF 7.0.*' ..
1288 '\d OPFLOAT +.*' ..
1289 '\d STORE $4.*' ..
1290 'flres = fl - 7.0.*' ..
1291 '\d OPFLOAT -.*' ..
1292 'flres = fl \* 7.0.*' ..
1293 '\d OPFLOAT \*.*' ..
1294 'flres = fl / 7.0.*' ..
1295 '\d OPFLOAT /.*',
1296 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001297 endif
1298enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001299
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001300def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001301 var reslist = [1, 2] + [3, 4]
1302 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001303enddef
1304
1305def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001306 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001307 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001308 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001309 '\d PUSHNR 1.*' ..
1310 '\d PUSHNR 2.*' ..
1311 '\d NEWLIST size 2.*' ..
1312 '\d PUSHNR 3.*' ..
1313 '\d PUSHNR 4.*' ..
1314 '\d NEWLIST size 2.*' ..
1315 '\d ADDLIST.*' ..
1316 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001318 '\d PUSHBLOB 0z1122.*' ..
1319 '\d PUSHBLOB 0z3344.*' ..
1320 '\d ADDBLOB.*' ..
1321 '\d STORE $.*',
1322 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001323enddef
1324
1325let g:aa = 'aa'
1326def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001327 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001328 return res
1329enddef
1330
1331def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001332 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001333 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001334 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001335 '\d LOADG g:aa.*' ..
1336 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001337 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001338 '\d CONCAT.*' ..
1339 '\d STORE $.*',
1340 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001341 assert_equal('aabb', ConcatString())
1342enddef
1343
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001344def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001345 var s = "abcd"
1346 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001347 return res
1348enddef
1349
1350def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001351 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001352 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001353 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001354 '\d PUSHS "abcd"\_s*' ..
1355 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001356 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001357 '\d LOAD $0\_s*' ..
1358 '\d PUSHNR 1\_s*' ..
1359 '\d STRINDEX\_s*' ..
1360 '\d STORE $1\_s*',
1361 instr)
1362 assert_equal('b', StringIndex())
1363enddef
1364
Bram Moolenaared591872020-08-15 22:14:53 +02001365def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001366 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001367 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001368 return res
1369enddef
1370
1371def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001372 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001373 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001374 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001375 '\d PUSHS "abcd"\_s*' ..
1376 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001377 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001378 '\d LOAD $0\_s*' ..
1379 '\d PUSHNR 1\_s*' ..
1380 '\d PUSHNR 8\_s*' ..
1381 '\d STRSLICE\_s*' ..
1382 '\d STORE $1\_s*',
1383 instr)
1384 assert_equal('bcd', StringSlice())
1385enddef
1386
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001387def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001388 var l = [1, 2, 3]
1389 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001390 return res
1391enddef
1392
1393def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001394 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001395 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001396 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001397 '\d PUSHNR 1\_s*' ..
1398 '\d PUSHNR 2\_s*' ..
1399 '\d PUSHNR 3\_s*' ..
1400 '\d NEWLIST size 3\_s*' ..
1401 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001402 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001403 '\d LOAD $0\_s*' ..
1404 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001405 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001406 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001407 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001408 assert_equal(2, ListIndex())
1409enddef
1410
Bram Moolenaared591872020-08-15 22:14:53 +02001411def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001412 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001413 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001414 return res
1415enddef
1416
1417def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001418 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001419 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001420 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001421 '\d PUSHNR 1\_s*' ..
1422 '\d PUSHNR 2\_s*' ..
1423 '\d PUSHNR 3\_s*' ..
1424 '\d NEWLIST size 3\_s*' ..
1425 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001426 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001427 '\d LOAD $0\_s*' ..
1428 '\d PUSHNR 1\_s*' ..
1429 '\d PUSHNR 8\_s*' ..
1430 '\d LISTSLICE\_s*' ..
1431 '\d STORE $1\_s*',
1432 instr)
1433 assert_equal([2, 3], ListSlice())
1434enddef
1435
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001436def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001437 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001438 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001439 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001440 return res
1441enddef
1442
1443def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001444 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001445 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001446 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001447 '\d PUSHS "item"\_s*' ..
1448 '\d PUSHNR 1\_s*' ..
1449 '\d NEWDICT size 1\_s*' ..
1450 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001451 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001452 '\d\+ LOAD $0\_s*' ..
1453 '\d\+ MEMBER item\_s*' ..
1454 '\d\+ STORE $1\_s*' ..
1455 'res = d\["item"\]\_s*' ..
1456 '\d\+ LOAD $0\_s*' ..
1457 '\d\+ PUSHS "item"\_s*' ..
1458 '\d\+ MEMBER\_s*' ..
1459 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001460 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001461 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001462enddef
1463
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001464let somelist = [1, 2, 3, 4, 5]
1465def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001466 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001467 return res
1468enddef
1469
1470def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001471 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001472 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001473 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001474 '\d LOADG g:somelist\_s*' ..
1475 '\d PUSHNR 2\_s*' ..
1476 '\d ANYINDEX\_s*' ..
1477 '\d STORE $0\_s*' ..
1478 'return res\_s*' ..
1479 '\d LOAD $0\_s*' ..
1480 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1481 '\d RETURN',
1482 instr)
1483 assert_equal(3, AnyIndex())
1484enddef
1485
1486def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001487 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001488 return res
1489enddef
1490
1491def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001492 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001493 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001494 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001495 '\d LOADG g:somelist\_s*' ..
1496 '\d PUSHNR 1\_s*' ..
1497 '\d PUSHNR 3\_s*' ..
1498 '\d ANYSLICE\_s*' ..
1499 '\d STORE $0\_s*' ..
1500 'return res\_s*' ..
1501 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001502 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001503 '\d RETURN',
1504 instr)
1505 assert_equal([2, 3, 4], AnySlice())
1506enddef
1507
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001508def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001509 var nr = 9
1510 var plus = +nr
1511 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001512 return res
1513enddef
1514
1515def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001516 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001517 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001518 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001519 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001520 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001521 '\d LOAD $0\_s*' ..
1522 '\d CHECKNR\_s*' ..
1523 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001524 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001525 '\d LOAD $0\_s*' ..
1526 '\d NEGATENR\_s*' ..
1527 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001528 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001529 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001530enddef
1531
1532def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001533 var flag = true
1534 var invert = !flag
1535 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001536 return res
1537enddef
1538
1539def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001540 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001541 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001542 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001543 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001544 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001545 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001546 '\d LOAD $0\_s*' ..
1547 '\d INVERT (!val)\_s*' ..
1548 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001549 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001550 '\d LOAD $0\_s*' ..
1551 '\d 2BOOL (!!val)\_s*' ..
1552 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001553 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001554 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001555enddef
1556
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001557def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001558 var name: bool = 1 && 0 || 1
1559 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001560enddef
1561
1562def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001563 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001564 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001565 'var name: bool = 1 && 0 || 1\_s*' ..
1566 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001567 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001568 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1569 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001570 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001571 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1572 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001573 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001574 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001575 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001576 '\d\+ LOAD $0\_s*' ..
1577 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001578 instr)
1579 assert_equal(true, InvertBool())
1580enddef
1581
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001582def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001583 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001584 ['true == isFalse', 'COMPAREBOOL =='],
1585 ['true != isFalse', 'COMPAREBOOL !='],
1586 ['v:none == isNull', 'COMPARESPECIAL =='],
1587 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001588
Bram Moolenaara5565e42020-05-09 15:44:01 +02001589 ['111 == aNumber', 'COMPARENR =='],
1590 ['111 != aNumber', 'COMPARENR !='],
1591 ['111 > aNumber', 'COMPARENR >'],
1592 ['111 < aNumber', 'COMPARENR <'],
1593 ['111 >= aNumber', 'COMPARENR >='],
1594 ['111 <= aNumber', 'COMPARENR <='],
1595 ['111 =~ aNumber', 'COMPARENR =\~'],
1596 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001597
Bram Moolenaara5565e42020-05-09 15:44:01 +02001598 ['"xx" != aString', 'COMPARESTRING !='],
1599 ['"xx" > aString', 'COMPARESTRING >'],
1600 ['"xx" < aString', 'COMPARESTRING <'],
1601 ['"xx" >= aString', 'COMPARESTRING >='],
1602 ['"xx" <= aString', 'COMPARESTRING <='],
1603 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1604 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1605 ['"xx" is aString', 'COMPARESTRING is'],
1606 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001607
Bram Moolenaara5565e42020-05-09 15:44:01 +02001608 ['0z11 == aBlob', 'COMPAREBLOB =='],
1609 ['0z11 != aBlob', 'COMPAREBLOB !='],
1610 ['0z11 is aBlob', 'COMPAREBLOB is'],
1611 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001612
Bram Moolenaara5565e42020-05-09 15:44:01 +02001613 ['[1, 2] == aList', 'COMPARELIST =='],
1614 ['[1, 2] != aList', 'COMPARELIST !='],
1615 ['[1, 2] is aList', 'COMPARELIST is'],
1616 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001617
Bram Moolenaare0de1712020-12-02 17:36:54 +01001618 ['{a: 1} == aDict', 'COMPAREDICT =='],
1619 ['{a: 1} != aDict', 'COMPAREDICT !='],
1620 ['{a: 1} is aDict', 'COMPAREDICT is'],
1621 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001622
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001623 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1624 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1625 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1626 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001627
1628 ['77 == g:xx', 'COMPAREANY =='],
1629 ['77 != g:xx', 'COMPAREANY !='],
1630 ['77 > g:xx', 'COMPAREANY >'],
1631 ['77 < g:xx', 'COMPAREANY <'],
1632 ['77 >= g:xx', 'COMPAREANY >='],
1633 ['77 <= g:xx', 'COMPAREANY <='],
1634 ['77 =~ g:xx', 'COMPAREANY =\~'],
1635 ['77 !~ g:xx', 'COMPAREANY !\~'],
1636 ['77 is g:xx', 'COMPAREANY is'],
1637 ['77 isnot g:xx', 'COMPAREANY isnot'],
1638 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001639 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001640 if has('float')
1641 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001642 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1643 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1644 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1645 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1646 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1647 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1648 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1649 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001650 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001651 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001652 endif
1653
Bram Moolenaarac564082020-09-27 19:05:33 +02001654 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001655 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001656 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001657 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001658 ' var isFalse = false',
1659 ' var isNull = v:null',
1660 ' var aNumber = 222',
1661 ' var aString = "yy"',
1662 ' var aBlob = 0z22',
1663 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001664 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001665 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001666 ' if ' .. case[0],
1667 ' echo 42'
1668 ' endif',
1669 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001670 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001671 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001672 assert_match('TestCase' .. nr .. '.*' ..
1673 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1674 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001675 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001676 '\d ' .. case[1] .. '.*' ..
1677 '\d JUMP_IF_FALSE -> \d\+.*',
1678 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001679
1680 nr += 1
1681 endfor
1682
Bram Moolenaar22da5592020-03-19 14:52:20 +01001683 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001684enddef
1685
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001686def s:FalsyOp()
1687 echo g:flag ?? "yes"
1688 echo [] ?? "empty list"
1689 echo "" ?? "empty string"
1690enddef
1691
1692def Test_dsassemble_falsy_op()
1693 var res = execute('disass s:FalsyOp')
1694 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1695 'echo g:flag ?? "yes"\_s*' ..
1696 '0 LOADG g:flag\_s*' ..
1697 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1698 '2 PUSHS "yes"\_s*' ..
1699 '3 ECHO 1\_s*' ..
1700 'echo \[\] ?? "empty list"\_s*' ..
1701 '4 NEWLIST size 0\_s*' ..
1702 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1703 '6 PUSHS "empty list"\_s*' ..
1704 '7 ECHO 1\_s*' ..
1705 'echo "" ?? "empty string"\_s*' ..
1706 '\d\+ PUSHS "empty string"\_s*' ..
1707 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001708 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001709 res)
1710enddef
1711
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001712def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001713 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001714 ['"xx" == "yy"', false],
1715 ['"aa" == "aa"', true],
1716 ['has("eval") ? true : false', true],
1717 ['has("asdf") ? true : false', false],
1718 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001719
Bram Moolenaarac564082020-09-27 19:05:33 +02001720 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001721 for case in cases
1722 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001723 ' if ' .. case[0],
1724 ' echo 42'
1725 ' endif',
1726 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001727 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001728 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001729 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001730 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001731 assert_match('TestCase' .. nr .. '.*' ..
1732 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1733 '\d PUSHNR 42.*' ..
1734 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001735 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001736 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001737 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001738 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001739 assert_match('TestCase' .. nr .. '.*' ..
1740 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1741 'echo 42[ \n]*' ..
1742 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001743 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001744 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001745 endif
1746
1747 nr += 1
1748 endfor
1749
1750 delete('Xdisassemble')
1751enddef
1752
Bram Moolenaarad39c092020-02-26 18:23:43 +01001753def s:Execute()
1754 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001755 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001756 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001758 execute 'help ' .. tag
1759enddef
1760
1761def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001762 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001763 assert_match('\<SNR>\d*_Execute\_s*' ..
1764 "execute 'help vim9.txt'\\_s*" ..
1765 '\d PUSHS "help vim9.txt"\_s*' ..
1766 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001767 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001768 '\d PUSHS "help vim9.txt"\_s*' ..
1769 '\d STORE $0\_s*' ..
1770 'execute cmd\_s*' ..
1771 '\d LOAD $0\_s*' ..
1772 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001773 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001774 '\d PUSHS "vim9.txt"\_s*' ..
1775 '\d STORE $1\_s*' ..
1776 "execute 'help ' .. tag\\_s*" ..
1777 '\d\+ PUSHS "help "\_s*' ..
1778 '\d\+ LOAD $1\_s*' ..
1779 '\d\+ CONCAT\_s*' ..
1780 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001781 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001782 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001783enddef
1784
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001785def s:Echomsg()
1786 echomsg 'some' 'message'
1787 echoerr 'went' .. 'wrong'
1788enddef
1789
1790def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001791 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001792 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1793 "echomsg 'some' 'message'\\_s*" ..
1794 '\d PUSHS "some"\_s*' ..
1795 '\d PUSHS "message"\_s*' ..
1796 '\d ECHOMSG 2\_s*' ..
1797 "echoerr 'went' .. 'wrong'\\_s*" ..
1798 '\d PUSHS "wentwrong"\_s*' ..
1799 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001800 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001801 res)
1802enddef
1803
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001804def SomeStringArg(arg: string)
1805 echo arg
1806enddef
1807
1808def SomeAnyArg(arg: any)
1809 echo arg
1810enddef
1811
1812def SomeStringArgAndReturn(arg: string): string
1813 return arg
1814enddef
1815
1816def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001817 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001818 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1819 '\d *echo arg.*' ..
1820 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001821 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001822
Bram Moolenaarac564082020-09-27 19:05:33 +02001823 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001824 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1825 '\d *echo arg\_s*' ..
1826 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001827 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001828
Bram Moolenaarac564082020-09-27 19:05:33 +02001829 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001830 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1831 '\d *return arg\_s*' ..
1832 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001833 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001834enddef
1835
Bram Moolenaar09689a02020-05-09 22:50:08 +02001836def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001837 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001838 vim9script
1839 def FuncOne(): string
1840 return FuncTwo()
1841 enddef
1842 def FuncTwo(): string
1843 return 'two'
1844 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001845 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001846 END
1847 writefile(lines, 'Xdisassemble')
1848 source Xdisassemble
1849
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001850 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001851 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1852 'return FuncTwo()\_s*' ..
1853 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001854 '\d RETURN',
1855 g:res_FuncOne)
1856
1857 delete('Xdisassemble')
1858 unlet g:res_FuncOne
1859enddef
1860
Bram Moolenaar61a89812020-05-07 16:58:17 +02001861def s:ConcatStrings(): string
1862 return 'one' .. 'two' .. 'three'
1863enddef
1864
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001865def s:ComputeConst(): number
1866 return 2 + 3 * 4 / 6 + 7
1867enddef
1868
Bram Moolenaar1c747212020-05-09 18:28:34 +02001869def s:ComputeConstParen(): number
1870 return ((2 + 4) * (8 / 2)) / (3 + 4)
1871enddef
1872
Bram Moolenaar61a89812020-05-07 16:58:17 +02001873def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001874 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001875 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1876 "return 'one' .. 'two' .. 'three'\\_s*" ..
1877 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001878 '\d RETURN',
1879 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001880
1881 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001882 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1883 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1884 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001885 '\d RETURN',
1886 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001887
1888 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001889 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1890 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1891 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001892 '\d RETURN',
1893 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001894enddef
1895
Bram Moolenaar389df252020-07-09 21:20:47 +02001896def s:CallAppend()
1897 eval "some text"->append(2)
1898enddef
1899
1900def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001901 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001902 assert_match('<SNR>\d*_CallAppend\_s*' ..
1903 'eval "some text"->append(2)\_s*' ..
1904 '\d PUSHS "some text"\_s*' ..
1905 '\d PUSHNR 2\_s*' ..
1906 '\d SHUFFLE 2 up 1\_s*' ..
1907 '\d BCALL append(argc 2)\_s*' ..
1908 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001909 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001910 res)
1911enddef
1912
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001913
1914def s:SilentMessage()
1915 silent echomsg "text"
1916 silent! echoerr "error"
1917enddef
1918
1919def Test_silent()
1920 var res = execute('disass s:SilentMessage')
1921 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1922 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001923 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001924 '\d PUSHS "text"\_s*' ..
1925 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001926 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001927 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001928 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001929 '\d PUSHS "error"\_s*' ..
1930 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001931 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001932 '\d\+ RETURN 0',
1933 res)
1934enddef
1935
1936def s:SilentIf()
1937 silent if 4 == g:five
1938 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001939 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001940enddef
1941
1942def Test_silent_if()
1943 var res = execute('disass s:SilentIf')
1944 assert_match('<SNR>\d*_SilentIf\_s*' ..
1945 'silent if 4 == g:five\_s*' ..
1946 '\d\+ CMDMOD silent\_s*' ..
1947 '\d\+ PUSHNR 4\_s*' ..
1948 '\d\+ LOADG g:five\_s*' ..
1949 '\d\+ COMPAREANY ==\_s*' ..
1950 '\d\+ CMDMOD_REV\_s*' ..
1951 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1952 'silent elseif 4 == g:five\_s*' ..
1953 '\d\+ JUMP -> \d\+\_s*' ..
1954 '\d\+ CMDMOD silent\_s*' ..
1955 '\d\+ PUSHNR 4\_s*' ..
1956 '\d\+ LOADG g:five\_s*' ..
1957 '\d\+ COMPAREANY ==\_s*' ..
1958 '\d\+ CMDMOD_REV\_s*' ..
1959 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001960 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001961 '\d\+ RETURN 0',
1962 res)
1963enddef
1964
1965def s:SilentFor()
1966 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01001967 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01001968enddef
1969
1970def Test_silent_for()
1971 var res = execute('disass s:SilentFor')
1972 assert_match('<SNR>\d*_SilentFor\_s*' ..
1973 'silent for i in \[0\]\_s*' ..
1974 '\d CMDMOD silent\_s*' ..
1975 '\d STORE -1 in $0\_s*' ..
1976 '\d PUSHNR 0\_s*' ..
1977 '\d NEWLIST size 1\_s*' ..
1978 '\d CMDMOD_REV\_s*' ..
1979 '5 FOR $0 -> 8\_s*' ..
1980 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001981 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001982 '\d JUMP -> 5\_s*' ..
1983 '8 DROP\_s*' ..
1984 '\d RETURN 0\_s*',
1985 res)
1986enddef
1987
1988def s:SilentWhile()
1989 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01001990 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01001991enddef
1992
1993def Test_silent_while()
1994 var res = execute('disass s:SilentWhile')
1995 assert_match('<SNR>\d*_SilentWhile\_s*' ..
1996 'silent while g:not\_s*' ..
1997 '0 CMDMOD silent\_s*' ..
1998 '\d LOADG g:not\_s*' ..
1999 '\d COND2BOOL\_s*' ..
2000 '\d CMDMOD_REV\_s*' ..
2001 '\d JUMP_IF_FALSE -> 6\_s*' ..
2002
Bram Moolenaarfa984412021-03-25 22:15:28 +01002003 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01002004 '\d JUMP -> 0\_s*' ..
2005 '6 RETURN 0\_s*',
2006 res)
2007enddef
2008
2009def s:SilentReturn(): string
2010 silent return "done"
2011enddef
2012
2013def Test_silent_return()
2014 var res = execute('disass s:SilentReturn')
2015 assert_match('<SNR>\d*_SilentReturn\_s*' ..
2016 'silent return "done"\_s*' ..
2017 '\d CMDMOD silent\_s*' ..
2018 '\d PUSHS "done"\_s*' ..
2019 '\d CMDMOD_REV\_s*' ..
2020 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02002021 res)
2022enddef
2023
Bram Moolenaarb2049902021-01-24 12:53:53 +01002024def s:Profiled(): string
2025 echo "profiled"
2026 return "done"
2027enddef
2028
2029def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002030 if !has('profile')
2031 MissingFeature 'profile'
2032 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002033 var res = execute('disass! s:Profiled')
2034 assert_match('<SNR>\d*_Profiled\_s*' ..
2035 'echo "profiled"\_s*' ..
2036 '\d PROFILE START line 1\_s*' ..
2037 '\d PUSHS "profiled"\_s*' ..
2038 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002039 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002040 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002041 '\d PROFILE START line 2\_s*' ..
2042 '\d PUSHS "done"\_s*' ..
2043 '\d RETURN\_s*' ..
2044 '\d PROFILE END',
2045 res)
2046enddef
2047
Bram Moolenaarf62d7392021-04-14 12:40:00 +02002048def s:EchoMessages()
2049 echohl ErrorMsg | echom v:exception | echohl NONE
2050enddef
2051
2052def Test_disassemble_nextcmd()
2053 # splitting commands and removing trailing blanks should not change the line
2054 var res = execute('disass s:EchoMessages')
2055 assert_match('<SNR>\d*_EchoMessages\_s*' ..
2056 'echohl ErrorMsg | echom v:exception | echohl NONE',
2057 res)
2058enddef
2059
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002060
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002061" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker