blob: 363aaea356c4b7b6393020a15c6f95fc8534b511 [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 Moolenaar38a3bfa2021-03-29 22:14:55 +0200644def FuncWithDefault(arg: string = 'default', nr = 77): string
645 return arg .. nr
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100646enddef
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*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200651 '\d JUMP_IF_ARG_SET arg\[-2\] -> 3\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200652 '\d PUSHS "default"\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200653 '\d STORE arg\[-2]\_s*' ..
654 '3 JUMP_IF_ARG_SET arg\[-1\] -> 6\_s*' ..
655 '\d PUSHNR 77\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200656 '\d STORE arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200657 'return arg .. nr\_s*' ..
658 '6 LOAD arg\[-2]\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200659 '\d LOAD arg\[-1]\_s*' ..
Bram Moolenaar38a3bfa2021-03-29 22:14:55 +0200660 '\d 2STRING stack\[-1]\_s*' ..
661 '\d\+ CONCAT\_s*' ..
662 '\d\+ RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200663 res)
Bram Moolenaar8ed04582020-02-22 19:07:28 +0100664enddef
665
666
Bram Moolenaar158906c2020-02-06 20:39:45 +0100667def HasEval()
668 if has("eval")
669 echo "yes"
670 else
671 echo "no"
672 endif
673enddef
674
675def HasNothing()
676 if has("nothing")
677 echo "yes"
678 else
679 echo "no"
680 endif
681enddef
682
683def HasSomething()
684 if has("nothing")
685 echo "nothing"
686 elseif has("something")
687 echo "something"
688 elseif has("eval")
689 echo "eval"
690 elseif has("less")
691 echo "less"
692 endif
693enddef
694
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100695def HasGuiRunning()
696 if has("gui_running")
697 echo "yes"
698 else
699 echo "no"
700 endif
701enddef
702
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100703def Test_disassemble_const_expr()
Bram Moolenaard2c61702020-09-06 15:58:36 +0200704 assert_equal("\nyes", execute('HasEval()'))
Bram Moolenaarac564082020-09-27 19:05:33 +0200705 var instr = execute('disassemble HasEval')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200706 assert_match('HasEval\_s*' ..
707 'if has("eval")\_s*' ..
708 'echo "yes"\_s*' ..
709 '\d PUSHS "yes"\_s*' ..
710 '\d ECHO 1\_s*' ..
711 'else\_s*' ..
712 'echo "no"\_s*' ..
713 'endif\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200714 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100715 assert_notmatch('JUMP', instr)
716
Bram Moolenaard2c61702020-09-06 15:58:36 +0200717 assert_equal("\nno", execute('HasNothing()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100718 instr = execute('disassemble HasNothing')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200719 assert_match('HasNothing\_s*' ..
720 'if has("nothing")\_s*' ..
721 'echo "yes"\_s*' ..
722 'else\_s*' ..
723 'echo "no"\_s*' ..
724 '\d PUSHS "no"\_s*' ..
725 '\d ECHO 1\_s*' ..
726 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200727 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100728 assert_notmatch('PUSHS "yes"', instr)
729 assert_notmatch('JUMP', instr)
730
Bram Moolenaard2c61702020-09-06 15:58:36 +0200731 assert_equal("\neval", execute('HasSomething()'))
Bram Moolenaar158906c2020-02-06 20:39:45 +0100732 instr = execute('disassemble HasSomething')
Bram Moolenaar675f7162020-04-12 22:53:54 +0200733 assert_match('HasSomething.*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200734 'if has("nothing")\_s*' ..
735 'echo "nothing"\_s*' ..
736 'elseif has("something")\_s*' ..
737 'echo "something"\_s*' ..
738 'elseif has("eval")\_s*' ..
739 'echo "eval"\_s*' ..
740 '\d PUSHS "eval"\_s*' ..
741 '\d ECHO 1\_s*' ..
742 'elseif has("less").*' ..
743 'echo "less"\_s*' ..
744 'endif',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200745 instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100746 assert_notmatch('PUSHS "nothing"', instr)
747 assert_notmatch('PUSHS "something"', instr)
748 assert_notmatch('PUSHS "less"', instr)
749 assert_notmatch('JUMP', instr)
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100750
751 var result: string
752 var instr_expected: string
753 if has('gui')
754 if has('gui_running')
755 # GUI already running, always returns "yes"
756 result = "\nyes"
757 instr_expected = 'HasGuiRunning.*' ..
758 'if has("gui_running")\_s*' ..
759 ' echo "yes"\_s*' ..
760 '\d PUSHS "yes"\_s*' ..
761 '\d ECHO 1\_s*' ..
762 'else\_s*' ..
763 ' echo "no"\_s*' ..
764 'endif'
765 else
766 result = "\nno"
767 if has('unix')
768 # GUI not running but can start later, call has()
769 instr_expected = 'HasGuiRunning.*' ..
770 'if has("gui_running")\_s*' ..
771 '\d PUSHS "gui_running"\_s*' ..
772 '\d BCALL has(argc 1)\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +0200773 '\d COND2BOOL\_s*' ..
Bram Moolenaar8cebd432020-11-08 12:49:47 +0100774 '\d JUMP_IF_FALSE -> \d\_s*' ..
775 ' echo "yes"\_s*' ..
776 '\d PUSHS "yes"\_s*' ..
777 '\d ECHO 1\_s*' ..
778 'else\_s*' ..
779 '\d JUMP -> \d\_s*' ..
780 ' echo "no"\_s*' ..
781 '\d PUSHS "no"\_s*' ..
782 '\d ECHO 1\_s*' ..
783 'endif'
784 else
785 # GUI not running, always return "no"
786 instr_expected = 'HasGuiRunning.*' ..
787 'if has("gui_running")\_s*' ..
788 ' echo "yes"\_s*' ..
789 'else\_s*' ..
790 ' echo "no"\_s*' ..
791 '\d PUSHS "no"\_s*' ..
792 '\d ECHO 1\_s*' ..
793 'endif'
794 endif
795 endif
796 else
797 # GUI not supported, always return "no"
798 result = "\nno"
799 instr_expected = 'HasGuiRunning.*' ..
800 'if has("gui_running")\_s*' ..
801 ' echo "yes"\_s*' ..
802 'else\_s*' ..
803 ' echo "no"\_s*' ..
804 '\d PUSHS "no"\_s*' ..
805 '\d ECHO 1\_s*' ..
806 'endif'
807 endif
808
809 assert_equal(result, execute('HasGuiRunning()'))
810 instr = execute('disassemble HasGuiRunning')
811 assert_match(instr_expected, instr)
Bram Moolenaar158906c2020-02-06 20:39:45 +0100812enddef
813
Bram Moolenaarefd88552020-06-18 20:50:10 +0200814def ReturnInIf(): string
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100815 if 1 < 0
816 return "maybe"
817 endif
Bram Moolenaarefd88552020-06-18 20:50:10 +0200818 if g:cond
819 return "yes"
820 else
821 return "no"
822 endif
823enddef
824
825def Test_disassemble_return_in_if()
Bram Moolenaarac564082020-09-27 19:05:33 +0200826 var instr = execute('disassemble ReturnInIf')
Bram Moolenaarefd88552020-06-18 20:50:10 +0200827 assert_match('ReturnInIf\_s*' ..
Bram Moolenaar8e02faf2020-11-18 16:35:02 +0100828 'if 1 < 0\_s*' ..
829 ' return "maybe"\_s*' ..
830 'endif\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200831 'if g:cond\_s*' ..
832 '0 LOADG g:cond\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100833 '1 COND2BOOL\_s*' ..
834 '2 JUMP_IF_FALSE -> 5\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200835 'return "yes"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100836 '3 PUSHS "yes"\_s*' ..
837 '4 RETURN\_s*' ..
Bram Moolenaarefd88552020-06-18 20:50:10 +0200838 'else\_s*' ..
839 ' return "no"\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +0100840 '5 PUSHS "no"\_s*' ..
841 '6 RETURN$',
Bram Moolenaarefd88552020-06-18 20:50:10 +0200842 instr)
843enddef
844
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100845def WithFunc()
Bram Moolenaarac564082020-09-27 19:05:33 +0200846 var Funky1: func
847 var Funky2: func = function("len")
848 var Party2: func = funcref("UserFunc")
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100849enddef
850
851def Test_disassemble_function()
Bram Moolenaarac564082020-09-27 19:05:33 +0200852 var instr = execute('disassemble WithFunc')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200853 assert_match('WithFunc\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200854 'var Funky1: func\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200855 '0 PUSHFUNC "\[none]"\_s*' ..
856 '1 STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200857 'var Funky2: func = function("len")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200858 '2 PUSHS "len"\_s*' ..
859 '3 BCALL function(argc 1)\_s*' ..
860 '4 STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200861 'var Party2: func = funcref("UserFunc")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200862 '\d PUSHS "UserFunc"\_s*' ..
863 '\d BCALL funcref(argc 1)\_s*' ..
864 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100865 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200866 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100867enddef
868
869if has('channel')
870 def WithChannel()
Bram Moolenaarac564082020-09-27 19:05:33 +0200871 var job1: job
872 var job2: job = job_start("donothing")
873 var chan1: channel
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100874 enddef
875endif
876
877def Test_disassemble_channel()
878 CheckFeature channel
879
Bram Moolenaarac564082020-09-27 19:05:33 +0200880 var instr = execute('disassemble WithChannel')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200881 assert_match('WithChannel\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200882 'var job1: job\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200883 '\d PUSHJOB "no process"\_s*' ..
884 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200885 'var job2: job = job_start("donothing")\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200886 '\d PUSHS "donothing"\_s*' ..
887 '\d BCALL job_start(argc 1)\_s*' ..
888 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +0200889 'var chan1: channel\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200890 '\d PUSHCHANNEL 0\_s*' ..
891 '\d STORE $2\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100892 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200893 instr)
Bram Moolenaarf51cb4e2020-03-01 17:55:14 +0100894enddef
895
Bram Moolenaar777770f2020-02-06 21:27:08 +0100896def WithLambda(): string
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100897 var F = (a) => "X" .. a .. "X"
Bram Moolenaar777770f2020-02-06 21:27:08 +0100898 return F("x")
899enddef
900
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100901def Test_disassemble_lambda()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100902 assert_equal("XxX", WithLambda())
Bram Moolenaarac564082020-09-27 19:05:33 +0200903 var instr = execute('disassemble WithLambda')
Bram Moolenaarcb790402020-05-15 20:53:00 +0200904 assert_match('WithLambda\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100905 'var F = (a) => "X" .. a .. "X"\_s*' ..
Bram Moolenaar148ce7a2020-09-23 21:57:23 +0200906 '\d FUNCREF <lambda>\d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +0200907 '\d STORE $0\_s*' ..
908 'return F("x")\_s*' ..
909 '\d PUSHS "x"\_s*' ..
910 '\d LOAD $0\_s*' ..
911 '\d PCALL (argc 1)\_s*' ..
Bram Moolenaar822ba242020-05-24 23:00:18 +0200912 '\d RETURN',
Bram Moolenaar675f7162020-04-12 22:53:54 +0200913 instr)
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200914
Bram Moolenaarac564082020-09-27 19:05:33 +0200915 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200916 instr = execute('disassemble ' .. name)
917 assert_match('<lambda>\d\+\_s*' ..
918 'return "X" .. a .. "X"\_s*' ..
919 '\d PUSHS "X"\_s*' ..
920 '\d LOAD arg\[-1\]\_s*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +0200921 '\d 2STRING_ANY stack\[-1\]\_s*' ..
Bram Moolenaarbfd65582020-07-13 18:18:00 +0200922 '\d CONCAT\_s*' ..
923 '\d PUSHS "X"\_s*' ..
924 '\d CONCAT\_s*' ..
925 '\d RETURN',
926 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +0100927enddef
928
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100929def LambdaWithType(): number
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100930 var Ref = (a: number) => a + 10
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100931 return Ref(g:value)
932enddef
933
934def Test_disassemble_lambda_with_type()
935 g:value = 5
936 assert_equal(15, LambdaWithType())
937 var instr = execute('disassemble LambdaWithType')
938 assert_match('LambdaWithType\_s*' ..
Bram Moolenaar2949cfd2020-12-31 21:28:47 +0100939 'var Ref = (a: number) => a + 10\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100940 '\d FUNCREF <lambda>\d\+\_s*' ..
941 '\d STORE $0\_s*' ..
942 'return Ref(g:value)\_s*' ..
943 '\d LOADG g:value\_s*' ..
944 '\d LOAD $0\_s*' ..
Bram Moolenaare32e5162021-01-21 20:21:29 +0100945 '\d CHECKTYPE number stack\[-2\] arg 1\_s*' ..
Bram Moolenaarb4d16cb2020-11-05 18:45:46 +0100946 '\d PCALL (argc 1)\_s*' ..
947 '\d RETURN',
948 instr)
949enddef
950
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200951def NestedOuter()
952 def g:Inner()
953 echomsg "inner"
954 enddef
955enddef
956
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100957def Test_disassemble_nested_func()
Bram Moolenaarac564082020-09-27 19:05:33 +0200958 var instr = execute('disassemble NestedOuter')
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200959 assert_match('NestedOuter\_s*' ..
960 'def g:Inner()\_s*' ..
961 'echomsg "inner"\_s*' ..
962 'enddef\_s*' ..
963 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100964 '\d RETURN 0',
Bram Moolenaar38ddf332020-07-31 22:05:04 +0200965 instr)
966enddef
967
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100968def NestedDefList()
969 def
970 def Info
971 def /Info
972 def /Info/
973enddef
974
Bram Moolenaar8863bda2021-03-17 18:42:08 +0100975def Test_disassemble_nested_def_list()
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100976 var instr = execute('disassemble NestedDefList')
977 assert_match('NestedDefList\_s*' ..
978 'def\_s*' ..
979 '\d DEF \_s*' ..
980 'def Info\_s*' ..
981 '\d DEF Info\_s*' ..
982 'def /Info\_s*' ..
983 '\d DEF /Info\_s*' ..
984 'def /Info/\_s*' ..
985 '\d DEF /Info/\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +0100986 '\d RETURN 0',
Bram Moolenaar6abdcf82020-11-22 18:15:44 +0100987 instr)
988enddef
989
Bram Moolenaar6e949782020-04-13 17:21:00 +0200990def AndOr(arg: any): string
Bram Moolenaar777770f2020-02-06 21:27:08 +0100991 if arg == 1 && arg != 2 || arg == 4
992 return 'yes'
993 endif
994 return 'no'
995enddef
996
Bram Moolenaarf2460a32020-02-07 22:09:54 +0100997def Test_disassemble_and_or()
Bram Moolenaar777770f2020-02-06 21:27:08 +0100998 assert_equal("yes", AndOr(1))
999 assert_equal("no", AndOr(2))
1000 assert_equal("yes", AndOr(4))
Bram Moolenaarac564082020-09-27 19:05:33 +02001001 var instr = execute('disassemble AndOr')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001002 assert_match('AndOr\_s*' ..
1003 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
1004 '\d LOAD arg\[-1]\_s*' ..
1005 '\d PUSHNR 1\_s*' ..
1006 '\d COMPAREANY ==\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001007 '\d JUMP_IF_COND_FALSE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001008 '\d LOAD arg\[-1]\_s*' ..
1009 '\d PUSHNR 2\_s*' ..
1010 '\d COMPAREANY !=\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001011 '\d JUMP_IF_COND_TRUE -> \d\+\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001012 '\d LOAD arg\[-1]\_s*' ..
1013 '\d\+ PUSHNR 4\_s*' ..
1014 '\d\+ COMPAREANY ==\_s*' ..
1015 '\d\+ JUMP_IF_FALSE -> \d\+',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001016 instr)
Bram Moolenaar777770f2020-02-06 21:27:08 +01001017enddef
1018
Bram Moolenaar04d05222020-02-06 22:06:54 +01001019def ForLoop(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001020 var res: list<number>
Bram Moolenaar04d05222020-02-06 22:06:54 +01001021 for i in range(3)
1022 res->add(i)
1023 endfor
1024 return res
1025enddef
1026
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001027def Test_disassemble_for_loop()
Bram Moolenaar04d05222020-02-06 22:06:54 +01001028 assert_equal([0, 1, 2], ForLoop())
Bram Moolenaarac564082020-09-27 19:05:33 +02001029 var instr = execute('disassemble ForLoop')
Bram Moolenaarcb790402020-05-15 20:53:00 +02001030 assert_match('ForLoop\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001031 'var res: list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001032 '\d NEWLIST size 0\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001033 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001034 '\d STORE $0\_s*' ..
1035 'for i in range(3)\_s*' ..
1036 '\d STORE -1 in $1\_s*' ..
1037 '\d PUSHNR 3\_s*' ..
1038 '\d BCALL range(argc 1)\_s*' ..
1039 '\d FOR $1 -> \d\+\_s*' ..
1040 '\d STORE $2\_s*' ..
1041 'res->add(i)\_s*' ..
1042 '\d LOAD $0\_s*' ..
1043 '\d LOAD $2\_s*' ..
Bram Moolenaar1dcae592020-10-19 19:02:42 +02001044 '\d\+ LISTAPPEND\_s*' ..
Bram Moolenaarcb790402020-05-15 20:53:00 +02001045 '\d\+ DROP\_s*' ..
1046 'endfor\_s*' ..
1047 '\d\+ JUMP -> \d\+\_s*' ..
1048 '\d\+ DROP',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001049 instr)
Bram Moolenaar04d05222020-02-06 22:06:54 +01001050enddef
1051
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001052def ForLoopEval(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001053 var res = ""
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001054 for str in eval('["one", "two"]')
1055 res ..= str
1056 endfor
1057 return res
1058enddef
1059
1060def Test_disassemble_for_loop_eval()
1061 assert_equal('onetwo', ForLoopEval())
Bram Moolenaarac564082020-09-27 19:05:33 +02001062 var instr = execute('disassemble ForLoopEval')
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001063 assert_match('ForLoopEval\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001064 'var res = ""\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001065 '\d PUSHS ""\_s*' ..
1066 '\d STORE $0\_s*' ..
1067 'for str in eval(''\["one", "two"\]'')\_s*' ..
1068 '\d STORE -1 in $1\_s*' ..
1069 '\d PUSHS "\["one", "two"\]"\_s*' ..
1070 '\d BCALL eval(argc 1)\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001071 '\d FOR $1 -> \d\+\_s*' ..
1072 '\d STORE $2\_s*' ..
1073 'res ..= str\_s*' ..
1074 '\d\+ LOAD $0\_s*' ..
1075 '\d\+ LOAD $2\_s*' ..
1076 '\d\+ CHECKTYPE string stack\[-1\]\_s*' ..
1077 '\d\+ CONCAT\_s*' ..
1078 '\d\+ STORE $0\_s*' ..
1079 'endfor\_s*' ..
Bram Moolenaar74e54fc2021-03-26 20:41:29 +01001080 '\d\+ JUMP -> 5\_s*' ..
Bram Moolenaar0ad3e892020-07-05 21:38:11 +02001081 '\d\+ DROP\_s*' ..
1082 'return res\_s*' ..
1083 '\d\+ LOAD $0\_s*' ..
1084 '\d\+ RETURN',
1085 instr)
1086enddef
1087
Bram Moolenaar792f7862020-11-23 08:31:18 +01001088def ForLoopUnpack()
1089 for [x1, x2] in [[1, 2], [3, 4]]
1090 echo x1 x2
1091 endfor
1092enddef
1093
1094def Test_disassemble_for_loop_unpack()
1095 var instr = execute('disassemble ForLoopUnpack')
1096 assert_match('ForLoopUnpack\_s*' ..
1097 'for \[x1, x2\] in \[\[1, 2\], \[3, 4\]\]\_s*' ..
1098 '\d\+ STORE -1 in $0\_s*' ..
1099 '\d\+ PUSHNR 1\_s*' ..
1100 '\d\+ PUSHNR 2\_s*' ..
1101 '\d\+ NEWLIST size 2\_s*' ..
1102 '\d\+ PUSHNR 3\_s*' ..
1103 '\d\+ PUSHNR 4\_s*' ..
1104 '\d\+ NEWLIST size 2\_s*' ..
1105 '\d\+ NEWLIST size 2\_s*' ..
1106 '\d\+ FOR $0 -> 16\_s*' ..
1107 '\d\+ UNPACK 2\_s*' ..
1108 '\d\+ STORE $1\_s*' ..
1109 '\d\+ STORE $2\_s*' ..
1110 'echo x1 x2\_s*' ..
1111 '\d\+ LOAD $1\_s*' ..
1112 '\d\+ LOAD $2\_s*' ..
1113 '\d\+ ECHO 2\_s*' ..
1114 'endfor\_s*' ..
1115 '\d\+ JUMP -> 8\_s*' ..
1116 '\d\+ DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001117 '\d\+ RETURN 0',
Bram Moolenaar792f7862020-11-23 08:31:18 +01001118 instr)
1119enddef
1120
Bram Moolenaarc150c092021-02-13 15:02:46 +01001121def ForLoopContinue()
1122 for nr in [1, 2]
1123 try
1124 echo "ok"
1125 try
1126 echo "deeper"
1127 catch
1128 continue
1129 endtry
1130 catch
1131 echo "not ok"
1132 endtry
1133 endfor
1134enddef
1135
1136def Test_disassemble_for_loop_continue()
1137 var instr = execute('disassemble ForLoopContinue')
1138 assert_match('ForLoopContinue\_s*' ..
1139 'for nr in \[1, 2]\_s*' ..
1140 '0 STORE -1 in $0\_s*' ..
1141 '1 PUSHNR 1\_s*' ..
1142 '2 PUSHNR 2\_s*' ..
1143 '3 NEWLIST size 2\_s*' ..
1144 '4 FOR $0 -> 22\_s*' ..
1145 '5 STORE $1\_s*' ..
1146 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001147 '6 TRY catch -> 17, endtry -> 20\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001148 'echo "ok"\_s*' ..
1149 '7 PUSHS "ok"\_s*' ..
1150 '8 ECHO 1\_s*' ..
1151 'try\_s*' ..
Bram Moolenaar7e82c5f2021-02-21 21:32:45 +01001152 '9 TRY catch -> 13, endtry -> 15\_s*' ..
Bram Moolenaarc150c092021-02-13 15:02:46 +01001153 'echo "deeper"\_s*' ..
1154 '10 PUSHS "deeper"\_s*' ..
1155 '11 ECHO 1\_s*' ..
1156 'catch\_s*' ..
1157 '12 JUMP -> 15\_s*' ..
1158 '13 CATCH\_s*' ..
1159 'continue\_s*' ..
1160 '14 TRY-CONTINUE 2 levels -> 4\_s*' ..
1161 'endtry\_s*' ..
1162 '15 ENDTRY\_s*' ..
1163 'catch\_s*' ..
1164 '16 JUMP -> 20\_s*' ..
1165 '17 CATCH\_s*' ..
1166 'echo "not ok"\_s*' ..
1167 '18 PUSHS "not ok"\_s*' ..
1168 '19 ECHO 1\_s*' ..
1169 'endtry\_s*' ..
1170 '20 ENDTRY\_s*' ..
1171 'endfor\_s*' ..
1172 '21 JUMP -> 4\_s*' ..
1173 '\d\+ DROP\_s*' ..
1174 '\d\+ RETURN 0',
1175 instr)
1176enddef
1177
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001178let g:number = 42
1179
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001180def TypeCast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001181 var l: list<number> = [23, <number>g:number]
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001182enddef
1183
1184def Test_disassemble_typecast()
Bram Moolenaarac564082020-09-27 19:05:33 +02001185 var instr = execute('disassemble TypeCast')
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001186 assert_match('TypeCast.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001187 'var l: list<number> = \[23, <number>g:number\].*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001188 '\d PUSHNR 23\_s*' ..
1189 '\d LOADG g:number\_s*' ..
1190 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1191 '\d NEWLIST size 2\_s*' ..
Bram Moolenaaraa210a32021-01-02 15:41:03 +01001192 '\d SETTYPE list<number>\_s*' ..
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001193 '\d STORE $0\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001194 '\d RETURN 0\_s*',
Bram Moolenaar64d662d2020-08-09 19:02:50 +02001195 instr)
1196enddef
1197
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001198def Computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001199 var nr = 3
1200 var nrres = nr + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001201 nrres = nr - 7
1202 nrres = nr * 7
1203 nrres = nr / 7
1204 nrres = nr % 7
1205
Bram Moolenaarac564082020-09-27 19:05:33 +02001206 var anyres = g:number + 7
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001207 anyres = g:number - 7
1208 anyres = g:number * 7
1209 anyres = g:number / 7
1210 anyres = g:number % 7
1211
1212 if has('float')
Bram Moolenaarac564082020-09-27 19:05:33 +02001213 var fl = 3.0
1214 var flres = fl + 7.0
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001215 flres = fl - 7.0
1216 flres = fl * 7.0
1217 flres = fl / 7.0
1218 endif
1219enddef
1220
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001221def Test_disassemble_computing()
Bram Moolenaarac564082020-09-27 19:05:33 +02001222 var instr = execute('disassemble Computing')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001223 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001224 'var nr = 3.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001225 '\d STORE 3 in $0.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001226 'var nrres = nr + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001227 '\d LOAD $0.*' ..
1228 '\d PUSHNR 7.*' ..
1229 '\d OPNR +.*' ..
1230 '\d STORE $1.*' ..
1231 'nrres = nr - 7.*' ..
1232 '\d OPNR -.*' ..
1233 'nrres = nr \* 7.*' ..
1234 '\d OPNR \*.*' ..
1235 'nrres = nr / 7.*' ..
1236 '\d OPNR /.*' ..
1237 'nrres = nr % 7.*' ..
1238 '\d OPNR %.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001239 'var anyres = g:number + 7.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001240 '\d LOADG g:number.*' ..
1241 '\d PUSHNR 7.*' ..
1242 '\d OPANY +.*' ..
1243 '\d STORE $2.*' ..
1244 'anyres = g:number - 7.*' ..
1245 '\d OPANY -.*' ..
1246 'anyres = g:number \* 7.*' ..
1247 '\d OPANY \*.*' ..
1248 'anyres = g:number / 7.*' ..
1249 '\d OPANY /.*' ..
1250 'anyres = g:number % 7.*' ..
1251 '\d OPANY %.*',
1252 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001253 if has('float')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001254 assert_match('Computing.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001255 'var fl = 3.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001256 '\d PUSHF 3.0.*' ..
1257 '\d STORE $3.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001258 'var flres = fl + 7.0.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001259 '\d LOAD $3.*' ..
1260 '\d PUSHF 7.0.*' ..
1261 '\d OPFLOAT +.*' ..
1262 '\d STORE $4.*' ..
1263 'flres = fl - 7.0.*' ..
1264 '\d OPFLOAT -.*' ..
1265 'flres = fl \* 7.0.*' ..
1266 '\d OPFLOAT \*.*' ..
1267 'flres = fl / 7.0.*' ..
1268 '\d OPFLOAT /.*',
1269 instr)
Bram Moolenaarc2a4b352020-02-06 22:41:16 +01001270 endif
1271enddef
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01001272
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001273def AddListBlob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001274 var reslist = [1, 2] + [3, 4]
1275 var resblob = 0z1122 + 0z3344
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001276enddef
1277
1278def Test_disassemble_add_list_blob()
Bram Moolenaarac564082020-09-27 19:05:33 +02001279 var instr = execute('disassemble AddListBlob')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001280 assert_match('AddListBlob.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001281 'var reslist = \[1, 2] + \[3, 4].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001282 '\d PUSHNR 1.*' ..
1283 '\d PUSHNR 2.*' ..
1284 '\d NEWLIST size 2.*' ..
1285 '\d PUSHNR 3.*' ..
1286 '\d PUSHNR 4.*' ..
1287 '\d NEWLIST size 2.*' ..
1288 '\d ADDLIST.*' ..
1289 '\d STORE $.*.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001290 'var resblob = 0z1122 + 0z3344.*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001291 '\d PUSHBLOB 0z1122.*' ..
1292 '\d PUSHBLOB 0z3344.*' ..
1293 '\d ADDBLOB.*' ..
1294 '\d STORE $.*',
1295 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001296enddef
1297
1298let g:aa = 'aa'
1299def ConcatString(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001300 var res = g:aa .. "bb"
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001301 return res
1302enddef
1303
1304def Test_disassemble_concat()
Bram Moolenaarac564082020-09-27 19:05:33 +02001305 var instr = execute('disassemble ConcatString')
Bram Moolenaar675f7162020-04-12 22:53:54 +02001306 assert_match('ConcatString.*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001307 'var res = g:aa .. "bb".*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001308 '\d LOADG g:aa.*' ..
1309 '\d PUSHS "bb".*' ..
Bram Moolenaar418f1df2020-08-12 21:34:49 +02001310 '\d 2STRING_ANY stack\[-2].*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001311 '\d CONCAT.*' ..
1312 '\d STORE $.*',
1313 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001314 assert_equal('aabb', ConcatString())
1315enddef
1316
Bram Moolenaar11107ba2020-08-15 21:10:16 +02001317def StringIndex(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001318 var s = "abcd"
1319 var res = s[1]
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001320 return res
1321enddef
1322
1323def Test_disassemble_string_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001324 var instr = execute('disassemble StringIndex')
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001325 assert_match('StringIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001326 'var s = "abcd"\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001327 '\d PUSHS "abcd"\_s*' ..
1328 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001329 'var res = s\[1]\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001330 '\d LOAD $0\_s*' ..
1331 '\d PUSHNR 1\_s*' ..
1332 '\d STRINDEX\_s*' ..
1333 '\d STORE $1\_s*',
1334 instr)
1335 assert_equal('b', StringIndex())
1336enddef
1337
Bram Moolenaared591872020-08-15 22:14:53 +02001338def StringSlice(): string
Bram Moolenaarac564082020-09-27 19:05:33 +02001339 var s = "abcd"
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001340 var res = s[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001341 return res
1342enddef
1343
1344def Test_disassemble_string_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001345 var instr = execute('disassemble StringSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001346 assert_match('StringSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001347 'var s = "abcd"\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001348 '\d PUSHS "abcd"\_s*' ..
1349 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001350 'var res = s\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001351 '\d LOAD $0\_s*' ..
1352 '\d PUSHNR 1\_s*' ..
1353 '\d PUSHNR 8\_s*' ..
1354 '\d STRSLICE\_s*' ..
1355 '\d STORE $1\_s*',
1356 instr)
1357 assert_equal('bcd', StringSlice())
1358enddef
1359
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001360def ListIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001361 var l = [1, 2, 3]
1362 var res = l[1]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001363 return res
1364enddef
1365
1366def Test_disassemble_list_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001367 var instr = execute('disassemble ListIndex')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001368 assert_match('ListIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001369 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001370 '\d PUSHNR 1\_s*' ..
1371 '\d PUSHNR 2\_s*' ..
1372 '\d PUSHNR 3\_s*' ..
1373 '\d NEWLIST size 3\_s*' ..
1374 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001375 'var res = l\[1]\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001376 '\d LOAD $0\_s*' ..
1377 '\d PUSHNR 1\_s*' ..
Bram Moolenaar747f11a2020-07-19 18:38:37 +02001378 '\d LISTINDEX\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001379 '\d STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001380 instr)
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001381 assert_equal(2, ListIndex())
1382enddef
1383
Bram Moolenaared591872020-08-15 22:14:53 +02001384def ListSlice(): list<number>
Bram Moolenaarac564082020-09-27 19:05:33 +02001385 var l = [1, 2, 3]
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001386 var res = l[1 : 8]
Bram Moolenaared591872020-08-15 22:14:53 +02001387 return res
1388enddef
1389
1390def Test_disassemble_list_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001391 var instr = execute('disassemble ListSlice')
Bram Moolenaared591872020-08-15 22:14:53 +02001392 assert_match('ListSlice\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001393 'var l = \[1, 2, 3]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001394 '\d PUSHNR 1\_s*' ..
1395 '\d PUSHNR 2\_s*' ..
1396 '\d PUSHNR 3\_s*' ..
1397 '\d NEWLIST size 3\_s*' ..
1398 '\d STORE $0\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001399 'var res = l\[1 : 8]\_s*' ..
Bram Moolenaared591872020-08-15 22:14:53 +02001400 '\d LOAD $0\_s*' ..
1401 '\d PUSHNR 1\_s*' ..
1402 '\d PUSHNR 8\_s*' ..
1403 '\d LISTSLICE\_s*' ..
1404 '\d STORE $1\_s*',
1405 instr)
1406 assert_equal([2, 3], ListSlice())
1407enddef
1408
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001409def DictMember(): number
Bram Moolenaare0de1712020-12-02 17:36:54 +01001410 var d = {item: 1}
Bram Moolenaarac564082020-09-27 19:05:33 +02001411 var res = d.item
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001412 res = d["item"]
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001413 return res
1414enddef
1415
1416def Test_disassemble_dict_member()
Bram Moolenaarac564082020-09-27 19:05:33 +02001417 var instr = execute('disassemble DictMember')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001418 assert_match('DictMember\_s*' ..
Bram Moolenaare0de1712020-12-02 17:36:54 +01001419 'var d = {item: 1}\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001420 '\d PUSHS "item"\_s*' ..
1421 '\d PUSHNR 1\_s*' ..
1422 '\d NEWDICT size 1\_s*' ..
1423 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001424 'var res = d.item\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001425 '\d\+ LOAD $0\_s*' ..
1426 '\d\+ MEMBER item\_s*' ..
1427 '\d\+ STORE $1\_s*' ..
1428 'res = d\["item"\]\_s*' ..
1429 '\d\+ LOAD $0\_s*' ..
1430 '\d\+ PUSHS "item"\_s*' ..
1431 '\d\+ MEMBER\_s*' ..
1432 '\d\+ STORE $1\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001433 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001434 assert_equal(1, DictMember())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001435enddef
1436
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001437let somelist = [1, 2, 3, 4, 5]
1438def AnyIndex(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001439 var res = g:somelist[2]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001440 return res
1441enddef
1442
1443def Test_disassemble_any_index()
Bram Moolenaarac564082020-09-27 19:05:33 +02001444 var instr = execute('disassemble AnyIndex')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001445 assert_match('AnyIndex\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001446 'var res = g:somelist\[2\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001447 '\d LOADG g:somelist\_s*' ..
1448 '\d PUSHNR 2\_s*' ..
1449 '\d ANYINDEX\_s*' ..
1450 '\d STORE $0\_s*' ..
1451 'return res\_s*' ..
1452 '\d LOAD $0\_s*' ..
1453 '\d CHECKTYPE number stack\[-1\]\_s*' ..
1454 '\d RETURN',
1455 instr)
1456 assert_equal(3, AnyIndex())
1457enddef
1458
1459def AnySlice(): list<number>
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001460 var res = g:somelist[1 : 3]
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001461 return res
1462enddef
1463
1464def Test_disassemble_any_slice()
Bram Moolenaarac564082020-09-27 19:05:33 +02001465 var instr = execute('disassemble AnySlice')
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001466 assert_match('AnySlice\_s*' ..
Bram Moolenaarde4f95b2020-12-30 20:39:21 +01001467 'var res = g:somelist\[1 : 3\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001468 '\d LOADG g:somelist\_s*' ..
1469 '\d PUSHNR 1\_s*' ..
1470 '\d PUSHNR 3\_s*' ..
1471 '\d ANYSLICE\_s*' ..
1472 '\d STORE $0\_s*' ..
1473 'return res\_s*' ..
1474 '\d LOAD $0\_s*' ..
Bram Moolenaar5e654232020-09-16 15:22:00 +02001475 '\d CHECKTYPE list<number> stack\[-1\]\_s*' ..
Bram Moolenaarcc673e72020-08-16 17:33:35 +02001476 '\d RETURN',
1477 instr)
1478 assert_equal([2, 3, 4], AnySlice())
1479enddef
1480
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001481def NegateNumber(): number
Bram Moolenaarac564082020-09-27 19:05:33 +02001482 var nr = 9
1483 var plus = +nr
1484 var res = -nr
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001485 return res
1486enddef
1487
1488def Test_disassemble_negate_number()
Bram Moolenaarac564082020-09-27 19:05:33 +02001489 var instr = execute('disassemble NegateNumber')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001490 assert_match('NegateNumber\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001491 'var nr = 9\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001492 '\d STORE 9 in $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001493 'var plus = +nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001494 '\d LOAD $0\_s*' ..
1495 '\d CHECKNR\_s*' ..
1496 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001497 'var res = -nr\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001498 '\d LOAD $0\_s*' ..
1499 '\d NEGATENR\_s*' ..
1500 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001501 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001502 assert_equal(-9, NegateNumber())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001503enddef
1504
1505def InvertBool(): bool
Bram Moolenaarac564082020-09-27 19:05:33 +02001506 var flag = true
1507 var invert = !flag
1508 var res = !!flag
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001509 return res
1510enddef
1511
1512def Test_disassemble_invert_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001513 var instr = execute('disassemble InvertBool')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001514 assert_match('InvertBool\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001515 'var flag = true\_s*' ..
Bram Moolenaara8b8af12021-01-01 15:11:04 +01001516 '\d PUSH true\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001517 '\d STORE $0\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001518 'var invert = !flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001519 '\d LOAD $0\_s*' ..
1520 '\d INVERT (!val)\_s*' ..
1521 '\d STORE $1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001522 'var res = !!flag\_s*' ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001523 '\d LOAD $0\_s*' ..
1524 '\d 2BOOL (!!val)\_s*' ..
1525 '\d STORE $2\_s*',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001526 instr)
Bram Moolenaard2c61702020-09-06 15:58:36 +02001527 assert_equal(true, InvertBool())
Bram Moolenaaree2e52a2020-02-19 14:17:18 +01001528enddef
1529
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001530def ReturnBool(): bool
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001531 var name: bool = 1 && 0 || 1
1532 return name
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001533enddef
1534
1535def Test_disassemble_return_bool()
Bram Moolenaarac564082020-09-27 19:05:33 +02001536 var instr = execute('disassemble ReturnBool')
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001537 assert_match('ReturnBool\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001538 'var name: bool = 1 && 0 || 1\_s*' ..
1539 '0 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001540 '1 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001541 '2 JUMP_IF_COND_FALSE -> 5\_s*' ..
1542 '3 PUSHNR 0\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001543 '4 COND2BOOL\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001544 '5 JUMP_IF_COND_TRUE -> 8\_s*' ..
1545 '6 PUSHNR 1\_s*' ..
Bram Moolenaaraf8ea0d2021-04-11 18:24:46 +02001546 '7 COND2BOOL\_s*' ..
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001547 '\d STORE $0\_s*' ..
Bram Moolenaar2bb26582020-10-03 22:52:39 +02001548 'return name\_s*' ..
Bram Moolenaarea2d4072020-11-12 12:08:51 +01001549 '\d\+ LOAD $0\_s*' ..
1550 '\d\+ RETURN',
Bram Moolenaar4ed124c2020-09-09 20:03:46 +02001551 instr)
1552 assert_equal(true, InvertBool())
1553enddef
1554
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001555def Test_disassemble_compare()
Bram Moolenaarac564082020-09-27 19:05:33 +02001556 var cases = [
Bram Moolenaara5565e42020-05-09 15:44:01 +02001557 ['true == isFalse', 'COMPAREBOOL =='],
1558 ['true != isFalse', 'COMPAREBOOL !='],
1559 ['v:none == isNull', 'COMPARESPECIAL =='],
1560 ['v:none != isNull', 'COMPARESPECIAL !='],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001561
Bram Moolenaara5565e42020-05-09 15:44:01 +02001562 ['111 == aNumber', 'COMPARENR =='],
1563 ['111 != aNumber', 'COMPARENR !='],
1564 ['111 > aNumber', 'COMPARENR >'],
1565 ['111 < aNumber', 'COMPARENR <'],
1566 ['111 >= aNumber', 'COMPARENR >='],
1567 ['111 <= aNumber', 'COMPARENR <='],
1568 ['111 =~ aNumber', 'COMPARENR =\~'],
1569 ['111 !~ aNumber', 'COMPARENR !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001570
Bram Moolenaara5565e42020-05-09 15:44:01 +02001571 ['"xx" != aString', 'COMPARESTRING !='],
1572 ['"xx" > aString', 'COMPARESTRING >'],
1573 ['"xx" < aString', 'COMPARESTRING <'],
1574 ['"xx" >= aString', 'COMPARESTRING >='],
1575 ['"xx" <= aString', 'COMPARESTRING <='],
1576 ['"xx" =~ aString', 'COMPARESTRING =\~'],
1577 ['"xx" !~ aString', 'COMPARESTRING !\~'],
1578 ['"xx" is aString', 'COMPARESTRING is'],
1579 ['"xx" isnot aString', 'COMPARESTRING isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001580
Bram Moolenaara5565e42020-05-09 15:44:01 +02001581 ['0z11 == aBlob', 'COMPAREBLOB =='],
1582 ['0z11 != aBlob', 'COMPAREBLOB !='],
1583 ['0z11 is aBlob', 'COMPAREBLOB is'],
1584 ['0z11 isnot aBlob', 'COMPAREBLOB isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001585
Bram Moolenaara5565e42020-05-09 15:44:01 +02001586 ['[1, 2] == aList', 'COMPARELIST =='],
1587 ['[1, 2] != aList', 'COMPARELIST !='],
1588 ['[1, 2] is aList', 'COMPARELIST is'],
1589 ['[1, 2] isnot aList', 'COMPARELIST isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001590
Bram Moolenaare0de1712020-12-02 17:36:54 +01001591 ['{a: 1} == aDict', 'COMPAREDICT =='],
1592 ['{a: 1} != aDict', 'COMPAREDICT !='],
1593 ['{a: 1} is aDict', 'COMPAREDICT is'],
1594 ['{a: 1} isnot aDict', 'COMPAREDICT isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001595
Bram Moolenaar2949cfd2020-12-31 21:28:47 +01001596 ['(() => 33) == (() => 44)', 'COMPAREFUNC =='],
1597 ['(() => 33) != (() => 44)', 'COMPAREFUNC !='],
1598 ['(() => 33) is (() => 44)', 'COMPAREFUNC is'],
1599 ['(() => 33) isnot (() => 44)', 'COMPAREFUNC isnot'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001600
1601 ['77 == g:xx', 'COMPAREANY =='],
1602 ['77 != g:xx', 'COMPAREANY !='],
1603 ['77 > g:xx', 'COMPAREANY >'],
1604 ['77 < g:xx', 'COMPAREANY <'],
1605 ['77 >= g:xx', 'COMPAREANY >='],
1606 ['77 <= g:xx', 'COMPAREANY <='],
1607 ['77 =~ g:xx', 'COMPAREANY =\~'],
1608 ['77 !~ g:xx', 'COMPAREANY !\~'],
1609 ['77 is g:xx', 'COMPAREANY is'],
1610 ['77 isnot g:xx', 'COMPAREANY isnot'],
1611 ]
Bram Moolenaarac564082020-09-27 19:05:33 +02001612 var floatDecl = ''
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001613 if has('float')
1614 cases->extend([
Bram Moolenaara5565e42020-05-09 15:44:01 +02001615 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1616 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1617 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1618 ['1.1 < aFloat', 'COMPAREFLOAT <'],
1619 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1620 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1621 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1622 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
Bram Moolenaar675f7162020-04-12 22:53:54 +02001623 ])
Bram Moolenaarac564082020-09-27 19:05:33 +02001624 floatDecl = 'var aFloat = 2.2'
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001625 endif
1626
Bram Moolenaarac564082020-09-27 19:05:33 +02001627 var nr = 1
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001628 for case in cases
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001629 # declare local variables to get a non-constant with the right type
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001630 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaarac564082020-09-27 19:05:33 +02001631 ' var isFalse = false',
1632 ' var isNull = v:null',
1633 ' var aNumber = 222',
1634 ' var aString = "yy"',
1635 ' var aBlob = 0z22',
1636 ' var aList = [3, 4]',
Bram Moolenaare0de1712020-12-02 17:36:54 +01001637 ' var aDict = {x: 2}',
Bram Moolenaara5565e42020-05-09 15:44:01 +02001638 floatDecl,
Bram Moolenaar675f7162020-04-12 22:53:54 +02001639 ' if ' .. case[0],
1640 ' echo 42'
1641 ' endif',
1642 'enddef'], 'Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001643 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001644 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaar675f7162020-04-12 22:53:54 +02001645 assert_match('TestCase' .. nr .. '.*' ..
1646 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1647 '\d \(PUSH\|FUNCREF\).*' ..
Bram Moolenaara5565e42020-05-09 15:44:01 +02001648 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
Bram Moolenaar675f7162020-04-12 22:53:54 +02001649 '\d ' .. case[1] .. '.*' ..
1650 '\d JUMP_IF_FALSE -> \d\+.*',
1651 instr)
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001652
1653 nr += 1
1654 endfor
1655
Bram Moolenaar22da5592020-03-19 14:52:20 +01001656 delete('Xdisassemble')
Bram Moolenaarf2460a32020-02-07 22:09:54 +01001657enddef
1658
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001659def s:FalsyOp()
1660 echo g:flag ?? "yes"
1661 echo [] ?? "empty list"
1662 echo "" ?? "empty string"
1663enddef
1664
1665def Test_dsassemble_falsy_op()
1666 var res = execute('disass s:FalsyOp')
1667 assert_match('\<SNR>\d*_FalsyOp\_s*' ..
1668 'echo g:flag ?? "yes"\_s*' ..
1669 '0 LOADG g:flag\_s*' ..
1670 '1 JUMP_AND_KEEP_IF_TRUE -> 3\_s*' ..
1671 '2 PUSHS "yes"\_s*' ..
1672 '3 ECHO 1\_s*' ..
1673 'echo \[\] ?? "empty list"\_s*' ..
1674 '4 NEWLIST size 0\_s*' ..
1675 '5 JUMP_AND_KEEP_IF_TRUE -> 7\_s*' ..
1676 '6 PUSHS "empty list"\_s*' ..
1677 '7 ECHO 1\_s*' ..
1678 'echo "" ?? "empty string"\_s*' ..
1679 '\d\+ PUSHS "empty string"\_s*' ..
1680 '\d\+ ECHO 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001681 '\d\+ RETURN 0',
Bram Moolenaar92f26c22020-10-03 20:17:30 +02001682 res)
1683enddef
1684
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001685def Test_disassemble_compare_const()
Bram Moolenaarac564082020-09-27 19:05:33 +02001686 var cases = [
Bram Moolenaar675f7162020-04-12 22:53:54 +02001687 ['"xx" == "yy"', false],
1688 ['"aa" == "aa"', true],
1689 ['has("eval") ? true : false', true],
1690 ['has("asdf") ? true : false', false],
1691 ]
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001692
Bram Moolenaarac564082020-09-27 19:05:33 +02001693 var nr = 1
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001694 for case in cases
1695 writefile(['def TestCase' .. nr .. '()',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001696 ' if ' .. case[0],
1697 ' echo 42'
1698 ' endif',
1699 'enddef'], 'Xdisassemble')
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001700 source Xdisassemble
Bram Moolenaarac564082020-09-27 19:05:33 +02001701 var instr = execute('disassemble TestCase' .. nr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001702 if case[1]
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001703 # condition true, "echo 42" executed
Bram Moolenaar675f7162020-04-12 22:53:54 +02001704 assert_match('TestCase' .. nr .. '.*' ..
1705 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1706 '\d PUSHNR 42.*' ..
1707 '\d ECHO 1.*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001708 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001709 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001710 else
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001711 # condition false, function just returns
Bram Moolenaar675f7162020-04-12 22:53:54 +02001712 assert_match('TestCase' .. nr .. '.*' ..
1713 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '[ \n]*' ..
1714 'echo 42[ \n]*' ..
1715 'endif[ \n]*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001716 '\d RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001717 instr)
Bram Moolenaara4d4cf42020-04-02 13:50:27 +02001718 endif
1719
1720 nr += 1
1721 endfor
1722
1723 delete('Xdisassemble')
1724enddef
1725
Bram Moolenaarad39c092020-02-26 18:23:43 +01001726def s:Execute()
1727 execute 'help vim9.txt'
Bram Moolenaarac564082020-09-27 19:05:33 +02001728 var cmd = 'help vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001729 execute cmd
Bram Moolenaarac564082020-09-27 19:05:33 +02001730 var tag = 'vim9.txt'
Bram Moolenaarad39c092020-02-26 18:23:43 +01001731 execute 'help ' .. tag
1732enddef
1733
1734def Test_disassemble_execute()
Bram Moolenaarac564082020-09-27 19:05:33 +02001735 var res = execute('disass s:Execute')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001736 assert_match('\<SNR>\d*_Execute\_s*' ..
1737 "execute 'help vim9.txt'\\_s*" ..
1738 '\d PUSHS "help vim9.txt"\_s*' ..
1739 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001740 "var cmd = 'help vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001741 '\d PUSHS "help vim9.txt"\_s*' ..
1742 '\d STORE $0\_s*' ..
1743 'execute cmd\_s*' ..
1744 '\d LOAD $0\_s*' ..
1745 '\d EXECUTE 1\_s*' ..
Bram Moolenaarac564082020-09-27 19:05:33 +02001746 "var tag = 'vim9.txt'\\_s*" ..
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001747 '\d PUSHS "vim9.txt"\_s*' ..
1748 '\d STORE $1\_s*' ..
1749 "execute 'help ' .. tag\\_s*" ..
1750 '\d\+ PUSHS "help "\_s*' ..
1751 '\d\+ LOAD $1\_s*' ..
1752 '\d\+ CONCAT\_s*' ..
1753 '\d\+ EXECUTE 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001754 '\d\+ RETURN 0',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001755 res)
Bram Moolenaarad39c092020-02-26 18:23:43 +01001756enddef
1757
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001758def s:Echomsg()
1759 echomsg 'some' 'message'
1760 echoerr 'went' .. 'wrong'
1761enddef
1762
1763def Test_disassemble_echomsg()
Bram Moolenaarac564082020-09-27 19:05:33 +02001764 var res = execute('disass s:Echomsg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001765 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1766 "echomsg 'some' 'message'\\_s*" ..
1767 '\d PUSHS "some"\_s*' ..
1768 '\d PUSHS "message"\_s*' ..
1769 '\d ECHOMSG 2\_s*' ..
1770 "echoerr 'went' .. 'wrong'\\_s*" ..
1771 '\d PUSHS "wentwrong"\_s*' ..
1772 '\d ECHOERR 1\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001773 '\d RETURN 0',
Bram Moolenaarf93c7fe2020-04-23 22:16:53 +02001774 res)
1775enddef
1776
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001777def SomeStringArg(arg: string)
1778 echo arg
1779enddef
1780
1781def SomeAnyArg(arg: any)
1782 echo arg
1783enddef
1784
1785def SomeStringArgAndReturn(arg: string): string
1786 return arg
1787enddef
1788
1789def Test_display_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001790 var res1 = execute('function SomeStringArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001791 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1792 '\d *echo arg.*' ..
1793 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001794 res1)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001795
Bram Moolenaarac564082020-09-27 19:05:33 +02001796 var res2 = execute('function SomeAnyArg')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001797 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1798 '\d *echo arg\_s*' ..
1799 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001800 res2)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001801
Bram Moolenaarac564082020-09-27 19:05:33 +02001802 var res3 = execute('function SomeStringArgAndReturn')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001803 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1804 '\d *return arg\_s*' ..
1805 ' *enddef',
Bram Moolenaar675f7162020-04-12 22:53:54 +02001806 res3)
Bram Moolenaar61a6d4e2020-03-01 23:32:25 +01001807enddef
1808
Bram Moolenaar09689a02020-05-09 22:50:08 +02001809def Test_vim9script_forward_func()
Bram Moolenaarac564082020-09-27 19:05:33 +02001810 var lines =<< trim END
Bram Moolenaar09689a02020-05-09 22:50:08 +02001811 vim9script
1812 def FuncOne(): string
1813 return FuncTwo()
1814 enddef
1815 def FuncTwo(): string
1816 return 'two'
1817 enddef
Bram Moolenaar67979662020-06-20 22:50:47 +02001818 g:res_FuncOne = execute('disass FuncOne')
Bram Moolenaar09689a02020-05-09 22:50:08 +02001819 END
1820 writefile(lines, 'Xdisassemble')
1821 source Xdisassemble
1822
Bram Moolenaarf5be8cd2020-07-17 20:36:00 +02001823 # check that the first function calls the second with DCALL
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001824 assert_match('\<SNR>\d*_FuncOne\_s*' ..
1825 'return FuncTwo()\_s*' ..
1826 '\d DCALL <SNR>\d\+_FuncTwo(argc 0)\_s*' ..
Bram Moolenaar09689a02020-05-09 22:50:08 +02001827 '\d RETURN',
1828 g:res_FuncOne)
1829
1830 delete('Xdisassemble')
1831 unlet g:res_FuncOne
1832enddef
1833
Bram Moolenaar61a89812020-05-07 16:58:17 +02001834def s:ConcatStrings(): string
1835 return 'one' .. 'two' .. 'three'
1836enddef
1837
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001838def s:ComputeConst(): number
1839 return 2 + 3 * 4 / 6 + 7
1840enddef
1841
Bram Moolenaar1c747212020-05-09 18:28:34 +02001842def s:ComputeConstParen(): number
1843 return ((2 + 4) * (8 / 2)) / (3 + 4)
1844enddef
1845
Bram Moolenaar61a89812020-05-07 16:58:17 +02001846def Test_simplify_const_expr()
Bram Moolenaarac564082020-09-27 19:05:33 +02001847 var res = execute('disass s:ConcatStrings')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001848 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1849 "return 'one' .. 'two' .. 'three'\\_s*" ..
1850 '\d PUSHS "onetwothree"\_s*' ..
Bram Moolenaar61a89812020-05-07 16:58:17 +02001851 '\d RETURN',
1852 res)
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001853
1854 res = execute('disass s:ComputeConst')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001855 assert_match('<SNR>\d*_ComputeConst\_s*' ..
1856 'return 2 + 3 \* 4 / 6 + 7\_s*' ..
1857 '\d PUSHNR 11\_s*' ..
Bram Moolenaar7d131b02020-05-08 19:10:34 +02001858 '\d RETURN',
1859 res)
Bram Moolenaar1c747212020-05-09 18:28:34 +02001860
1861 res = execute('disass s:ComputeConstParen')
Bram Moolenaar4902ab12020-05-15 19:21:31 +02001862 assert_match('<SNR>\d*_ComputeConstParen\_s*' ..
1863 'return ((2 + 4) \* (8 / 2)) / (3 + 4)\_s*' ..
1864 '\d PUSHNR 3\>\_s*' ..
Bram Moolenaar1c747212020-05-09 18:28:34 +02001865 '\d RETURN',
1866 res)
Bram Moolenaar61a89812020-05-07 16:58:17 +02001867enddef
1868
Bram Moolenaar389df252020-07-09 21:20:47 +02001869def s:CallAppend()
1870 eval "some text"->append(2)
1871enddef
1872
1873def Test_shuffle()
Bram Moolenaarac564082020-09-27 19:05:33 +02001874 var res = execute('disass s:CallAppend')
Bram Moolenaar389df252020-07-09 21:20:47 +02001875 assert_match('<SNR>\d*_CallAppend\_s*' ..
1876 'eval "some text"->append(2)\_s*' ..
1877 '\d PUSHS "some text"\_s*' ..
1878 '\d PUSHNR 2\_s*' ..
1879 '\d SHUFFLE 2 up 1\_s*' ..
1880 '\d BCALL append(argc 2)\_s*' ..
1881 '\d DROP\_s*' ..
Bram Moolenaar299f3032021-01-08 20:53:09 +01001882 '\d RETURN 0',
Bram Moolenaar389df252020-07-09 21:20:47 +02001883 res)
1884enddef
1885
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001886
1887def s:SilentMessage()
1888 silent echomsg "text"
1889 silent! echoerr "error"
1890enddef
1891
1892def Test_silent()
1893 var res = execute('disass s:SilentMessage')
1894 assert_match('<SNR>\d*_SilentMessage\_s*' ..
1895 'silent echomsg "text"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001896 '\d CMDMOD silent\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001897 '\d PUSHS "text"\_s*' ..
1898 '\d ECHOMSG 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001899 '\d CMDMOD_REV\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001900 'silent! echoerr "error"\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001901 '\d CMDMOD silent!\_s*' ..
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001902 '\d PUSHS "error"\_s*' ..
1903 '\d ECHOERR 1\_s*' ..
Bram Moolenaar02194d22020-10-24 23:08:38 +02001904 '\d CMDMOD_REV\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001905 '\d\+ RETURN 0',
1906 res)
1907enddef
1908
1909def s:SilentIf()
1910 silent if 4 == g:five
1911 silent elseif 4 == g:five
Bram Moolenaarfa984412021-03-25 22:15:28 +01001912 endif
Bram Moolenaara91a7132021-03-25 21:12:15 +01001913enddef
1914
1915def Test_silent_if()
1916 var res = execute('disass s:SilentIf')
1917 assert_match('<SNR>\d*_SilentIf\_s*' ..
1918 'silent if 4 == g:five\_s*' ..
1919 '\d\+ CMDMOD silent\_s*' ..
1920 '\d\+ PUSHNR 4\_s*' ..
1921 '\d\+ LOADG g:five\_s*' ..
1922 '\d\+ COMPAREANY ==\_s*' ..
1923 '\d\+ CMDMOD_REV\_s*' ..
1924 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
1925 'silent elseif 4 == g:five\_s*' ..
1926 '\d\+ JUMP -> \d\+\_s*' ..
1927 '\d\+ CMDMOD silent\_s*' ..
1928 '\d\+ PUSHNR 4\_s*' ..
1929 '\d\+ LOADG g:five\_s*' ..
1930 '\d\+ COMPAREANY ==\_s*' ..
1931 '\d\+ CMDMOD_REV\_s*' ..
1932 '\d\+ JUMP_IF_FALSE -> \d\+\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001933 'endif\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001934 '\d\+ RETURN 0',
1935 res)
1936enddef
1937
1938def s:SilentFor()
1939 silent for i in [0]
Bram Moolenaarfa984412021-03-25 22:15:28 +01001940 endfor
Bram Moolenaara91a7132021-03-25 21:12:15 +01001941enddef
1942
1943def Test_silent_for()
1944 var res = execute('disass s:SilentFor')
1945 assert_match('<SNR>\d*_SilentFor\_s*' ..
1946 'silent for i in \[0\]\_s*' ..
1947 '\d CMDMOD silent\_s*' ..
1948 '\d STORE -1 in $0\_s*' ..
1949 '\d PUSHNR 0\_s*' ..
1950 '\d NEWLIST size 1\_s*' ..
1951 '\d CMDMOD_REV\_s*' ..
1952 '5 FOR $0 -> 8\_s*' ..
1953 '\d STORE $1\_s*' ..
Bram Moolenaarfa984412021-03-25 22:15:28 +01001954 'endfor\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001955 '\d JUMP -> 5\_s*' ..
1956 '8 DROP\_s*' ..
1957 '\d RETURN 0\_s*',
1958 res)
1959enddef
1960
1961def s:SilentWhile()
1962 silent while g:not
Bram Moolenaarfa984412021-03-25 22:15:28 +01001963 endwhile
Bram Moolenaara91a7132021-03-25 21:12:15 +01001964enddef
1965
1966def Test_silent_while()
1967 var res = execute('disass s:SilentWhile')
1968 assert_match('<SNR>\d*_SilentWhile\_s*' ..
1969 'silent while g:not\_s*' ..
1970 '0 CMDMOD silent\_s*' ..
1971 '\d LOADG g:not\_s*' ..
1972 '\d COND2BOOL\_s*' ..
1973 '\d CMDMOD_REV\_s*' ..
1974 '\d JUMP_IF_FALSE -> 6\_s*' ..
1975
Bram Moolenaarfa984412021-03-25 22:15:28 +01001976 'endwhile\_s*' ..
Bram Moolenaara91a7132021-03-25 21:12:15 +01001977 '\d JUMP -> 0\_s*' ..
1978 '6 RETURN 0\_s*',
1979 res)
1980enddef
1981
1982def s:SilentReturn(): string
1983 silent return "done"
1984enddef
1985
1986def Test_silent_return()
1987 var res = execute('disass s:SilentReturn')
1988 assert_match('<SNR>\d*_SilentReturn\_s*' ..
1989 'silent return "done"\_s*' ..
1990 '\d CMDMOD silent\_s*' ..
1991 '\d PUSHS "done"\_s*' ..
1992 '\d CMDMOD_REV\_s*' ..
1993 '\d RETURN',
Bram Moolenaarf4c6e1e2020-10-23 18:02:32 +02001994 res)
1995enddef
1996
Bram Moolenaarb2049902021-01-24 12:53:53 +01001997def s:Profiled(): string
1998 echo "profiled"
1999 return "done"
2000enddef
2001
2002def Test_profiled()
Bram Moolenaarf002a412021-01-24 13:34:18 +01002003 if !has('profile')
2004 MissingFeature 'profile'
2005 endif
Bram Moolenaarb2049902021-01-24 12:53:53 +01002006 var res = execute('disass! s:Profiled')
2007 assert_match('<SNR>\d*_Profiled\_s*' ..
2008 'echo "profiled"\_s*' ..
2009 '\d PROFILE START line 1\_s*' ..
2010 '\d PUSHS "profiled"\_s*' ..
2011 '\d ECHO 1\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002012 'return "done"\_s*' ..
Bram Moolenaarced68a02021-01-24 17:53:47 +01002013 '\d PROFILE END\_s*' ..
Bram Moolenaarb2049902021-01-24 12:53:53 +01002014 '\d PROFILE START line 2\_s*' ..
2015 '\d PUSHS "done"\_s*' ..
2016 '\d RETURN\_s*' ..
2017 '\d PROFILE END',
2018 res)
2019enddef
2020
Bram Moolenaar7cd24222021-01-12 18:58:39 +01002021
Bram Moolenaar5cab73f2020-02-06 19:25:19 +01002022" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker