blob: 7470ac3ce7b4f44cca548efd261401df56ea2c1c [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 Moolenaard72c1bf2020-04-19 16:28:59 +0200389def s:ScriptFuncUnlet()
390 g:somevar = "value"
391 unlet g:somevar
392 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200393 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200394enddef
395
396def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200397 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200398 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
399 'g:somevar = "value"\_s*' ..
400 '\d PUSHS "value"\_s*' ..
401 '\d STOREG g:somevar\_s*' ..
402 'unlet g:somevar\_s*' ..
403 '\d UNLET g:somevar\_s*' ..
404 'unlet! g:somevar\_s*' ..
405 '\d UNLET! g:somevar\_s*' ..
406 'unlet $SOMEVAR\_s*' ..
407 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200408 res)
409enddef
410
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100411def s:ScriptFuncTry()
412 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200413 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100414 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200415 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100416 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200417 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100418 endtry
419enddef
420
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100421def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200422 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200423 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
424 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100425 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200426 'echo "yes"\_s*' ..
427 '\d PUSHS "yes"\_s*' ..
428 '\d ECHO 1\_s*' ..
429 'catch /fail/\_s*' ..
430 '\d JUMP -> \d\+\_s*' ..
431 '\d PUSH v:exception\_s*' ..
432 '\d PUSHS "fail"\_s*' ..
433 '\d COMPARESTRING =\~\_s*' ..
434 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
435 '\d CATCH\_s*' ..
436 'echo "no"\_s*' ..
437 '\d\+ PUSHS "no"\_s*' ..
438 '\d\+ ECHO 1\_s*' ..
439 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100440 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200441 'throw "end"\_s*' ..
442 '\d\+ PUSHS "end"\_s*' ..
443 '\d\+ THROW\_s*' ..
444 'endtry\_s*' ..
445 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200446 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100447enddef
448
449def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200450 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100451 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100452enddef
453
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100454def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200455 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200456 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200457 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200458 '\d PUSHNR 1\_s*' ..
459 '\d PUSHS "two"\_s*' ..
460 '\d PUSHNR 333\_s*' ..
461 '\d NEWLIST size 3\_s*' ..
462 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100463 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200464 '\d PUSHS "one"\_s*' ..
465 '\d PUSHNR 1\_s*' ..
466 '\d PUSHS "two"\_s*' ..
467 '\d PUSHS "val"\_s*' ..
468 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200469 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100470enddef
471
Bram Moolenaar6e949782020-04-13 17:21:00 +0200472def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100473 echo arg
474enddef
475
476func UserFunc()
477 echo 'nothing'
478endfunc
479
480func UserFuncWithArg(arg)
481 echo a:arg
482endfunc
483
484def s:ScriptFuncCall(): string
485 changenr()
486 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100487 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100488 FuncWithArg(343)
489 ScriptFuncNew()
490 s:ScriptFuncNew()
491 UserFunc()
492 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200493 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100494 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200495 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100496 FuncRefWithArg("bar")
497 return "yes"
498enddef
499
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100500def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200501 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200502 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
503 'changenr()\_s*' ..
504 '\d BCALL changenr(argc 0)\_s*' ..
505 '\d DROP\_s*' ..
506 'char2nr("abc")\_s*' ..
507 '\d PUSHS "abc"\_s*' ..
508 '\d BCALL char2nr(argc 1)\_s*' ..
509 '\d DROP\_s*' ..
510 'Test_disassemble_new()\_s*' ..
511 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
512 '\d DROP\_s*' ..
513 'FuncWithArg(343)\_s*' ..
514 '\d\+ PUSHNR 343\_s*' ..
515 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
516 '\d\+ DROP\_s*' ..
517 'ScriptFuncNew()\_s*' ..
518 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
519 '\d\+ DROP\_s*' ..
520 's:ScriptFuncNew()\_s*' ..
521 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
522 '\d\+ DROP\_s*' ..
523 'UserFunc()\_s*' ..
524 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
525 '\d\+ DROP\_s*' ..
526 'UserFuncWithArg("foo")\_s*' ..
527 '\d\+ PUSHS "foo"\_s*' ..
528 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
529 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200530 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200531 '\d\+ PUSHS "UserFunc"\_s*' ..
532 '\d\+ BCALL function(argc 1)\_s*' ..
533 '\d\+ STORE $0\_s*' ..
534 'FuncRef()\_s*' ..
535 '\d\+ LOAD $\d\_s*' ..
536 '\d\+ PCALL (argc 0)\_s*' ..
537 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200538 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200539 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
540 '\d\+ BCALL function(argc 1)\_s*' ..
541 '\d\+ STORE $1\_s*' ..
542 'FuncRefWithArg("bar")\_s*' ..
543 '\d\+ PUSHS "bar"\_s*' ..
544 '\d\+ LOAD $\d\_s*' ..
545 '\d\+ PCALL (argc 1)\_s*' ..
546 '\d\+ DROP\_s*' ..
547 'return "yes"\_s*' ..
548 '\d\+ PUSHS "yes"\_s*' ..
549 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200550 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100551enddef
552
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200553
554def s:CreateRefs()
555 var local = 'a'
556 def Append(arg: string)
557 local ..= arg
558 enddef
559 g:Append = Append
560 def Get(): string
561 return local
562 enddef
563 g:Get = Get
564enddef
565
566def Test_disassemble_closure()
567 CreateRefs()
568 var res = execute('disass g:Append')
569 assert_match('<lambda>\d\_s*' ..
570 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100571 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200572 '\d LOAD arg\[-1\]\_s*' ..
573 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100574 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100575 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200576 res)
577
578 res = execute('disass g:Get')
579 assert_match('<lambda>\d\_s*' ..
580 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100581 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200582 '\d RETURN',
583 res)
584
585 unlet g:Append
586 unlet g:Get
587enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200588
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100589
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200590def EchoArg(arg: string): string
591 return arg
592enddef
593def RefThis(): func
594 return function('EchoArg')
595enddef
596def s:ScriptPCall()
597 RefThis()("text")
598enddef
599
600def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200601 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200602 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
603 'RefThis()("text")\_s*' ..
604 '\d DCALL RefThis(argc 0)\_s*' ..
605 '\d PUSHS "text"\_s*' ..
606 '\d PCALL top (argc 1)\_s*' ..
607 '\d PCALL end\_s*' ..
608 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100609 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200610 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200611enddef
612
613
Bram Moolenaara26b9702020-04-18 19:53:28 +0200614def s:FuncWithForwardCall(): string
615 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100616enddef
617
618def DefinedLater(arg: string): string
619 return arg
620enddef
621
622def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200623 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200624 assert_match('FuncWithForwardCall\_s*' ..
625 'return g:DefinedLater("yes")\_s*' ..
626 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200627 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200628 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200629 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100630
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200631 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100632 assert_equal('yes', FuncWithForwardCall())
633
Bram Moolenaara26b9702020-04-18 19:53:28 +0200634 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200635 assert_match('FuncWithForwardCall\_s*' ..
636 'return g:DefinedLater("yes")\_s*' ..
637 '\d PUSHS "yes"\_s*' ..
638 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200639 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200640 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100641enddef
642
643
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100644def FuncWithDefault(arg: string = 'default'): string
645 return arg
646enddef
647
648def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200649 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200650 assert_match('FuncWithDefault\_s*' ..
651 '\d PUSHS "default"\_s*' ..
652 '\d STORE arg\[-1]\_s*' ..
653 'return arg\_s*' ..
654 '\d LOAD arg\[-1]\_s*' ..
655 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200656 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100657enddef
658
659
Bram Moolenaar158906c2020-02-06 20:39:45 +0100660def HasEval()
661 if has("eval")
662 echo "yes"
663 else
664 echo "no"
665 endif
666enddef
667
668def HasNothing()
669 if has("nothing")
670 echo "yes"
671 else
672 echo "no"
673 endif
674enddef
675
676def HasSomething()
677 if has("nothing")
678 echo "nothing"
679 elseif has("something")
680 echo "something"
681 elseif has("eval")
682 echo "eval"
683 elseif has("less")
684 echo "less"
685 endif
686enddef
687
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100688def HasGuiRunning()
689 if has("gui_running")
690 echo "yes"
691 else
692 echo "no"
693 endif
694enddef
695
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100696def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200697 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200698 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200699 assert_match('HasEval\_s*' ..
700 'if has("eval")\_s*' ..
701 'echo "yes"\_s*' ..
702 '\d PUSHS "yes"\_s*' ..
703 '\d ECHO 1\_s*' ..
704 'else\_s*' ..
705 'echo "no"\_s*' ..
706 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200707 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100708 assert_notmatch('JUMP', instr)
709
Bram Moolenaard2c61702020-09-06 15:58:36 +0200710 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100711 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200712 assert_match('HasNothing\_s*' ..
713 'if has("nothing")\_s*' ..
714 'echo "yes"\_s*' ..
715 'else\_s*' ..
716 'echo "no"\_s*' ..
717 '\d PUSHS "no"\_s*' ..
718 '\d ECHO 1\_s*' ..
719 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200720 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100721 assert_notmatch('PUSHS "yes"', instr)
722 assert_notmatch('JUMP', instr)
723
Bram Moolenaard2c61702020-09-06 15:58:36 +0200724 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100725 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200726 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200727 'if has("nothing")\_s*' ..
728 'echo "nothing"\_s*' ..
729 'elseif has("something")\_s*' ..
730 'echo "something"\_s*' ..
731 'elseif has("eval")\_s*' ..
732 'echo "eval"\_s*' ..
733 '\d PUSHS "eval"\_s*' ..
734 '\d ECHO 1\_s*' ..
735 'elseif has("less").*' ..
736 'echo "less"\_s*' ..
737 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200738 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100739 assert_notmatch('PUSHS "nothing"', instr)
740 assert_notmatch('PUSHS "something"', instr)
741 assert_notmatch('PUSHS "less"', instr)
742 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100743
744 var result: string
745 var instr_expected: string
746 if has('gui')
747 if has('gui_running')
748 # GUI already running, always returns "yes"
749 result = "\nyes"
750 instr_expected = 'HasGuiRunning.*' ..
751 'if has("gui_running")\_s*' ..
752 ' echo "yes"\_s*' ..
753 '\d PUSHS "yes"\_s*' ..
754 '\d ECHO 1\_s*' ..
755 'else\_s*' ..
756 ' echo "no"\_s*' ..
757 'endif'
758 else
759 result = "\nno"
760 if has('unix')
761 # GUI not running but can start later, call has()
762 instr_expected = 'HasGuiRunning.*' ..
763 'if has("gui_running")\_s*' ..
764 '\d PUSHS "gui_running"\_s*' ..
765 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaar3af15ab2021-01-17 16:16:23 +0100766 '\d 2BOOL (!!val)\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100767 '\d JUMP_IF_FALSE -> \d\_s*' ..
768 ' echo "yes"\_s*' ..
769 '\d PUSHS "yes"\_s*' ..
770 '\d ECHO 1\_s*' ..
771 'else\_s*' ..
772 '\d JUMP -> \d\_s*' ..
773 ' echo "no"\_s*' ..
774 '\d PUSHS "no"\_s*' ..
775 '\d ECHO 1\_s*' ..
776 'endif'
777 else
778 # GUI not running, always return "no"
779 instr_expected = 'HasGuiRunning.*' ..
780 'if has("gui_running")\_s*' ..
781 ' echo "yes"\_s*' ..
782 'else\_s*' ..
783 ' echo "no"\_s*' ..
784 '\d PUSHS "no"\_s*' ..
785 '\d ECHO 1\_s*' ..
786 'endif'
787 endif
788 endif
789 else
790 # GUI not supported, always return "no"
791 result = "\nno"
792 instr_expected = 'HasGuiRunning.*' ..
793 'if has("gui_running")\_s*' ..
794 ' echo "yes"\_s*' ..
795 'else\_s*' ..
796 ' echo "no"\_s*' ..
797 '\d PUSHS "no"\_s*' ..
798 '\d ECHO 1\_s*' ..
799 'endif'
800 endif
801
802 assert_equal(result, execute('HasGuiRunning()'))
803 instr = execute('disassemble HasGuiRunning')
804 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100805enddef
806
Bram Moolenaarefd88552020-06-18 20:50:10 +0200807def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100808 if 1 < 0
809 return "maybe"
810 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200811 if g:cond
812 return "yes"
813 else
814 return "no"
815 endif
816enddef
817
818def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200819 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200820 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100821 'if 1 < 0\_s*' ..
822 ' return "maybe"\_s*' ..
823 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200824 'if g:cond\_s*' ..
825 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100826 '1 COND2BOOL\_s*' ..
827 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200828 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100829 '3 PUSHS "yes"\_s*' ..
830 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200831 'else\_s*' ..
832 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100833 '5 PUSHS "no"\_s*' ..
834 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200835 instr)
836enddef
837
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100838def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200839 var Funky1: func
840 var Funky2: func = function("len")
841 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100842enddef
843
844def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200845 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200846 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200847 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200848 '0 PUSHFUNC "\[none]"\_s*' ..
849 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200850 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200851 '2 PUSHS "len"\_s*' ..
852 '3 BCALL function(argc 1)\_s*' ..
853 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200855 '\d PUSHS "UserFunc"\_s*' ..
856 '\d BCALL funcref(argc 1)\_s*' ..
857 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100858 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200859 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100860enddef
861
862if has('channel')
863 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200864 var job1: job
865 var job2: job = job_start("donothing")
866 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100867 enddef
868endif
869
870def Test_disassemble_channel()
871 CheckFeature channel
872
Bram Moolenaarac564082020-09-27 19:05:33 +0200873 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200874 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200875 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200876 '\d PUSHJOB "no process"\_s*' ..
877 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200878 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200879 '\d PUSHS "donothing"\_s*' ..
880 '\d BCALL job_start(argc 1)\_s*' ..
881 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200882 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200883 '\d PUSHCHANNEL 0\_s*' ..
884 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100885 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200886 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100887enddef
888
Bram Moolenaar777770f2020-02-06 21:27:08 +0100889def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100890 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100891 return F("x")
892enddef
893
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100894def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100895 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200896 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200897 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100898 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200899 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200900 '\d STORE $0\_s*' ..
901 'return F("x")\_s*' ..
902 '\d PUSHS "x"\_s*' ..
903 '\d LOAD $0\_s*' ..
904 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200905 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200906 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200907
Bram Moolenaarac564082020-09-27 19:05:33 +0200908 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200909 instr = execute('disassemble ' .. name)
910 assert_match('<lambda>\d\+\_s*' ..
911 'return "X" .. a .. "X"\_s*' ..
912 '\d PUSHS "X"\_s*' ..
913 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200914 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200915 '\d CONCAT\_s*' ..
916 '\d PUSHS "X"\_s*' ..
917 '\d CONCAT\_s*' ..
918 '\d RETURN',
919 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100920enddef
921
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100922def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100923 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100924 return Ref(g:value)
925enddef
926
927def Test_disassemble_lambda_with_type()
928 g:value = 5
929 assert_equal(15, LambdaWithType())
930 var instr = execute('disassemble LambdaWithType')
931 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100932 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100933 '\d FUNCREF <lambda>\d\+\_s*' ..
934 '\d STORE $0\_s*' ..
935 'return Ref(g:value)\_s*' ..
936 '\d LOADG g:value\_s*' ..
937 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +0100938 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100939 '\d PCALL (argc 1)\_s*' ..
940 '\d RETURN',
941 instr)
942enddef
943
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200944def NestedOuter()
945 def g:Inner()
946 echomsg "inner"
947 enddef
948enddef
949
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100950def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200951 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200952 assert_match('NestedOuter\_s*' ..
953 'def g:Inner()\_s*' ..
954 'echomsg "inner"\_s*' ..
955 'enddef\_s*' ..
956 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100957 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200958 instr)
959enddef
960
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100961def NestedDefList()
962 def
963 def Info
964 def /Info
965 def /Info/
966enddef
967
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100968def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100969 var instr = execute('disassemble NestedDefList')
970 assert_match('NestedDefList\_s*' ..
971 'def\_s*' ..
972 '\d DEF \_s*' ..
973 'def Info\_s*' ..
974 '\d DEF Info\_s*' ..
975 'def /Info\_s*' ..
976 '\d DEF /Info\_s*' ..
977 'def /Info/\_s*' ..
978 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100979 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100980 instr)
981enddef
982
Bram Moolenaar6e949782020-04-13 17:21:00 +0200983def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100984 if arg == 1 && arg != 2 || arg == 4
985 return 'yes'
986 endif
987 return 'no'
988enddef
989
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100990def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100991 assert_equal("yes", AndOr(1))
992 assert_equal("no", AndOr(2))
993 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200994 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200995 assert_match('AndOr\_s*' ..
996 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
997 '\d LOAD arg\[-1]\_s*' ..
998 '\d PUSHNR 1\_s*' ..
999 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001000 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001001 '\d LOAD arg\[-1]\_s*' ..
1002 '\d PUSHNR 2\_s*' ..
1003 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001004 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001005 '\d LOAD arg\[-1]\_s*' ..
1006 '\d\+ PUSHNR 4\_s*' ..
1007 '\d\+ COMPAREANY ==\_s*' ..
1008 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001009 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001010enddef
1011
Bram Moolenaar04d05222020-02-06 22:06:54 +01001012def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001013 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001014 for i in range(3)
1015 res->add(i)
1016 endfor
1017 return res
1018enddef
1019
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001020def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001021 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001022 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001023 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001024 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001025 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001026 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001027 '\d STORE $0\_s*' ..
1028 'for i in range(3)\_s*' ..
1029 '\d STORE -1 in $1\_s*' ..
1030 '\d PUSHNR 3\_s*' ..
1031 '\d BCALL range(argc 1)\_s*' ..
1032 '\d FOR $1 -> \d\+\_s*' ..
1033 '\d STORE $2\_s*' ..
1034 'res->add(i)\_s*' ..
1035 '\d LOAD $0\_s*' ..
1036 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001037 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001038 '\d\+ DROP\_s*' ..
1039 'endfor\_s*' ..
1040 '\d\+ JUMP -> \d\+\_s*' ..
1041 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001042 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001043enddef
1044
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001045def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001046 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001047 for str in eval('["one", "two"]')
1048 res ..= str
1049 endfor
1050 return res
1051enddef
1052
1053def Test_disassemble_for_loop_eval()
1054 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001055 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001056 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001057 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001058 '\d PUSHS ""\_s*' ..
1059 '\d STORE $0\_s*' ..
1060 'for str in eval(''\["one", "two"\]'')\_s*' ..
1061 '\d STORE -1 in $1\_s*' ..
1062 '\d PUSHS "\["one", "two"\]"\_s*' ..
1063 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001064 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001065 '\d FOR $1 -> \d\+\_s*' ..
1066 '\d STORE $2\_s*' ..
1067 'res ..= str\_s*' ..
1068 '\d\+ LOAD $0\_s*' ..
1069 '\d\+ LOAD $2\_s*' ..
1070 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1071 '\d\+ CONCAT\_s*' ..
1072 '\d\+ STORE $0\_s*' ..
1073 'endfor\_s*' ..
1074 '\d\+ JUMP -> 6\_s*' ..
1075 '\d\+ DROP\_s*' ..
1076 'return res\_s*' ..
1077 '\d\+ LOAD $0\_s*' ..
1078 '\d\+ RETURN',
1079 instr)
1080enddef
1081
Bram Moolenaar792f7862020-11-23 08:31:18 +01001082def ForLoopUnpack()
1083 for [x1, x2] in [[1, 2], [3, 4]]
1084 echo x1 x2
1085 endfor
1086enddef
1087
1088def Test_disassemble_for_loop_unpack()
1089 var instr = execute('disassemble ForLoopUnpack')
1090 assert_match('ForLoopUnpack\_s*' ..
1091 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1092 '\d\+ STORE -1 in $0\_s*' ..
1093 '\d\+ PUSHNR 1\_s*' ..
1094 '\d\+ PUSHNR 2\_s*' ..
1095 '\d\+ NEWLIST size 2\_s*' ..
1096 '\d\+ PUSHNR 3\_s*' ..
1097 '\d\+ PUSHNR 4\_s*' ..
1098 '\d\+ NEWLIST size 2\_s*' ..
1099 '\d\+ NEWLIST size 2\_s*' ..
1100 '\d\+ FOR $0 -> 16\_s*' ..
1101 '\d\+ UNPACK 2\_s*' ..
1102 '\d\+ STORE $1\_s*' ..
1103 '\d\+ STORE $2\_s*' ..
1104 'echo x1 x2\_s*' ..
1105 '\d\+ LOAD $1\_s*' ..
1106 '\d\+ LOAD $2\_s*' ..
1107 '\d\+ ECHO 2\_s*' ..
1108 'endfor\_s*' ..
1109 '\d\+ JUMP -> 8\_s*' ..
1110 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001111 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001112 instr)
1113enddef
1114
Bram Moolenaarc150c092021-02-13 15:02:46 +01001115def ForLoopContinue()
1116 for nr in [1, 2]
1117 try
1118 echo "ok"
1119 try
1120 echo "deeper"
1121 catch
1122 continue
1123 endtry
1124 catch
1125 echo "not ok"
1126 endtry
1127 endfor
1128enddef
1129
1130def Test_disassemble_for_loop_continue()
1131 var instr = execute('disassemble ForLoopContinue')
1132 assert_match('ForLoopContinue\_s*' ..
1133 'for nr in \[1, 2]\_s*' ..
1134 '0 STORE -1 in $0\_s*' ..
1135 '1 PUSHNR 1\_s*' ..
1136 '2 PUSHNR 2\_s*' ..
1137 '3 NEWLIST size 2\_s*' ..
1138 '4 FOR $0 -> 22\_s*' ..
1139 '5 STORE $1\_s*' ..
1140 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001141 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001142 'echo "ok"\_s*' ..
1143 '7 PUSHS "ok"\_s*' ..
1144 '8 ECHO 1\_s*' ..
1145 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001146 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001147 'echo "deeper"\_s*' ..
1148 '10 PUSHS "deeper"\_s*' ..
1149 '11 ECHO 1\_s*' ..
1150 'catch\_s*' ..
1151 '12 JUMP -> 15\_s*' ..
1152 '13 CATCH\_s*' ..
1153 'continue\_s*' ..
1154 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1155 'endtry\_s*' ..
1156 '15 ENDTRY\_s*' ..
1157 'catch\_s*' ..
1158 '16 JUMP -> 20\_s*' ..
1159 '17 CATCH\_s*' ..
1160 'echo "not ok"\_s*' ..
1161 '18 PUSHS "not ok"\_s*' ..
1162 '19 ECHO 1\_s*' ..
1163 'endtry\_s*' ..
1164 '20 ENDTRY\_s*' ..
1165 'endfor\_s*' ..
1166 '21 JUMP -> 4\_s*' ..
1167 '\d\+ DROP\_s*' ..
1168 '\d\+ RETURN 0',
1169 instr)
1170enddef
1171
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001172let g:number = 42
1173
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001174def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001175 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001176enddef
1177
1178def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001179 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001180 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001181 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001182 '\d PUSHNR 23\_s*' ..
1183 '\d LOADG g:number\_s*' ..
1184 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1185 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001186 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001187 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001188 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001189 instr)
1190enddef
1191
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001192def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001193 var nr = 3
1194 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001195 nrres = nr - 7
1196 nrres = nr * 7
1197 nrres = nr / 7
1198 nrres = nr % 7
1199
Bram Moolenaarac564082020-09-27 19:05:33 +02001200 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001201 anyres = g:number - 7
1202 anyres = g:number * 7
1203 anyres = g:number / 7
1204 anyres = g:number % 7
1205
1206 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001207 var fl = 3.0
1208 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001209 flres = fl - 7.0
1210 flres = fl * 7.0
1211 flres = fl / 7.0
1212 endif
1213enddef
1214
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001215def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001216 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001217 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001218 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001219 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001220 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001221 '\d LOAD $0.*' ..
1222 '\d PUSHNR 7.*' ..
1223 '\d OPNR +.*' ..
1224 '\d STORE $1.*' ..
1225 'nrres = nr - 7.*' ..
1226 '\d OPNR -.*' ..
1227 'nrres = nr \* 7.*' ..
1228 '\d OPNR \*.*' ..
1229 'nrres = nr / 7.*' ..
1230 '\d OPNR /.*' ..
1231 'nrres = nr % 7.*' ..
1232 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001233 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001234 '\d LOADG g:number.*' ..
1235 '\d PUSHNR 7.*' ..
1236 '\d OPANY +.*' ..
1237 '\d STORE $2.*' ..
1238 'anyres = g:number - 7.*' ..
1239 '\d OPANY -.*' ..
1240 'anyres = g:number \* 7.*' ..
1241 '\d OPANY \*.*' ..
1242 'anyres = g:number / 7.*' ..
1243 '\d OPANY /.*' ..
1244 'anyres = g:number % 7.*' ..
1245 '\d OPANY %.*',
1246 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001247 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001248 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001249 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001250 '\d PUSHF 3.0.*' ..
1251 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001252 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001253 '\d LOAD $3.*' ..
1254 '\d PUSHF 7.0.*' ..
1255 '\d OPFLOAT +.*' ..
1256 '\d STORE $4.*' ..
1257 'flres = fl - 7.0.*' ..
1258 '\d OPFLOAT -.*' ..
1259 'flres = fl \* 7.0.*' ..
1260 '\d OPFLOAT \*.*' ..
1261 'flres = fl / 7.0.*' ..
1262 '\d OPFLOAT /.*',
1263 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001264 endif
1265enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001266
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001267def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001268 var reslist = [1, 2] + [3, 4]
1269 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001270enddef
1271
1272def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001273 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001274 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001275 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001276 '\d PUSHNR 1.*' ..
1277 '\d PUSHNR 2.*' ..
1278 '\d NEWLIST size 2.*' ..
1279 '\d PUSHNR 3.*' ..
1280 '\d PUSHNR 4.*' ..
1281 '\d NEWLIST size 2.*' ..
1282 '\d ADDLIST.*' ..
1283 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001284 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001285 '\d PUSHBLOB 0z1122.*' ..
1286 '\d PUSHBLOB 0z3344.*' ..
1287 '\d ADDBLOB.*' ..
1288 '\d STORE $.*',
1289 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001290enddef
1291
1292let g:aa = 'aa'
1293def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001294 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001295 return res
1296enddef
1297
1298def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001299 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001300 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001301 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001302 '\d LOADG g:aa.*' ..
1303 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001304 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001305 '\d CONCAT.*' ..
1306 '\d STORE $.*',
1307 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001308 assert_equal('aabb', ConcatString())
1309enddef
1310
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001311def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001312 var s = "abcd"
1313 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001314 return res
1315enddef
1316
1317def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001318 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001319 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001320 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001321 '\d PUSHS "abcd"\_s*' ..
1322 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001323 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001324 '\d LOAD $0\_s*' ..
1325 '\d PUSHNR 1\_s*' ..
1326 '\d STRINDEX\_s*' ..
1327 '\d STORE $1\_s*',
1328 instr)
1329 assert_equal('b', StringIndex())
1330enddef
1331
Bram Moolenaared591872020-08-15 22:14:53 +02001332def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001333 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001334 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001335 return res
1336enddef
1337
1338def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001339 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001340 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001341 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001342 '\d PUSHS "abcd"\_s*' ..
1343 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001344 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001345 '\d LOAD $0\_s*' ..
1346 '\d PUSHNR 1\_s*' ..
1347 '\d PUSHNR 8\_s*' ..
1348 '\d STRSLICE\_s*' ..
1349 '\d STORE $1\_s*',
1350 instr)
1351 assert_equal('bcd', StringSlice())
1352enddef
1353
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001354def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001355 var l = [1, 2, 3]
1356 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001357 return res
1358enddef
1359
1360def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001361 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001362 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001363 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001364 '\d PUSHNR 1\_s*' ..
1365 '\d PUSHNR 2\_s*' ..
1366 '\d PUSHNR 3\_s*' ..
1367 '\d NEWLIST size 3\_s*' ..
1368 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001369 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001370 '\d LOAD $0\_s*' ..
1371 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001372 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001373 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001374 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001375 assert_equal(2, ListIndex())
1376enddef
1377
Bram Moolenaared591872020-08-15 22:14:53 +02001378def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001379 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001380 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001381 return res
1382enddef
1383
1384def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001385 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001386 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001387 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001388 '\d PUSHNR 1\_s*' ..
1389 '\d PUSHNR 2\_s*' ..
1390 '\d PUSHNR 3\_s*' ..
1391 '\d NEWLIST size 3\_s*' ..
1392 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001393 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001394 '\d LOAD $0\_s*' ..
1395 '\d PUSHNR 1\_s*' ..
1396 '\d PUSHNR 8\_s*' ..
1397 '\d LISTSLICE\_s*' ..
1398 '\d STORE $1\_s*',
1399 instr)
1400 assert_equal([2, 3], ListSlice())
1401enddef
1402
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001403def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001404 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001405 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001406 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001407 return res
1408enddef
1409
1410def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001411 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001412 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001413 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001414 '\d PUSHS "item"\_s*' ..
1415 '\d PUSHNR 1\_s*' ..
1416 '\d NEWDICT size 1\_s*' ..
1417 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001418 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001419 '\d\+ LOAD $0\_s*' ..
1420 '\d\+ MEMBER item\_s*' ..
1421 '\d\+ STORE $1\_s*' ..
1422 'res = d\["item"\]\_s*' ..
1423 '\d\+ LOAD $0\_s*' ..
1424 '\d\+ PUSHS "item"\_s*' ..
1425 '\d\+ MEMBER\_s*' ..
1426 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001427 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001428 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001429enddef
1430
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001431let somelist = [1, 2, 3, 4, 5]
1432def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001433 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001434 return res
1435enddef
1436
1437def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001438 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001439 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001440 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001441 '\d LOADG g:somelist\_s*' ..
1442 '\d PUSHNR 2\_s*' ..
1443 '\d ANYINDEX\_s*' ..
1444 '\d STORE $0\_s*' ..
1445 'return res\_s*' ..
1446 '\d LOAD $0\_s*' ..
1447 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1448 '\d RETURN',
1449 instr)
1450 assert_equal(3, AnyIndex())
1451enddef
1452
1453def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001454 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001455 return res
1456enddef
1457
1458def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001459 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001460 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001461 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001462 '\d LOADG g:somelist\_s*' ..
1463 '\d PUSHNR 1\_s*' ..
1464 '\d PUSHNR 3\_s*' ..
1465 '\d ANYSLICE\_s*' ..
1466 '\d STORE $0\_s*' ..
1467 'return res\_s*' ..
1468 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001469 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001470 '\d RETURN',
1471 instr)
1472 assert_equal([2, 3, 4], AnySlice())
1473enddef
1474
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001475def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001476 var nr = 9
1477 var plus = +nr
1478 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001479 return res
1480enddef
1481
1482def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001483 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001484 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001485 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001486 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001487 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001488 '\d LOAD $0\_s*' ..
1489 '\d CHECKNR\_s*' ..
1490 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001491 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001492 '\d LOAD $0\_s*' ..
1493 '\d NEGATENR\_s*' ..
1494 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001495 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001496 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001497enddef
1498
1499def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001500 var flag = true
1501 var invert = !flag
1502 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001503 return res
1504enddef
1505
1506def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001507 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001508 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001509 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001510 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001511 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001512 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001513 '\d LOAD $0\_s*' ..
1514 '\d INVERT (!val)\_s*' ..
1515 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001516 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001517 '\d LOAD $0\_s*' ..
1518 '\d 2BOOL (!!val)\_s*' ..
1519 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001520 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001521 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001522enddef
1523
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001524def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001525 var name: bool = 1 && 0 || 1
1526 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001527enddef
1528
1529def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001530 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001531 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001532 'var name: bool = 1 && 0 || 1\_s*' ..
1533 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001534 '1 2BOOL (!!val)\_s*' ..
1535 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1536 '3 PUSHNR 0\_s*' ..
1537 '4 2BOOL (!!val)\_s*' ..
1538 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1539 '6 PUSHNR 1\_s*' ..
1540 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001541 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001542 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001543 '\d\+ LOAD $0\_s*' ..
1544 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001545 instr)
1546 assert_equal(true, InvertBool())
1547enddef
1548
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001549def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001550 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001551 ['true == isFalse', 'COMPAREBOOL =='],
1552 ['true != isFalse', 'COMPAREBOOL !='],
1553 ['v:none == isNull', 'COMPARESPECIAL =='],
1554 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001555
Bram Moolenaara5565e42020-05-09 15:44:01 +02001556 ['111 == aNumber', 'COMPARENR =='],
1557 ['111 != aNumber', 'COMPARENR !='],
1558 ['111 > aNumber', 'COMPARENR >'],
1559 ['111 < aNumber', 'COMPARENR <'],
1560 ['111 >= aNumber', 'COMPARENR >='],
1561 ['111 <= aNumber', 'COMPARENR <='],
1562 ['111 =~ aNumber', 'COMPARENR =\~'],
1563 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001564
Bram Moolenaara5565e42020-05-09 15:44:01 +02001565 ['"xx" != aString', 'COMPARESTRING !='],
1566 ['"xx" > aString', 'COMPARESTRING >'],
1567 ['"xx" < aString', 'COMPARESTRING <'],
1568 ['"xx" >= aString', 'COMPARESTRING >='],
1569 ['"xx" <= aString', 'COMPARESTRING <='],
1570 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1571 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1572 ['"xx" is aString', 'COMPARESTRING is'],
1573 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001574
Bram Moolenaara5565e42020-05-09 15:44:01 +02001575 ['0z11 == aBlob', 'COMPAREBLOB =='],
1576 ['0z11 != aBlob', 'COMPAREBLOB !='],
1577 ['0z11 is aBlob', 'COMPAREBLOB is'],
1578 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001579
Bram Moolenaara5565e42020-05-09 15:44:01 +02001580 ['[1, 2] == aList', 'COMPARELIST =='],
1581 ['[1, 2] != aList', 'COMPARELIST !='],
1582 ['[1, 2] is aList', 'COMPARELIST is'],
1583 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001584
Bram Moolenaare0de1712020-12-02 17:36:54 +01001585 ['{a: 1} == aDict', 'COMPAREDICT =='],
1586 ['{a: 1} != aDict', 'COMPAREDICT !='],
1587 ['{a: 1} is aDict', 'COMPAREDICT is'],
1588 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001589
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001590 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1591 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1592 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1593 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001594
1595 ['77 == g:xx', 'COMPAREANY =='],
1596 ['77 != g:xx', 'COMPAREANY !='],
1597 ['77 > g:xx', 'COMPAREANY >'],
1598 ['77 < g:xx', 'COMPAREANY <'],
1599 ['77 >= g:xx', 'COMPAREANY >='],
1600 ['77 <= g:xx', 'COMPAREANY <='],
1601 ['77 =~ g:xx', 'COMPAREANY =\~'],
1602 ['77 !~ g:xx', 'COMPAREANY !\~'],
1603 ['77 is g:xx', 'COMPAREANY is'],
1604 ['77 isnot g:xx', 'COMPAREANY isnot'],
1605 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001606 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001607 if has('float')
1608 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001609 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1610 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1611 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1612 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1613 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1614 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1615 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1616 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001617 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001618 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001619 endif
1620
Bram Moolenaarac564082020-09-27 19:05:33 +02001621 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001622 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001623 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001624 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001625 ' var isFalse = false',
1626 ' var isNull = v:null',
1627 ' var aNumber = 222',
1628 ' var aString = "yy"',
1629 ' var aBlob = 0z22',
1630 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001631 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001632 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001633 ' if ' .. case[0],
1634 ' echo 42'
1635 ' endif',
1636 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001637 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001638 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001639 assert_match('TestCase' .. nr .. '.*' ..
1640 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1641 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001642 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001643 '\d ' .. case[1] .. '.*' ..
1644 '\d JUMP_IF_FALSE -> \d\+.*',
1645 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001646
1647 nr += 1
1648 endfor
1649
Bram Moolenaar22da5592020-03-19 14:52:20 +01001650 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001651enddef
1652
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001653def s:FalsyOp()
1654 echo g:flag ?? "yes"
1655 echo [] ?? "empty list"
1656 echo "" ?? "empty string"
1657enddef
1658
1659def Test_dsassemble_falsy_op()
1660 var res = execute('disass s:FalsyOp')
1661 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1662 'echo g:flag ?? "yes"\_s*' ..
1663 '0 LOADG g:flag\_s*' ..
1664 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1665 '2 PUSHS "yes"\_s*' ..
1666 '3 ECHO 1\_s*' ..
1667 'echo \[\] ?? "empty list"\_s*' ..
1668 '4 NEWLIST size 0\_s*' ..
1669 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1670 '6 PUSHS "empty list"\_s*' ..
1671 '7 ECHO 1\_s*' ..
1672 'echo "" ?? "empty string"\_s*' ..
1673 '\d\+ PUSHS "empty string"\_s*' ..
1674 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001675 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001676 res)
1677enddef
1678
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001679def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001680 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001681 ['"xx" == "yy"', false],
1682 ['"aa" == "aa"', true],
1683 ['has("eval") ? true : false', true],
1684 ['has("asdf") ? true : false', false],
1685 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001686
Bram Moolenaarac564082020-09-27 19:05:33 +02001687 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001688 for case in cases
1689 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001690 ' if ' .. case[0],
1691 ' echo 42'
1692 ' endif',
1693 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001694 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001695 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001696 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001697 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001698 assert_match('TestCase' .. nr .. '.*' ..
1699 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1700 '\d PUSHNR 42.*' ..
1701 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001702 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001703 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001704 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001705 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001706 assert_match('TestCase' .. nr .. '.*' ..
1707 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1708 'echo 42[ \n]*' ..
1709 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001710 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001711 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001712 endif
1713
1714 nr += 1
1715 endfor
1716
1717 delete('Xdisassemble')
1718enddef
1719
Bram Moolenaarad39c092020-02-26 18:23:43 +01001720def s:Execute()
1721 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001722 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001723 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001724 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001725 execute 'help ' .. tag
1726enddef
1727
1728def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001729 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001730 assert_match('\<SNR>\d*_Execute\_s*' ..
1731 "execute 'help vim9.txt'\\_s*" ..
1732 '\d PUSHS "help vim9.txt"\_s*' ..
1733 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001734 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001735 '\d PUSHS "help vim9.txt"\_s*' ..
1736 '\d STORE $0\_s*' ..
1737 'execute cmd\_s*' ..
1738 '\d LOAD $0\_s*' ..
1739 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001740 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001741 '\d PUSHS "vim9.txt"\_s*' ..
1742 '\d STORE $1\_s*' ..
1743 "execute 'help ' .. tag\\_s*" ..
1744 '\d\+ PUSHS "help "\_s*' ..
1745 '\d\+ LOAD $1\_s*' ..
1746 '\d\+ CONCAT\_s*' ..
1747 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001748 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001749 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001750enddef
1751
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001752def s:Echomsg()
1753 echomsg 'some' 'message'
1754 echoerr 'went' .. 'wrong'
1755enddef
1756
1757def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001758 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001759 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1760 "echomsg 'some' 'message'\\_s*" ..
1761 '\d PUSHS "some"\_s*' ..
1762 '\d PUSHS "message"\_s*' ..
1763 '\d ECHOMSG 2\_s*' ..
1764 "echoerr 'went' .. 'wrong'\\_s*" ..
1765 '\d PUSHS "wentwrong"\_s*' ..
1766 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001767 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001768 res)
1769enddef
1770
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001771def SomeStringArg(arg: string)
1772 echo arg
1773enddef
1774
1775def SomeAnyArg(arg: any)
1776 echo arg
1777enddef
1778
1779def SomeStringArgAndReturn(arg: string): string
1780 return arg
1781enddef
1782
1783def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001784 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001785 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1786 '\d *echo arg.*' ..
1787 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001788 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001789
Bram Moolenaarac564082020-09-27 19:05:33 +02001790 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001791 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1792 '\d *echo arg\_s*' ..
1793 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001794 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001795
Bram Moolenaarac564082020-09-27 19:05:33 +02001796 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001797 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1798 '\d *return arg\_s*' ..
1799 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001800 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001801enddef
1802
Bram Moolenaar09689a02020-05-09 22:50:08 +02001803def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001804 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001805 vim9script
1806 def FuncOne(): string
1807 return FuncTwo()
1808 enddef
1809 def FuncTwo(): string
1810 return 'two'
1811 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001812 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001813 END
1814 writefile(lines, 'Xdisassemble')
1815 source Xdisassemble
1816
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001817 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001818 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1819 'return FuncTwo()\_s*' ..
1820 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001821 '\d RETURN',
1822 g:res_FuncOne)
1823
1824 delete('Xdisassemble')
1825 unlet g:res_FuncOne
1826enddef
1827
Bram Moolenaar61a89812020-05-07 16:58:17 +02001828def s:ConcatStrings(): string
1829 return 'one' .. 'two' .. 'three'
1830enddef
1831
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001832def s:ComputeConst(): number
1833 return 2 + 3 * 4 / 6 + 7
1834enddef
1835
Bram Moolenaar1c747212020-05-09 18:28:34 +02001836def s:ComputeConstParen(): number
1837 return ((2 + 4) * (8 / 2)) / (3 + 4)
1838enddef
1839
Bram Moolenaar61a89812020-05-07 16:58:17 +02001840def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001841 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001842 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1843 "return 'one' .. 'two' .. 'three'\\_s*" ..
1844 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001845 '\d RETURN',
1846 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001847
1848 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001849 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1850 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1851 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001852 '\d RETURN',
1853 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001854
1855 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001856 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1857 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1858 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001859 '\d RETURN',
1860 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001861enddef
1862
Bram Moolenaar389df252020-07-09 21:20:47 +02001863def s:CallAppend()
1864 eval "some text"->append(2)
1865enddef
1866
1867def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001868 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001869 assert_match('<SNR>\d*_CallAppend\_s*' ..
1870 'eval "some text"->append(2)\_s*' ..
1871 '\d PUSHS "some text"\_s*' ..
1872 '\d PUSHNR 2\_s*' ..
1873 '\d SHUFFLE 2 up 1\_s*' ..
1874 '\d BCALL append(argc 2)\_s*' ..
1875 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001876 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001877 res)
1878enddef
1879
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001880
1881def s:SilentMessage()
1882 silent echomsg "text"
1883 silent! echoerr "error"
1884enddef
1885
1886def Test_silent()
1887 var res = execute('disass s:SilentMessage')
1888 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1889 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001890 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001891 '\d PUSHS "text"\_s*' ..
1892 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001893 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001894 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001895 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001896 '\d PUSHS "error"\_s*' ..
1897 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001898 '\d CMDMOD_REV\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001899 '\d RETURN 0',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001900 res)
1901enddef
1902
Bram Moolenaarb2049902021-01-24 12:53:53 +01001903def s:Profiled(): string
1904 echo "profiled"
1905 return "done"
1906enddef
1907
1908def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01001909 if !has('profile')
1910 MissingFeature 'profile'
1911 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01001912 var res = execute('disass! s:Profiled')
1913 assert_match('<SNR>\d*_Profiled\_s*' ..
1914 'echo "profiled"\_s*' ..
1915 '\d PROFILE START line 1\_s*' ..
1916 '\d PUSHS "profiled"\_s*' ..
1917 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01001918 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01001919 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01001920 '\d PROFILE START line 2\_s*' ..
1921 '\d PUSHS "done"\_s*' ..
1922 '\d RETURN\_s*' ..
1923 '\d PROFILE END',
1924 res)
1925enddef
1926
Bram Moolenaar7cd24222021-01-12 18:58:39 +01001927def s:SilentReturn(): string
1928 silent return "done"
1929enddef
1930
1931def Test_silent_return()
1932 var res = execute('disass s:SilentReturn')
1933 assert_match('<SNR>\d*_SilentReturn\_s*' ..
1934 'silent return "done"\_s*' ..
1935 '\d CMDMOD silent\_s*' ..
1936 '\d PUSHS "done"\_s*' ..
1937 '\d CMDMOD_REV\_s*' ..
1938 '\d RETURN',
1939 res)
1940enddef
1941
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001942" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker