blob: 1aab9d5b385c6480dccb8b49961dfa2a0f2a579d [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*' ..
425 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
426 '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*' ..
440 'throw "end"\_s*' ..
441 '\d\+ PUSHS "end"\_s*' ..
442 '\d\+ THROW\_s*' ..
443 'endtry\_s*' ..
444 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200445 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100446enddef
447
448def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200449 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100450 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100451enddef
452
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100453def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200454 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200455 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200456 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200457 '\d PUSHNR 1\_s*' ..
458 '\d PUSHS "two"\_s*' ..
459 '\d PUSHNR 333\_s*' ..
460 '\d NEWLIST size 3\_s*' ..
461 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100462 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200463 '\d PUSHS "one"\_s*' ..
464 '\d PUSHNR 1\_s*' ..
465 '\d PUSHS "two"\_s*' ..
466 '\d PUSHS "val"\_s*' ..
467 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200468 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100469enddef
470
Bram Moolenaar6e949782020-04-13 17:21:00 +0200471def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100472 echo arg
473enddef
474
475func UserFunc()
476 echo 'nothing'
477endfunc
478
479func UserFuncWithArg(arg)
480 echo a:arg
481endfunc
482
483def s:ScriptFuncCall(): string
484 changenr()
485 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100486 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100487 FuncWithArg(343)
488 ScriptFuncNew()
489 s:ScriptFuncNew()
490 UserFunc()
491 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200492 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100493 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200494 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100495 FuncRefWithArg("bar")
496 return "yes"
497enddef
498
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100499def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200500 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200501 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
502 'changenr()\_s*' ..
503 '\d BCALL changenr(argc 0)\_s*' ..
504 '\d DROP\_s*' ..
505 'char2nr("abc")\_s*' ..
506 '\d PUSHS "abc"\_s*' ..
507 '\d BCALL char2nr(argc 1)\_s*' ..
508 '\d DROP\_s*' ..
509 'Test_disassemble_new()\_s*' ..
510 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
511 '\d DROP\_s*' ..
512 'FuncWithArg(343)\_s*' ..
513 '\d\+ PUSHNR 343\_s*' ..
514 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
515 '\d\+ DROP\_s*' ..
516 'ScriptFuncNew()\_s*' ..
517 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
518 '\d\+ DROP\_s*' ..
519 's:ScriptFuncNew()\_s*' ..
520 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
521 '\d\+ DROP\_s*' ..
522 'UserFunc()\_s*' ..
523 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
524 '\d\+ DROP\_s*' ..
525 'UserFuncWithArg("foo")\_s*' ..
526 '\d\+ PUSHS "foo"\_s*' ..
527 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
528 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200529 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200530 '\d\+ PUSHS "UserFunc"\_s*' ..
531 '\d\+ BCALL function(argc 1)\_s*' ..
532 '\d\+ STORE $0\_s*' ..
533 'FuncRef()\_s*' ..
534 '\d\+ LOAD $\d\_s*' ..
535 '\d\+ PCALL (argc 0)\_s*' ..
536 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200537 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200538 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
539 '\d\+ BCALL function(argc 1)\_s*' ..
540 '\d\+ STORE $1\_s*' ..
541 'FuncRefWithArg("bar")\_s*' ..
542 '\d\+ PUSHS "bar"\_s*' ..
543 '\d\+ LOAD $\d\_s*' ..
544 '\d\+ PCALL (argc 1)\_s*' ..
545 '\d\+ DROP\_s*' ..
546 'return "yes"\_s*' ..
547 '\d\+ PUSHS "yes"\_s*' ..
548 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200549 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100550enddef
551
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200552
553def s:CreateRefs()
554 var local = 'a'
555 def Append(arg: string)
556 local ..= arg
557 enddef
558 g:Append = Append
559 def Get(): string
560 return local
561 enddef
562 g:Get = Get
563enddef
564
565def Test_disassemble_closure()
566 CreateRefs()
567 var res = execute('disass g:Append')
568 assert_match('<lambda>\d\_s*' ..
569 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100570 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200571 '\d LOAD arg\[-1\]\_s*' ..
572 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100573 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100574 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200575 res)
576
577 res = execute('disass g:Get')
578 assert_match('<lambda>\d\_s*' ..
579 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100580 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200581 '\d RETURN',
582 res)
583
584 unlet g:Append
585 unlet g:Get
586enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200587
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100588
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200589def EchoArg(arg: string): string
590 return arg
591enddef
592def RefThis(): func
593 return function('EchoArg')
594enddef
595def s:ScriptPCall()
596 RefThis()("text")
597enddef
598
599def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200600 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200601 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
602 'RefThis()("text")\_s*' ..
603 '\d DCALL RefThis(argc 0)\_s*' ..
604 '\d PUSHS "text"\_s*' ..
605 '\d PCALL top (argc 1)\_s*' ..
606 '\d PCALL end\_s*' ..
607 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100608 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200609 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200610enddef
611
612
Bram Moolenaara26b9702020-04-18 19:53:28 +0200613def s:FuncWithForwardCall(): string
614 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100615enddef
616
617def DefinedLater(arg: string): string
618 return arg
619enddef
620
621def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200622 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200623 assert_match('FuncWithForwardCall\_s*' ..
624 'return g:DefinedLater("yes")\_s*' ..
625 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200626 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200627 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200628 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100629
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200630 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100631 assert_equal('yes', FuncWithForwardCall())
632
Bram Moolenaara26b9702020-04-18 19:53:28 +0200633 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*' ..
637 '\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 +0100640enddef
641
642
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100643def FuncWithDefault(arg: string = 'default'): string
644 return arg
645enddef
646
647def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200648 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200649 assert_match('FuncWithDefault\_s*' ..
650 '\d PUSHS "default"\_s*' ..
651 '\d STORE arg\[-1]\_s*' ..
652 'return arg\_s*' ..
653 '\d LOAD arg\[-1]\_s*' ..
654 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200655 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100656enddef
657
658
Bram Moolenaar158906c2020-02-06 20:39:45 +0100659def HasEval()
660 if has("eval")
661 echo "yes"
662 else
663 echo "no"
664 endif
665enddef
666
667def HasNothing()
668 if has("nothing")
669 echo "yes"
670 else
671 echo "no"
672 endif
673enddef
674
675def HasSomething()
676 if has("nothing")
677 echo "nothing"
678 elseif has("something")
679 echo "something"
680 elseif has("eval")
681 echo "eval"
682 elseif has("less")
683 echo "less"
684 endif
685enddef
686
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100687def HasGuiRunning()
688 if has("gui_running")
689 echo "yes"
690 else
691 echo "no"
692 endif
693enddef
694
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100695def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200696 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200697 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200698 assert_match('HasEval\_s*' ..
699 'if has("eval")\_s*' ..
700 'echo "yes"\_s*' ..
701 '\d PUSHS "yes"\_s*' ..
702 '\d ECHO 1\_s*' ..
703 'else\_s*' ..
704 'echo "no"\_s*' ..
705 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200706 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100707 assert_notmatch('JUMP', instr)
708
Bram Moolenaard2c61702020-09-06 15:58:36 +0200709 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100710 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200711 assert_match('HasNothing\_s*' ..
712 'if has("nothing")\_s*' ..
713 'echo "yes"\_s*' ..
714 'else\_s*' ..
715 'echo "no"\_s*' ..
716 '\d PUSHS "no"\_s*' ..
717 '\d ECHO 1\_s*' ..
718 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200719 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100720 assert_notmatch('PUSHS "yes"', instr)
721 assert_notmatch('JUMP', instr)
722
Bram Moolenaard2c61702020-09-06 15:58:36 +0200723 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100724 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200725 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200726 'if has("nothing")\_s*' ..
727 'echo "nothing"\_s*' ..
728 'elseif has("something")\_s*' ..
729 'echo "something"\_s*' ..
730 'elseif has("eval")\_s*' ..
731 'echo "eval"\_s*' ..
732 '\d PUSHS "eval"\_s*' ..
733 '\d ECHO 1\_s*' ..
734 'elseif has("less").*' ..
735 'echo "less"\_s*' ..
736 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200737 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100738 assert_notmatch('PUSHS "nothing"', instr)
739 assert_notmatch('PUSHS "something"', instr)
740 assert_notmatch('PUSHS "less"', instr)
741 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100742
743 var result: string
744 var instr_expected: string
745 if has('gui')
746 if has('gui_running')
747 # GUI already running, always returns "yes"
748 result = "\nyes"
749 instr_expected = 'HasGuiRunning.*' ..
750 'if has("gui_running")\_s*' ..
751 ' echo "yes"\_s*' ..
752 '\d PUSHS "yes"\_s*' ..
753 '\d ECHO 1\_s*' ..
754 'else\_s*' ..
755 ' echo "no"\_s*' ..
756 'endif'
757 else
758 result = "\nno"
759 if has('unix')
760 # GUI not running but can start later, call has()
761 instr_expected = 'HasGuiRunning.*' ..
762 'if has("gui_running")\_s*' ..
763 '\d PUSHS "gui_running"\_s*' ..
764 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaar3af15ab2021-01-17 16:16:23 +0100765 '\d 2BOOL (!!val)\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100766 '\d JUMP_IF_FALSE -> \d\_s*' ..
767 ' echo "yes"\_s*' ..
768 '\d PUSHS "yes"\_s*' ..
769 '\d ECHO 1\_s*' ..
770 'else\_s*' ..
771 '\d JUMP -> \d\_s*' ..
772 ' echo "no"\_s*' ..
773 '\d PUSHS "no"\_s*' ..
774 '\d ECHO 1\_s*' ..
775 'endif'
776 else
777 # GUI not running, always return "no"
778 instr_expected = 'HasGuiRunning.*' ..
779 'if has("gui_running")\_s*' ..
780 ' echo "yes"\_s*' ..
781 'else\_s*' ..
782 ' echo "no"\_s*' ..
783 '\d PUSHS "no"\_s*' ..
784 '\d ECHO 1\_s*' ..
785 'endif'
786 endif
787 endif
788 else
789 # GUI not supported, always return "no"
790 result = "\nno"
791 instr_expected = 'HasGuiRunning.*' ..
792 'if has("gui_running")\_s*' ..
793 ' echo "yes"\_s*' ..
794 'else\_s*' ..
795 ' echo "no"\_s*' ..
796 '\d PUSHS "no"\_s*' ..
797 '\d ECHO 1\_s*' ..
798 'endif'
799 endif
800
801 assert_equal(result, execute('HasGuiRunning()'))
802 instr = execute('disassemble HasGuiRunning')
803 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100804enddef
805
Bram Moolenaarefd88552020-06-18 20:50:10 +0200806def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100807 if 1 < 0
808 return "maybe"
809 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200810 if g:cond
811 return "yes"
812 else
813 return "no"
814 endif
815enddef
816
817def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200818 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200819 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100820 'if 1 < 0\_s*' ..
821 ' return "maybe"\_s*' ..
822 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200823 'if g:cond\_s*' ..
824 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100825 '1 COND2BOOL\_s*' ..
826 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200827 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100828 '3 PUSHS "yes"\_s*' ..
829 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200830 'else\_s*' ..
831 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100832 '5 PUSHS "no"\_s*' ..
833 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200834 instr)
835enddef
836
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100837def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200838 var Funky1: func
839 var Funky2: func = function("len")
840 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100841enddef
842
843def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200844 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200845 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200846 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200847 '0 PUSHFUNC "\[none]"\_s*' ..
848 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200849 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200850 '2 PUSHS "len"\_s*' ..
851 '3 BCALL function(argc 1)\_s*' ..
852 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200853 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200854 '\d PUSHS "UserFunc"\_s*' ..
855 '\d BCALL funcref(argc 1)\_s*' ..
856 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100857 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200858 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100859enddef
860
861if has('channel')
862 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200863 var job1: job
864 var job2: job = job_start("donothing")
865 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100866 enddef
867endif
868
869def Test_disassemble_channel()
870 CheckFeature channel
871
Bram Moolenaarac564082020-09-27 19:05:33 +0200872 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200873 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200874 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200875 '\d PUSHJOB "no process"\_s*' ..
876 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200877 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200878 '\d PUSHS "donothing"\_s*' ..
879 '\d BCALL job_start(argc 1)\_s*' ..
880 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200881 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200882 '\d PUSHCHANNEL 0\_s*' ..
883 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100884 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200885 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100886enddef
887
Bram Moolenaar777770f2020-02-06 21:27:08 +0100888def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100889 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100890 return F("x")
891enddef
892
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100893def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100894 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200895 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200896 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100897 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200898 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200899 '\d STORE $0\_s*' ..
900 'return F("x")\_s*' ..
901 '\d PUSHS "x"\_s*' ..
902 '\d LOAD $0\_s*' ..
903 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200904 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200905 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200906
Bram Moolenaarac564082020-09-27 19:05:33 +0200907 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200908 instr = execute('disassemble ' .. name)
909 assert_match('<lambda>\d\+\_s*' ..
910 'return "X" .. a .. "X"\_s*' ..
911 '\d PUSHS "X"\_s*' ..
912 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200913 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200914 '\d CONCAT\_s*' ..
915 '\d PUSHS "X"\_s*' ..
916 '\d CONCAT\_s*' ..
917 '\d RETURN',
918 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100919enddef
920
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100921def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100922 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100923 return Ref(g:value)
924enddef
925
926def Test_disassemble_lambda_with_type()
927 g:value = 5
928 assert_equal(15, LambdaWithType())
929 var instr = execute('disassemble LambdaWithType')
930 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100931 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100932 '\d FUNCREF <lambda>\d\+\_s*' ..
933 '\d STORE $0\_s*' ..
934 'return Ref(g:value)\_s*' ..
935 '\d LOADG g:value\_s*' ..
936 '\d LOAD $0\_s*' ..
937 '\d CHECKTYPE number stack\[-2\]\_s*' ..
938 '\d PCALL (argc 1)\_s*' ..
939 '\d RETURN',
940 instr)
941enddef
942
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200943def NestedOuter()
944 def g:Inner()
945 echomsg "inner"
946 enddef
947enddef
948
949def Test_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200950 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200951 assert_match('NestedOuter\_s*' ..
952 'def g:Inner()\_s*' ..
953 'echomsg "inner"\_s*' ..
954 'enddef\_s*' ..
955 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100956 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200957 instr)
958enddef
959
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100960def NestedDefList()
961 def
962 def Info
963 def /Info
964 def /Info/
965enddef
966
967def Test_nested_def_list()
968 var instr = execute('disassemble NestedDefList')
969 assert_match('NestedDefList\_s*' ..
970 'def\_s*' ..
971 '\d DEF \_s*' ..
972 'def Info\_s*' ..
973 '\d DEF Info\_s*' ..
974 'def /Info\_s*' ..
975 '\d DEF /Info\_s*' ..
976 'def /Info/\_s*' ..
977 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100978 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100979 instr)
980enddef
981
Bram Moolenaar6e949782020-04-13 17:21:00 +0200982def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100983 if arg == 1 && arg != 2 || arg == 4
984 return 'yes'
985 endif
986 return 'no'
987enddef
988
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100989def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100990 assert_equal("yes", AndOr(1))
991 assert_equal("no", AndOr(2))
992 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200993 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200994 assert_match('AndOr\_s*' ..
995 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
996 '\d LOAD arg\[-1]\_s*' ..
997 '\d PUSHNR 1\_s*' ..
998 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +0200999 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001000 '\d LOAD arg\[-1]\_s*' ..
1001 '\d PUSHNR 2\_s*' ..
1002 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001003 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001004 '\d LOAD arg\[-1]\_s*' ..
1005 '\d\+ PUSHNR 4\_s*' ..
1006 '\d\+ COMPAREANY ==\_s*' ..
1007 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001008 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001009enddef
1010
Bram Moolenaar04d05222020-02-06 22:06:54 +01001011def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001012 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001013 for i in range(3)
1014 res->add(i)
1015 endfor
1016 return res
1017enddef
1018
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001019def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001020 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001021 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001022 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001023 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001024 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001025 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001026 '\d STORE $0\_s*' ..
1027 'for i in range(3)\_s*' ..
1028 '\d STORE -1 in $1\_s*' ..
1029 '\d PUSHNR 3\_s*' ..
1030 '\d BCALL range(argc 1)\_s*' ..
1031 '\d FOR $1 -> \d\+\_s*' ..
1032 '\d STORE $2\_s*' ..
1033 'res->add(i)\_s*' ..
1034 '\d LOAD $0\_s*' ..
1035 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001036 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001037 '\d\+ DROP\_s*' ..
1038 'endfor\_s*' ..
1039 '\d\+ JUMP -> \d\+\_s*' ..
1040 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001041 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001042enddef
1043
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001044def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001045 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001046 for str in eval('["one", "two"]')
1047 res ..= str
1048 endfor
1049 return res
1050enddef
1051
1052def Test_disassemble_for_loop_eval()
1053 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001054 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001055 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001056 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001057 '\d PUSHS ""\_s*' ..
1058 '\d STORE $0\_s*' ..
1059 'for str in eval(''\["one", "two"\]'')\_s*' ..
1060 '\d STORE -1 in $1\_s*' ..
1061 '\d PUSHS "\["one", "two"\]"\_s*' ..
1062 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001063 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001064 '\d FOR $1 -> \d\+\_s*' ..
1065 '\d STORE $2\_s*' ..
1066 'res ..= str\_s*' ..
1067 '\d\+ LOAD $0\_s*' ..
1068 '\d\+ LOAD $2\_s*' ..
1069 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1070 '\d\+ CONCAT\_s*' ..
1071 '\d\+ STORE $0\_s*' ..
1072 'endfor\_s*' ..
1073 '\d\+ JUMP -> 6\_s*' ..
1074 '\d\+ DROP\_s*' ..
1075 'return res\_s*' ..
1076 '\d\+ LOAD $0\_s*' ..
1077 '\d\+ RETURN',
1078 instr)
1079enddef
1080
Bram Moolenaar792f7862020-11-23 08:31:18 +01001081def ForLoopUnpack()
1082 for [x1, x2] in [[1, 2], [3, 4]]
1083 echo x1 x2
1084 endfor
1085enddef
1086
1087def Test_disassemble_for_loop_unpack()
1088 var instr = execute('disassemble ForLoopUnpack')
1089 assert_match('ForLoopUnpack\_s*' ..
1090 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1091 '\d\+ STORE -1 in $0\_s*' ..
1092 '\d\+ PUSHNR 1\_s*' ..
1093 '\d\+ PUSHNR 2\_s*' ..
1094 '\d\+ NEWLIST size 2\_s*' ..
1095 '\d\+ PUSHNR 3\_s*' ..
1096 '\d\+ PUSHNR 4\_s*' ..
1097 '\d\+ NEWLIST size 2\_s*' ..
1098 '\d\+ NEWLIST size 2\_s*' ..
1099 '\d\+ FOR $0 -> 16\_s*' ..
1100 '\d\+ UNPACK 2\_s*' ..
1101 '\d\+ STORE $1\_s*' ..
1102 '\d\+ STORE $2\_s*' ..
1103 'echo x1 x2\_s*' ..
1104 '\d\+ LOAD $1\_s*' ..
1105 '\d\+ LOAD $2\_s*' ..
1106 '\d\+ ECHO 2\_s*' ..
1107 'endfor\_s*' ..
1108 '\d\+ JUMP -> 8\_s*' ..
1109 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001110 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001111 instr)
1112enddef
1113
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001114let g:number = 42
1115
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001116def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001117 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001118enddef
1119
1120def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001121 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001122 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001123 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001124 '\d PUSHNR 23\_s*' ..
1125 '\d LOADG g:number\_s*' ..
1126 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1127 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001128 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001129 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001130 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001131 instr)
1132enddef
1133
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001134def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001135 var nr = 3
1136 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001137 nrres = nr - 7
1138 nrres = nr * 7
1139 nrres = nr / 7
1140 nrres = nr % 7
1141
Bram Moolenaarac564082020-09-27 19:05:33 +02001142 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001143 anyres = g:number - 7
1144 anyres = g:number * 7
1145 anyres = g:number / 7
1146 anyres = g:number % 7
1147
1148 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001149 var fl = 3.0
1150 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001151 flres = fl - 7.0
1152 flres = fl * 7.0
1153 flres = fl / 7.0
1154 endif
1155enddef
1156
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001157def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001158 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001159 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001160 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001161 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001162 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001163 '\d LOAD $0.*' ..
1164 '\d PUSHNR 7.*' ..
1165 '\d OPNR +.*' ..
1166 '\d STORE $1.*' ..
1167 'nrres = nr - 7.*' ..
1168 '\d OPNR -.*' ..
1169 'nrres = nr \* 7.*' ..
1170 '\d OPNR \*.*' ..
1171 'nrres = nr / 7.*' ..
1172 '\d OPNR /.*' ..
1173 'nrres = nr % 7.*' ..
1174 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001175 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001176 '\d LOADG g:number.*' ..
1177 '\d PUSHNR 7.*' ..
1178 '\d OPANY +.*' ..
1179 '\d STORE $2.*' ..
1180 'anyres = g:number - 7.*' ..
1181 '\d OPANY -.*' ..
1182 'anyres = g:number \* 7.*' ..
1183 '\d OPANY \*.*' ..
1184 'anyres = g:number / 7.*' ..
1185 '\d OPANY /.*' ..
1186 'anyres = g:number % 7.*' ..
1187 '\d OPANY %.*',
1188 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001189 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001190 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001191 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001192 '\d PUSHF 3.0.*' ..
1193 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001194 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001195 '\d LOAD $3.*' ..
1196 '\d PUSHF 7.0.*' ..
1197 '\d OPFLOAT +.*' ..
1198 '\d STORE $4.*' ..
1199 'flres = fl - 7.0.*' ..
1200 '\d OPFLOAT -.*' ..
1201 'flres = fl \* 7.0.*' ..
1202 '\d OPFLOAT \*.*' ..
1203 'flres = fl / 7.0.*' ..
1204 '\d OPFLOAT /.*',
1205 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001206 endif
1207enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001208
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001209def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001210 var reslist = [1, 2] + [3, 4]
1211 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001212enddef
1213
1214def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001215 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001216 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001217 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001218 '\d PUSHNR 1.*' ..
1219 '\d PUSHNR 2.*' ..
1220 '\d NEWLIST size 2.*' ..
1221 '\d PUSHNR 3.*' ..
1222 '\d PUSHNR 4.*' ..
1223 '\d NEWLIST size 2.*' ..
1224 '\d ADDLIST.*' ..
1225 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001226 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001227 '\d PUSHBLOB 0z1122.*' ..
1228 '\d PUSHBLOB 0z3344.*' ..
1229 '\d ADDBLOB.*' ..
1230 '\d STORE $.*',
1231 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001232enddef
1233
1234let g:aa = 'aa'
1235def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001236 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001237 return res
1238enddef
1239
1240def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001241 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001242 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001243 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001244 '\d LOADG g:aa.*' ..
1245 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001246 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001247 '\d CONCAT.*' ..
1248 '\d STORE $.*',
1249 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001250 assert_equal('aabb', ConcatString())
1251enddef
1252
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001253def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001254 var s = "abcd"
1255 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001256 return res
1257enddef
1258
1259def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001260 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001261 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001262 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001263 '\d PUSHS "abcd"\_s*' ..
1264 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001265 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001266 '\d LOAD $0\_s*' ..
1267 '\d PUSHNR 1\_s*' ..
1268 '\d STRINDEX\_s*' ..
1269 '\d STORE $1\_s*',
1270 instr)
1271 assert_equal('b', StringIndex())
1272enddef
1273
Bram Moolenaared591872020-08-15 22:14:53 +02001274def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001275 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001276 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001277 return res
1278enddef
1279
1280def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001281 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001282 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001283 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001284 '\d PUSHS "abcd"\_s*' ..
1285 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001286 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001287 '\d LOAD $0\_s*' ..
1288 '\d PUSHNR 1\_s*' ..
1289 '\d PUSHNR 8\_s*' ..
1290 '\d STRSLICE\_s*' ..
1291 '\d STORE $1\_s*',
1292 instr)
1293 assert_equal('bcd', StringSlice())
1294enddef
1295
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001296def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001297 var l = [1, 2, 3]
1298 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001299 return res
1300enddef
1301
1302def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001303 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001304 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001305 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001306 '\d PUSHNR 1\_s*' ..
1307 '\d PUSHNR 2\_s*' ..
1308 '\d PUSHNR 3\_s*' ..
1309 '\d NEWLIST size 3\_s*' ..
1310 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001311 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001312 '\d LOAD $0\_s*' ..
1313 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001314 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001315 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001316 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001317 assert_equal(2, ListIndex())
1318enddef
1319
Bram Moolenaared591872020-08-15 22:14:53 +02001320def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001321 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001322 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001323 return res
1324enddef
1325
1326def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001327 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001328 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001329 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001330 '\d PUSHNR 1\_s*' ..
1331 '\d PUSHNR 2\_s*' ..
1332 '\d PUSHNR 3\_s*' ..
1333 '\d NEWLIST size 3\_s*' ..
1334 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001335 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001336 '\d LOAD $0\_s*' ..
1337 '\d PUSHNR 1\_s*' ..
1338 '\d PUSHNR 8\_s*' ..
1339 '\d LISTSLICE\_s*' ..
1340 '\d STORE $1\_s*',
1341 instr)
1342 assert_equal([2, 3], ListSlice())
1343enddef
1344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001345def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001346 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001347 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001348 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001349 return res
1350enddef
1351
1352def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001353 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001354 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001355 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001356 '\d PUSHS "item"\_s*' ..
1357 '\d PUSHNR 1\_s*' ..
1358 '\d NEWDICT size 1\_s*' ..
1359 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001361 '\d\+ LOAD $0\_s*' ..
1362 '\d\+ MEMBER item\_s*' ..
1363 '\d\+ STORE $1\_s*' ..
1364 'res = d\["item"\]\_s*' ..
1365 '\d\+ LOAD $0\_s*' ..
1366 '\d\+ PUSHS "item"\_s*' ..
1367 '\d\+ MEMBER\_s*' ..
1368 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001369 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001370 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001371enddef
1372
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001373let somelist = [1, 2, 3, 4, 5]
1374def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001375 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001376 return res
1377enddef
1378
1379def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001380 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001381 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001382 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001383 '\d LOADG g:somelist\_s*' ..
1384 '\d PUSHNR 2\_s*' ..
1385 '\d ANYINDEX\_s*' ..
1386 '\d STORE $0\_s*' ..
1387 'return res\_s*' ..
1388 '\d LOAD $0\_s*' ..
1389 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1390 '\d RETURN',
1391 instr)
1392 assert_equal(3, AnyIndex())
1393enddef
1394
1395def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001396 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001397 return res
1398enddef
1399
1400def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001401 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001402 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001403 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001404 '\d LOADG g:somelist\_s*' ..
1405 '\d PUSHNR 1\_s*' ..
1406 '\d PUSHNR 3\_s*' ..
1407 '\d ANYSLICE\_s*' ..
1408 '\d STORE $0\_s*' ..
1409 'return res\_s*' ..
1410 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001411 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001412 '\d RETURN',
1413 instr)
1414 assert_equal([2, 3, 4], AnySlice())
1415enddef
1416
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001417def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001418 var nr = 9
1419 var plus = +nr
1420 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001421 return res
1422enddef
1423
1424def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001425 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001426 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001427 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001428 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001429 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001430 '\d LOAD $0\_s*' ..
1431 '\d CHECKNR\_s*' ..
1432 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001433 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001434 '\d LOAD $0\_s*' ..
1435 '\d NEGATENR\_s*' ..
1436 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001437 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001438 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001439enddef
1440
1441def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001442 var flag = true
1443 var invert = !flag
1444 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001445 return res
1446enddef
1447
1448def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001449 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001450 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001451 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001452 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001453 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001454 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001455 '\d LOAD $0\_s*' ..
1456 '\d INVERT (!val)\_s*' ..
1457 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001458 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001459 '\d LOAD $0\_s*' ..
1460 '\d 2BOOL (!!val)\_s*' ..
1461 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001462 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001463 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001464enddef
1465
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001466def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001467 var name: bool = 1 && 0 || 1
1468 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001469enddef
1470
1471def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001472 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001473 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001474 'var name: bool = 1 && 0 || 1\_s*' ..
1475 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001476 '1 2BOOL (!!val)\_s*' ..
1477 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1478 '3 PUSHNR 0\_s*' ..
1479 '4 2BOOL (!!val)\_s*' ..
1480 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1481 '6 PUSHNR 1\_s*' ..
1482 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001483 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001484 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001485 '\d\+ LOAD $0\_s*' ..
1486 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001487 instr)
1488 assert_equal(true, InvertBool())
1489enddef
1490
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001491def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001492 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001493 ['true == isFalse', 'COMPAREBOOL =='],
1494 ['true != isFalse', 'COMPAREBOOL !='],
1495 ['v:none == isNull', 'COMPARESPECIAL =='],
1496 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001497
Bram Moolenaara5565e42020-05-09 15:44:01 +02001498 ['111 == aNumber', 'COMPARENR =='],
1499 ['111 != aNumber', 'COMPARENR !='],
1500 ['111 > aNumber', 'COMPARENR >'],
1501 ['111 < aNumber', 'COMPARENR <'],
1502 ['111 >= aNumber', 'COMPARENR >='],
1503 ['111 <= aNumber', 'COMPARENR <='],
1504 ['111 =~ aNumber', 'COMPARENR =\~'],
1505 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001506
Bram Moolenaara5565e42020-05-09 15:44:01 +02001507 ['"xx" != aString', 'COMPARESTRING !='],
1508 ['"xx" > aString', 'COMPARESTRING >'],
1509 ['"xx" < aString', 'COMPARESTRING <'],
1510 ['"xx" >= aString', 'COMPARESTRING >='],
1511 ['"xx" <= aString', 'COMPARESTRING <='],
1512 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1513 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1514 ['"xx" is aString', 'COMPARESTRING is'],
1515 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001516
Bram Moolenaara5565e42020-05-09 15:44:01 +02001517 ['0z11 == aBlob', 'COMPAREBLOB =='],
1518 ['0z11 != aBlob', 'COMPAREBLOB !='],
1519 ['0z11 is aBlob', 'COMPAREBLOB is'],
1520 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001521
Bram Moolenaara5565e42020-05-09 15:44:01 +02001522 ['[1, 2] == aList', 'COMPARELIST =='],
1523 ['[1, 2] != aList', 'COMPARELIST !='],
1524 ['[1, 2] is aList', 'COMPARELIST is'],
1525 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001526
Bram Moolenaare0de1712020-12-02 17:36:54 +01001527 ['{a: 1} == aDict', 'COMPAREDICT =='],
1528 ['{a: 1} != aDict', 'COMPAREDICT !='],
1529 ['{a: 1} is aDict', 'COMPAREDICT is'],
1530 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001531
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001532 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1533 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1534 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1535 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001536
1537 ['77 == g:xx', 'COMPAREANY =='],
1538 ['77 != g:xx', 'COMPAREANY !='],
1539 ['77 > g:xx', 'COMPAREANY >'],
1540 ['77 < g:xx', 'COMPAREANY <'],
1541 ['77 >= g:xx', 'COMPAREANY >='],
1542 ['77 <= g:xx', 'COMPAREANY <='],
1543 ['77 =~ g:xx', 'COMPAREANY =\~'],
1544 ['77 !~ g:xx', 'COMPAREANY !\~'],
1545 ['77 is g:xx', 'COMPAREANY is'],
1546 ['77 isnot g:xx', 'COMPAREANY isnot'],
1547 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001548 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001549 if has('float')
1550 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001551 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1552 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1553 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1554 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1555 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1556 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1557 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1558 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001559 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001560 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001561 endif
1562
Bram Moolenaarac564082020-09-27 19:05:33 +02001563 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001564 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001565 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001566 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001567 ' var isFalse = false',
1568 ' var isNull = v:null',
1569 ' var aNumber = 222',
1570 ' var aString = "yy"',
1571 ' var aBlob = 0z22',
1572 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001573 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001574 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001575 ' if ' .. case[0],
1576 ' echo 42'
1577 ' endif',
1578 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001579 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001580 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001581 assert_match('TestCase' .. nr .. '.*' ..
1582 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1583 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001584 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001585 '\d ' .. case[1] .. '.*' ..
1586 '\d JUMP_IF_FALSE -> \d\+.*',
1587 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001588
1589 nr += 1
1590 endfor
1591
Bram Moolenaar22da5592020-03-19 14:52:20 +01001592 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001593enddef
1594
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001595def s:FalsyOp()
1596 echo g:flag ?? "yes"
1597 echo [] ?? "empty list"
1598 echo "" ?? "empty string"
1599enddef
1600
1601def Test_dsassemble_falsy_op()
1602 var res = execute('disass s:FalsyOp')
1603 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1604 'echo g:flag ?? "yes"\_s*' ..
1605 '0 LOADG g:flag\_s*' ..
1606 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1607 '2 PUSHS "yes"\_s*' ..
1608 '3 ECHO 1\_s*' ..
1609 'echo \[\] ?? "empty list"\_s*' ..
1610 '4 NEWLIST size 0\_s*' ..
1611 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1612 '6 PUSHS "empty list"\_s*' ..
1613 '7 ECHO 1\_s*' ..
1614 'echo "" ?? "empty string"\_s*' ..
1615 '\d\+ PUSHS "empty string"\_s*' ..
1616 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001617 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001618 res)
1619enddef
1620
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001621def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001622 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001623 ['"xx" == "yy"', false],
1624 ['"aa" == "aa"', true],
1625 ['has("eval") ? true : false', true],
1626 ['has("asdf") ? true : false', false],
1627 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001628
Bram Moolenaarac564082020-09-27 19:05:33 +02001629 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001630 for case in cases
1631 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001632 ' if ' .. case[0],
1633 ' echo 42'
1634 ' endif',
1635 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001636 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001637 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001638 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001639 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001640 assert_match('TestCase' .. nr .. '.*' ..
1641 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1642 '\d PUSHNR 42.*' ..
1643 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001644 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001645 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001646 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001647 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001648 assert_match('TestCase' .. nr .. '.*' ..
1649 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1650 'echo 42[ \n]*' ..
1651 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001652 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001653 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001654 endif
1655
1656 nr += 1
1657 endfor
1658
1659 delete('Xdisassemble')
1660enddef
1661
Bram Moolenaarad39c092020-02-26 18:23:43 +01001662def s:Execute()
1663 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001664 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001665 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001666 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001667 execute 'help ' .. tag
1668enddef
1669
1670def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001671 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001672 assert_match('\<SNR>\d*_Execute\_s*' ..
1673 "execute 'help vim9.txt'\\_s*" ..
1674 '\d PUSHS "help vim9.txt"\_s*' ..
1675 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001676 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001677 '\d PUSHS "help vim9.txt"\_s*' ..
1678 '\d STORE $0\_s*' ..
1679 'execute cmd\_s*' ..
1680 '\d LOAD $0\_s*' ..
1681 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001682 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001683 '\d PUSHS "vim9.txt"\_s*' ..
1684 '\d STORE $1\_s*' ..
1685 "execute 'help ' .. tag\\_s*" ..
1686 '\d\+ PUSHS "help "\_s*' ..
1687 '\d\+ LOAD $1\_s*' ..
1688 '\d\+ CONCAT\_s*' ..
1689 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001690 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001691 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001692enddef
1693
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001694def s:Echomsg()
1695 echomsg 'some' 'message'
1696 echoerr 'went' .. 'wrong'
1697enddef
1698
1699def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001700 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001701 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1702 "echomsg 'some' 'message'\\_s*" ..
1703 '\d PUSHS "some"\_s*' ..
1704 '\d PUSHS "message"\_s*' ..
1705 '\d ECHOMSG 2\_s*' ..
1706 "echoerr 'went' .. 'wrong'\\_s*" ..
1707 '\d PUSHS "wentwrong"\_s*' ..
1708 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001709 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001710 res)
1711enddef
1712
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001713def SomeStringArg(arg: string)
1714 echo arg
1715enddef
1716
1717def SomeAnyArg(arg: any)
1718 echo arg
1719enddef
1720
1721def SomeStringArgAndReturn(arg: string): string
1722 return arg
1723enddef
1724
1725def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001726 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001727 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1728 '\d *echo arg.*' ..
1729 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001730 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001731
Bram Moolenaarac564082020-09-27 19:05:33 +02001732 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001733 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1734 '\d *echo arg\_s*' ..
1735 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001736 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001737
Bram Moolenaarac564082020-09-27 19:05:33 +02001738 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001739 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1740 '\d *return arg\_s*' ..
1741 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001742 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001743enddef
1744
Bram Moolenaar09689a02020-05-09 22:50:08 +02001745def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001746 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001747 vim9script
1748 def FuncOne(): string
1749 return FuncTwo()
1750 enddef
1751 def FuncTwo(): string
1752 return 'two'
1753 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001754 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001755 END
1756 writefile(lines, 'Xdisassemble')
1757 source Xdisassemble
1758
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001759 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001760 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1761 'return FuncTwo()\_s*' ..
1762 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001763 '\d RETURN',
1764 g:res_FuncOne)
1765
1766 delete('Xdisassemble')
1767 unlet g:res_FuncOne
1768enddef
1769
Bram Moolenaar61a89812020-05-07 16:58:17 +02001770def s:ConcatStrings(): string
1771 return 'one' .. 'two' .. 'three'
1772enddef
1773
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001774def s:ComputeConst(): number
1775 return 2 + 3 * 4 / 6 + 7
1776enddef
1777
Bram Moolenaar1c747212020-05-09 18:28:34 +02001778def s:ComputeConstParen(): number
1779 return ((2 + 4) * (8 / 2)) / (3 + 4)
1780enddef
1781
Bram Moolenaar61a89812020-05-07 16:58:17 +02001782def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001783 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001784 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1785 "return 'one' .. 'two' .. 'three'\\_s*" ..
1786 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001787 '\d RETURN',
1788 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001789
1790 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001791 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1792 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1793 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001794 '\d RETURN',
1795 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001796
1797 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001798 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1799 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1800 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001801 '\d RETURN',
1802 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001803enddef
1804
Bram Moolenaar389df252020-07-09 21:20:47 +02001805def s:CallAppend()
1806 eval "some text"->append(2)
1807enddef
1808
1809def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001810 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001811 assert_match('<SNR>\d*_CallAppend\_s*' ..
1812 'eval "some text"->append(2)\_s*' ..
1813 '\d PUSHS "some text"\_s*' ..
1814 '\d PUSHNR 2\_s*' ..
1815 '\d SHUFFLE 2 up 1\_s*' ..
1816 '\d BCALL append(argc 2)\_s*' ..
1817 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001818 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001819 res)
1820enddef
1821
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001822
1823def s:SilentMessage()
1824 silent echomsg "text"
1825 silent! echoerr "error"
1826enddef
1827
1828def Test_silent()
1829 var res = execute('disass s:SilentMessage')
1830 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1831 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001832 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001833 '\d PUSHS "text"\_s*' ..
1834 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001835 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001836 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001837 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001838 '\d PUSHS "error"\_s*' ..
1839 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001840 '\d CMDMOD_REV\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001841 '\d RETURN 0',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001842 res)
1843enddef
1844
Bram Moolenaar7cd24222021-01-12 18:58:39 +01001845def s:SilentReturn(): string
1846 silent return "done"
1847enddef
1848
1849def Test_silent_return()
1850 var res = execute('disass s:SilentReturn')
1851 assert_match('<SNR>\d*_SilentReturn\_s*' ..
1852 'silent return "done"\_s*' ..
1853 '\d CMDMOD silent\_s*' ..
1854 '\d PUSHS "done"\_s*' ..
1855 '\d CMDMOD_REV\_s*' ..
1856 '\d RETURN',
1857 res)
1858enddef
1859
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001860" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker