blob: 407e2611ffe9d186f986c593debbe6d76756086d [file] [log] [blame]
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001" Test the :disassemble command, and compilation as a side effect
2
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +01003source check.vim
4
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01005func NotCompiled()
6 echo "not"
7endfunc
8
9let s:scriptvar = 4
10let g:globalvar = 'g'
Bram Moolenaard3aac292020-04-19 14:32:17 +020011let b:buffervar = 'b'
12let w:windowvar = 'w'
13let t:tabpagevar = 't'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010014
15def s:ScriptFuncLoad(arg: string)
Bram Moolenaarac564082020-09-27 19:05:33 +020016 var local = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010017 buffers
Bram Moolenaare4984292020-12-13 14:19:25 +010018 echo
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010019 echo arg
20 echo local
Bram Moolenaar8a1c1012020-05-07 14:07:25 +020021 echo &lines
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010022 echo v:version
23 echo s:scriptvar
24 echo g:globalvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020025 echo get(g:, "global")
Bram Moolenaar03290b82020-12-19 16:30:44 +010026 echo g:auto#var
Bram Moolenaard3aac292020-04-19 14:32:17 +020027 echo b:buffervar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020028 echo get(b:, "buffer")
Bram Moolenaard3aac292020-04-19 14:32:17 +020029 echo w:windowvar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020030 echo get(w:, "window")
Bram Moolenaard3aac292020-04-19 14:32:17 +020031 echo t:tabpagevar
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020032 echo get(t:, "tab")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010033 echo &tabstop
34 echo $ENVVAR
35 echo @z
36enddef
37
Bram Moolenaarf2460a32020-02-07 22:09:54 +010038def Test_disassemble_load()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010039 assert_fails('disass NoFunc', 'E1061:')
Bram Moolenaar451c2e32020-08-15 16:33:28 +020040 assert_fails('disass NotCompiled', 'E1091:')
Bram Moolenaar21456cd2020-02-13 21:29:32 +010041 assert_fails('disass', 'E471:')
42 assert_fails('disass [', 'E475:')
Bram Moolenaar9b7bf9e2020-07-11 22:14:59 +020043 assert_fails('disass 234', 'E129:')
44 assert_fails('disass <XX>foo', 'E129:')
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010045
Bram Moolenaarac564082020-09-27 19:05:33 +020046 var res = execute('disass s:ScriptFuncLoad')
Bram Moolenaar675f7162020-04-12 22:53:54 +020047 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
Bram Moolenaare4984292020-12-13 14:19:25 +010048 'buffers\_s*' ..
49 '\d\+ EXEC \+buffers\_s*' ..
50 'echo\_s*' ..
51 'echo arg\_s*' ..
52 '\d\+ LOAD arg\[-1\]\_s*' ..
53 '\d\+ ECHO 1\_s*' ..
54 'echo local\_s*' ..
55 '\d\+ LOAD $0\_s*' ..
56 '\d\+ ECHO 1\_s*' ..
57 'echo &lines\_s*' ..
58 '\d\+ LOADOPT &lines\_s*' ..
59 '\d\+ ECHO 1\_s*' ..
60 'echo v:version\_s*' ..
61 '\d\+ LOADV v:version\_s*' ..
62 '\d\+ ECHO 1\_s*' ..
63 'echo s:scriptvar\_s*' ..
64 '\d\+ LOADS s:scriptvar from .*test_vim9_disassemble.vim\_s*' ..
65 '\d\+ ECHO 1\_s*' ..
66 'echo g:globalvar\_s*' ..
67 '\d\+ LOADG g:globalvar\_s*' ..
68 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020069 'echo get(g:, "global")\_s*' ..
70 '\d\+ LOAD g:\_s*' ..
71 '\d\+ PUSHS "global"\_s*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +010072 '\d\+ BCALL get(argc 2)\_s*' ..
73 '\d\+ ECHO 1\_s*' ..
74 'echo g:auto#var\_s*' ..
75 '\d\+ LOADAUTO g:auto#var\_s*' ..
76 '\d\+ ECHO 1\_s*' ..
77 'echo b:buffervar\_s*' ..
78 '\d\+ LOADB b:buffervar\_s*' ..
79 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020080 'echo get(b:, "buffer")\_s*' ..
81 '\d\+ LOAD b:\_s*' ..
82 '\d\+ PUSHS "buffer"\_s*' ..
83 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020084 ' LOADW w:windowvar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020085 'echo get(w:, "window")\_s*' ..
86 '\d\+ LOAD w:\_s*' ..
87 '\d\+ PUSHS "window"\_s*' ..
88 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +020089 ' LOADT t:tabpagevar.*' ..
Bram Moolenaar2f8ce0a2020-07-19 19:47:35 +020090 'echo get(t:, "tab")\_s*' ..
91 '\d\+ LOAD t:\_s*' ..
92 '\d\+ PUSHS "tab"\_s*' ..
93 '\d\+ BCALL get(argc 2).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +020094 ' LOADENV $ENVVAR.*' ..
95 ' LOADREG @z.*',
96 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +010097enddef
98
Bram Moolenaarcfe435d2020-04-25 20:02:55 +020099def s:EditExpand()
Bram Moolenaarac564082020-09-27 19:05:33 +0200100 var filename = "file"
101 var filenr = 123
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200102 edit the`=filename``=filenr`.txt
103enddef
104
105def Test_disassemble_exec_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200106 var res = execute('disass s:EditExpand')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200107 assert_match('<SNR>\d*_EditExpand\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200108 ' var filename = "file"\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200109 '\d PUSHS "file"\_s*' ..
110 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200111 ' var filenr = 123\_s*' ..
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200112 '\d STORE 123 in $1\_s*' ..
113 ' edit the`=filename``=filenr`.txt\_s*' ..
114 '\d PUSHS "edit the"\_s*' ..
115 '\d LOAD $0\_s*' ..
116 '\d LOAD $1\_s*' ..
117 '\d 2STRING stack\[-1\]\_s*' ..
118 '\d\+ PUSHS ".txt"\_s*' ..
119 '\d\+ EXECCONCAT 4\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100120 '\d\+ RETURN 0',
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200121 res)
122enddef
123
124def s:YankRange()
125 norm! m[jjm]
126 :'[,']yank
127enddef
128
129def Test_disassemble_yank_range()
Bram Moolenaarac564082020-09-27 19:05:33 +0200130 var res = execute('disass s:YankRange')
Bram Moolenaar7c5ad342020-08-12 15:48:55 +0200131 assert_match('<SNR>\d*_YankRange.*' ..
132 ' norm! m\[jjm\]\_s*' ..
133 '\d EXEC norm! m\[jjm\]\_s*' ..
134 ' :''\[,''\]yank\_s*' ..
135 '\d EXEC :''\[,''\]yank\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100136 '\d RETURN 0',
Bram Moolenaarcfe435d2020-04-25 20:02:55 +0200137 res)
138enddef
139
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200140def s:PutExpr()
141 :3put ="text"
142enddef
143
144def Test_disassemble_put_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200145 var res = execute('disass s:PutExpr')
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200146 assert_match('<SNR>\d*_PutExpr.*' ..
147 ' :3put ="text"\_s*' ..
148 '\d PUSHS "text"\_s*' ..
149 '\d PUT = 3\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100150 '\d RETURN 0',
Bram Moolenaarc3516f72020-09-08 22:45:35 +0200151 res)
152enddef
153
Bram Moolenaar08597872020-12-10 19:43:40 +0100154def s:PutRange()
155 :$-2put a
156enddef
157
158def Test_disassemble_put_range()
159 var res = execute('disass s:PutRange')
160 assert_match('<SNR>\d*_PutRange.*' ..
161 ' :$-2put a\_s*' ..
162 '\d RANGE $-2\_s*' ..
163 '\d PUT a range\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100164 '\d RETURN 0',
Bram Moolenaar08597872020-12-10 19:43:40 +0100165 res)
166enddef
167
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100168def s:ScriptFuncPush()
Bram Moolenaarac564082020-09-27 19:05:33 +0200169 var localbool = true
170 var localspec = v:none
171 var localblob = 0z1234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100172 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +0200173 var localfloat = 1.234
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100174 endif
175enddef
176
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100177def Test_disassemble_push()
Bram Moolenaarac564082020-09-27 19:05:33 +0200178 var res = execute('disass s:ScriptFuncPush')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200179 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
180 'localbool = true.*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +0100181 ' PUSH true.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200182 'localspec = v:none.*' ..
183 ' PUSH v:none.*' ..
184 'localblob = 0z1234.*' ..
185 ' PUSHBLOB 0z1234.*',
186 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100187 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200188 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
189 'localfloat = 1.234.*' ..
190 ' PUSHF 1.234.*',
191 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100192 endif
193enddef
194
195def s:ScriptFuncStore()
Bram Moolenaarac564082020-09-27 19:05:33 +0200196 var localnr = 1
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100197 localnr = 2
Bram Moolenaarac564082020-09-27 19:05:33 +0200198 var localstr = 'abc'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100199 localstr = 'xyz'
200 v:char = 'abc'
201 s:scriptvar = 'sv'
202 g:globalvar = 'gv'
Bram Moolenaar03290b82020-12-19 16:30:44 +0100203 g:auto#var = 'av'
Bram Moolenaard3aac292020-04-19 14:32:17 +0200204 b:buffervar = 'bv'
205 w:windowvar = 'wv'
206 t:tabpagevar = 'tv'
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100207 &tabstop = 8
208 $ENVVAR = 'ev'
209 @z = 'rv'
210enddef
211
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100212def Test_disassemble_store()
Bram Moolenaarac564082020-09-27 19:05:33 +0200213 var res = execute('disass s:ScriptFuncStore')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200214 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200215 'var localnr = 1.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200216 'localnr = 2.*' ..
217 ' STORE 2 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200218 'var localstr = ''abc''.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200219 'localstr = ''xyz''.*' ..
220 ' STORE $1.*' ..
221 'v:char = ''abc''.*' ..
222 'STOREV v:char.*' ..
223 's:scriptvar = ''sv''.*' ..
224 ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
225 'g:globalvar = ''gv''.*' ..
226 ' STOREG g:globalvar.*' ..
Bram Moolenaar03290b82020-12-19 16:30:44 +0100227 'g:auto#var = ''av''.*' ..
228 ' STOREAUTO g:auto#var.*' ..
Bram Moolenaard3aac292020-04-19 14:32:17 +0200229 'b:buffervar = ''bv''.*' ..
230 ' STOREB b:buffervar.*' ..
231 'w:windowvar = ''wv''.*' ..
232 ' STOREW w:windowvar.*' ..
233 't:tabpagevar = ''tv''.*' ..
234 ' STORET t:tabpagevar.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +0200235 '&tabstop = 8.*' ..
236 ' STOREOPT &tabstop.*' ..
237 '$ENVVAR = ''ev''.*' ..
238 ' STOREENV $ENVVAR.*' ..
239 '@z = ''rv''.*' ..
240 ' STOREREG @z.*',
241 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100242enddef
243
Bram Moolenaarcb790402020-05-15 20:53:00 +0200244def s:ScriptFuncStoreMember()
Bram Moolenaarac564082020-09-27 19:05:33 +0200245 var locallist: list<number> = []
Bram Moolenaarcb790402020-05-15 20:53:00 +0200246 locallist[0] = 123
Bram Moolenaarac564082020-09-27 19:05:33 +0200247 var localdict: dict<number> = {}
Bram Moolenaarcb790402020-05-15 20:53:00 +0200248 localdict["a"] = 456
249enddef
250
251def Test_disassemble_store_member()
Bram Moolenaarac564082020-09-27 19:05:33 +0200252 var res = execute('disass s:ScriptFuncStoreMember')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200253 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200254 'var locallist: list<number> = []\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200255 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100256 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200257 '\d STORE $0\_s*' ..
258 'locallist\[0\] = 123\_s*' ..
259 '\d PUSHNR 123\_s*' ..
260 '\d PUSHNR 0\_s*' ..
261 '\d LOAD $0\_s*' ..
262 '\d STORELIST\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200263 'var localdict: dict<number> = {}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200264 '\d NEWDICT size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100265 '\d SETTYPE dict<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200266 '\d STORE $1\_s*' ..
267 'localdict\["a"\] = 456\_s*' ..
268 '\d\+ PUSHNR 456\_s*' ..
269 '\d\+ PUSHS "a"\_s*' ..
270 '\d\+ LOAD $1\_s*' ..
271 '\d\+ STOREDICT\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100272 '\d\+ RETURN 0',
Bram Moolenaarcb790402020-05-15 20:53:00 +0200273 res)
274enddef
275
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100276def s:ScriptFuncStoreIndex()
277 var d = {dd: {}}
278 d.dd[0] = 0
279enddef
280
281def Test_disassemble_store_index()
282 var res = execute('disass s:ScriptFuncStoreIndex')
283 assert_match('<SNR>\d*_ScriptFuncStoreIndex\_s*' ..
284 'var d = {dd: {}}\_s*' ..
285 '\d PUSHS "dd"\_s*' ..
286 '\d NEWDICT size 0\_s*' ..
287 '\d NEWDICT size 1\_s*' ..
288 '\d STORE $0\_s*' ..
289 'd.dd\[0\] = 0\_s*' ..
290 '\d PUSHNR 0\_s*' ..
291 '\d PUSHNR 0\_s*' ..
292 '\d LOAD $0\_s*' ..
293 '\d MEMBER dd\_s*' ..
294 '\d STOREINDEX\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100295 '\d\+ RETURN 0',
Bram Moolenaar4f5e3972020-12-21 17:30:50 +0100296 res)
297enddef
298
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200299def s:ListAssign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200300 var x: string
301 var y: string
302 var l: list<any>
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200303 [x, y; l] = g:stringlist
304enddef
305
306def Test_disassemble_list_assign()
Bram Moolenaarac564082020-09-27 19:05:33 +0200307 var res = execute('disass s:ListAssign')
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200308 assert_match('<SNR>\d*_ListAssign\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200309 'var x: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200310 '\d PUSHS "\[NULL\]"\_s*' ..
311 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200312 'var y: string\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200313 '\d PUSHS "\[NULL\]"\_s*' ..
314 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200315 'var l: list<any>\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200316 '\d NEWLIST size 0\_s*' ..
317 '\d STORE $2\_s*' ..
318 '\[x, y; l\] = g:stringlist\_s*' ..
319 '\d LOADG g:stringlist\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +0200320 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200321 '\d CHECKLEN >= 2\_s*' ..
322 '\d\+ ITEM 0\_s*' ..
323 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
324 '\d\+ STORE $0\_s*' ..
325 '\d\+ ITEM 1\_s*' ..
326 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
327 '\d\+ STORE $1\_s*' ..
328 '\d\+ SLICE 2\_s*' ..
329 '\d\+ STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100330 '\d\+ RETURN 0',
Bram Moolenaar0779fab2020-06-18 22:18:18 +0200331 res)
332enddef
333
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200334def s:ListAdd()
335 var l: list<number> = []
336 add(l, 123)
337 add(l, g:aNumber)
338enddef
339
340def Test_disassemble_list_add()
341 var res = execute('disass s:ListAdd')
342 assert_match('<SNR>\d*_ListAdd\_s*' ..
343 'var l: list<number> = []\_s*' ..
344 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +0100345 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200346 '\d STORE $0\_s*' ..
347 'add(l, 123)\_s*' ..
348 '\d LOAD $0\_s*' ..
349 '\d PUSHNR 123\_s*' ..
350 '\d LISTAPPEND\_s*' ..
351 '\d DROP\_s*' ..
352 'add(l, g:aNumber)\_s*' ..
353 '\d LOAD $0\_s*' ..
354 '\d\+ LOADG g:aNumber\_s*' ..
355 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
356 '\d\+ LISTAPPEND\_s*' ..
357 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100358 '\d\+ RETURN 0',
Bram Moolenaar1dcae592020-10-19 19:02:42 +0200359 res)
360enddef
361
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200362def s:BlobAdd()
363 var b: blob = 0z
364 add(b, 123)
365 add(b, g:aNumber)
366enddef
367
368def Test_disassemble_blob_add()
369 var res = execute('disass s:BlobAdd')
370 assert_match('<SNR>\d*_BlobAdd\_s*' ..
371 'var b: blob = 0z\_s*' ..
372 '\d PUSHBLOB 0z\_s*' ..
373 '\d STORE $0\_s*' ..
374 'add(b, 123)\_s*' ..
375 '\d LOAD $0\_s*' ..
376 '\d PUSHNR 123\_s*' ..
377 '\d BLOBAPPEND\_s*' ..
378 '\d DROP\_s*' ..
379 'add(b, g:aNumber)\_s*' ..
380 '\d LOAD $0\_s*' ..
381 '\d\+ LOADG g:aNumber\_s*' ..
382 '\d\+ CHECKTYPE number stack\[-1\]\_s*' ..
383 '\d\+ BLOBAPPEND\_s*' ..
384 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100385 '\d\+ RETURN 0',
Bram Moolenaar80b0e5e2020-10-19 20:45:36 +0200386 res)
387enddef
388
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200389def s:ScriptFuncUnlet()
390 g:somevar = "value"
391 unlet g:somevar
392 unlet! g:somevar
Bram Moolenaar7bdaea62020-04-19 18:27:26 +0200393 unlet $SOMEVAR
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200394enddef
395
396def Test_disassemble_unlet()
Bram Moolenaarac564082020-09-27 19:05:33 +0200397 var res = execute('disass s:ScriptFuncUnlet')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200398 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
399 'g:somevar = "value"\_s*' ..
400 '\d PUSHS "value"\_s*' ..
401 '\d STOREG g:somevar\_s*' ..
402 'unlet g:somevar\_s*' ..
403 '\d UNLET g:somevar\_s*' ..
404 'unlet! g:somevar\_s*' ..
405 '\d UNLET! g:somevar\_s*' ..
406 'unlet $SOMEVAR\_s*' ..
407 '\d UNLETENV $SOMEVAR\_s*',
Bram Moolenaard72c1bf2020-04-19 16:28:59 +0200408 res)
409enddef
410
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100411def s:ScriptFuncTry()
412 try
Bram Moolenaarcb790402020-05-15 20:53:00 +0200413 echo "yes"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100414 catch /fail/
Bram Moolenaarcb790402020-05-15 20:53:00 +0200415 echo "no"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100416 finally
Bram Moolenaarcb790402020-05-15 20:53:00 +0200417 throw "end"
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100418 endtry
419enddef
420
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100421def Test_disassemble_try()
Bram Moolenaarac564082020-09-27 19:05:33 +0200422 var res = execute('disass s:ScriptFuncTry')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200423 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
424 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100425 '\d TRY catch -> \d\+, finally -> \d\+, endtry -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200426 'echo "yes"\_s*' ..
427 '\d PUSHS "yes"\_s*' ..
428 '\d ECHO 1\_s*' ..
429 'catch /fail/\_s*' ..
430 '\d JUMP -> \d\+\_s*' ..
431 '\d PUSH v:exception\_s*' ..
432 '\d PUSHS "fail"\_s*' ..
433 '\d COMPARESTRING =\~\_s*' ..
434 '\d JUMP_IF_FALSE -> \d\+\_s*' ..
435 '\d CATCH\_s*' ..
436 'echo "no"\_s*' ..
437 '\d\+ PUSHS "no"\_s*' ..
438 '\d\+ ECHO 1\_s*' ..
439 'finally\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +0100440 '\d\+ FINALLY\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200441 'throw "end"\_s*' ..
442 '\d\+ PUSHS "end"\_s*' ..
443 '\d\+ THROW\_s*' ..
444 'endtry\_s*' ..
445 '\d\+ ENDTRY',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200446 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100447enddef
448
449def s:ScriptFuncNew()
Bram Moolenaarac564082020-09-27 19:05:33 +0200450 var ll = [1, "two", 333]
Bram Moolenaare0de1712020-12-02 17:36:54 +0100451 var dd = {one: 1, two: "val"}
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100452enddef
453
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100454def Test_disassemble_new()
Bram Moolenaarac564082020-09-27 19:05:33 +0200455 var res = execute('disass s:ScriptFuncNew')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200456 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200457 'var ll = \[1, "two", 333\]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200458 '\d PUSHNR 1\_s*' ..
459 '\d PUSHS "two"\_s*' ..
460 '\d PUSHNR 333\_s*' ..
461 '\d NEWLIST size 3\_s*' ..
462 '\d STORE $0\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +0100463 'var dd = {one: 1, two: "val"}\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200464 '\d PUSHS "one"\_s*' ..
465 '\d PUSHNR 1\_s*' ..
466 '\d PUSHS "two"\_s*' ..
467 '\d PUSHS "val"\_s*' ..
468 '\d NEWDICT size 2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200469 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100470enddef
471
Bram Moolenaar6e949782020-04-13 17:21:00 +0200472def FuncWithArg(arg: any)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100473 echo arg
474enddef
475
476func UserFunc()
477 echo 'nothing'
478endfunc
479
480func UserFuncWithArg(arg)
481 echo a:arg
482endfunc
483
484def s:ScriptFuncCall(): string
485 changenr()
486 char2nr("abc")
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100487 Test_disassemble_new()
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100488 FuncWithArg(343)
489 ScriptFuncNew()
490 s:ScriptFuncNew()
491 UserFunc()
492 UserFuncWithArg("foo")
Bram Moolenaarac564082020-09-27 19:05:33 +0200493 var FuncRef = function("UserFunc")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100494 FuncRef()
Bram Moolenaarac564082020-09-27 19:05:33 +0200495 var FuncRefWithArg = function("UserFuncWithArg")
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100496 FuncRefWithArg("bar")
497 return "yes"
498enddef
499
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100500def Test_disassemble_call()
Bram Moolenaarac564082020-09-27 19:05:33 +0200501 var res = execute('disass s:ScriptFuncCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200502 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
503 'changenr()\_s*' ..
504 '\d BCALL changenr(argc 0)\_s*' ..
505 '\d DROP\_s*' ..
506 'char2nr("abc")\_s*' ..
507 '\d PUSHS "abc"\_s*' ..
508 '\d BCALL char2nr(argc 1)\_s*' ..
509 '\d DROP\_s*' ..
510 'Test_disassemble_new()\_s*' ..
511 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
512 '\d DROP\_s*' ..
513 'FuncWithArg(343)\_s*' ..
514 '\d\+ PUSHNR 343\_s*' ..
515 '\d\+ DCALL FuncWithArg(argc 1)\_s*' ..
516 '\d\+ DROP\_s*' ..
517 'ScriptFuncNew()\_s*' ..
518 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
519 '\d\+ DROP\_s*' ..
520 's:ScriptFuncNew()\_s*' ..
521 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
522 '\d\+ DROP\_s*' ..
523 'UserFunc()\_s*' ..
524 '\d\+ UCALL UserFunc(argc 0)\_s*' ..
525 '\d\+ DROP\_s*' ..
526 'UserFuncWithArg("foo")\_s*' ..
527 '\d\+ PUSHS "foo"\_s*' ..
528 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
529 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200530 'var FuncRef = function("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200531 '\d\+ PUSHS "UserFunc"\_s*' ..
532 '\d\+ BCALL function(argc 1)\_s*' ..
533 '\d\+ STORE $0\_s*' ..
534 'FuncRef()\_s*' ..
535 '\d\+ LOAD $\d\_s*' ..
536 '\d\+ PCALL (argc 0)\_s*' ..
537 '\d\+ DROP\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200538 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200539 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
540 '\d\+ BCALL function(argc 1)\_s*' ..
541 '\d\+ STORE $1\_s*' ..
542 'FuncRefWithArg("bar")\_s*' ..
543 '\d\+ PUSHS "bar"\_s*' ..
544 '\d\+ LOAD $\d\_s*' ..
545 '\d\+ PCALL (argc 1)\_s*' ..
546 '\d\+ DROP\_s*' ..
547 'return "yes"\_s*' ..
548 '\d\+ PUSHS "yes"\_s*' ..
549 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200550 res)
Bram Moolenaar5cab73f2020-02-06 19:25:19 +0100551enddef
552
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200553
554def s:CreateRefs()
555 var local = 'a'
556 def Append(arg: string)
557 local ..= arg
558 enddef
559 g:Append = Append
560 def Get(): string
561 return local
562 enddef
563 g:Get = Get
564enddef
565
566def Test_disassemble_closure()
567 CreateRefs()
568 var res = execute('disass g:Append')
569 assert_match('<lambda>\d\_s*' ..
570 'local ..= arg\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100571 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200572 '\d LOAD arg\[-1\]\_s*' ..
573 '\d CONCAT\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100574 '\d STOREOUTER level 1 $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100575 '\d RETURN 0',
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200576 res)
577
578 res = execute('disass g:Get')
579 assert_match('<lambda>\d\_s*' ..
580 'return local\_s*' ..
Bram Moolenaarab360522021-01-10 14:02:28 +0100581 '\d LOADOUTER level 1 $0\_s*' ..
Bram Moolenaar85d5e2b2020-10-10 14:13:01 +0200582 '\d RETURN',
583 res)
584
585 unlet g:Append
586 unlet g:Get
587enddef
Bram Moolenaarb68b3462020-05-06 21:06:30 +0200588
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100589
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200590def EchoArg(arg: string): string
591 return arg
592enddef
593def RefThis(): func
594 return function('EchoArg')
595enddef
596def s:ScriptPCall()
597 RefThis()("text")
598enddef
599
600def Test_disassemble_pcall()
Bram Moolenaarac564082020-09-27 19:05:33 +0200601 var res = execute('disass s:ScriptPCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200602 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
603 'RefThis()("text")\_s*' ..
604 '\d DCALL RefThis(argc 0)\_s*' ..
605 '\d PUSHS "text"\_s*' ..
606 '\d PCALL top (argc 1)\_s*' ..
607 '\d PCALL end\_s*' ..
608 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100609 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200610 res)
Bram Moolenaarbd5da372020-03-31 23:13:10 +0200611enddef
612
613
Bram Moolenaara26b9702020-04-18 19:53:28 +0200614def s:FuncWithForwardCall(): string
615 return g:DefinedLater("yes")
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100616enddef
617
618def DefinedLater(arg: string): string
619 return arg
620enddef
621
622def Test_disassemble_update_instr()
Bram Moolenaarac564082020-09-27 19:05:33 +0200623 var res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200624 assert_match('FuncWithForwardCall\_s*' ..
625 'return g:DefinedLater("yes")\_s*' ..
626 '\d PUSHS "yes"\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200627 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200628 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200629 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100630
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +0200631 # Calling the function will change UCALL into the faster DCALL
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100632 assert_equal('yes', FuncWithForwardCall())
633
Bram Moolenaara26b9702020-04-18 19:53:28 +0200634 res = execute('disass s:FuncWithForwardCall')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200635 assert_match('FuncWithForwardCall\_s*' ..
636 'return g:DefinedLater("yes")\_s*' ..
637 '\d PUSHS "yes"\_s*' ..
638 '\d DCALL DefinedLater(argc 1)\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200639 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200640 res)
Bram Moolenaar7eeefd42020-02-26 21:24:23 +0100641enddef
642
643
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100644def FuncWithDefault(arg: string = 'default'): string
645 return arg
646enddef
647
648def Test_disassemble_call_default()
Bram Moolenaarac564082020-09-27 19:05:33 +0200649 var res = execute('disass FuncWithDefault')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200650 assert_match('FuncWithDefault\_s*' ..
651 '\d PUSHS "default"\_s*' ..
652 '\d STORE arg\[-1]\_s*' ..
653 'return arg\_s*' ..
654 '\d LOAD arg\[-1]\_s*' ..
655 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200656 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100657enddef
658
659
Bram Moolenaar158906c2020-02-06 20:39:45 +0100660def HasEval()
661 if has("eval")
662 echo "yes"
663 else
664 echo "no"
665 endif
666enddef
667
668def HasNothing()
669 if has("nothing")
670 echo "yes"
671 else
672 echo "no"
673 endif
674enddef
675
676def HasSomething()
677 if has("nothing")
678 echo "nothing"
679 elseif has("something")
680 echo "something"
681 elseif has("eval")
682 echo "eval"
683 elseif has("less")
684 echo "less"
685 endif
686enddef
687
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100688def HasGuiRunning()
689 if has("gui_running")
690 echo "yes"
691 else
692 echo "no"
693 endif
694enddef
695
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100696def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200697 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200698 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200699 assert_match('HasEval\_s*' ..
700 'if has("eval")\_s*' ..
701 'echo "yes"\_s*' ..
702 '\d PUSHS "yes"\_s*' ..
703 '\d ECHO 1\_s*' ..
704 'else\_s*' ..
705 'echo "no"\_s*' ..
706 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200707 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100708 assert_notmatch('JUMP', instr)
709
Bram Moolenaard2c61702020-09-06 15:58:36 +0200710 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100711 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200712 assert_match('HasNothing\_s*' ..
713 'if has("nothing")\_s*' ..
714 'echo "yes"\_s*' ..
715 'else\_s*' ..
716 'echo "no"\_s*' ..
717 '\d PUSHS "no"\_s*' ..
718 '\d ECHO 1\_s*' ..
719 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200720 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100721 assert_notmatch('PUSHS "yes"', instr)
722 assert_notmatch('JUMP', instr)
723
Bram Moolenaard2c61702020-09-06 15:58:36 +0200724 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100725 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200726 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200727 'if has("nothing")\_s*' ..
728 'echo "nothing"\_s*' ..
729 'elseif has("something")\_s*' ..
730 'echo "something"\_s*' ..
731 'elseif has("eval")\_s*' ..
732 'echo "eval"\_s*' ..
733 '\d PUSHS "eval"\_s*' ..
734 '\d ECHO 1\_s*' ..
735 'elseif has("less").*' ..
736 'echo "less"\_s*' ..
737 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200738 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100739 assert_notmatch('PUSHS "nothing"', instr)
740 assert_notmatch('PUSHS "something"', instr)
741 assert_notmatch('PUSHS "less"', instr)
742 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100743
744 var result: string
745 var instr_expected: string
746 if has('gui')
747 if has('gui_running')
748 # GUI already running, always returns "yes"
749 result = "\nyes"
750 instr_expected = 'HasGuiRunning.*' ..
751 'if has("gui_running")\_s*' ..
752 ' echo "yes"\_s*' ..
753 '\d PUSHS "yes"\_s*' ..
754 '\d ECHO 1\_s*' ..
755 'else\_s*' ..
756 ' echo "no"\_s*' ..
757 'endif'
758 else
759 result = "\nno"
760 if has('unix')
761 # GUI not running but can start later, call has()
762 instr_expected = 'HasGuiRunning.*' ..
763 'if has("gui_running")\_s*' ..
764 '\d PUSHS "gui_running"\_s*' ..
765 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaar3af15ab2021-01-17 16:16:23 +0100766 '\d 2BOOL (!!val)\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100767 '\d JUMP_IF_FALSE -> \d\_s*' ..
768 ' echo "yes"\_s*' ..
769 '\d PUSHS "yes"\_s*' ..
770 '\d ECHO 1\_s*' ..
771 'else\_s*' ..
772 '\d JUMP -> \d\_s*' ..
773 ' echo "no"\_s*' ..
774 '\d PUSHS "no"\_s*' ..
775 '\d ECHO 1\_s*' ..
776 'endif'
777 else
778 # GUI not running, always return "no"
779 instr_expected = 'HasGuiRunning.*' ..
780 'if has("gui_running")\_s*' ..
781 ' echo "yes"\_s*' ..
782 'else\_s*' ..
783 ' echo "no"\_s*' ..
784 '\d PUSHS "no"\_s*' ..
785 '\d ECHO 1\_s*' ..
786 'endif'
787 endif
788 endif
789 else
790 # GUI not supported, always return "no"
791 result = "\nno"
792 instr_expected = 'HasGuiRunning.*' ..
793 'if has("gui_running")\_s*' ..
794 ' echo "yes"\_s*' ..
795 'else\_s*' ..
796 ' echo "no"\_s*' ..
797 '\d PUSHS "no"\_s*' ..
798 '\d ECHO 1\_s*' ..
799 'endif'
800 endif
801
802 assert_equal(result, execute('HasGuiRunning()'))
803 instr = execute('disassemble HasGuiRunning')
804 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100805enddef
806
Bram Moolenaarefd88552020-06-18 20:50:10 +0200807def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100808 if 1 < 0
809 return "maybe"
810 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200811 if g:cond
812 return "yes"
813 else
814 return "no"
815 endif
816enddef
817
818def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200819 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200820 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100821 'if 1 < 0\_s*' ..
822 ' return "maybe"\_s*' ..
823 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200824 'if g:cond\_s*' ..
825 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100826 '1 COND2BOOL\_s*' ..
827 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200828 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100829 '3 PUSHS "yes"\_s*' ..
830 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200831 'else\_s*' ..
832 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100833 '5 PUSHS "no"\_s*' ..
834 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200835 instr)
836enddef
837
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100838def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200839 var Funky1: func
840 var Funky2: func = function("len")
841 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100842enddef
843
844def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200845 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200846 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200847 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200848 '0 PUSHFUNC "\[none]"\_s*' ..
849 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200850 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200851 '2 PUSHS "len"\_s*' ..
852 '3 BCALL function(argc 1)\_s*' ..
853 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200855 '\d PUSHS "UserFunc"\_s*' ..
856 '\d BCALL funcref(argc 1)\_s*' ..
857 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100858 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200859 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100860enddef
861
862if has('channel')
863 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200864 var job1: job
865 var job2: job = job_start("donothing")
866 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100867 enddef
868endif
869
870def Test_disassemble_channel()
871 CheckFeature channel
872
Bram Moolenaarac564082020-09-27 19:05:33 +0200873 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200874 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200875 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200876 '\d PUSHJOB "no process"\_s*' ..
877 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200878 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200879 '\d PUSHS "donothing"\_s*' ..
880 '\d BCALL job_start(argc 1)\_s*' ..
881 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200882 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200883 '\d PUSHCHANNEL 0\_s*' ..
884 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100885 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200886 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100887enddef
888
Bram Moolenaar777770f2020-02-06 21:27:08 +0100889def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100890 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100891 return F("x")
892enddef
893
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100894def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100895 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200896 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200897 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100898 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200899 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200900 '\d STORE $0\_s*' ..
901 'return F("x")\_s*' ..
902 '\d PUSHS "x"\_s*' ..
903 '\d LOAD $0\_s*' ..
904 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200905 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200906 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200907
Bram Moolenaarac564082020-09-27 19:05:33 +0200908 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200909 instr = execute('disassemble ' .. name)
910 assert_match('<lambda>\d\+\_s*' ..
911 'return "X" .. a .. "X"\_s*' ..
912 '\d PUSHS "X"\_s*' ..
913 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200914 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200915 '\d CONCAT\_s*' ..
916 '\d PUSHS "X"\_s*' ..
917 '\d CONCAT\_s*' ..
918 '\d RETURN',
919 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100920enddef
921
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100922def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100923 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100924 return Ref(g:value)
925enddef
926
927def Test_disassemble_lambda_with_type()
928 g:value = 5
929 assert_equal(15, LambdaWithType())
930 var instr = execute('disassemble LambdaWithType')
931 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100932 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100933 '\d FUNCREF <lambda>\d\+\_s*' ..
934 '\d STORE $0\_s*' ..
935 'return Ref(g:value)\_s*' ..
936 '\d LOADG g:value\_s*' ..
937 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +0100938 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100939 '\d PCALL (argc 1)\_s*' ..
940 '\d RETURN',
941 instr)
942enddef
943
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200944def NestedOuter()
945 def g:Inner()
946 echomsg "inner"
947 enddef
948enddef
949
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100950def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200951 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200952 assert_match('NestedOuter\_s*' ..
953 'def g:Inner()\_s*' ..
954 'echomsg "inner"\_s*' ..
955 'enddef\_s*' ..
956 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100957 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200958 instr)
959enddef
960
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100961def NestedDefList()
962 def
963 def Info
964 def /Info
965 def /Info/
966enddef
967
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100968def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100969 var instr = execute('disassemble NestedDefList')
970 assert_match('NestedDefList\_s*' ..
971 'def\_s*' ..
972 '\d DEF \_s*' ..
973 'def Info\_s*' ..
974 '\d DEF Info\_s*' ..
975 'def /Info\_s*' ..
976 '\d DEF /Info\_s*' ..
977 'def /Info/\_s*' ..
978 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100979 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100980 instr)
981enddef
982
Bram Moolenaar6e949782020-04-13 17:21:00 +0200983def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100984 if arg == 1 && arg != 2 || arg == 4
985 return 'yes'
986 endif
987 return 'no'
988enddef
989
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100990def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100991 assert_equal("yes", AndOr(1))
992 assert_equal("no", AndOr(2))
993 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +0200994 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200995 assert_match('AndOr\_s*' ..
996 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
997 '\d LOAD arg\[-1]\_s*' ..
998 '\d PUSHNR 1\_s*' ..
999 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001000 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001001 '\d LOAD arg\[-1]\_s*' ..
1002 '\d PUSHNR 2\_s*' ..
1003 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001004 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001005 '\d LOAD arg\[-1]\_s*' ..
1006 '\d\+ PUSHNR 4\_s*' ..
1007 '\d\+ COMPAREANY ==\_s*' ..
1008 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001009 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001010enddef
1011
Bram Moolenaar04d05222020-02-06 22:06:54 +01001012def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001013 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001014 for i in range(3)
1015 res->add(i)
1016 endfor
1017 return res
1018enddef
1019
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001020def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001021 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001022 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001023 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001024 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001025 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001026 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001027 '\d STORE $0\_s*' ..
1028 'for i in range(3)\_s*' ..
1029 '\d STORE -1 in $1\_s*' ..
1030 '\d PUSHNR 3\_s*' ..
1031 '\d BCALL range(argc 1)\_s*' ..
1032 '\d FOR $1 -> \d\+\_s*' ..
1033 '\d STORE $2\_s*' ..
1034 'res->add(i)\_s*' ..
1035 '\d LOAD $0\_s*' ..
1036 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001037 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001038 '\d\+ DROP\_s*' ..
1039 'endfor\_s*' ..
1040 '\d\+ JUMP -> \d\+\_s*' ..
1041 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001042 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001043enddef
1044
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001045def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001046 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001047 for str in eval('["one", "two"]')
1048 res ..= str
1049 endfor
1050 return res
1051enddef
1052
1053def Test_disassemble_for_loop_eval()
1054 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001055 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001056 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001057 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001058 '\d PUSHS ""\_s*' ..
1059 '\d STORE $0\_s*' ..
1060 'for str in eval(''\["one", "two"\]'')\_s*' ..
1061 '\d STORE -1 in $1\_s*' ..
1062 '\d PUSHS "\["one", "two"\]"\_s*' ..
1063 '\d BCALL eval(argc 1)\_s*' ..
Bram 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*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001073 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001074 '\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 Moolenaarc150c092021-02-13 15:02:46 +01001114def ForLoopContinue()
1115 for nr in [1, 2]
1116 try
1117 echo "ok"
1118 try
1119 echo "deeper"
1120 catch
1121 continue
1122 endtry
1123 catch
1124 echo "not ok"
1125 endtry
1126 endfor
1127enddef
1128
1129def Test_disassemble_for_loop_continue()
1130 var instr = execute('disassemble ForLoopContinue')
1131 assert_match('ForLoopContinue\_s*' ..
1132 'for nr in \[1, 2]\_s*' ..
1133 '0 STORE -1 in $0\_s*' ..
1134 '1 PUSHNR 1\_s*' ..
1135 '2 PUSHNR 2\_s*' ..
1136 '3 NEWLIST size 2\_s*' ..
1137 '4 FOR $0 -> 22\_s*' ..
1138 '5 STORE $1\_s*' ..
1139 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001140 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001141 'echo "ok"\_s*' ..
1142 '7 PUSHS "ok"\_s*' ..
1143 '8 ECHO 1\_s*' ..
1144 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001145 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001146 'echo "deeper"\_s*' ..
1147 '10 PUSHS "deeper"\_s*' ..
1148 '11 ECHO 1\_s*' ..
1149 'catch\_s*' ..
1150 '12 JUMP -> 15\_s*' ..
1151 '13 CATCH\_s*' ..
1152 'continue\_s*' ..
1153 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1154 'endtry\_s*' ..
1155 '15 ENDTRY\_s*' ..
1156 'catch\_s*' ..
1157 '16 JUMP -> 20\_s*' ..
1158 '17 CATCH\_s*' ..
1159 'echo "not ok"\_s*' ..
1160 '18 PUSHS "not ok"\_s*' ..
1161 '19 ECHO 1\_s*' ..
1162 'endtry\_s*' ..
1163 '20 ENDTRY\_s*' ..
1164 'endfor\_s*' ..
1165 '21 JUMP -> 4\_s*' ..
1166 '\d\+ DROP\_s*' ..
1167 '\d\+ RETURN 0',
1168 instr)
1169enddef
1170
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001171let g:number = 42
1172
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001173def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001174 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001175enddef
1176
1177def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001178 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001179 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001180 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001181 '\d PUSHNR 23\_s*' ..
1182 '\d LOADG g:number\_s*' ..
1183 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1184 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001185 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001186 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001187 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001188 instr)
1189enddef
1190
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001191def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001192 var nr = 3
1193 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001194 nrres = nr - 7
1195 nrres = nr * 7
1196 nrres = nr / 7
1197 nrres = nr % 7
1198
Bram Moolenaarac564082020-09-27 19:05:33 +02001199 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001200 anyres = g:number - 7
1201 anyres = g:number * 7
1202 anyres = g:number / 7
1203 anyres = g:number % 7
1204
1205 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001206 var fl = 3.0
1207 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001208 flres = fl - 7.0
1209 flres = fl * 7.0
1210 flres = fl / 7.0
1211 endif
1212enddef
1213
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001214def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001215 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001216 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001217 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001218 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001219 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001220 '\d LOAD $0.*' ..
1221 '\d PUSHNR 7.*' ..
1222 '\d OPNR +.*' ..
1223 '\d STORE $1.*' ..
1224 'nrres = nr - 7.*' ..
1225 '\d OPNR -.*' ..
1226 'nrres = nr \* 7.*' ..
1227 '\d OPNR \*.*' ..
1228 'nrres = nr / 7.*' ..
1229 '\d OPNR /.*' ..
1230 'nrres = nr % 7.*' ..
1231 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001232 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001233 '\d LOADG g:number.*' ..
1234 '\d PUSHNR 7.*' ..
1235 '\d OPANY +.*' ..
1236 '\d STORE $2.*' ..
1237 'anyres = g:number - 7.*' ..
1238 '\d OPANY -.*' ..
1239 'anyres = g:number \* 7.*' ..
1240 '\d OPANY \*.*' ..
1241 'anyres = g:number / 7.*' ..
1242 '\d OPANY /.*' ..
1243 'anyres = g:number % 7.*' ..
1244 '\d OPANY %.*',
1245 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001246 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001247 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001248 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001249 '\d PUSHF 3.0.*' ..
1250 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001251 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001252 '\d LOAD $3.*' ..
1253 '\d PUSHF 7.0.*' ..
1254 '\d OPFLOAT +.*' ..
1255 '\d STORE $4.*' ..
1256 'flres = fl - 7.0.*' ..
1257 '\d OPFLOAT -.*' ..
1258 'flres = fl \* 7.0.*' ..
1259 '\d OPFLOAT \*.*' ..
1260 'flres = fl / 7.0.*' ..
1261 '\d OPFLOAT /.*',
1262 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001263 endif
1264enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001265
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001266def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001267 var reslist = [1, 2] + [3, 4]
1268 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001269enddef
1270
1271def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001272 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001273 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001274 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001275 '\d PUSHNR 1.*' ..
1276 '\d PUSHNR 2.*' ..
1277 '\d NEWLIST size 2.*' ..
1278 '\d PUSHNR 3.*' ..
1279 '\d PUSHNR 4.*' ..
1280 '\d NEWLIST size 2.*' ..
1281 '\d ADDLIST.*' ..
1282 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001283 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001284 '\d PUSHBLOB 0z1122.*' ..
1285 '\d PUSHBLOB 0z3344.*' ..
1286 '\d ADDBLOB.*' ..
1287 '\d STORE $.*',
1288 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001289enddef
1290
1291let g:aa = 'aa'
1292def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001293 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001294 return res
1295enddef
1296
1297def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001298 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001299 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001300 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001301 '\d LOADG g:aa.*' ..
1302 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001303 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001304 '\d CONCAT.*' ..
1305 '\d STORE $.*',
1306 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001307 assert_equal('aabb', ConcatString())
1308enddef
1309
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001310def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001311 var s = "abcd"
1312 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001313 return res
1314enddef
1315
1316def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001317 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001318 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001319 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001320 '\d PUSHS "abcd"\_s*' ..
1321 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001322 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001323 '\d LOAD $0\_s*' ..
1324 '\d PUSHNR 1\_s*' ..
1325 '\d STRINDEX\_s*' ..
1326 '\d STORE $1\_s*',
1327 instr)
1328 assert_equal('b', StringIndex())
1329enddef
1330
Bram Moolenaared591872020-08-15 22:14:53 +02001331def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001332 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001333 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001334 return res
1335enddef
1336
1337def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001338 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001339 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001340 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001341 '\d PUSHS "abcd"\_s*' ..
1342 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001343 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001344 '\d LOAD $0\_s*' ..
1345 '\d PUSHNR 1\_s*' ..
1346 '\d PUSHNR 8\_s*' ..
1347 '\d STRSLICE\_s*' ..
1348 '\d STORE $1\_s*',
1349 instr)
1350 assert_equal('bcd', StringSlice())
1351enddef
1352
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001353def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001354 var l = [1, 2, 3]
1355 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001356 return res
1357enddef
1358
1359def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001360 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001361 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001362 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001363 '\d PUSHNR 1\_s*' ..
1364 '\d PUSHNR 2\_s*' ..
1365 '\d PUSHNR 3\_s*' ..
1366 '\d NEWLIST size 3\_s*' ..
1367 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001368 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001369 '\d LOAD $0\_s*' ..
1370 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001371 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001372 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001373 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001374 assert_equal(2, ListIndex())
1375enddef
1376
Bram Moolenaared591872020-08-15 22:14:53 +02001377def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001378 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001379 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001380 return res
1381enddef
1382
1383def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001384 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001385 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001386 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001387 '\d PUSHNR 1\_s*' ..
1388 '\d PUSHNR 2\_s*' ..
1389 '\d PUSHNR 3\_s*' ..
1390 '\d NEWLIST size 3\_s*' ..
1391 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001392 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001393 '\d LOAD $0\_s*' ..
1394 '\d PUSHNR 1\_s*' ..
1395 '\d PUSHNR 8\_s*' ..
1396 '\d LISTSLICE\_s*' ..
1397 '\d STORE $1\_s*',
1398 instr)
1399 assert_equal([2, 3], ListSlice())
1400enddef
1401
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001402def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001403 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001404 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001405 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001406 return res
1407enddef
1408
1409def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001410 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001411 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001412 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001413 '\d PUSHS "item"\_s*' ..
1414 '\d PUSHNR 1\_s*' ..
1415 '\d NEWDICT size 1\_s*' ..
1416 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001417 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001418 '\d\+ LOAD $0\_s*' ..
1419 '\d\+ MEMBER item\_s*' ..
1420 '\d\+ STORE $1\_s*' ..
1421 'res = d\["item"\]\_s*' ..
1422 '\d\+ LOAD $0\_s*' ..
1423 '\d\+ PUSHS "item"\_s*' ..
1424 '\d\+ MEMBER\_s*' ..
1425 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001426 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001427 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001428enddef
1429
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001430let somelist = [1, 2, 3, 4, 5]
1431def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001432 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001433 return res
1434enddef
1435
1436def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001437 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001438 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001440 '\d LOADG g:somelist\_s*' ..
1441 '\d PUSHNR 2\_s*' ..
1442 '\d ANYINDEX\_s*' ..
1443 '\d STORE $0\_s*' ..
1444 'return res\_s*' ..
1445 '\d LOAD $0\_s*' ..
1446 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1447 '\d RETURN',
1448 instr)
1449 assert_equal(3, AnyIndex())
1450enddef
1451
1452def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001453 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001454 return res
1455enddef
1456
1457def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001458 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001459 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001460 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001461 '\d LOADG g:somelist\_s*' ..
1462 '\d PUSHNR 1\_s*' ..
1463 '\d PUSHNR 3\_s*' ..
1464 '\d ANYSLICE\_s*' ..
1465 '\d STORE $0\_s*' ..
1466 'return res\_s*' ..
1467 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001468 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001469 '\d RETURN',
1470 instr)
1471 assert_equal([2, 3, 4], AnySlice())
1472enddef
1473
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001474def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001475 var nr = 9
1476 var plus = +nr
1477 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001478 return res
1479enddef
1480
1481def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001482 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001483 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001484 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001485 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001486 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001487 '\d LOAD $0\_s*' ..
1488 '\d CHECKNR\_s*' ..
1489 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001490 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001491 '\d LOAD $0\_s*' ..
1492 '\d NEGATENR\_s*' ..
1493 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001494 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001495 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001496enddef
1497
1498def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001499 var flag = true
1500 var invert = !flag
1501 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001502 return res
1503enddef
1504
1505def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001506 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001507 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001508 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001509 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001510 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001511 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001512 '\d LOAD $0\_s*' ..
1513 '\d INVERT (!val)\_s*' ..
1514 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001515 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001516 '\d LOAD $0\_s*' ..
1517 '\d 2BOOL (!!val)\_s*' ..
1518 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001519 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001520 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001521enddef
1522
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001523def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001524 var name: bool = 1 && 0 || 1
1525 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001526enddef
1527
1528def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001529 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001530 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001531 'var name: bool = 1 && 0 || 1\_s*' ..
1532 '0 PUSHNR 1\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001533 '1 2BOOL (!!val)\_s*' ..
1534 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1535 '3 PUSHNR 0\_s*' ..
1536 '4 2BOOL (!!val)\_s*' ..
1537 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1538 '6 PUSHNR 1\_s*' ..
1539 '7 2BOOL (!!val)\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001540 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001541 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001542 '\d\+ LOAD $0\_s*' ..
1543 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001544 instr)
1545 assert_equal(true, InvertBool())
1546enddef
1547
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001548def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001549 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001550 ['true == isFalse', 'COMPAREBOOL =='],
1551 ['true != isFalse', 'COMPAREBOOL !='],
1552 ['v:none == isNull', 'COMPARESPECIAL =='],
1553 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001554
Bram Moolenaara5565e42020-05-09 15:44:01 +02001555 ['111 == aNumber', 'COMPARENR =='],
1556 ['111 != aNumber', 'COMPARENR !='],
1557 ['111 > aNumber', 'COMPARENR >'],
1558 ['111 < aNumber', 'COMPARENR <'],
1559 ['111 >= aNumber', 'COMPARENR >='],
1560 ['111 <= aNumber', 'COMPARENR <='],
1561 ['111 =~ aNumber', 'COMPARENR =\~'],
1562 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001563
Bram Moolenaara5565e42020-05-09 15:44:01 +02001564 ['"xx" != aString', 'COMPARESTRING !='],
1565 ['"xx" > aString', 'COMPARESTRING >'],
1566 ['"xx" < aString', 'COMPARESTRING <'],
1567 ['"xx" >= aString', 'COMPARESTRING >='],
1568 ['"xx" <= aString', 'COMPARESTRING <='],
1569 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1570 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1571 ['"xx" is aString', 'COMPARESTRING is'],
1572 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001573
Bram Moolenaara5565e42020-05-09 15:44:01 +02001574 ['0z11 == aBlob', 'COMPAREBLOB =='],
1575 ['0z11 != aBlob', 'COMPAREBLOB !='],
1576 ['0z11 is aBlob', 'COMPAREBLOB is'],
1577 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001578
Bram Moolenaara5565e42020-05-09 15:44:01 +02001579 ['[1, 2] == aList', 'COMPARELIST =='],
1580 ['[1, 2] != aList', 'COMPARELIST !='],
1581 ['[1, 2] is aList', 'COMPARELIST is'],
1582 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001583
Bram Moolenaare0de1712020-12-02 17:36:54 +01001584 ['{a: 1} == aDict', 'COMPAREDICT =='],
1585 ['{a: 1} != aDict', 'COMPAREDICT !='],
1586 ['{a: 1} is aDict', 'COMPAREDICT is'],
1587 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001588
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001589 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1590 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1591 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1592 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001593
1594 ['77 == g:xx', 'COMPAREANY =='],
1595 ['77 != g:xx', 'COMPAREANY !='],
1596 ['77 > g:xx', 'COMPAREANY >'],
1597 ['77 < g:xx', 'COMPAREANY <'],
1598 ['77 >= g:xx', 'COMPAREANY >='],
1599 ['77 <= g:xx', 'COMPAREANY <='],
1600 ['77 =~ g:xx', 'COMPAREANY =\~'],
1601 ['77 !~ g:xx', 'COMPAREANY !\~'],
1602 ['77 is g:xx', 'COMPAREANY is'],
1603 ['77 isnot g:xx', 'COMPAREANY isnot'],
1604 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001605 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001606 if has('float')
1607 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001608 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1609 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1610 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1611 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1612 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1613 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1614 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1615 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001616 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001617 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001618 endif
1619
Bram Moolenaarac564082020-09-27 19:05:33 +02001620 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001621 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001622 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001623 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 ' var isFalse = false',
1625 ' var isNull = v:null',
1626 ' var aNumber = 222',
1627 ' var aString = "yy"',
1628 ' var aBlob = 0z22',
1629 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001630 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001631 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001632 ' if ' .. case[0],
1633 ' echo 42'
1634 ' endif',
1635 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001636 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001637 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001638 assert_match('TestCase' .. nr .. '.*' ..
1639 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1640 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001641 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001642 '\d ' .. case[1] .. '.*' ..
1643 '\d JUMP_IF_FALSE -> \d\+.*',
1644 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001645
1646 nr += 1
1647 endfor
1648
Bram Moolenaar22da5592020-03-19 14:52:20 +01001649 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001650enddef
1651
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001652def s:FalsyOp()
1653 echo g:flag ?? "yes"
1654 echo [] ?? "empty list"
1655 echo "" ?? "empty string"
1656enddef
1657
1658def Test_dsassemble_falsy_op()
1659 var res = execute('disass s:FalsyOp')
1660 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1661 'echo g:flag ?? "yes"\_s*' ..
1662 '0 LOADG g:flag\_s*' ..
1663 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1664 '2 PUSHS "yes"\_s*' ..
1665 '3 ECHO 1\_s*' ..
1666 'echo \[\] ?? "empty list"\_s*' ..
1667 '4 NEWLIST size 0\_s*' ..
1668 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1669 '6 PUSHS "empty list"\_s*' ..
1670 '7 ECHO 1\_s*' ..
1671 'echo "" ?? "empty string"\_s*' ..
1672 '\d\+ PUSHS "empty string"\_s*' ..
1673 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001674 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001675 res)
1676enddef
1677
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001678def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001679 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001680 ['"xx" == "yy"', false],
1681 ['"aa" == "aa"', true],
1682 ['has("eval") ? true : false', true],
1683 ['has("asdf") ? true : false', false],
1684 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001685
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001687 for case in cases
1688 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001689 ' if ' .. case[0],
1690 ' echo 42'
1691 ' endif',
1692 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001693 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001694 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001695 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001696 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001697 assert_match('TestCase' .. nr .. '.*' ..
1698 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1699 '\d PUSHNR 42.*' ..
1700 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001701 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001702 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001703 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001704 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001705 assert_match('TestCase' .. nr .. '.*' ..
1706 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1707 'echo 42[ \n]*' ..
1708 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001709 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001710 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001711 endif
1712
1713 nr += 1
1714 endfor
1715
1716 delete('Xdisassemble')
1717enddef
1718
Bram Moolenaarad39c092020-02-26 18:23:43 +01001719def s:Execute()
1720 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001721 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001722 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001723 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001724 execute 'help ' .. tag
1725enddef
1726
1727def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001728 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001729 assert_match('\<SNR>\d*_Execute\_s*' ..
1730 "execute 'help vim9.txt'\\_s*" ..
1731 '\d PUSHS "help vim9.txt"\_s*' ..
1732 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001733 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001734 '\d PUSHS "help vim9.txt"\_s*' ..
1735 '\d STORE $0\_s*' ..
1736 'execute cmd\_s*' ..
1737 '\d LOAD $0\_s*' ..
1738 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001739 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001740 '\d PUSHS "vim9.txt"\_s*' ..
1741 '\d STORE $1\_s*' ..
1742 "execute 'help ' .. tag\\_s*" ..
1743 '\d\+ PUSHS "help "\_s*' ..
1744 '\d\+ LOAD $1\_s*' ..
1745 '\d\+ CONCAT\_s*' ..
1746 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001747 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001748 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001749enddef
1750
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001751def s:Echomsg()
1752 echomsg 'some' 'message'
1753 echoerr 'went' .. 'wrong'
1754enddef
1755
1756def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001757 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001758 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1759 "echomsg 'some' 'message'\\_s*" ..
1760 '\d PUSHS "some"\_s*' ..
1761 '\d PUSHS "message"\_s*' ..
1762 '\d ECHOMSG 2\_s*' ..
1763 "echoerr 'went' .. 'wrong'\\_s*" ..
1764 '\d PUSHS "wentwrong"\_s*' ..
1765 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001766 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001767 res)
1768enddef
1769
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001770def SomeStringArg(arg: string)
1771 echo arg
1772enddef
1773
1774def SomeAnyArg(arg: any)
1775 echo arg
1776enddef
1777
1778def SomeStringArgAndReturn(arg: string): string
1779 return arg
1780enddef
1781
1782def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001783 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001784 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1785 '\d *echo arg.*' ..
1786 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001787 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001788
Bram Moolenaarac564082020-09-27 19:05:33 +02001789 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001790 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1791 '\d *echo arg\_s*' ..
1792 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001793 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001794
Bram Moolenaarac564082020-09-27 19:05:33 +02001795 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001796 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1797 '\d *return arg\_s*' ..
1798 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001799 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001800enddef
1801
Bram Moolenaar09689a02020-05-09 22:50:08 +02001802def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001803 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001804 vim9script
1805 def FuncOne(): string
1806 return FuncTwo()
1807 enddef
1808 def FuncTwo(): string
1809 return 'two'
1810 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001811 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001812 END
1813 writefile(lines, 'Xdisassemble')
1814 source Xdisassemble
1815
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001816 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001817 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1818 'return FuncTwo()\_s*' ..
1819 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001820 '\d RETURN',
1821 g:res_FuncOne)
1822
1823 delete('Xdisassemble')
1824 unlet g:res_FuncOne
1825enddef
1826
Bram Moolenaar61a89812020-05-07 16:58:17 +02001827def s:ConcatStrings(): string
1828 return 'one' .. 'two' .. 'three'
1829enddef
1830
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001831def s:ComputeConst(): number
1832 return 2 + 3 * 4 / 6 + 7
1833enddef
1834
Bram Moolenaar1c747212020-05-09 18:28:34 +02001835def s:ComputeConstParen(): number
1836 return ((2 + 4) * (8 / 2)) / (3 + 4)
1837enddef
1838
Bram Moolenaar61a89812020-05-07 16:58:17 +02001839def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001840 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001841 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1842 "return 'one' .. 'two' .. 'three'\\_s*" ..
1843 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001844 '\d RETURN',
1845 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001846
1847 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001848 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1849 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1850 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001851 '\d RETURN',
1852 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001853
1854 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001855 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1856 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1857 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001858 '\d RETURN',
1859 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001860enddef
1861
Bram Moolenaar389df252020-07-09 21:20:47 +02001862def s:CallAppend()
1863 eval "some text"->append(2)
1864enddef
1865
1866def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001867 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001868 assert_match('<SNR>\d*_CallAppend\_s*' ..
1869 'eval "some text"->append(2)\_s*' ..
1870 '\d PUSHS "some text"\_s*' ..
1871 '\d PUSHNR 2\_s*' ..
1872 '\d SHUFFLE 2 up 1\_s*' ..
1873 '\d BCALL append(argc 2)\_s*' ..
1874 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001875 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001876 res)
1877enddef
1878
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001879
1880def s:SilentMessage()
1881 silent echomsg "text"
1882 silent! echoerr "error"
1883enddef
1884
1885def Test_silent()
1886 var res = execute('disass s:SilentMessage')
1887 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1888 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001889 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001890 '\d PUSHS "text"\_s*' ..
1891 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001892 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001893 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001894 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001895 '\d PUSHS "error"\_s*' ..
1896 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001897 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001898 '\d\+ RETURN 0',
1899 res)
1900enddef
1901
1902def s:SilentIf()
1903 silent if 4 == g:five
1904 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001905 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001906enddef
1907
1908def Test_silent_if()
1909 var res = execute('disass s:SilentIf')
1910 assert_match('<SNR>\d*_SilentIf\_s*' ..
1911 'silent if 4 == g:five\_s*' ..
1912 '\d\+ CMDMOD silent\_s*' ..
1913 '\d\+ PUSHNR 4\_s*' ..
1914 '\d\+ LOADG g:five\_s*' ..
1915 '\d\+ COMPAREANY ==\_s*' ..
1916 '\d\+ CMDMOD_REV\_s*' ..
1917 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1918 'silent elseif 4 == g:five\_s*' ..
1919 '\d\+ JUMP -> \d\+\_s*' ..
1920 '\d\+ CMDMOD silent\_s*' ..
1921 '\d\+ PUSHNR 4\_s*' ..
1922 '\d\+ LOADG g:five\_s*' ..
1923 '\d\+ COMPAREANY ==\_s*' ..
1924 '\d\+ CMDMOD_REV\_s*' ..
1925 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001926 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001927 '\d\+ RETURN 0',
1928 res)
1929enddef
1930
1931def s:SilentFor()
1932 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01001933 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01001934enddef
1935
1936def Test_silent_for()
1937 var res = execute('disass s:SilentFor')
1938 assert_match('<SNR>\d*_SilentFor\_s*' ..
1939 'silent for i in \[0\]\_s*' ..
1940 '\d CMDMOD silent\_s*' ..
1941 '\d STORE -1 in $0\_s*' ..
1942 '\d PUSHNR 0\_s*' ..
1943 '\d NEWLIST size 1\_s*' ..
1944 '\d CMDMOD_REV\_s*' ..
1945 '5 FOR $0 -> 8\_s*' ..
1946 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001947 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001948 '\d JUMP -> 5\_s*' ..
1949 '8 DROP\_s*' ..
1950 '\d RETURN 0\_s*',
1951 res)
1952enddef
1953
1954def s:SilentWhile()
1955 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01001956 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01001957enddef
1958
1959def Test_silent_while()
1960 var res = execute('disass s:SilentWhile')
1961 assert_match('<SNR>\d*_SilentWhile\_s*' ..
1962 'silent while g:not\_s*' ..
1963 '0 CMDMOD silent\_s*' ..
1964 '\d LOADG g:not\_s*' ..
1965 '\d COND2BOOL\_s*' ..
1966 '\d CMDMOD_REV\_s*' ..
1967 '\d JUMP_IF_FALSE -> 6\_s*' ..
1968
Bram Moolenaarfa984412021-03-25 22:15:28 +01001969 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001970 '\d JUMP -> 0\_s*' ..
1971 '6 RETURN 0\_s*',
1972 res)
1973enddef
1974
1975def s:SilentReturn(): string
1976 silent return "done"
1977enddef
1978
1979def Test_silent_return()
1980 var res = execute('disass s:SilentReturn')
1981 assert_match('<SNR>\d*_SilentReturn\_s*' ..
1982 'silent return "done"\_s*' ..
1983 '\d CMDMOD silent\_s*' ..
1984 '\d PUSHS "done"\_s*' ..
1985 '\d CMDMOD_REV\_s*' ..
1986 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001987 res)
1988enddef
1989
Bram Moolenaarb2049902021-01-24 12:53:53 +01001990def s:Profiled(): string
1991 echo "profiled"
1992 return "done"
1993enddef
1994
1995def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01001996 if !has('profile')
1997 MissingFeature 'profile'
1998 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01001999 var res = execute('disass! s:Profiled')
2000 assert_match('<SNR>\d*_Profiled\_s*' ..
2001 'echo "profiled"\_s*' ..
2002 '\d PROFILE START line 1\_s*' ..
2003 '\d PUSHS "profiled"\_s*' ..
2004 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002005 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002006 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002007 '\d PROFILE START line 2\_s*' ..
2008 '\d PUSHS "done"\_s*' ..
2009 '\d RETURN\_s*' ..
2010 '\d PROFILE END',
2011 res)
2012enddef
2013
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002014
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002015" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker