blob: b0f84a6e1e961b26bfc2de2abb03aaea908f3be9 [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*' ..
120 '\d\+ PUSHNR 0\_s*' ..
121 '\d\+ RETURN',
122 res)
123enddef
124
125def s:YankRange()
126 norm! m[jjm]
127 :'[,']yank
128enddef
129
130def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200131 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200132 assert_match('<SNR>\d*_YankRange.*' ..
133 ' norm! m\[jjm\]\_s*' ..
134 '\d EXEC norm! m\[jjm\]\_s*' ..
135 ' :''\[,''\]yank\_s*' ..
136 '\d EXEC :''\[,''\]yank\_s*' ..
137 '\d PUSHNR 0\_s*' ..
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200138 '\d RETURN',
139 res)
140enddef
141
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200142def s:PutExpr()
143 :3put ="text"
144enddef
145
146def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200147 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200148 assert_match('<SNR>\d*_PutExpr.*' ..
149 ' :3put ="text"\_s*' ..
150 '\d PUSHS "text"\_s*' ..
151 '\d PUT = 3\_s*' ..
152 '\d PUSHNR 0\_s*' ..
153 '\d RETURN',
154 res)
155enddef
156
Bram Moolenaar08597872020-12-10 19:43:40 +0100157def s:PutRange()
158 :$-2put a
159enddef
160
161def Test_disassemble_put_range()
162 var res = execute('disass s:PutRange')
163 assert_match('<SNR>\d*_PutRange.*' ..
164 ' :$-2put a\_s*' ..
165 '\d RANGE $-2\_s*' ..
166 '\d PUT a range\_s*' ..
167 '\d PUSHNR 0\_s*' ..
168 '\d RETURN',
169 res)
170enddef
171
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100172def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200173 var localbool = true
174 var localspec = v:none
175 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100176 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200177 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100178 endif
179enddef
180
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100181def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200182 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200183 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
184 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100185 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200186 'localspec = v:none.*' ..
187 ' PUSH v:none.*' ..
188 'localblob = 0z1234.*' ..
189 ' PUSHBLOB 0z1234.*',
190 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100191 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200192 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
193 'localfloat = 1.234.*' ..
194 ' PUSHF 1.234.*',
195 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100196 endif
197enddef
198
199def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200200 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100201 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200202 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100203 localstr = 'xyz'
204 v:char = 'abc'
205 s:scriptvar = 'sv'
206 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100207 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200208 b:buffervar = 'bv'
209 w:windowvar = 'wv'
210 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100211 &tabstop = 8
212 $ENVVAR = 'ev'
213 @z = 'rv'
214enddef
215
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100216def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200217 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200218 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200219 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200220 'localnr = 2.*' ..
221 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200222 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200223 'localstr = ''xyz''.*' ..
224 ' STORE $1.*' ..
225 'v:char = ''abc''.*' ..
226 'STOREV v:char.*' ..
227 's:scriptvar = ''sv''.*' ..
228 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
229 'g:globalvar = ''gv''.*' ..
230 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100231 'g:auto#var = ''av''.*' ..
232 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200233 'b:buffervar = ''bv''.*' ..
234 ' STOREB b:buffervar.*' ..
235 'w:windowvar = ''wv''.*' ..
236 ' STOREW w:windowvar.*' ..
237 't:tabpagevar = ''tv''.*' ..
238 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200239 '&tabstop = 8.*' ..
240 ' STOREOPT &tabstop.*' ..
241 '$ENVVAR = ''ev''.*' ..
242 ' STOREENV $ENVVAR.*' ..
243 '@z = ''rv''.*' ..
244 ' STOREREG @z.*',
245 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100246enddef
247
Bram Moolenaarcb790402020-05-15 20:53:00 +0200248def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200249 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200250 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200251 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200252 localdict["a"] = 456
253enddef
254
255def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200256 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200257 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200258 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200259 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100260 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200261 '\d STORE $0\_s*' ..
262 'locallist\[0\] = 123\_s*' ..
263 '\d PUSHNR 123\_s*' ..
264 '\d PUSHNR 0\_s*' ..
265 '\d LOAD $0\_s*' ..
266 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200267 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200268 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100269 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200270 '\d STORE $1\_s*' ..
271 'localdict\["a"\] = 456\_s*' ..
272 '\d\+ PUSHNR 456\_s*' ..
273 '\d\+ PUSHS "a"\_s*' ..
274 '\d\+ LOAD $1\_s*' ..
275 '\d\+ STOREDICT\_s*' ..
276 '\d\+ PUSHNR 0\_s*' ..
277 '\d\+ RETURN',
278 res)
279enddef
280
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100281def s:ScriptFuncStoreIndex()
282 var d = {dd: {}}
283 d.dd[0] = 0
284enddef
285
286def Test_disassemble_store_index()
287 var res = execute('disass s:ScriptFuncStoreIndex')
288 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
289 'var d = {dd: {}}\_s*' ..
290 '\d PUSHS "dd"\_s*' ..
291 '\d NEWDICT size 0\_s*' ..
292 '\d NEWDICT size 1\_s*' ..
293 '\d STORE $0\_s*' ..
294 'd.dd\[0\] = 0\_s*' ..
295 '\d PUSHNR 0\_s*' ..
296 '\d PUSHNR 0\_s*' ..
297 '\d LOAD $0\_s*' ..
298 '\d MEMBER dd\_s*' ..
299 '\d STOREINDEX\_s*' ..
300 '\d\+ PUSHNR 0\_s*' ..
301 '\d\+ RETURN',
302 res)
303enddef
304
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200305def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200306 var x: string
307 var y: string
308 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200309 [x, y; l] = g:stringlist
310enddef
311
312def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200313 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200314 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200315 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200316 '\d PUSHS "\[NULL\]"\_s*' ..
317 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200318 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200319 '\d PUSHS "\[NULL\]"\_s*' ..
320 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200321 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200322 '\d NEWLIST size 0\_s*' ..
323 '\d STORE $2\_s*' ..
324 '\[x, y; l\] = g:stringlist\_s*' ..
325 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200326 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200327 '\d CHECKLEN >= 2\_s*' ..
328 '\d\+ ITEM 0\_s*' ..
329 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
330 '\d\+ STORE $0\_s*' ..
331 '\d\+ ITEM 1\_s*' ..
332 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
333 '\d\+ STORE $1\_s*' ..
334 '\d\+ SLICE 2\_s*' ..
335 '\d\+ STORE $2\_s*' ..
336 '\d\+ PUSHNR 0\_s*' ..
337 '\d\+ RETURN',
338 res)
339enddef
340
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200341def s:ListAdd()
342 var l: list<number> = []
343 add(l, 123)
344 add(l, g:aNumber)
345enddef
346
347def Test_disassemble_list_add()
348 var res = execute('disass s:ListAdd')
349 assert_match('<SNR>\d*_ListAdd\_s*' ..
350 'var l: list<number> = []\_s*' ..
351 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100352 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200353 '\d STORE $0\_s*' ..
354 'add(l, 123)\_s*' ..
355 '\d LOAD $0\_s*' ..
356 '\d PUSHNR 123\_s*' ..
357 '\d LISTAPPEND\_s*' ..
358 '\d DROP\_s*' ..
359 'add(l, g:aNumber)\_s*' ..
360 '\d LOAD $0\_s*' ..
361 '\d\+ LOADG g:aNumber\_s*' ..
362 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
363 '\d\+ LISTAPPEND\_s*' ..
364 '\d\+ DROP\_s*' ..
365 '\d\+ PUSHNR 0\_s*' ..
366 '\d\+ RETURN',
367 res)
368enddef
369
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200370def s:BlobAdd()
371 var b: blob = 0z
372 add(b, 123)
373 add(b, g:aNumber)
374enddef
375
376def Test_disassemble_blob_add()
377 var res = execute('disass s:BlobAdd')
378 assert_match('<SNR>\d*_BlobAdd\_s*' ..
379 'var b: blob = 0z\_s*' ..
380 '\d PUSHBLOB 0z\_s*' ..
381 '\d STORE $0\_s*' ..
382 'add(b, 123)\_s*' ..
383 '\d LOAD $0\_s*' ..
384 '\d PUSHNR 123\_s*' ..
385 '\d BLOBAPPEND\_s*' ..
386 '\d DROP\_s*' ..
387 'add(b, g:aNumber)\_s*' ..
388 '\d LOAD $0\_s*' ..
389 '\d\+ LOADG g:aNumber\_s*' ..
390 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
391 '\d\+ BLOBAPPEND\_s*' ..
392 '\d\+ DROP\_s*' ..
393 '\d\+ PUSHNR 0\_s*' ..
394 '\d\+ RETURN',
395 res)
396enddef
397
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200398def s:ScriptFuncUnlet()
399 g:somevar = "value"
400 unlet g:somevar
401 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200402 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200403enddef
404
405def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200406 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200407 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
408 'g:somevar = "value"\_s*' ..
409 '\d PUSHS "value"\_s*' ..
410 '\d STOREG g:somevar\_s*' ..
411 'unlet g:somevar\_s*' ..
412 '\d UNLET g:somevar\_s*' ..
413 'unlet! g:somevar\_s*' ..
414 '\d UNLET! g:somevar\_s*' ..
415 'unlet $SOMEVAR\_s*' ..
416 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200417 res)
418enddef
419
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100420def s:ScriptFuncTry()
421 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200422 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100423 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200424 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100425 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200426 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100427 endtry
428enddef
429
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100430def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200431 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200432 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
433 'try\_s*' ..
434 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
435 'echo "yes"\_s*' ..
436 '\d PUSHS "yes"\_s*' ..
437 '\d ECHO 1\_s*' ..
438 'catch /fail/\_s*' ..
439 '\d JUMP -> \d\+\_s*' ..
440 '\d PUSH v:exception\_s*' ..
441 '\d PUSHS "fail"\_s*' ..
442 '\d COMPARESTRING =\~\_s*' ..
443 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
444 '\d CATCH\_s*' ..
445 'echo "no"\_s*' ..
446 '\d\+ PUSHS "no"\_s*' ..
447 '\d\+ ECHO 1\_s*' ..
448 'finally\_s*' ..
449 'throw "end"\_s*' ..
450 '\d\+ PUSHS "end"\_s*' ..
451 '\d\+ THROW\_s*' ..
452 'endtry\_s*' ..
453 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200454 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100455enddef
456
457def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200458 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100459 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100460enddef
461
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100462def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200463 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200464 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200465 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200466 '\d PUSHNR 1\_s*' ..
467 '\d PUSHS "two"\_s*' ..
468 '\d PUSHNR 333\_s*' ..
469 '\d NEWLIST size 3\_s*' ..
470 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100471 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200472 '\d PUSHS "one"\_s*' ..
473 '\d PUSHNR 1\_s*' ..
474 '\d PUSHS "two"\_s*' ..
475 '\d PUSHS "val"\_s*' ..
476 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200477 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100478enddef
479
Bram Moolenaar6e949782020-04-13 17:21:00 +0200480def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100481 echo arg
482enddef
483
484func UserFunc()
485 echo 'nothing'
486endfunc
487
488func UserFuncWithArg(arg)
489 echo a:arg
490endfunc
491
492def s:ScriptFuncCall(): string
493 changenr()
494 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100495 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100496 FuncWithArg(343)
497 ScriptFuncNew()
498 s:ScriptFuncNew()
499 UserFunc()
500 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200501 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100502 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200503 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100504 FuncRefWithArg("bar")
505 return "yes"
506enddef
507
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100508def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200509 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200510 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
511 'changenr()\_s*' ..
512 '\d BCALL changenr(argc 0)\_s*' ..
513 '\d DROP\_s*' ..
514 'char2nr("abc")\_s*' ..
515 '\d PUSHS "abc"\_s*' ..
516 '\d BCALL char2nr(argc 1)\_s*' ..
517 '\d DROP\_s*' ..
518 'Test_disassemble_new()\_s*' ..
519 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
520 '\d DROP\_s*' ..
521 'FuncWithArg(343)\_s*' ..
522 '\d\+ PUSHNR 343\_s*' ..
523 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
524 '\d\+ DROP\_s*' ..
525 'ScriptFuncNew()\_s*' ..
526 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
527 '\d\+ DROP\_s*' ..
528 's:ScriptFuncNew()\_s*' ..
529 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
530 '\d\+ DROP\_s*' ..
531 'UserFunc()\_s*' ..
532 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
533 '\d\+ DROP\_s*' ..
534 'UserFuncWithArg("foo")\_s*' ..
535 '\d\+ PUSHS "foo"\_s*' ..
536 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
537 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200538 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200539 '\d\+ PUSHS "UserFunc"\_s*' ..
540 '\d\+ BCALL function(argc 1)\_s*' ..
541 '\d\+ STORE $0\_s*' ..
542 'FuncRef()\_s*' ..
543 '\d\+ LOAD $\d\_s*' ..
544 '\d\+ PCALL (argc 0)\_s*' ..
545 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200546 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200547 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
548 '\d\+ BCALL function(argc 1)\_s*' ..
549 '\d\+ STORE $1\_s*' ..
550 'FuncRefWithArg("bar")\_s*' ..
551 '\d\+ PUSHS "bar"\_s*' ..
552 '\d\+ LOAD $\d\_s*' ..
553 '\d\+ PCALL (argc 1)\_s*' ..
554 '\d\+ DROP\_s*' ..
555 'return "yes"\_s*' ..
556 '\d\+ PUSHS "yes"\_s*' ..
557 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200558 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100559enddef
560
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200561
562def s:CreateRefs()
563 var local = 'a'
564 def Append(arg: string)
565 local ..= arg
566 enddef
567 g:Append = Append
568 def Get(): string
569 return local
570 enddef
571 g:Get = Get
572enddef
573
574def Test_disassemble_closure()
575 CreateRefs()
576 var res = execute('disass g:Append')
577 assert_match('<lambda>\d\_s*' ..
578 'local ..= arg\_s*' ..
579 '\d LOADOUTER $0\_s*' ..
580 '\d LOAD arg\[-1\]\_s*' ..
581 '\d CONCAT\_s*' ..
582 '\d STOREOUTER $0\_s*' ..
583 '\d PUSHNR 0\_s*' ..
584 '\d RETURN',
585 res)
586
587 res = execute('disass g:Get')
588 assert_match('<lambda>\d\_s*' ..
589 'return local\_s*' ..
590 '\d LOADOUTER $0\_s*' ..
591 '\d RETURN',
592 res)
593
594 unlet g:Append
595 unlet g:Get
596enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200597
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100598
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200599def EchoArg(arg: string): string
600 return arg
601enddef
602def RefThis(): func
603 return function('EchoArg')
604enddef
605def s:ScriptPCall()
606 RefThis()("text")
607enddef
608
609def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200610 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200611 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
612 'RefThis()("text")\_s*' ..
613 '\d DCALL RefThis(argc 0)\_s*' ..
614 '\d PUSHS "text"\_s*' ..
615 '\d PCALL top (argc 1)\_s*' ..
616 '\d PCALL end\_s*' ..
617 '\d DROP\_s*' ..
618 '\d PUSHNR 0\_s*' ..
619 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200620 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200621enddef
622
623
Bram Moolenaara26b9702020-04-18 19:53:28 +0200624def s:FuncWithForwardCall(): string
625 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100626enddef
627
628def DefinedLater(arg: string): string
629 return arg
630enddef
631
632def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200633 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200634 assert_match('FuncWithForwardCall\_s*' ..
635 'return g:DefinedLater("yes")\_s*' ..
636 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200637 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200638 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200639 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100640
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200641 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100642 assert_equal('yes', FuncWithForwardCall())
643
Bram Moolenaara26b9702020-04-18 19:53:28 +0200644 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200645 assert_match('FuncWithForwardCall\_s*' ..
646 'return g:DefinedLater("yes")\_s*' ..
647 '\d PUSHS "yes"\_s*' ..
648 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200649 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200650 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100651enddef
652
653
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100654def FuncWithDefault(arg: string = 'default'): string
655 return arg
656enddef
657
658def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200659 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200660 assert_match('FuncWithDefault\_s*' ..
661 '\d PUSHS "default"\_s*' ..
662 '\d STORE arg\[-1]\_s*' ..
663 'return arg\_s*' ..
664 '\d LOAD arg\[-1]\_s*' ..
665 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200666 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100667enddef
668
669
Bram Moolenaar158906c2020-02-06 20:39:45 +0100670def HasEval()
671 if has("eval")
672 echo "yes"
673 else
674 echo "no"
675 endif
676enddef
677
678def HasNothing()
679 if has("nothing")
680 echo "yes"
681 else
682 echo "no"
683 endif
684enddef
685
686def HasSomething()
687 if has("nothing")
688 echo "nothing"
689 elseif has("something")
690 echo "something"
691 elseif has("eval")
692 echo "eval"
693 elseif has("less")
694 echo "less"
695 endif
696enddef
697
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100698def HasGuiRunning()
699 if has("gui_running")
700 echo "yes"
701 else
702 echo "no"
703 endif
704enddef
705
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100706def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200707 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200708 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200709 assert_match('HasEval\_s*' ..
710 'if has("eval")\_s*' ..
711 'echo "yes"\_s*' ..
712 '\d PUSHS "yes"\_s*' ..
713 '\d ECHO 1\_s*' ..
714 'else\_s*' ..
715 'echo "no"\_s*' ..
716 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200717 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100718 assert_notmatch('JUMP', instr)
719
Bram Moolenaard2c61702020-09-06 15:58:36 +0200720 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100721 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200722 assert_match('HasNothing\_s*' ..
723 'if has("nothing")\_s*' ..
724 'echo "yes"\_s*' ..
725 'else\_s*' ..
726 'echo "no"\_s*' ..
727 '\d PUSHS "no"\_s*' ..
728 '\d ECHO 1\_s*' ..
729 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200730 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100731 assert_notmatch('PUSHS "yes"', instr)
732 assert_notmatch('JUMP', instr)
733
Bram Moolenaard2c61702020-09-06 15:58:36 +0200734 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100735 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200736 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200737 'if has("nothing")\_s*' ..
738 'echo "nothing"\_s*' ..
739 'elseif has("something")\_s*' ..
740 'echo "something"\_s*' ..
741 'elseif has("eval")\_s*' ..
742 'echo "eval"\_s*' ..
743 '\d PUSHS "eval"\_s*' ..
744 '\d ECHO 1\_s*' ..
745 'elseif has("less").*' ..
746 'echo "less"\_s*' ..
747 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200748 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100749 assert_notmatch('PUSHS "nothing"', instr)
750 assert_notmatch('PUSHS "something"', instr)
751 assert_notmatch('PUSHS "less"', instr)
752 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100753
754 var result: string
755 var instr_expected: string
756 if has('gui')
757 if has('gui_running')
758 # GUI already running, always returns "yes"
759 result = "\nyes"
760 instr_expected = 'HasGuiRunning.*' ..
761 'if has("gui_running")\_s*' ..
762 ' echo "yes"\_s*' ..
763 '\d PUSHS "yes"\_s*' ..
764 '\d ECHO 1\_s*' ..
765 'else\_s*' ..
766 ' echo "no"\_s*' ..
767 'endif'
768 else
769 result = "\nno"
770 if has('unix')
771 # GUI not running but can start later, call has()
772 instr_expected = 'HasGuiRunning.*' ..
773 'if has("gui_running")\_s*' ..
774 '\d PUSHS "gui_running"\_s*' ..
775 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100776 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100777 '\d JUMP_IF_FALSE -> \d\_s*' ..
778 ' echo "yes"\_s*' ..
779 '\d PUSHS "yes"\_s*' ..
780 '\d ECHO 1\_s*' ..
781 'else\_s*' ..
782 '\d JUMP -> \d\_s*' ..
783 ' echo "no"\_s*' ..
784 '\d PUSHS "no"\_s*' ..
785 '\d ECHO 1\_s*' ..
786 'endif'
787 else
788 # GUI not running, always return "no"
789 instr_expected = 'HasGuiRunning.*' ..
790 'if has("gui_running")\_s*' ..
791 ' echo "yes"\_s*' ..
792 'else\_s*' ..
793 ' echo "no"\_s*' ..
794 '\d PUSHS "no"\_s*' ..
795 '\d ECHO 1\_s*' ..
796 'endif'
797 endif
798 endif
799 else
800 # GUI not supported, always return "no"
801 result = "\nno"
802 instr_expected = 'HasGuiRunning.*' ..
803 'if has("gui_running")\_s*' ..
804 ' echo "yes"\_s*' ..
805 'else\_s*' ..
806 ' echo "no"\_s*' ..
807 '\d PUSHS "no"\_s*' ..
808 '\d ECHO 1\_s*' ..
809 'endif'
810 endif
811
812 assert_equal(result, execute('HasGuiRunning()'))
813 instr = execute('disassemble HasGuiRunning')
814 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100815enddef
816
Bram Moolenaarefd88552020-06-18 20:50:10 +0200817def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100818 if 1 < 0
819 return "maybe"
820 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200821 if g:cond
822 return "yes"
823 else
824 return "no"
825 endif
826enddef
827
828def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200829 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200830 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100831 'if 1 < 0\_s*' ..
832 ' return "maybe"\_s*' ..
833 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200834 'if g:cond\_s*' ..
835 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100836 '1 COND2BOOL\_s*' ..
837 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200838 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100839 '3 PUSHS "yes"\_s*' ..
840 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200841 'else\_s*' ..
842 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100843 '5 PUSHS "no"\_s*' ..
844 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200845 instr)
846enddef
847
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100848def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200849 var Funky1: func
850 var Funky2: func = function("len")
851 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100852enddef
853
854def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200855 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200856 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200857 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 '0 PUSHFUNC "\[none]"\_s*' ..
859 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200860 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200861 '2 PUSHS "len"\_s*' ..
862 '3 BCALL function(argc 1)\_s*' ..
863 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200864 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200865 '\d PUSHS "UserFunc"\_s*' ..
866 '\d BCALL funcref(argc 1)\_s*' ..
867 '\d STORE $2\_s*' ..
868 '\d PUSHNR 0\_s*' ..
869 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200870 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100871enddef
872
873if has('channel')
874 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200875 var job1: job
876 var job2: job = job_start("donothing")
877 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100878 enddef
879endif
880
881def Test_disassemble_channel()
882 CheckFeature channel
883
Bram Moolenaarac564082020-09-27 19:05:33 +0200884 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200885 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200886 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200887 '\d PUSHJOB "no process"\_s*' ..
888 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200889 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200890 '\d PUSHS "donothing"\_s*' ..
891 '\d BCALL job_start(argc 1)\_s*' ..
892 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200893 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200894 '\d PUSHCHANNEL 0\_s*' ..
895 '\d STORE $2\_s*' ..
896 '\d PUSHNR 0\_s*' ..
897 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200898 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100899enddef
900
Bram Moolenaar777770f2020-02-06 21:27:08 +0100901def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100902 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100903 return F("x")
904enddef
905
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100906def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100907 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200908 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200909 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100910 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200911 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200912 '\d STORE $0\_s*' ..
913 'return F("x")\_s*' ..
914 '\d PUSHS "x"\_s*' ..
915 '\d LOAD $0\_s*' ..
916 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200917 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200918 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200919
Bram Moolenaarac564082020-09-27 19:05:33 +0200920 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200921 instr = execute('disassemble ' .. name)
922 assert_match('<lambda>\d\+\_s*' ..
923 'return "X" .. a .. "X"\_s*' ..
924 '\d PUSHS "X"\_s*' ..
925 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200926 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200927 '\d CONCAT\_s*' ..
928 '\d PUSHS "X"\_s*' ..
929 '\d CONCAT\_s*' ..
930 '\d RETURN',
931 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100932enddef
933
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100934def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100935 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100936 return Ref(g:value)
937enddef
938
939def Test_disassemble_lambda_with_type()
940 g:value = 5
941 assert_equal(15, LambdaWithType())
942 var instr = execute('disassemble LambdaWithType')
943 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100944 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100945 '\d FUNCREF <lambda>\d\+\_s*' ..
946 '\d STORE $0\_s*' ..
947 'return Ref(g:value)\_s*' ..
948 '\d LOADG g:value\_s*' ..
949 '\d LOAD $0\_s*' ..
950 '\d CHECKTYPE number stack\[-2\]\_s*' ..
951 '\d PCALL (argc 1)\_s*' ..
952 '\d RETURN',
953 instr)
954enddef
955
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200956def NestedOuter()
957 def g:Inner()
958 echomsg "inner"
959 enddef
960enddef
961
962def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200963 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200964 assert_match('NestedOuter\_s*' ..
965 'def g:Inner()\_s*' ..
966 'echomsg "inner"\_s*' ..
967 'enddef\_s*' ..
968 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
969 '\d PUSHNR 0\_s*' ..
970 '\d RETURN',
971 instr)
972enddef
973
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100974def NestedDefList()
975 def
976 def Info
977 def /Info
978 def /Info/
979enddef
980
981def Test_nested_def_list()
982 var instr = execute('disassemble NestedDefList')
983 assert_match('NestedDefList\_s*' ..
984 'def\_s*' ..
985 '\d DEF \_s*' ..
986 'def Info\_s*' ..
987 '\d DEF Info\_s*' ..
988 'def /Info\_s*' ..
989 '\d DEF /Info\_s*' ..
990 'def /Info/\_s*' ..
991 '\d DEF /Info/\_s*' ..
992 '\d PUSHNR 0\_s*' ..
993 '\d RETURN',
994 instr)
995enddef
996
Bram Moolenaar6e949782020-04-13 17:21:00 +0200997def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100998 if arg == 1 && arg != 2 || arg == 4
999 return 'yes'
1000 endif
1001 return 'no'
1002enddef
1003
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001004def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +01001005 assert_equal("yes", AndOr(1))
1006 assert_equal("no", AndOr(2))
1007 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001008 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001009 assert_match('AndOr\_s*' ..
1010 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1011 '\d LOAD arg\[-1]\_s*' ..
1012 '\d PUSHNR 1\_s*' ..
1013 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001014 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001015 '\d LOAD arg\[-1]\_s*' ..
1016 '\d PUSHNR 2\_s*' ..
1017 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001018 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001019 '\d LOAD arg\[-1]\_s*' ..
1020 '\d\+ PUSHNR 4\_s*' ..
1021 '\d\+ COMPAREANY ==\_s*' ..
1022 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001023 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001024enddef
1025
Bram Moolenaar04d05222020-02-06 22:06:54 +01001026def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001027 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001028 for i in range(3)
1029 res->add(i)
1030 endfor
1031 return res
1032enddef
1033
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001034def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001035 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001036 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001037 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001038 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001039 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001040 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001041 '\d STORE $0\_s*' ..
1042 'for i in range(3)\_s*' ..
1043 '\d STORE -1 in $1\_s*' ..
1044 '\d PUSHNR 3\_s*' ..
1045 '\d BCALL range(argc 1)\_s*' ..
1046 '\d FOR $1 -> \d\+\_s*' ..
1047 '\d STORE $2\_s*' ..
1048 'res->add(i)\_s*' ..
1049 '\d LOAD $0\_s*' ..
1050 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001051 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001052 '\d\+ DROP\_s*' ..
1053 'endfor\_s*' ..
1054 '\d\+ JUMP -> \d\+\_s*' ..
1055 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001056 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001057enddef
1058
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001059def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001060 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001061 for str in eval('["one", "two"]')
1062 res ..= str
1063 endfor
1064 return res
1065enddef
1066
1067def Test_disassemble_for_loop_eval()
1068 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001069 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001070 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001071 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001072 '\d PUSHS ""\_s*' ..
1073 '\d STORE $0\_s*' ..
1074 'for str in eval(''\["one", "two"\]'')\_s*' ..
1075 '\d STORE -1 in $1\_s*' ..
1076 '\d PUSHS "\["one", "two"\]"\_s*' ..
1077 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001078 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001079 '\d FOR $1 -> \d\+\_s*' ..
1080 '\d STORE $2\_s*' ..
1081 'res ..= str\_s*' ..
1082 '\d\+ LOAD $0\_s*' ..
1083 '\d\+ LOAD $2\_s*' ..
1084 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1085 '\d\+ CONCAT\_s*' ..
1086 '\d\+ STORE $0\_s*' ..
1087 'endfor\_s*' ..
1088 '\d\+ JUMP -> 6\_s*' ..
1089 '\d\+ DROP\_s*' ..
1090 'return res\_s*' ..
1091 '\d\+ LOAD $0\_s*' ..
1092 '\d\+ RETURN',
1093 instr)
1094enddef
1095
Bram Moolenaar792f7862020-11-23 08:31:18 +01001096def ForLoopUnpack()
1097 for [x1, x2] in [[1, 2], [3, 4]]
1098 echo x1 x2
1099 endfor
1100enddef
1101
1102def Test_disassemble_for_loop_unpack()
1103 var instr = execute('disassemble ForLoopUnpack')
1104 assert_match('ForLoopUnpack\_s*' ..
1105 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1106 '\d\+ STORE -1 in $0\_s*' ..
1107 '\d\+ PUSHNR 1\_s*' ..
1108 '\d\+ PUSHNR 2\_s*' ..
1109 '\d\+ NEWLIST size 2\_s*' ..
1110 '\d\+ PUSHNR 3\_s*' ..
1111 '\d\+ PUSHNR 4\_s*' ..
1112 '\d\+ NEWLIST size 2\_s*' ..
1113 '\d\+ NEWLIST size 2\_s*' ..
1114 '\d\+ FOR $0 -> 16\_s*' ..
1115 '\d\+ UNPACK 2\_s*' ..
1116 '\d\+ STORE $1\_s*' ..
1117 '\d\+ STORE $2\_s*' ..
1118 'echo x1 x2\_s*' ..
1119 '\d\+ LOAD $1\_s*' ..
1120 '\d\+ LOAD $2\_s*' ..
1121 '\d\+ ECHO 2\_s*' ..
1122 'endfor\_s*' ..
1123 '\d\+ JUMP -> 8\_s*' ..
1124 '\d\+ DROP\_s*' ..
1125 '\d\+ PUSHNR 0\_s*' ..
1126 '\d\+ RETURN',
1127 instr)
1128enddef
1129
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001130let g:number = 42
1131
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001132def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001133 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001134enddef
1135
1136def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001137 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001138 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001139 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001140 '\d PUSHNR 23\_s*' ..
1141 '\d LOADG g:number\_s*' ..
1142 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1143 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001144 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001145 '\d STORE $0\_s*' ..
1146 '\d PUSHNR 0\_s*' ..
1147 '\d RETURN\_s*',
1148 instr)
1149enddef
1150
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001151def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001152 var nr = 3
1153 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001154 nrres = nr - 7
1155 nrres = nr * 7
1156 nrres = nr / 7
1157 nrres = nr % 7
1158
Bram Moolenaarac564082020-09-27 19:05:33 +02001159 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001160 anyres = g:number - 7
1161 anyres = g:number * 7
1162 anyres = g:number / 7
1163 anyres = g:number % 7
1164
1165 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001166 var fl = 3.0
1167 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001168 flres = fl - 7.0
1169 flres = fl * 7.0
1170 flres = fl / 7.0
1171 endif
1172enddef
1173
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001174def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001175 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001176 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001177 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001178 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001179 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001180 '\d LOAD $0.*' ..
1181 '\d PUSHNR 7.*' ..
1182 '\d OPNR +.*' ..
1183 '\d STORE $1.*' ..
1184 'nrres = nr - 7.*' ..
1185 '\d OPNR -.*' ..
1186 'nrres = nr \* 7.*' ..
1187 '\d OPNR \*.*' ..
1188 'nrres = nr / 7.*' ..
1189 '\d OPNR /.*' ..
1190 'nrres = nr % 7.*' ..
1191 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001192 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001193 '\d LOADG g:number.*' ..
1194 '\d PUSHNR 7.*' ..
1195 '\d OPANY +.*' ..
1196 '\d STORE $2.*' ..
1197 'anyres = g:number - 7.*' ..
1198 '\d OPANY -.*' ..
1199 'anyres = g:number \* 7.*' ..
1200 '\d OPANY \*.*' ..
1201 'anyres = g:number / 7.*' ..
1202 '\d OPANY /.*' ..
1203 'anyres = g:number % 7.*' ..
1204 '\d OPANY %.*',
1205 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001206 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001207 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001208 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001209 '\d PUSHF 3.0.*' ..
1210 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001211 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001212 '\d LOAD $3.*' ..
1213 '\d PUSHF 7.0.*' ..
1214 '\d OPFLOAT +.*' ..
1215 '\d STORE $4.*' ..
1216 'flres = fl - 7.0.*' ..
1217 '\d OPFLOAT -.*' ..
1218 'flres = fl \* 7.0.*' ..
1219 '\d OPFLOAT \*.*' ..
1220 'flres = fl / 7.0.*' ..
1221 '\d OPFLOAT /.*',
1222 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001223 endif
1224enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001225
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001226def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001227 var reslist = [1, 2] + [3, 4]
1228 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001229enddef
1230
1231def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001232 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001233 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001234 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001235 '\d PUSHNR 1.*' ..
1236 '\d PUSHNR 2.*' ..
1237 '\d NEWLIST size 2.*' ..
1238 '\d PUSHNR 3.*' ..
1239 '\d PUSHNR 4.*' ..
1240 '\d NEWLIST size 2.*' ..
1241 '\d ADDLIST.*' ..
1242 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001243 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001244 '\d PUSHBLOB 0z1122.*' ..
1245 '\d PUSHBLOB 0z3344.*' ..
1246 '\d ADDBLOB.*' ..
1247 '\d STORE $.*',
1248 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001249enddef
1250
1251let g:aa = 'aa'
1252def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001253 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001254 return res
1255enddef
1256
1257def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001258 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001259 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001260 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001261 '\d LOADG g:aa.*' ..
1262 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001263 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001264 '\d CONCAT.*' ..
1265 '\d STORE $.*',
1266 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001267 assert_equal('aabb', ConcatString())
1268enddef
1269
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001270def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001271 var s = "abcd"
1272 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001273 return res
1274enddef
1275
1276def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001277 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001278 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001279 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001280 '\d PUSHS "abcd"\_s*' ..
1281 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001282 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001283 '\d LOAD $0\_s*' ..
1284 '\d PUSHNR 1\_s*' ..
1285 '\d STRINDEX\_s*' ..
1286 '\d STORE $1\_s*',
1287 instr)
1288 assert_equal('b', StringIndex())
1289enddef
1290
Bram Moolenaared591872020-08-15 22:14:53 +02001291def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001292 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001293 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001294 return res
1295enddef
1296
1297def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001298 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001299 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001300 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001301 '\d PUSHS "abcd"\_s*' ..
1302 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001303 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001304 '\d LOAD $0\_s*' ..
1305 '\d PUSHNR 1\_s*' ..
1306 '\d PUSHNR 8\_s*' ..
1307 '\d STRSLICE\_s*' ..
1308 '\d STORE $1\_s*',
1309 instr)
1310 assert_equal('bcd', StringSlice())
1311enddef
1312
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001313def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001314 var l = [1, 2, 3]
1315 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001316 return res
1317enddef
1318
1319def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001320 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001321 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001322 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001323 '\d PUSHNR 1\_s*' ..
1324 '\d PUSHNR 2\_s*' ..
1325 '\d PUSHNR 3\_s*' ..
1326 '\d NEWLIST size 3\_s*' ..
1327 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001328 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001329 '\d LOAD $0\_s*' ..
1330 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001331 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001332 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001333 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001334 assert_equal(2, ListIndex())
1335enddef
1336
Bram Moolenaared591872020-08-15 22:14:53 +02001337def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001338 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001339 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001340 return res
1341enddef
1342
1343def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001344 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001345 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001346 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001347 '\d PUSHNR 1\_s*' ..
1348 '\d PUSHNR 2\_s*' ..
1349 '\d PUSHNR 3\_s*' ..
1350 '\d NEWLIST size 3\_s*' ..
1351 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001352 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001353 '\d LOAD $0\_s*' ..
1354 '\d PUSHNR 1\_s*' ..
1355 '\d PUSHNR 8\_s*' ..
1356 '\d LISTSLICE\_s*' ..
1357 '\d STORE $1\_s*',
1358 instr)
1359 assert_equal([2, 3], ListSlice())
1360enddef
1361
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001362def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001363 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001364 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001365 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001366 return res
1367enddef
1368
1369def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001370 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001371 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001372 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001373 '\d PUSHS "item"\_s*' ..
1374 '\d PUSHNR 1\_s*' ..
1375 '\d NEWDICT size 1\_s*' ..
1376 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001377 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001378 '\d\+ LOAD $0\_s*' ..
1379 '\d\+ MEMBER item\_s*' ..
1380 '\d\+ STORE $1\_s*' ..
1381 'res = d\["item"\]\_s*' ..
1382 '\d\+ LOAD $0\_s*' ..
1383 '\d\+ PUSHS "item"\_s*' ..
1384 '\d\+ MEMBER\_s*' ..
1385 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001386 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001387 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001388enddef
1389
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001390let somelist = [1, 2, 3, 4, 5]
1391def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001392 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001393 return res
1394enddef
1395
1396def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001397 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001398 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001399 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001400 '\d LOADG g:somelist\_s*' ..
1401 '\d PUSHNR 2\_s*' ..
1402 '\d ANYINDEX\_s*' ..
1403 '\d STORE $0\_s*' ..
1404 'return res\_s*' ..
1405 '\d LOAD $0\_s*' ..
1406 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1407 '\d RETURN',
1408 instr)
1409 assert_equal(3, AnyIndex())
1410enddef
1411
1412def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001413 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001414 return res
1415enddef
1416
1417def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001418 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001419 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001420 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001421 '\d LOADG g:somelist\_s*' ..
1422 '\d PUSHNR 1\_s*' ..
1423 '\d PUSHNR 3\_s*' ..
1424 '\d ANYSLICE\_s*' ..
1425 '\d STORE $0\_s*' ..
1426 'return res\_s*' ..
1427 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001428 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001429 '\d RETURN',
1430 instr)
1431 assert_equal([2, 3, 4], AnySlice())
1432enddef
1433
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001434def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001435 var nr = 9
1436 var plus = +nr
1437 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001438 return res
1439enddef
1440
1441def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001442 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001443 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001444 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001445 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001446 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001447 '\d LOAD $0\_s*' ..
1448 '\d CHECKNR\_s*' ..
1449 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001450 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001451 '\d LOAD $0\_s*' ..
1452 '\d NEGATENR\_s*' ..
1453 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001454 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001455 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001456enddef
1457
1458def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001459 var flag = true
1460 var invert = !flag
1461 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001462 return res
1463enddef
1464
1465def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001466 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001467 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001468 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001469 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001470 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001471 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001472 '\d LOAD $0\_s*' ..
1473 '\d INVERT (!val)\_s*' ..
1474 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001475 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001476 '\d LOAD $0\_s*' ..
1477 '\d 2BOOL (!!val)\_s*' ..
1478 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001479 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001480 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001481enddef
1482
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001483def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001484 var name: bool = 1 && 0 || 1
1485 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001486enddef
1487
1488def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001489 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001490 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001491 'var name: bool = 1 && 0 || 1\_s*' ..
1492 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001493 '1 2BOOL (!!val)\_s*' ..
1494 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1495 '3 PUSHNR 0\_s*' ..
1496 '4 2BOOL (!!val)\_s*' ..
1497 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1498 '6 PUSHNR 1\_s*' ..
1499 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001500 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001501 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001502 '\d\+ LOAD $0\_s*' ..
1503 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001504 instr)
1505 assert_equal(true, InvertBool())
1506enddef
1507
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001508def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001509 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001510 ['true == isFalse', 'COMPAREBOOL =='],
1511 ['true != isFalse', 'COMPAREBOOL !='],
1512 ['v:none == isNull', 'COMPARESPECIAL =='],
1513 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001514
Bram Moolenaara5565e42020-05-09 15:44:01 +02001515 ['111 == aNumber', 'COMPARENR =='],
1516 ['111 != aNumber', 'COMPARENR !='],
1517 ['111 > aNumber', 'COMPARENR >'],
1518 ['111 < aNumber', 'COMPARENR <'],
1519 ['111 >= aNumber', 'COMPARENR >='],
1520 ['111 <= aNumber', 'COMPARENR <='],
1521 ['111 =~ aNumber', 'COMPARENR =\~'],
1522 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001523
Bram Moolenaara5565e42020-05-09 15:44:01 +02001524 ['"xx" != aString', 'COMPARESTRING !='],
1525 ['"xx" > aString', 'COMPARESTRING >'],
1526 ['"xx" < aString', 'COMPARESTRING <'],
1527 ['"xx" >= aString', 'COMPARESTRING >='],
1528 ['"xx" <= aString', 'COMPARESTRING <='],
1529 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1530 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1531 ['"xx" is aString', 'COMPARESTRING is'],
1532 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001533
Bram Moolenaara5565e42020-05-09 15:44:01 +02001534 ['0z11 == aBlob', 'COMPAREBLOB =='],
1535 ['0z11 != aBlob', 'COMPAREBLOB !='],
1536 ['0z11 is aBlob', 'COMPAREBLOB is'],
1537 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001538
Bram Moolenaara5565e42020-05-09 15:44:01 +02001539 ['[1, 2] == aList', 'COMPARELIST =='],
1540 ['[1, 2] != aList', 'COMPARELIST !='],
1541 ['[1, 2] is aList', 'COMPARELIST is'],
1542 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001543
Bram Moolenaare0de1712020-12-02 17:36:54 +01001544 ['{a: 1} == aDict', 'COMPAREDICT =='],
1545 ['{a: 1} != aDict', 'COMPAREDICT !='],
1546 ['{a: 1} is aDict', 'COMPAREDICT is'],
1547 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001548
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001549 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1550 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1551 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1552 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001553
1554 ['77 == g:xx', 'COMPAREANY =='],
1555 ['77 != g:xx', 'COMPAREANY !='],
1556 ['77 > g:xx', 'COMPAREANY >'],
1557 ['77 < g:xx', 'COMPAREANY <'],
1558 ['77 >= g:xx', 'COMPAREANY >='],
1559 ['77 <= g:xx', 'COMPAREANY <='],
1560 ['77 =~ g:xx', 'COMPAREANY =\~'],
1561 ['77 !~ g:xx', 'COMPAREANY !\~'],
1562 ['77 is g:xx', 'COMPAREANY is'],
1563 ['77 isnot g:xx', 'COMPAREANY isnot'],
1564 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001565 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001566 if has('float')
1567 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001568 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1569 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1570 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1571 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1572 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1573 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1574 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1575 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001576 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001577 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001578 endif
1579
Bram Moolenaarac564082020-09-27 19:05:33 +02001580 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001581 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001582 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001583 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001584 ' var isFalse = false',
1585 ' var isNull = v:null',
1586 ' var aNumber = 222',
1587 ' var aString = "yy"',
1588 ' var aBlob = 0z22',
1589 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001590 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001591 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001592 ' if ' .. case[0],
1593 ' echo 42'
1594 ' endif',
1595 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001596 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001597 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001598 assert_match('TestCase' .. nr .. '.*' ..
1599 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1600 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001601 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001602 '\d ' .. case[1] .. '.*' ..
1603 '\d JUMP_IF_FALSE -> \d\+.*',
1604 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001605
1606 nr += 1
1607 endfor
1608
Bram Moolenaar22da5592020-03-19 14:52:20 +01001609 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001610enddef
1611
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001612def s:FalsyOp()
1613 echo g:flag ?? "yes"
1614 echo [] ?? "empty list"
1615 echo "" ?? "empty string"
1616enddef
1617
1618def Test_dsassemble_falsy_op()
1619 var res = execute('disass s:FalsyOp')
1620 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1621 'echo g:flag ?? "yes"\_s*' ..
1622 '0 LOADG g:flag\_s*' ..
1623 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1624 '2 PUSHS "yes"\_s*' ..
1625 '3 ECHO 1\_s*' ..
1626 'echo \[\] ?? "empty list"\_s*' ..
1627 '4 NEWLIST size 0\_s*' ..
1628 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1629 '6 PUSHS "empty list"\_s*' ..
1630 '7 ECHO 1\_s*' ..
1631 'echo "" ?? "empty string"\_s*' ..
1632 '\d\+ PUSHS "empty string"\_s*' ..
1633 '\d\+ ECHO 1\_s*' ..
1634 '\d\+ PUSHNR 0\_s*' ..
1635 '\d\+ RETURN',
1636 res)
1637enddef
1638
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001639def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001640 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001641 ['"xx" == "yy"', false],
1642 ['"aa" == "aa"', true],
1643 ['has("eval") ? true : false', true],
1644 ['has("asdf") ? true : false', false],
1645 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001646
Bram Moolenaarac564082020-09-27 19:05:33 +02001647 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001648 for case in cases
1649 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001650 ' if ' .. case[0],
1651 ' echo 42'
1652 ' endif',
1653 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001654 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001655 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001656 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001657 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001658 assert_match('TestCase' .. nr .. '.*' ..
1659 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1660 '\d PUSHNR 42.*' ..
1661 '\d ECHO 1.*' ..
1662 '\d PUSHNR 0.*' ..
1663 '\d RETURN.*',
1664 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001665 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001666 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001667 assert_match('TestCase' .. nr .. '.*' ..
1668 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1669 'echo 42[ \n]*' ..
1670 'endif[ \n]*' ..
1671 '\s*\d PUSHNR 0.*' ..
1672 '\d RETURN.*',
1673 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001674 endif
1675
1676 nr += 1
1677 endfor
1678
1679 delete('Xdisassemble')
1680enddef
1681
Bram Moolenaarad39c092020-02-26 18:23:43 +01001682def s:Execute()
1683 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001684 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001685 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001687 execute 'help ' .. tag
1688enddef
1689
1690def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001691 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001692 assert_match('\<SNR>\d*_Execute\_s*' ..
1693 "execute 'help vim9.txt'\\_s*" ..
1694 '\d PUSHS "help vim9.txt"\_s*' ..
1695 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001696 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001697 '\d PUSHS "help vim9.txt"\_s*' ..
1698 '\d STORE $0\_s*' ..
1699 'execute cmd\_s*' ..
1700 '\d LOAD $0\_s*' ..
1701 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001702 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001703 '\d PUSHS "vim9.txt"\_s*' ..
1704 '\d STORE $1\_s*' ..
1705 "execute 'help ' .. tag\\_s*" ..
1706 '\d\+ PUSHS "help "\_s*' ..
1707 '\d\+ LOAD $1\_s*' ..
1708 '\d\+ CONCAT\_s*' ..
1709 '\d\+ EXECUTE 1\_s*' ..
1710 '\d\+ PUSHNR 0\_s*' ..
1711 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001712 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001713enddef
1714
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001715def s:Echomsg()
1716 echomsg 'some' 'message'
1717 echoerr 'went' .. 'wrong'
1718enddef
1719
1720def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001722 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1723 "echomsg 'some' 'message'\\_s*" ..
1724 '\d PUSHS "some"\_s*' ..
1725 '\d PUSHS "message"\_s*' ..
1726 '\d ECHOMSG 2\_s*' ..
1727 "echoerr 'went' .. 'wrong'\\_s*" ..
1728 '\d PUSHS "wentwrong"\_s*' ..
1729 '\d ECHOERR 1\_s*' ..
1730 '\d PUSHNR 0\_s*' ..
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001731 '\d RETURN',
1732 res)
1733enddef
1734
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001735def SomeStringArg(arg: string)
1736 echo arg
1737enddef
1738
1739def SomeAnyArg(arg: any)
1740 echo arg
1741enddef
1742
1743def SomeStringArgAndReturn(arg: string): string
1744 return arg
1745enddef
1746
1747def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001748 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001749 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1750 '\d *echo arg.*' ..
1751 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001752 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001753
Bram Moolenaarac564082020-09-27 19:05:33 +02001754 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001755 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1756 '\d *echo arg\_s*' ..
1757 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001758 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001759
Bram Moolenaarac564082020-09-27 19:05:33 +02001760 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001761 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1762 '\d *return arg\_s*' ..
1763 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001764 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001765enddef
1766
Bram Moolenaar09689a02020-05-09 22:50:08 +02001767def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001768 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001769 vim9script
1770 def FuncOne(): string
1771 return FuncTwo()
1772 enddef
1773 def FuncTwo(): string
1774 return 'two'
1775 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001776 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001777 END
1778 writefile(lines, 'Xdisassemble')
1779 source Xdisassemble
1780
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001781 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001782 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1783 'return FuncTwo()\_s*' ..
1784 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001785 '\d RETURN',
1786 g:res_FuncOne)
1787
1788 delete('Xdisassemble')
1789 unlet g:res_FuncOne
1790enddef
1791
Bram Moolenaar61a89812020-05-07 16:58:17 +02001792def s:ConcatStrings(): string
1793 return 'one' .. 'two' .. 'three'
1794enddef
1795
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001796def s:ComputeConst(): number
1797 return 2 + 3 * 4 / 6 + 7
1798enddef
1799
Bram Moolenaar1c747212020-05-09 18:28:34 +02001800def s:ComputeConstParen(): number
1801 return ((2 + 4) * (8 / 2)) / (3 + 4)
1802enddef
1803
Bram Moolenaar61a89812020-05-07 16:58:17 +02001804def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001805 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001806 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1807 "return 'one' .. 'two' .. 'three'\\_s*" ..
1808 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001809 '\d RETURN',
1810 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001811
1812 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001813 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1814 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1815 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001816 '\d RETURN',
1817 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001818
1819 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001820 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1821 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1822 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001823 '\d RETURN',
1824 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001825enddef
1826
Bram Moolenaar389df252020-07-09 21:20:47 +02001827def s:CallAppend()
1828 eval "some text"->append(2)
1829enddef
1830
1831def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001832 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001833 assert_match('<SNR>\d*_CallAppend\_s*' ..
1834 'eval "some text"->append(2)\_s*' ..
1835 '\d PUSHS "some text"\_s*' ..
1836 '\d PUSHNR 2\_s*' ..
1837 '\d SHUFFLE 2 up 1\_s*' ..
1838 '\d BCALL append(argc 2)\_s*' ..
1839 '\d DROP\_s*' ..
1840 '\d PUSHNR 0\_s*' ..
1841 '\d RETURN',
1842 res)
1843enddef
1844
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001845
1846def s:SilentMessage()
1847 silent echomsg "text"
1848 silent! echoerr "error"
1849enddef
1850
1851def Test_silent()
1852 var res = execute('disass s:SilentMessage')
1853 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1854 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001855 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001856 '\d PUSHS "text"\_s*' ..
1857 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001858 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001859 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001860 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001861 '\d PUSHS "error"\_s*' ..
1862 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001863 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001864 '\d PUSHNR 0\_s*' ..
1865 '\d RETURN',
1866 res)
1867enddef
1868
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001869" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker