comparison src/testdir/test_vim9_disassemble.vim @ 22425:eabc059a6ac4 v8.2.1761

patch 8.2.1761: Vim9: Some tests are still using :let Commit: https://github.com/vim/vim/commit/ac564082f118ccdca828980c5f10b65a40bffb4d Author: Bram Moolenaar <Bram@vim.org> Date: Sun Sep 27 19:05:33 2020 +0200 patch 8.2.1761: Vim9: Some tests are still using :let Problem: Vim9: Some tests are still using :let. Solution: Change more declarations to use :var.
author Bram Moolenaar <Bram@vim.org>
date Sun, 27 Sep 2020 19:15:03 +0200
parents 15003353a464
children 166a0f17b05e
comparison
equal deleted inserted replaced
22424:2cf3f399bedb 22425:eabc059a6ac4
1 " Test the :disassemble command, and compilation as a side effect 1 " Test the :disassemble command, and compilation as a side effect
2 2
3 source check.vim 3 source check.vim
4
5 " TODO: remove later
6 let v:disallow_let = 1
4 7
5 func NotCompiled() 8 func NotCompiled()
6 echo "not" 9 echo "not"
7 endfunc 10 endfunc
8 11
11 let b:buffervar = 'b' 14 let b:buffervar = 'b'
12 let w:windowvar = 'w' 15 let w:windowvar = 'w'
13 let t:tabpagevar = 't' 16 let t:tabpagevar = 't'
14 17
15 def s:ScriptFuncLoad(arg: string) 18 def s:ScriptFuncLoad(arg: string)
16 let local = 1 19 var local = 1
17 buffers 20 buffers
18 echo arg 21 echo arg
19 echo local 22 echo local
20 echo &lines 23 echo &lines
21 echo v:version 24 echo v:version
39 assert_fails('disass', 'E471:') 42 assert_fails('disass', 'E471:')
40 assert_fails('disass [', 'E475:') 43 assert_fails('disass [', 'E475:')
41 assert_fails('disass 234', 'E129:') 44 assert_fails('disass 234', 'E129:')
42 assert_fails('disass <XX>foo', 'E129:') 45 assert_fails('disass <XX>foo', 'E129:')
43 46
44 let res = execute('disass s:ScriptFuncLoad') 47 var res = execute('disass s:ScriptFuncLoad')
45 assert_match('<SNR>\d*_ScriptFuncLoad.*' .. 48 assert_match('<SNR>\d*_ScriptFuncLoad.*' ..
46 'buffers.*' .. 49 'buffers.*' ..
47 ' EXEC \+buffers.*' .. 50 ' EXEC \+buffers.*' ..
48 ' LOAD arg\[-1\].*' .. 51 ' LOAD arg\[-1\].*' ..
49 ' LOAD $0.*' .. 52 ' LOAD $0.*' ..
74 ' LOADREG @z.*', 77 ' LOADREG @z.*',
75 res) 78 res)
76 enddef 79 enddef
77 80
78 def s:EditExpand() 81 def s:EditExpand()
79 let filename = "file" 82 var filename = "file"
80 let filenr = 123 83 var filenr = 123
81 edit the`=filename``=filenr`.txt 84 edit the`=filename``=filenr`.txt
82 enddef 85 enddef
83 86
84 def Test_disassemble_exec_expr() 87 def Test_disassemble_exec_expr()
85 let res = execute('disass s:EditExpand') 88 var res = execute('disass s:EditExpand')
86 assert_match('<SNR>\d*_EditExpand\_s*' .. 89 assert_match('<SNR>\d*_EditExpand\_s*' ..
87 ' let filename = "file"\_s*' .. 90 ' var filename = "file"\_s*' ..
88 '\d PUSHS "file"\_s*' .. 91 '\d PUSHS "file"\_s*' ..
89 '\d STORE $0\_s*' .. 92 '\d STORE $0\_s*' ..
90 ' let filenr = 123\_s*' .. 93 ' var filenr = 123\_s*' ..
91 '\d STORE 123 in $1\_s*' .. 94 '\d STORE 123 in $1\_s*' ..
92 ' edit the`=filename``=filenr`.txt\_s*' .. 95 ' edit the`=filename``=filenr`.txt\_s*' ..
93 '\d PUSHS "edit the"\_s*' .. 96 '\d PUSHS "edit the"\_s*' ..
94 '\d LOAD $0\_s*' .. 97 '\d LOAD $0\_s*' ..
95 '\d LOAD $1\_s*' .. 98 '\d LOAD $1\_s*' ..
105 norm! m[jjm] 108 norm! m[jjm]
106 :'[,']yank 109 :'[,']yank
107 enddef 110 enddef
108 111
109 def Test_disassemble_yank_range() 112 def Test_disassemble_yank_range()
110 let res = execute('disass s:YankRange') 113 var res = execute('disass s:YankRange')
111 assert_match('<SNR>\d*_YankRange.*' .. 114 assert_match('<SNR>\d*_YankRange.*' ..
112 ' norm! m\[jjm\]\_s*' .. 115 ' norm! m\[jjm\]\_s*' ..
113 '\d EXEC norm! m\[jjm\]\_s*' .. 116 '\d EXEC norm! m\[jjm\]\_s*' ..
114 ' :''\[,''\]yank\_s*' .. 117 ' :''\[,''\]yank\_s*' ..
115 '\d EXEC :''\[,''\]yank\_s*' .. 118 '\d EXEC :''\[,''\]yank\_s*' ..
121 def s:PutExpr() 124 def s:PutExpr()
122 :3put ="text" 125 :3put ="text"
123 enddef 126 enddef
124 127
125 def Test_disassemble_put_expr() 128 def Test_disassemble_put_expr()
126 let res = execute('disass s:PutExpr') 129 var res = execute('disass s:PutExpr')
127 assert_match('<SNR>\d*_PutExpr.*' .. 130 assert_match('<SNR>\d*_PutExpr.*' ..
128 ' :3put ="text"\_s*' .. 131 ' :3put ="text"\_s*' ..
129 '\d PUSHS "text"\_s*' .. 132 '\d PUSHS "text"\_s*' ..
130 '\d PUT = 3\_s*' .. 133 '\d PUT = 3\_s*' ..
131 '\d PUSHNR 0\_s*' .. 134 '\d PUSHNR 0\_s*' ..
132 '\d RETURN', 135 '\d RETURN',
133 res) 136 res)
134 enddef 137 enddef
135 138
136 def s:ScriptFuncPush() 139 def s:ScriptFuncPush()
137 let localbool = true 140 var localbool = true
138 let localspec = v:none 141 var localspec = v:none
139 let localblob = 0z1234 142 var localblob = 0z1234
140 if has('float') 143 if has('float')
141 let localfloat = 1.234 144 var localfloat = 1.234
142 endif 145 endif
143 enddef 146 enddef
144 147
145 def Test_disassemble_push() 148 def Test_disassemble_push()
146 let res = execute('disass s:ScriptFuncPush') 149 var res = execute('disass s:ScriptFuncPush')
147 assert_match('<SNR>\d*_ScriptFuncPush.*' .. 150 assert_match('<SNR>\d*_ScriptFuncPush.*' ..
148 'localbool = true.*' .. 151 'localbool = true.*' ..
149 ' PUSH v:true.*' .. 152 ' PUSH v:true.*' ..
150 'localspec = v:none.*' .. 153 'localspec = v:none.*' ..
151 ' PUSH v:none.*' .. 154 ' PUSH v:none.*' ..
159 res) 162 res)
160 endif 163 endif
161 enddef 164 enddef
162 165
163 def s:ScriptFuncStore() 166 def s:ScriptFuncStore()
164 let localnr = 1 167 var localnr = 1
165 localnr = 2 168 localnr = 2
166 let localstr = 'abc' 169 var localstr = 'abc'
167 localstr = 'xyz' 170 localstr = 'xyz'
168 v:char = 'abc' 171 v:char = 'abc'
169 s:scriptvar = 'sv' 172 s:scriptvar = 'sv'
170 g:globalvar = 'gv' 173 g:globalvar = 'gv'
171 b:buffervar = 'bv' 174 b:buffervar = 'bv'
175 $ENVVAR = 'ev' 178 $ENVVAR = 'ev'
176 @z = 'rv' 179 @z = 'rv'
177 enddef 180 enddef
178 181
179 def Test_disassemble_store() 182 def Test_disassemble_store()
180 let res = execute('disass s:ScriptFuncStore') 183 var res = execute('disass s:ScriptFuncStore')
181 assert_match('<SNR>\d*_ScriptFuncStore.*' .. 184 assert_match('<SNR>\d*_ScriptFuncStore.*' ..
182 'let localnr = 1.*' .. 185 'var localnr = 1.*' ..
183 'localnr = 2.*' .. 186 'localnr = 2.*' ..
184 ' STORE 2 in $0.*' .. 187 ' STORE 2 in $0.*' ..
185 'let localstr = ''abc''.*' .. 188 'var localstr = ''abc''.*' ..
186 'localstr = ''xyz''.*' .. 189 'localstr = ''xyz''.*' ..
187 ' STORE $1.*' .. 190 ' STORE $1.*' ..
188 'v:char = ''abc''.*' .. 191 'v:char = ''abc''.*' ..
189 'STOREV v:char.*' .. 192 'STOREV v:char.*' ..
190 's:scriptvar = ''sv''.*' .. 193 's:scriptvar = ''sv''.*' ..
205 ' STOREREG @z.*', 208 ' STOREREG @z.*',
206 res) 209 res)
207 enddef 210 enddef
208 211
209 def s:ScriptFuncStoreMember() 212 def s:ScriptFuncStoreMember()
210 let locallist: list<number> = [] 213 var locallist: list<number> = []
211 locallist[0] = 123 214 locallist[0] = 123
212 let localdict: dict<number> = {} 215 var localdict: dict<number> = {}
213 localdict["a"] = 456 216 localdict["a"] = 456
214 enddef 217 enddef
215 218
216 def Test_disassemble_store_member() 219 def Test_disassemble_store_member()
217 let res = execute('disass s:ScriptFuncStoreMember') 220 var res = execute('disass s:ScriptFuncStoreMember')
218 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' .. 221 assert_match('<SNR>\d*_ScriptFuncStoreMember\_s*' ..
219 'let locallist: list<number> = []\_s*' .. 222 'var locallist: list<number> = []\_s*' ..
220 '\d NEWLIST size 0\_s*' .. 223 '\d NEWLIST size 0\_s*' ..
221 '\d STORE $0\_s*' .. 224 '\d STORE $0\_s*' ..
222 'locallist\[0\] = 123\_s*' .. 225 'locallist\[0\] = 123\_s*' ..
223 '\d PUSHNR 123\_s*' .. 226 '\d PUSHNR 123\_s*' ..
224 '\d PUSHNR 0\_s*' .. 227 '\d PUSHNR 0\_s*' ..
225 '\d LOAD $0\_s*' .. 228 '\d LOAD $0\_s*' ..
226 '\d STORELIST\_s*' .. 229 '\d STORELIST\_s*' ..
227 'let localdict: dict<number> = {}\_s*' .. 230 'var localdict: dict<number> = {}\_s*' ..
228 '\d NEWDICT size 0\_s*' .. 231 '\d NEWDICT size 0\_s*' ..
229 '\d STORE $1\_s*' .. 232 '\d STORE $1\_s*' ..
230 'localdict\["a"\] = 456\_s*' .. 233 'localdict\["a"\] = 456\_s*' ..
231 '\d\+ PUSHNR 456\_s*' .. 234 '\d\+ PUSHNR 456\_s*' ..
232 '\d\+ PUSHS "a"\_s*' .. 235 '\d\+ PUSHS "a"\_s*' ..
236 '\d\+ RETURN', 239 '\d\+ RETURN',
237 res) 240 res)
238 enddef 241 enddef
239 242
240 def s:ListAssign() 243 def s:ListAssign()
241 let x: string 244 var x: string
242 let y: string 245 var y: string
243 let l: list<any> 246 var l: list<any>
244 [x, y; l] = g:stringlist 247 [x, y; l] = g:stringlist
245 enddef 248 enddef
246 249
247 def Test_disassemble_list_assign() 250 def Test_disassemble_list_assign()
248 let res = execute('disass s:ListAssign') 251 var res = execute('disass s:ListAssign')
249 assert_match('<SNR>\d*_ListAssign\_s*' .. 252 assert_match('<SNR>\d*_ListAssign\_s*' ..
250 'let x: string\_s*' .. 253 'var x: string\_s*' ..
251 '\d PUSHS "\[NULL\]"\_s*' .. 254 '\d PUSHS "\[NULL\]"\_s*' ..
252 '\d STORE $0\_s*' .. 255 '\d STORE $0\_s*' ..
253 'let y: string\_s*' .. 256 'var y: string\_s*' ..
254 '\d PUSHS "\[NULL\]"\_s*' .. 257 '\d PUSHS "\[NULL\]"\_s*' ..
255 '\d STORE $1\_s*' .. 258 '\d STORE $1\_s*' ..
256 'let l: list<any>\_s*' .. 259 'var l: list<any>\_s*' ..
257 '\d NEWLIST size 0\_s*' .. 260 '\d NEWLIST size 0\_s*' ..
258 '\d STORE $2\_s*' .. 261 '\d STORE $2\_s*' ..
259 '\[x, y; l\] = g:stringlist\_s*' .. 262 '\[x, y; l\] = g:stringlist\_s*' ..
260 '\d LOADG g:stringlist\_s*' .. 263 '\d LOADG g:stringlist\_s*' ..
261 '\d CHECKTYPE list<any> stack\[-1\]\_s*' .. 264 '\d CHECKTYPE list<any> stack\[-1\]\_s*' ..
279 unlet! g:somevar 282 unlet! g:somevar
280 unlet $SOMEVAR 283 unlet $SOMEVAR
281 enddef 284 enddef
282 285
283 def Test_disassemble_unlet() 286 def Test_disassemble_unlet()
284 let res = execute('disass s:ScriptFuncUnlet') 287 var res = execute('disass s:ScriptFuncUnlet')
285 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' .. 288 assert_match('<SNR>\d*_ScriptFuncUnlet\_s*' ..
286 'g:somevar = "value"\_s*' .. 289 'g:somevar = "value"\_s*' ..
287 '\d PUSHS "value"\_s*' .. 290 '\d PUSHS "value"\_s*' ..
288 '\d STOREG g:somevar\_s*' .. 291 '\d STOREG g:somevar\_s*' ..
289 'unlet g:somevar\_s*' .. 292 'unlet g:somevar\_s*' ..
304 throw "end" 307 throw "end"
305 endtry 308 endtry
306 enddef 309 enddef
307 310
308 def Test_disassemble_try() 311 def Test_disassemble_try()
309 let res = execute('disass s:ScriptFuncTry') 312 var res = execute('disass s:ScriptFuncTry')
310 assert_match('<SNR>\d*_ScriptFuncTry\_s*' .. 313 assert_match('<SNR>\d*_ScriptFuncTry\_s*' ..
311 'try\_s*' .. 314 'try\_s*' ..
312 '\d TRY catch -> \d\+, finally -> \d\+\_s*' .. 315 '\d TRY catch -> \d\+, finally -> \d\+\_s*' ..
313 'echo "yes"\_s*' .. 316 'echo "yes"\_s*' ..
314 '\d PUSHS "yes"\_s*' .. 317 '\d PUSHS "yes"\_s*' ..
331 '\d\+ ENDTRY', 334 '\d\+ ENDTRY',
332 res) 335 res)
333 enddef 336 enddef
334 337
335 def s:ScriptFuncNew() 338 def s:ScriptFuncNew()
336 let ll = [1, "two", 333] 339 var ll = [1, "two", 333]
337 let dd = #{one: 1, two: "val"} 340 var dd = #{one: 1, two: "val"}
338 enddef 341 enddef
339 342
340 def Test_disassemble_new() 343 def Test_disassemble_new()
341 let res = execute('disass s:ScriptFuncNew') 344 var res = execute('disass s:ScriptFuncNew')
342 assert_match('<SNR>\d*_ScriptFuncNew\_s*' .. 345 assert_match('<SNR>\d*_ScriptFuncNew\_s*' ..
343 'let ll = \[1, "two", 333\]\_s*' .. 346 'var ll = \[1, "two", 333\]\_s*' ..
344 '\d PUSHNR 1\_s*' .. 347 '\d PUSHNR 1\_s*' ..
345 '\d PUSHS "two"\_s*' .. 348 '\d PUSHS "two"\_s*' ..
346 '\d PUSHNR 333\_s*' .. 349 '\d PUSHNR 333\_s*' ..
347 '\d NEWLIST size 3\_s*' .. 350 '\d NEWLIST size 3\_s*' ..
348 '\d STORE $0\_s*' .. 351 '\d STORE $0\_s*' ..
349 'let dd = #{one: 1, two: "val"}\_s*' .. 352 'var dd = #{one: 1, two: "val"}\_s*' ..
350 '\d PUSHS "one"\_s*' .. 353 '\d PUSHS "one"\_s*' ..
351 '\d PUSHNR 1\_s*' .. 354 '\d PUSHNR 1\_s*' ..
352 '\d PUSHS "two"\_s*' .. 355 '\d PUSHS "two"\_s*' ..
353 '\d PUSHS "val"\_s*' .. 356 '\d PUSHS "val"\_s*' ..
354 '\d NEWDICT size 2\_s*', 357 '\d NEWDICT size 2\_s*',
374 FuncWithArg(343) 377 FuncWithArg(343)
375 ScriptFuncNew() 378 ScriptFuncNew()
376 s:ScriptFuncNew() 379 s:ScriptFuncNew()
377 UserFunc() 380 UserFunc()
378 UserFuncWithArg("foo") 381 UserFuncWithArg("foo")
379 let FuncRef = function("UserFunc") 382 var FuncRef = function("UserFunc")
380 FuncRef() 383 FuncRef()
381 let FuncRefWithArg = function("UserFuncWithArg") 384 var FuncRefWithArg = function("UserFuncWithArg")
382 FuncRefWithArg("bar") 385 FuncRefWithArg("bar")
383 return "yes" 386 return "yes"
384 enddef 387 enddef
385 388
386 def Test_disassemble_call() 389 def Test_disassemble_call()
387 let res = execute('disass s:ScriptFuncCall') 390 var res = execute('disass s:ScriptFuncCall')
388 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' .. 391 assert_match('<SNR>\d\+_ScriptFuncCall\_s*' ..
389 'changenr()\_s*' .. 392 'changenr()\_s*' ..
390 '\d BCALL changenr(argc 0)\_s*' .. 393 '\d BCALL changenr(argc 0)\_s*' ..
391 '\d DROP\_s*' .. 394 '\d DROP\_s*' ..
392 'char2nr("abc")\_s*' .. 395 'char2nr("abc")\_s*' ..
411 '\d\+ DROP\_s*' .. 414 '\d\+ DROP\_s*' ..
412 'UserFuncWithArg("foo")\_s*' .. 415 'UserFuncWithArg("foo")\_s*' ..
413 '\d\+ PUSHS "foo"\_s*' .. 416 '\d\+ PUSHS "foo"\_s*' ..
414 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' .. 417 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' ..
415 '\d\+ DROP\_s*' .. 418 '\d\+ DROP\_s*' ..
416 'let FuncRef = function("UserFunc")\_s*' .. 419 'var FuncRef = function("UserFunc")\_s*' ..
417 '\d\+ PUSHS "UserFunc"\_s*' .. 420 '\d\+ PUSHS "UserFunc"\_s*' ..
418 '\d\+ BCALL function(argc 1)\_s*' .. 421 '\d\+ BCALL function(argc 1)\_s*' ..
419 '\d\+ STORE $0\_s*' .. 422 '\d\+ STORE $0\_s*' ..
420 'FuncRef()\_s*' .. 423 'FuncRef()\_s*' ..
421 '\d\+ LOAD $\d\_s*' .. 424 '\d\+ LOAD $\d\_s*' ..
422 '\d\+ PCALL (argc 0)\_s*' .. 425 '\d\+ PCALL (argc 0)\_s*' ..
423 '\d\+ DROP\_s*' .. 426 '\d\+ DROP\_s*' ..
424 'let FuncRefWithArg = function("UserFuncWithArg")\_s*' .. 427 'var FuncRefWithArg = function("UserFuncWithArg")\_s*' ..
425 '\d\+ PUSHS "UserFuncWithArg"\_s*' .. 428 '\d\+ PUSHS "UserFuncWithArg"\_s*' ..
426 '\d\+ BCALL function(argc 1)\_s*' .. 429 '\d\+ BCALL function(argc 1)\_s*' ..
427 '\d\+ STORE $1\_s*' .. 430 '\d\+ STORE $1\_s*' ..
428 'FuncRefWithArg("bar")\_s*' .. 431 'FuncRefWithArg("bar")\_s*' ..
429 '\d\+ PUSHS "bar"\_s*' .. 432 '\d\+ PUSHS "bar"\_s*' ..
435 '\d\+ RETURN', 438 '\d\+ RETURN',
436 res) 439 res)
437 enddef 440 enddef
438 441
439 def s:CreateRefs() 442 def s:CreateRefs()
440 let local = 'a' 443 var local = 'a'
441 def Append(arg: string) 444 def Append(arg: string)
442 local ..= arg 445 local ..= arg
443 enddef 446 enddef
444 g:Append = Append 447 g:Append = Append
445 def Get(): string 448 def Get(): string
448 g:Get = Get 451 g:Get = Get
449 enddef 452 enddef
450 453
451 def Test_disassemble_closure() 454 def Test_disassemble_closure()
452 CreateRefs() 455 CreateRefs()
453 let res = execute('disass g:Append') 456 var res = execute('disass g:Append')
454 assert_match('<lambda>\d\_s*' .. 457 assert_match('<lambda>\d\_s*' ..
455 'local ..= arg\_s*' .. 458 'local ..= arg\_s*' ..
456 '\d LOADOUTER $0\_s*' .. 459 '\d LOADOUTER $0\_s*' ..
457 '\d LOAD arg\[-1\]\_s*' .. 460 '\d LOAD arg\[-1\]\_s*' ..
458 '\d CONCAT\_s*' .. 461 '\d CONCAT\_s*' ..
482 def s:ScriptPCall() 485 def s:ScriptPCall()
483 RefThis()("text") 486 RefThis()("text")
484 enddef 487 enddef
485 488
486 def Test_disassemble_pcall() 489 def Test_disassemble_pcall()
487 let res = execute('disass s:ScriptPCall') 490 var res = execute('disass s:ScriptPCall')
488 assert_match('<SNR>\d\+_ScriptPCall\_s*' .. 491 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
489 'RefThis()("text")\_s*' .. 492 'RefThis()("text")\_s*' ..
490 '\d DCALL RefThis(argc 0)\_s*' .. 493 '\d DCALL RefThis(argc 0)\_s*' ..
491 '\d PUSHS "text"\_s*' .. 494 '\d PUSHS "text"\_s*' ..
492 '\d PCALL top (argc 1)\_s*' .. 495 '\d PCALL top (argc 1)\_s*' ..
505 def DefinedLater(arg: string): string 508 def DefinedLater(arg: string): string
506 return arg 509 return arg
507 enddef 510 enddef
508 511
509 def Test_disassemble_update_instr() 512 def Test_disassemble_update_instr()
510 let res = execute('disass s:FuncWithForwardCall') 513 var res = execute('disass s:FuncWithForwardCall')
511 assert_match('FuncWithForwardCall\_s*' .. 514 assert_match('FuncWithForwardCall\_s*' ..
512 'return g:DefinedLater("yes")\_s*' .. 515 'return g:DefinedLater("yes")\_s*' ..
513 '\d PUSHS "yes"\_s*' .. 516 '\d PUSHS "yes"\_s*' ..
514 '\d DCALL DefinedLater(argc 1)\_s*' .. 517 '\d DCALL DefinedLater(argc 1)\_s*' ..
515 '\d RETURN', 518 '\d RETURN',
531 def FuncWithDefault(arg: string = 'default'): string 534 def FuncWithDefault(arg: string = 'default'): string
532 return arg 535 return arg
533 enddef 536 enddef
534 537
535 def Test_disassemble_call_default() 538 def Test_disassemble_call_default()
536 let res = execute('disass FuncWithDefault') 539 var res = execute('disass FuncWithDefault')
537 assert_match('FuncWithDefault\_s*' .. 540 assert_match('FuncWithDefault\_s*' ..
538 '\d PUSHS "default"\_s*' .. 541 '\d PUSHS "default"\_s*' ..
539 '\d STORE arg\[-1]\_s*' .. 542 '\d STORE arg\[-1]\_s*' ..
540 'return arg\_s*' .. 543 'return arg\_s*' ..
541 '\d LOAD arg\[-1]\_s*' .. 544 '\d LOAD arg\[-1]\_s*' ..
572 endif 575 endif
573 enddef 576 enddef
574 577
575 def Test_disassemble_const_expr() 578 def Test_disassemble_const_expr()
576 assert_equal("\nyes", execute('HasEval()')) 579 assert_equal("\nyes", execute('HasEval()'))
577 let instr = execute('disassemble HasEval') 580 var instr = execute('disassemble HasEval')
578 assert_match('HasEval\_s*' .. 581 assert_match('HasEval\_s*' ..
579 'if has("eval")\_s*' .. 582 'if has("eval")\_s*' ..
580 'echo "yes"\_s*' .. 583 'echo "yes"\_s*' ..
581 '\d PUSHS "yes"\_s*' .. 584 '\d PUSHS "yes"\_s*' ..
582 '\d ECHO 1\_s*' .. 585 '\d ECHO 1\_s*' ..
628 return "no" 631 return "no"
629 endif 632 endif
630 enddef 633 enddef
631 634
632 def Test_disassemble_return_in_if() 635 def Test_disassemble_return_in_if()
633 let instr = execute('disassemble ReturnInIf') 636 var instr = execute('disassemble ReturnInIf')
634 assert_match('ReturnInIf\_s*' .. 637 assert_match('ReturnInIf\_s*' ..
635 'if g:cond\_s*' .. 638 'if g:cond\_s*' ..
636 '0 LOADG g:cond\_s*' .. 639 '0 LOADG g:cond\_s*' ..
637 '1 JUMP_IF_FALSE -> 4\_s*' .. 640 '1 JUMP_IF_FALSE -> 4\_s*' ..
638 'return "yes"\_s*' .. 641 'return "yes"\_s*' ..
644 '5 RETURN$', 647 '5 RETURN$',
645 instr) 648 instr)
646 enddef 649 enddef
647 650
648 def WithFunc() 651 def WithFunc()
649 let Funky1: func 652 var Funky1: func
650 let Funky2: func = function("len") 653 var Funky2: func = function("len")
651 let Party2: func = funcref("UserFunc") 654 var Party2: func = funcref("UserFunc")
652 enddef 655 enddef
653 656
654 def Test_disassemble_function() 657 def Test_disassemble_function()
655 let instr = execute('disassemble WithFunc') 658 var instr = execute('disassemble WithFunc')
656 assert_match('WithFunc\_s*' .. 659 assert_match('WithFunc\_s*' ..
657 'let Funky1: func\_s*' .. 660 'var Funky1: func\_s*' ..
658 '0 PUSHFUNC "\[none]"\_s*' .. 661 '0 PUSHFUNC "\[none]"\_s*' ..
659 '1 STORE $0\_s*' .. 662 '1 STORE $0\_s*' ..
660 'let Funky2: func = function("len")\_s*' .. 663 'var Funky2: func = function("len")\_s*' ..
661 '2 PUSHS "len"\_s*' .. 664 '2 PUSHS "len"\_s*' ..
662 '3 BCALL function(argc 1)\_s*' .. 665 '3 BCALL function(argc 1)\_s*' ..
663 '4 STORE $1\_s*' .. 666 '4 STORE $1\_s*' ..
664 'let Party2: func = funcref("UserFunc")\_s*' .. 667 'var Party2: func = funcref("UserFunc")\_s*' ..
665 '\d PUSHS "UserFunc"\_s*' .. 668 '\d PUSHS "UserFunc"\_s*' ..
666 '\d BCALL funcref(argc 1)\_s*' .. 669 '\d BCALL funcref(argc 1)\_s*' ..
667 '\d STORE $2\_s*' .. 670 '\d STORE $2\_s*' ..
668 '\d PUSHNR 0\_s*' .. 671 '\d PUSHNR 0\_s*' ..
669 '\d RETURN', 672 '\d RETURN',
670 instr) 673 instr)
671 enddef 674 enddef
672 675
673 if has('channel') 676 if has('channel')
674 def WithChannel() 677 def WithChannel()
675 let job1: job 678 var job1: job
676 let job2: job = job_start("donothing") 679 var job2: job = job_start("donothing")
677 let chan1: channel 680 var chan1: channel
678 enddef 681 enddef
679 endif 682 endif
680 683
681 def Test_disassemble_channel() 684 def Test_disassemble_channel()
682 CheckFeature channel 685 CheckFeature channel
683 686
684 let instr = execute('disassemble WithChannel') 687 var instr = execute('disassemble WithChannel')
685 assert_match('WithChannel\_s*' .. 688 assert_match('WithChannel\_s*' ..
686 'let job1: job\_s*' .. 689 'var job1: job\_s*' ..
687 '\d PUSHJOB "no process"\_s*' .. 690 '\d PUSHJOB "no process"\_s*' ..
688 '\d STORE $0\_s*' .. 691 '\d STORE $0\_s*' ..
689 'let job2: job = job_start("donothing")\_s*' .. 692 'var job2: job = job_start("donothing")\_s*' ..
690 '\d PUSHS "donothing"\_s*' .. 693 '\d PUSHS "donothing"\_s*' ..
691 '\d BCALL job_start(argc 1)\_s*' .. 694 '\d BCALL job_start(argc 1)\_s*' ..
692 '\d STORE $1\_s*' .. 695 '\d STORE $1\_s*' ..
693 'let chan1: channel\_s*' .. 696 'var chan1: channel\_s*' ..
694 '\d PUSHCHANNEL 0\_s*' .. 697 '\d PUSHCHANNEL 0\_s*' ..
695 '\d STORE $2\_s*' .. 698 '\d STORE $2\_s*' ..
696 '\d PUSHNR 0\_s*' .. 699 '\d PUSHNR 0\_s*' ..
697 '\d RETURN', 700 '\d RETURN',
698 instr) 701 instr)
699 enddef 702 enddef
700 703
701 def WithLambda(): string 704 def WithLambda(): string
702 let F = {a -> "X" .. a .. "X"} 705 var F = {a -> "X" .. a .. "X"}
703 return F("x") 706 return F("x")
704 enddef 707 enddef
705 708
706 def Test_disassemble_lambda() 709 def Test_disassemble_lambda()
707 assert_equal("XxX", WithLambda()) 710 assert_equal("XxX", WithLambda())
708 let instr = execute('disassemble WithLambda') 711 var instr = execute('disassemble WithLambda')
709 assert_match('WithLambda\_s*' .. 712 assert_match('WithLambda\_s*' ..
710 'let F = {a -> "X" .. a .. "X"}\_s*' .. 713 'var F = {a -> "X" .. a .. "X"}\_s*' ..
711 '\d FUNCREF <lambda>\d\+\_s*' .. 714 '\d FUNCREF <lambda>\d\+\_s*' ..
712 '\d STORE $0\_s*' .. 715 '\d STORE $0\_s*' ..
713 'return F("x")\_s*' .. 716 'return F("x")\_s*' ..
714 '\d PUSHS "x"\_s*' .. 717 '\d PUSHS "x"\_s*' ..
715 '\d LOAD $0\_s*' .. 718 '\d LOAD $0\_s*' ..
716 '\d PCALL (argc 1)\_s*' .. 719 '\d PCALL (argc 1)\_s*' ..
717 '\d RETURN', 720 '\d RETURN',
718 instr) 721 instr)
719 722
720 let name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '') 723 var name = substitute(instr, '.*\(<lambda>\d\+\).*', '\1', '')
721 instr = execute('disassemble ' .. name) 724 instr = execute('disassemble ' .. name)
722 assert_match('<lambda>\d\+\_s*' .. 725 assert_match('<lambda>\d\+\_s*' ..
723 'return "X" .. a .. "X"\_s*' .. 726 'return "X" .. a .. "X"\_s*' ..
724 '\d PUSHS "X"\_s*' .. 727 '\d PUSHS "X"\_s*' ..
725 '\d LOAD arg\[-1\]\_s*' .. 728 '\d LOAD arg\[-1\]\_s*' ..
736 echomsg "inner" 739 echomsg "inner"
737 enddef 740 enddef
738 enddef 741 enddef
739 742
740 def Test_nested_func() 743 def Test_nested_func()
741 let instr = execute('disassemble NestedOuter') 744 var instr = execute('disassemble NestedOuter')
742 assert_match('NestedOuter\_s*' .. 745 assert_match('NestedOuter\_s*' ..
743 'def g:Inner()\_s*' .. 746 'def g:Inner()\_s*' ..
744 'echomsg "inner"\_s*' .. 747 'echomsg "inner"\_s*' ..
745 'enddef\_s*' .. 748 'enddef\_s*' ..
746 '\d NEWFUNC <lambda>\d\+ Inner\_s*' .. 749 '\d NEWFUNC <lambda>\d\+ Inner\_s*' ..
758 761
759 def Test_disassemble_and_or() 762 def Test_disassemble_and_or()
760 assert_equal("yes", AndOr(1)) 763 assert_equal("yes", AndOr(1))
761 assert_equal("no", AndOr(2)) 764 assert_equal("no", AndOr(2))
762 assert_equal("yes", AndOr(4)) 765 assert_equal("yes", AndOr(4))
763 let instr = execute('disassemble AndOr') 766 var instr = execute('disassemble AndOr')
764 assert_match('AndOr\_s*' .. 767 assert_match('AndOr\_s*' ..
765 'if arg == 1 && arg != 2 || arg == 4\_s*' .. 768 'if arg == 1 && arg != 2 || arg == 4\_s*' ..
766 '\d LOAD arg\[-1]\_s*' .. 769 '\d LOAD arg\[-1]\_s*' ..
767 '\d PUSHNR 1\_s*' .. 770 '\d PUSHNR 1\_s*' ..
768 '\d COMPAREANY ==\_s*' .. 771 '\d COMPAREANY ==\_s*' ..
777 '\d\+ JUMP_IF_FALSE -> \d\+', 780 '\d\+ JUMP_IF_FALSE -> \d\+',
778 instr) 781 instr)
779 enddef 782 enddef
780 783
781 def ForLoop(): list<number> 784 def ForLoop(): list<number>
782 let res: list<number> 785 var res: list<number>
783 for i in range(3) 786 for i in range(3)
784 res->add(i) 787 res->add(i)
785 endfor 788 endfor
786 return res 789 return res
787 enddef 790 enddef
788 791
789 def Test_disassemble_for_loop() 792 def Test_disassemble_for_loop()
790 assert_equal([0, 1, 2], ForLoop()) 793 assert_equal([0, 1, 2], ForLoop())
791 let instr = execute('disassemble ForLoop') 794 var instr = execute('disassemble ForLoop')
792 assert_match('ForLoop\_s*' .. 795 assert_match('ForLoop\_s*' ..
793 'let res: list<number>\_s*' .. 796 'var res: list<number>\_s*' ..
794 '\d NEWLIST size 0\_s*' .. 797 '\d NEWLIST size 0\_s*' ..
795 '\d STORE $0\_s*' .. 798 '\d STORE $0\_s*' ..
796 'for i in range(3)\_s*' .. 799 'for i in range(3)\_s*' ..
797 '\d STORE -1 in $1\_s*' .. 800 '\d STORE -1 in $1\_s*' ..
798 '\d PUSHNR 3\_s*' .. 801 '\d PUSHNR 3\_s*' ..
809 '\d\+ DROP', 812 '\d\+ DROP',
810 instr) 813 instr)
811 enddef 814 enddef
812 815
813 def ForLoopEval(): string 816 def ForLoopEval(): string
814 let res = "" 817 var res = ""
815 for str in eval('["one", "two"]') 818 for str in eval('["one", "two"]')
816 res ..= str 819 res ..= str
817 endfor 820 endfor
818 return res 821 return res
819 enddef 822 enddef
820 823
821 def Test_disassemble_for_loop_eval() 824 def Test_disassemble_for_loop_eval()
822 assert_equal('onetwo', ForLoopEval()) 825 assert_equal('onetwo', ForLoopEval())
823 let instr = execute('disassemble ForLoopEval') 826 var instr = execute('disassemble ForLoopEval')
824 assert_match('ForLoopEval\_s*' .. 827 assert_match('ForLoopEval\_s*' ..
825 'let res = ""\_s*' .. 828 'var res = ""\_s*' ..
826 '\d PUSHS ""\_s*' .. 829 '\d PUSHS ""\_s*' ..
827 '\d STORE $0\_s*' .. 830 '\d STORE $0\_s*' ..
828 'for str in eval(''\["one", "two"\]'')\_s*' .. 831 'for str in eval(''\["one", "two"\]'')\_s*' ..
829 '\d STORE -1 in $1\_s*' .. 832 '\d STORE -1 in $1\_s*' ..
830 '\d PUSHS "\["one", "two"\]"\_s*' .. 833 '\d PUSHS "\["one", "two"\]"\_s*' ..
848 enddef 851 enddef
849 852
850 let g:number = 42 853 let g:number = 42
851 854
852 def TypeCast() 855 def TypeCast()
853 let l: list<number> = [23, <number>g:number] 856 var l: list<number> = [23, <number>g:number]
854 enddef 857 enddef
855 858
856 def Test_disassemble_typecast() 859 def Test_disassemble_typecast()
857 let instr = execute('disassemble TypeCast') 860 var instr = execute('disassemble TypeCast')
858 assert_match('TypeCast.*' .. 861 assert_match('TypeCast.*' ..
859 'let l: list<number> = \[23, <number>g:number\].*' .. 862 'var l: list<number> = \[23, <number>g:number\].*' ..
860 '\d PUSHNR 23\_s*' .. 863 '\d PUSHNR 23\_s*' ..
861 '\d LOADG g:number\_s*' .. 864 '\d LOADG g:number\_s*' ..
862 '\d CHECKTYPE number stack\[-1\]\_s*' .. 865 '\d CHECKTYPE number stack\[-1\]\_s*' ..
863 '\d NEWLIST size 2\_s*' .. 866 '\d NEWLIST size 2\_s*' ..
864 '\d STORE $0\_s*' .. 867 '\d STORE $0\_s*' ..
866 '\d RETURN\_s*', 869 '\d RETURN\_s*',
867 instr) 870 instr)
868 enddef 871 enddef
869 872
870 def Computing() 873 def Computing()
871 let nr = 3 874 var nr = 3
872 let nrres = nr + 7 875 var nrres = nr + 7
873 nrres = nr - 7 876 nrres = nr - 7
874 nrres = nr * 7 877 nrres = nr * 7
875 nrres = nr / 7 878 nrres = nr / 7
876 nrres = nr % 7 879 nrres = nr % 7
877 880
878 let anyres = g:number + 7 881 var anyres = g:number + 7
879 anyres = g:number - 7 882 anyres = g:number - 7
880 anyres = g:number * 7 883 anyres = g:number * 7
881 anyres = g:number / 7 884 anyres = g:number / 7
882 anyres = g:number % 7 885 anyres = g:number % 7
883 886
884 if has('float') 887 if has('float')
885 let fl = 3.0 888 var fl = 3.0
886 let flres = fl + 7.0 889 var flres = fl + 7.0
887 flres = fl - 7.0 890 flres = fl - 7.0
888 flres = fl * 7.0 891 flres = fl * 7.0
889 flres = fl / 7.0 892 flres = fl / 7.0
890 endif 893 endif
891 enddef 894 enddef
892 895
893 def Test_disassemble_computing() 896 def Test_disassemble_computing()
894 let instr = execute('disassemble Computing') 897 var instr = execute('disassemble Computing')
895 assert_match('Computing.*' .. 898 assert_match('Computing.*' ..
896 'let nr = 3.*' .. 899 'var nr = 3.*' ..
897 '\d STORE 3 in $0.*' .. 900 '\d STORE 3 in $0.*' ..
898 'let nrres = nr + 7.*' .. 901 'var nrres = nr + 7.*' ..
899 '\d LOAD $0.*' .. 902 '\d LOAD $0.*' ..
900 '\d PUSHNR 7.*' .. 903 '\d PUSHNR 7.*' ..
901 '\d OPNR +.*' .. 904 '\d OPNR +.*' ..
902 '\d STORE $1.*' .. 905 '\d STORE $1.*' ..
903 'nrres = nr - 7.*' .. 906 'nrres = nr - 7.*' ..
906 '\d OPNR \*.*' .. 909 '\d OPNR \*.*' ..
907 'nrres = nr / 7.*' .. 910 'nrres = nr / 7.*' ..
908 '\d OPNR /.*' .. 911 '\d OPNR /.*' ..
909 'nrres = nr % 7.*' .. 912 'nrres = nr % 7.*' ..
910 '\d OPNR %.*' .. 913 '\d OPNR %.*' ..
911 'let anyres = g:number + 7.*' .. 914 'var anyres = g:number + 7.*' ..
912 '\d LOADG g:number.*' .. 915 '\d LOADG g:number.*' ..
913 '\d PUSHNR 7.*' .. 916 '\d PUSHNR 7.*' ..
914 '\d OPANY +.*' .. 917 '\d OPANY +.*' ..
915 '\d STORE $2.*' .. 918 '\d STORE $2.*' ..
916 'anyres = g:number - 7.*' .. 919 'anyres = g:number - 7.*' ..
922 'anyres = g:number % 7.*' .. 925 'anyres = g:number % 7.*' ..
923 '\d OPANY %.*', 926 '\d OPANY %.*',
924 instr) 927 instr)
925 if has('float') 928 if has('float')
926 assert_match('Computing.*' .. 929 assert_match('Computing.*' ..
927 'let fl = 3.0.*' .. 930 'var fl = 3.0.*' ..
928 '\d PUSHF 3.0.*' .. 931 '\d PUSHF 3.0.*' ..
929 '\d STORE $3.*' .. 932 '\d STORE $3.*' ..
930 'let flres = fl + 7.0.*' .. 933 'var flres = fl + 7.0.*' ..
931 '\d LOAD $3.*' .. 934 '\d LOAD $3.*' ..
932 '\d PUSHF 7.0.*' .. 935 '\d PUSHF 7.0.*' ..
933 '\d OPFLOAT +.*' .. 936 '\d OPFLOAT +.*' ..
934 '\d STORE $4.*' .. 937 '\d STORE $4.*' ..
935 'flres = fl - 7.0.*' .. 938 'flres = fl - 7.0.*' ..
941 instr) 944 instr)
942 endif 945 endif
943 enddef 946 enddef
944 947
945 def AddListBlob() 948 def AddListBlob()
946 let reslist = [1, 2] + [3, 4] 949 var reslist = [1, 2] + [3, 4]
947 let resblob = 0z1122 + 0z3344 950 var resblob = 0z1122 + 0z3344
948 enddef 951 enddef
949 952
950 def Test_disassemble_add_list_blob() 953 def Test_disassemble_add_list_blob()
951 let instr = execute('disassemble AddListBlob') 954 var instr = execute('disassemble AddListBlob')
952 assert_match('AddListBlob.*' .. 955 assert_match('AddListBlob.*' ..
953 'let reslist = \[1, 2] + \[3, 4].*' .. 956 'var reslist = \[1, 2] + \[3, 4].*' ..
954 '\d PUSHNR 1.*' .. 957 '\d PUSHNR 1.*' ..
955 '\d PUSHNR 2.*' .. 958 '\d PUSHNR 2.*' ..
956 '\d NEWLIST size 2.*' .. 959 '\d NEWLIST size 2.*' ..
957 '\d PUSHNR 3.*' .. 960 '\d PUSHNR 3.*' ..
958 '\d PUSHNR 4.*' .. 961 '\d PUSHNR 4.*' ..
959 '\d NEWLIST size 2.*' .. 962 '\d NEWLIST size 2.*' ..
960 '\d ADDLIST.*' .. 963 '\d ADDLIST.*' ..
961 '\d STORE $.*.*' .. 964 '\d STORE $.*.*' ..
962 'let resblob = 0z1122 + 0z3344.*' .. 965 'var resblob = 0z1122 + 0z3344.*' ..
963 '\d PUSHBLOB 0z1122.*' .. 966 '\d PUSHBLOB 0z1122.*' ..
964 '\d PUSHBLOB 0z3344.*' .. 967 '\d PUSHBLOB 0z3344.*' ..
965 '\d ADDBLOB.*' .. 968 '\d ADDBLOB.*' ..
966 '\d STORE $.*', 969 '\d STORE $.*',
967 instr) 970 instr)
968 enddef 971 enddef
969 972
970 let g:aa = 'aa' 973 let g:aa = 'aa'
971 def ConcatString(): string 974 def ConcatString(): string
972 let res = g:aa .. "bb" 975 var res = g:aa .. "bb"
973 return res 976 return res
974 enddef 977 enddef
975 978
976 def Test_disassemble_concat() 979 def Test_disassemble_concat()
977 let instr = execute('disassemble ConcatString') 980 var instr = execute('disassemble ConcatString')
978 assert_match('ConcatString.*' .. 981 assert_match('ConcatString.*' ..
979 'let res = g:aa .. "bb".*' .. 982 'var res = g:aa .. "bb".*' ..
980 '\d LOADG g:aa.*' .. 983 '\d LOADG g:aa.*' ..
981 '\d PUSHS "bb".*' .. 984 '\d PUSHS "bb".*' ..
982 '\d 2STRING_ANY stack\[-2].*' .. 985 '\d 2STRING_ANY stack\[-2].*' ..
983 '\d CONCAT.*' .. 986 '\d CONCAT.*' ..
984 '\d STORE $.*', 987 '\d STORE $.*',
985 instr) 988 instr)
986 assert_equal('aabb', ConcatString()) 989 assert_equal('aabb', ConcatString())
987 enddef 990 enddef
988 991
989 def StringIndex(): string 992 def StringIndex(): string
990 let s = "abcd" 993 var s = "abcd"
991 let res = s[1] 994 var res = s[1]
992 return res 995 return res
993 enddef 996 enddef
994 997
995 def Test_disassemble_string_index() 998 def Test_disassemble_string_index()
996 let instr = execute('disassemble StringIndex') 999 var instr = execute('disassemble StringIndex')
997 assert_match('StringIndex\_s*' .. 1000 assert_match('StringIndex\_s*' ..
998 'let s = "abcd"\_s*' .. 1001 'var s = "abcd"\_s*' ..
999 '\d PUSHS "abcd"\_s*' .. 1002 '\d PUSHS "abcd"\_s*' ..
1000 '\d STORE $0\_s*' .. 1003 '\d STORE $0\_s*' ..
1001 'let res = s\[1]\_s*' .. 1004 'var res = s\[1]\_s*' ..
1002 '\d LOAD $0\_s*' .. 1005 '\d LOAD $0\_s*' ..
1003 '\d PUSHNR 1\_s*' .. 1006 '\d PUSHNR 1\_s*' ..
1004 '\d STRINDEX\_s*' .. 1007 '\d STRINDEX\_s*' ..
1005 '\d STORE $1\_s*', 1008 '\d STORE $1\_s*',
1006 instr) 1009 instr)
1007 assert_equal('b', StringIndex()) 1010 assert_equal('b', StringIndex())
1008 enddef 1011 enddef
1009 1012
1010 def StringSlice(): string 1013 def StringSlice(): string
1011 let s = "abcd" 1014 var s = "abcd"
1012 let res = s[1:8] 1015 var res = s[1:8]
1013 return res 1016 return res
1014 enddef 1017 enddef
1015 1018
1016 def Test_disassemble_string_slice() 1019 def Test_disassemble_string_slice()
1017 let instr = execute('disassemble StringSlice') 1020 var instr = execute('disassemble StringSlice')
1018 assert_match('StringSlice\_s*' .. 1021 assert_match('StringSlice\_s*' ..
1019 'let s = "abcd"\_s*' .. 1022 'var s = "abcd"\_s*' ..
1020 '\d PUSHS "abcd"\_s*' .. 1023 '\d PUSHS "abcd"\_s*' ..
1021 '\d STORE $0\_s*' .. 1024 '\d STORE $0\_s*' ..
1022 'let res = s\[1:8]\_s*' .. 1025 'var res = s\[1:8]\_s*' ..
1023 '\d LOAD $0\_s*' .. 1026 '\d LOAD $0\_s*' ..
1024 '\d PUSHNR 1\_s*' .. 1027 '\d PUSHNR 1\_s*' ..
1025 '\d PUSHNR 8\_s*' .. 1028 '\d PUSHNR 8\_s*' ..
1026 '\d STRSLICE\_s*' .. 1029 '\d STRSLICE\_s*' ..
1027 '\d STORE $1\_s*', 1030 '\d STORE $1\_s*',
1028 instr) 1031 instr)
1029 assert_equal('bcd', StringSlice()) 1032 assert_equal('bcd', StringSlice())
1030 enddef 1033 enddef
1031 1034
1032 def ListIndex(): number 1035 def ListIndex(): number
1033 let l = [1, 2, 3] 1036 var l = [1, 2, 3]
1034 let res = l[1] 1037 var res = l[1]
1035 return res 1038 return res
1036 enddef 1039 enddef
1037 1040
1038 def Test_disassemble_list_index() 1041 def Test_disassemble_list_index()
1039 let instr = execute('disassemble ListIndex') 1042 var instr = execute('disassemble ListIndex')
1040 assert_match('ListIndex\_s*' .. 1043 assert_match('ListIndex\_s*' ..
1041 'let l = \[1, 2, 3]\_s*' .. 1044 'var l = \[1, 2, 3]\_s*' ..
1042 '\d PUSHNR 1\_s*' .. 1045 '\d PUSHNR 1\_s*' ..
1043 '\d PUSHNR 2\_s*' .. 1046 '\d PUSHNR 2\_s*' ..
1044 '\d PUSHNR 3\_s*' .. 1047 '\d PUSHNR 3\_s*' ..
1045 '\d NEWLIST size 3\_s*' .. 1048 '\d NEWLIST size 3\_s*' ..
1046 '\d STORE $0\_s*' .. 1049 '\d STORE $0\_s*' ..
1047 'let res = l\[1]\_s*' .. 1050 'var res = l\[1]\_s*' ..
1048 '\d LOAD $0\_s*' .. 1051 '\d LOAD $0\_s*' ..
1049 '\d PUSHNR 1\_s*' .. 1052 '\d PUSHNR 1\_s*' ..
1050 '\d LISTINDEX\_s*' .. 1053 '\d LISTINDEX\_s*' ..
1051 '\d STORE $1\_s*', 1054 '\d STORE $1\_s*',
1052 instr) 1055 instr)
1053 assert_equal(2, ListIndex()) 1056 assert_equal(2, ListIndex())
1054 enddef 1057 enddef
1055 1058
1056 def ListSlice(): list<number> 1059 def ListSlice(): list<number>
1057 let l = [1, 2, 3] 1060 var l = [1, 2, 3]
1058 let res = l[1:8] 1061 var res = l[1:8]
1059 return res 1062 return res
1060 enddef 1063 enddef
1061 1064
1062 def Test_disassemble_list_slice() 1065 def Test_disassemble_list_slice()
1063 let instr = execute('disassemble ListSlice') 1066 var instr = execute('disassemble ListSlice')
1064 assert_match('ListSlice\_s*' .. 1067 assert_match('ListSlice\_s*' ..
1065 'let l = \[1, 2, 3]\_s*' .. 1068 'var l = \[1, 2, 3]\_s*' ..
1066 '\d PUSHNR 1\_s*' .. 1069 '\d PUSHNR 1\_s*' ..
1067 '\d PUSHNR 2\_s*' .. 1070 '\d PUSHNR 2\_s*' ..
1068 '\d PUSHNR 3\_s*' .. 1071 '\d PUSHNR 3\_s*' ..
1069 '\d NEWLIST size 3\_s*' .. 1072 '\d NEWLIST size 3\_s*' ..
1070 '\d STORE $0\_s*' .. 1073 '\d STORE $0\_s*' ..
1071 'let res = l\[1:8]\_s*' .. 1074 'var res = l\[1:8]\_s*' ..
1072 '\d LOAD $0\_s*' .. 1075 '\d LOAD $0\_s*' ..
1073 '\d PUSHNR 1\_s*' .. 1076 '\d PUSHNR 1\_s*' ..
1074 '\d PUSHNR 8\_s*' .. 1077 '\d PUSHNR 8\_s*' ..
1075 '\d LISTSLICE\_s*' .. 1078 '\d LISTSLICE\_s*' ..
1076 '\d STORE $1\_s*', 1079 '\d STORE $1\_s*',
1077 instr) 1080 instr)
1078 assert_equal([2, 3], ListSlice()) 1081 assert_equal([2, 3], ListSlice())
1079 enddef 1082 enddef
1080 1083
1081 def DictMember(): number 1084 def DictMember(): number
1082 let d = #{item: 1} 1085 var d = #{item: 1}
1083 let res = d.item 1086 var res = d.item
1084 res = d["item"] 1087 res = d["item"]
1085 return res 1088 return res
1086 enddef 1089 enddef
1087 1090
1088 def Test_disassemble_dict_member() 1091 def Test_disassemble_dict_member()
1089 let instr = execute('disassemble DictMember') 1092 var instr = execute('disassemble DictMember')
1090 assert_match('DictMember\_s*' .. 1093 assert_match('DictMember\_s*' ..
1091 'let d = #{item: 1}\_s*' .. 1094 'var d = #{item: 1}\_s*' ..
1092 '\d PUSHS "item"\_s*' .. 1095 '\d PUSHS "item"\_s*' ..
1093 '\d PUSHNR 1\_s*' .. 1096 '\d PUSHNR 1\_s*' ..
1094 '\d NEWDICT size 1\_s*' .. 1097 '\d NEWDICT size 1\_s*' ..
1095 '\d STORE $0\_s*' .. 1098 '\d STORE $0\_s*' ..
1096 'let res = d.item\_s*' .. 1099 'var res = d.item\_s*' ..
1097 '\d\+ LOAD $0\_s*' .. 1100 '\d\+ LOAD $0\_s*' ..
1098 '\d\+ MEMBER item\_s*' .. 1101 '\d\+ MEMBER item\_s*' ..
1099 '\d\+ STORE $1\_s*' .. 1102 '\d\+ STORE $1\_s*' ..
1100 'res = d\["item"\]\_s*' .. 1103 'res = d\["item"\]\_s*' ..
1101 '\d\+ LOAD $0\_s*' .. 1104 '\d\+ LOAD $0\_s*' ..
1106 assert_equal(1, DictMember()) 1109 assert_equal(1, DictMember())
1107 enddef 1110 enddef
1108 1111
1109 let somelist = [1, 2, 3, 4, 5] 1112 let somelist = [1, 2, 3, 4, 5]
1110 def AnyIndex(): number 1113 def AnyIndex(): number
1111 let res = g:somelist[2] 1114 var res = g:somelist[2]
1112 return res 1115 return res
1113 enddef 1116 enddef
1114 1117
1115 def Test_disassemble_any_index() 1118 def Test_disassemble_any_index()
1116 let instr = execute('disassemble AnyIndex') 1119 var instr = execute('disassemble AnyIndex')
1117 assert_match('AnyIndex\_s*' .. 1120 assert_match('AnyIndex\_s*' ..
1118 'let res = g:somelist\[2\]\_s*' .. 1121 'var res = g:somelist\[2\]\_s*' ..
1119 '\d LOADG g:somelist\_s*' .. 1122 '\d LOADG g:somelist\_s*' ..
1120 '\d PUSHNR 2\_s*' .. 1123 '\d PUSHNR 2\_s*' ..
1121 '\d ANYINDEX\_s*' .. 1124 '\d ANYINDEX\_s*' ..
1122 '\d STORE $0\_s*' .. 1125 '\d STORE $0\_s*' ..
1123 'return res\_s*' .. 1126 'return res\_s*' ..
1127 instr) 1130 instr)
1128 assert_equal(3, AnyIndex()) 1131 assert_equal(3, AnyIndex())
1129 enddef 1132 enddef
1130 1133
1131 def AnySlice(): list<number> 1134 def AnySlice(): list<number>
1132 let res = g:somelist[1:3] 1135 var res = g:somelist[1:3]
1133 return res 1136 return res
1134 enddef 1137 enddef
1135 1138
1136 def Test_disassemble_any_slice() 1139 def Test_disassemble_any_slice()
1137 let instr = execute('disassemble AnySlice') 1140 var instr = execute('disassemble AnySlice')
1138 assert_match('AnySlice\_s*' .. 1141 assert_match('AnySlice\_s*' ..
1139 'let res = g:somelist\[1:3\]\_s*' .. 1142 'var res = g:somelist\[1:3\]\_s*' ..
1140 '\d LOADG g:somelist\_s*' .. 1143 '\d LOADG g:somelist\_s*' ..
1141 '\d PUSHNR 1\_s*' .. 1144 '\d PUSHNR 1\_s*' ..
1142 '\d PUSHNR 3\_s*' .. 1145 '\d PUSHNR 3\_s*' ..
1143 '\d ANYSLICE\_s*' .. 1146 '\d ANYSLICE\_s*' ..
1144 '\d STORE $0\_s*' .. 1147 '\d STORE $0\_s*' ..
1149 instr) 1152 instr)
1150 assert_equal([2, 3, 4], AnySlice()) 1153 assert_equal([2, 3, 4], AnySlice())
1151 enddef 1154 enddef
1152 1155
1153 def NegateNumber(): number 1156 def NegateNumber(): number
1154 let nr = 9 1157 var nr = 9
1155 let plus = +nr 1158 var plus = +nr
1156 let res = -nr 1159 var res = -nr
1157 return res 1160 return res
1158 enddef 1161 enddef
1159 1162
1160 def Test_disassemble_negate_number() 1163 def Test_disassemble_negate_number()
1161 let instr = execute('disassemble NegateNumber') 1164 var instr = execute('disassemble NegateNumber')
1162 assert_match('NegateNumber\_s*' .. 1165 assert_match('NegateNumber\_s*' ..
1163 'let nr = 9\_s*' .. 1166 'var nr = 9\_s*' ..
1164 '\d STORE 9 in $0\_s*' .. 1167 '\d STORE 9 in $0\_s*' ..
1165 'let plus = +nr\_s*' .. 1168 'var plus = +nr\_s*' ..
1166 '\d LOAD $0\_s*' .. 1169 '\d LOAD $0\_s*' ..
1167 '\d CHECKNR\_s*' .. 1170 '\d CHECKNR\_s*' ..
1168 '\d STORE $1\_s*' .. 1171 '\d STORE $1\_s*' ..
1169 'let res = -nr\_s*' .. 1172 'var res = -nr\_s*' ..
1170 '\d LOAD $0\_s*' .. 1173 '\d LOAD $0\_s*' ..
1171 '\d NEGATENR\_s*' .. 1174 '\d NEGATENR\_s*' ..
1172 '\d STORE $2\_s*', 1175 '\d STORE $2\_s*',
1173 instr) 1176 instr)
1174 assert_equal(-9, NegateNumber()) 1177 assert_equal(-9, NegateNumber())
1175 enddef 1178 enddef
1176 1179
1177 def InvertBool(): bool 1180 def InvertBool(): bool
1178 let flag = true 1181 var flag = true
1179 let invert = !flag 1182 var invert = !flag
1180 let res = !!flag 1183 var res = !!flag
1181 return res 1184 return res
1182 enddef 1185 enddef
1183 1186
1184 def Test_disassemble_invert_bool() 1187 def Test_disassemble_invert_bool()
1185 let instr = execute('disassemble InvertBool') 1188 var instr = execute('disassemble InvertBool')
1186 assert_match('InvertBool\_s*' .. 1189 assert_match('InvertBool\_s*' ..
1187 'let flag = true\_s*' .. 1190 'var flag = true\_s*' ..
1188 '\d PUSH v:true\_s*' .. 1191 '\d PUSH v:true\_s*' ..
1189 '\d STORE $0\_s*' .. 1192 '\d STORE $0\_s*' ..
1190 'let invert = !flag\_s*' .. 1193 'var invert = !flag\_s*' ..
1191 '\d LOAD $0\_s*' .. 1194 '\d LOAD $0\_s*' ..
1192 '\d INVERT (!val)\_s*' .. 1195 '\d INVERT (!val)\_s*' ..
1193 '\d STORE $1\_s*' .. 1196 '\d STORE $1\_s*' ..
1194 'let res = !!flag\_s*' .. 1197 'var res = !!flag\_s*' ..
1195 '\d LOAD $0\_s*' .. 1198 '\d LOAD $0\_s*' ..
1196 '\d 2BOOL (!!val)\_s*' .. 1199 '\d 2BOOL (!!val)\_s*' ..
1197 '\d STORE $2\_s*', 1200 '\d STORE $2\_s*',
1198 instr) 1201 instr)
1199 assert_equal(true, InvertBool()) 1202 assert_equal(true, InvertBool())
1200 enddef 1203 enddef
1201 1204
1202 def ReturnBool(): bool 1205 def ReturnBool(): bool
1203 let var: bool = "no" && [] || 123 1206 var var: bool = "no" && [] || 123
1204 return var 1207 return var
1205 enddef 1208 enddef
1206 1209
1207 def Test_disassemble_return_bool() 1210 def Test_disassemble_return_bool()
1208 let instr = execute('disassemble ReturnBool') 1211 var instr = execute('disassemble ReturnBool')
1209 assert_match('ReturnBool\_s*' .. 1212 assert_match('ReturnBool\_s*' ..
1210 'let var: bool = "no" && \[\] || 123\_s*' .. 1213 'var var: bool = "no" && \[\] || 123\_s*' ..
1211 '0 PUSHS "no"\_s*' .. 1214 '0 PUSHS "no"\_s*' ..
1212 '1 JUMP_AND_KEEP_IF_FALSE -> 3\_s*' .. 1215 '1 JUMP_AND_KEEP_IF_FALSE -> 3\_s*' ..
1213 '2 NEWLIST size 0\_s*' .. 1216 '2 NEWLIST size 0\_s*' ..
1214 '3 JUMP_AND_KEEP_IF_TRUE -> 5\_s*' .. 1217 '3 JUMP_AND_KEEP_IF_TRUE -> 5\_s*' ..
1215 '4 PUSHNR 123\_s*' .. 1218 '4 PUSHNR 123\_s*' ..
1221 instr) 1224 instr)
1222 assert_equal(true, InvertBool()) 1225 assert_equal(true, InvertBool())
1223 enddef 1226 enddef
1224 1227
1225 def Test_disassemble_compare() 1228 def Test_disassemble_compare()
1226 let cases = [ 1229 var cases = [
1227 ['true == isFalse', 'COMPAREBOOL =='], 1230 ['true == isFalse', 'COMPAREBOOL =='],
1228 ['true != isFalse', 'COMPAREBOOL !='], 1231 ['true != isFalse', 'COMPAREBOOL !='],
1229 ['v:none == isNull', 'COMPARESPECIAL =='], 1232 ['v:none == isNull', 'COMPARESPECIAL =='],
1230 ['v:none != isNull', 'COMPARESPECIAL !='], 1233 ['v:none != isNull', 'COMPARESPECIAL !='],
1231 1234
1277 ['77 =~ g:xx', 'COMPAREANY =\~'], 1280 ['77 =~ g:xx', 'COMPAREANY =\~'],
1278 ['77 !~ g:xx', 'COMPAREANY !\~'], 1281 ['77 !~ g:xx', 'COMPAREANY !\~'],
1279 ['77 is g:xx', 'COMPAREANY is'], 1282 ['77 is g:xx', 'COMPAREANY is'],
1280 ['77 isnot g:xx', 'COMPAREANY isnot'], 1283 ['77 isnot g:xx', 'COMPAREANY isnot'],
1281 ] 1284 ]
1282 let floatDecl = '' 1285 var floatDecl = ''
1283 if has('float') 1286 if has('float')
1284 cases->extend([ 1287 cases->extend([
1285 ['1.1 == aFloat', 'COMPAREFLOAT =='], 1288 ['1.1 == aFloat', 'COMPAREFLOAT =='],
1286 ['1.1 != aFloat', 'COMPAREFLOAT !='], 1289 ['1.1 != aFloat', 'COMPAREFLOAT !='],
1287 ['1.1 > aFloat', 'COMPAREFLOAT >'], 1290 ['1.1 > aFloat', 'COMPAREFLOAT >'],
1289 ['1.1 >= aFloat', 'COMPAREFLOAT >='], 1292 ['1.1 >= aFloat', 'COMPAREFLOAT >='],
1290 ['1.1 <= aFloat', 'COMPAREFLOAT <='], 1293 ['1.1 <= aFloat', 'COMPAREFLOAT <='],
1291 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'], 1294 ['1.1 =~ aFloat', 'COMPAREFLOAT =\~'],
1292 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'], 1295 ['1.1 !~ aFloat', 'COMPAREFLOAT !\~'],
1293 ]) 1296 ])
1294 floatDecl = 'let aFloat = 2.2' 1297 floatDecl = 'var aFloat = 2.2'
1295 endif 1298 endif
1296 1299
1297 let nr = 1 1300 var nr = 1
1298 for case in cases 1301 for case in cases
1299 # declare local variables to get a non-constant with the right type 1302 # declare local variables to get a non-constant with the right type
1300 writefile(['def TestCase' .. nr .. '()', 1303 writefile(['def TestCase' .. nr .. '()',
1301 ' let isFalse = false', 1304 ' var isFalse = false',
1302 ' let isNull = v:null', 1305 ' var isNull = v:null',
1303 ' let aNumber = 222', 1306 ' var aNumber = 222',
1304 ' let aString = "yy"', 1307 ' var aString = "yy"',
1305 ' let aBlob = 0z22', 1308 ' var aBlob = 0z22',
1306 ' let aList = [3, 4]', 1309 ' var aList = [3, 4]',
1307 ' let aDict = #{x: 2}', 1310 ' var aDict = #{x: 2}',
1308 floatDecl, 1311 floatDecl,
1309 ' if ' .. case[0], 1312 ' if ' .. case[0],
1310 ' echo 42' 1313 ' echo 42'
1311 ' endif', 1314 ' endif',
1312 'enddef'], 'Xdisassemble') 1315 'enddef'], 'Xdisassemble')
1313 source Xdisassemble 1316 source Xdisassemble
1314 let instr = execute('disassemble TestCase' .. nr) 1317 var instr = execute('disassemble TestCase' .. nr)
1315 assert_match('TestCase' .. nr .. '.*' .. 1318 assert_match('TestCase' .. nr .. '.*' ..
1316 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' .. 1319 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1317 '\d \(PUSH\|FUNCREF\).*' .. 1320 '\d \(PUSH\|FUNCREF\).*' ..
1318 '\d \(PUSH\|FUNCREF\|LOAD\).*' .. 1321 '\d \(PUSH\|FUNCREF\|LOAD\).*' ..
1319 '\d ' .. case[1] .. '.*' .. 1322 '\d ' .. case[1] .. '.*' ..
1325 1328
1326 delete('Xdisassemble') 1329 delete('Xdisassemble')
1327 enddef 1330 enddef
1328 1331
1329 def Test_disassemble_compare_const() 1332 def Test_disassemble_compare_const()
1330 let cases = [ 1333 var cases = [
1331 ['"xx" == "yy"', false], 1334 ['"xx" == "yy"', false],
1332 ['"aa" == "aa"', true], 1335 ['"aa" == "aa"', true],
1333 ['has("eval") ? true : false', true], 1336 ['has("eval") ? true : false', true],
1334 ['has("asdf") ? true : false', false], 1337 ['has("asdf") ? true : false', false],
1335 ] 1338 ]
1336 1339
1337 let nr = 1 1340 var nr = 1
1338 for case in cases 1341 for case in cases
1339 writefile(['def TestCase' .. nr .. '()', 1342 writefile(['def TestCase' .. nr .. '()',
1340 ' if ' .. case[0], 1343 ' if ' .. case[0],
1341 ' echo 42' 1344 ' echo 42'
1342 ' endif', 1345 ' endif',
1343 'enddef'], 'Xdisassemble') 1346 'enddef'], 'Xdisassemble')
1344 source Xdisassemble 1347 source Xdisassemble
1345 let instr = execute('disassemble TestCase' .. nr) 1348 var instr = execute('disassemble TestCase' .. nr)
1346 if case[1] 1349 if case[1]
1347 # condition true, "echo 42" executed 1350 # condition true, "echo 42" executed
1348 assert_match('TestCase' .. nr .. '.*' .. 1351 assert_match('TestCase' .. nr .. '.*' ..
1349 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' .. 1352 'if ' .. substitute(case[0], '[[~]', '\\\0', 'g') .. '.*' ..
1350 '\d PUSHNR 42.*' .. 1353 '\d PUSHNR 42.*' ..
1369 delete('Xdisassemble') 1372 delete('Xdisassemble')
1370 enddef 1373 enddef
1371 1374
1372 def s:Execute() 1375 def s:Execute()
1373 execute 'help vim9.txt' 1376 execute 'help vim9.txt'
1374 let cmd = 'help vim9.txt' 1377 var cmd = 'help vim9.txt'
1375 execute cmd 1378 execute cmd
1376 let tag = 'vim9.txt' 1379 var tag = 'vim9.txt'
1377 execute 'help ' .. tag 1380 execute 'help ' .. tag
1378 enddef 1381 enddef
1379 1382
1380 def Test_disassemble_execute() 1383 def Test_disassemble_execute()
1381 let res = execute('disass s:Execute') 1384 var res = execute('disass s:Execute')
1382 assert_match('\<SNR>\d*_Execute\_s*' .. 1385 assert_match('\<SNR>\d*_Execute\_s*' ..
1383 "execute 'help vim9.txt'\\_s*" .. 1386 "execute 'help vim9.txt'\\_s*" ..
1384 '\d PUSHS "help vim9.txt"\_s*' .. 1387 '\d PUSHS "help vim9.txt"\_s*' ..
1385 '\d EXECUTE 1\_s*' .. 1388 '\d EXECUTE 1\_s*' ..
1386 "let cmd = 'help vim9.txt'\\_s*" .. 1389 "var cmd = 'help vim9.txt'\\_s*" ..
1387 '\d PUSHS "help vim9.txt"\_s*' .. 1390 '\d PUSHS "help vim9.txt"\_s*' ..
1388 '\d STORE $0\_s*' .. 1391 '\d STORE $0\_s*' ..
1389 'execute cmd\_s*' .. 1392 'execute cmd\_s*' ..
1390 '\d LOAD $0\_s*' .. 1393 '\d LOAD $0\_s*' ..
1391 '\d EXECUTE 1\_s*' .. 1394 '\d EXECUTE 1\_s*' ..
1392 "let tag = 'vim9.txt'\\_s*" .. 1395 "var tag = 'vim9.txt'\\_s*" ..
1393 '\d PUSHS "vim9.txt"\_s*' .. 1396 '\d PUSHS "vim9.txt"\_s*' ..
1394 '\d STORE $1\_s*' .. 1397 '\d STORE $1\_s*' ..
1395 "execute 'help ' .. tag\\_s*" .. 1398 "execute 'help ' .. tag\\_s*" ..
1396 '\d\+ PUSHS "help "\_s*' .. 1399 '\d\+ PUSHS "help "\_s*' ..
1397 '\d\+ LOAD $1\_s*' .. 1400 '\d\+ LOAD $1\_s*' ..
1406 echomsg 'some' 'message' 1409 echomsg 'some' 'message'
1407 echoerr 'went' .. 'wrong' 1410 echoerr 'went' .. 'wrong'
1408 enddef 1411 enddef
1409 1412
1410 def Test_disassemble_echomsg() 1413 def Test_disassemble_echomsg()
1411 let res = execute('disass s:Echomsg') 1414 var res = execute('disass s:Echomsg')
1412 assert_match('\<SNR>\d*_Echomsg\_s*' .. 1415 assert_match('\<SNR>\d*_Echomsg\_s*' ..
1413 "echomsg 'some' 'message'\\_s*" .. 1416 "echomsg 'some' 'message'\\_s*" ..
1414 '\d PUSHS "some"\_s*' .. 1417 '\d PUSHS "some"\_s*' ..
1415 '\d PUSHS "message"\_s*' .. 1418 '\d PUSHS "message"\_s*' ..
1416 '\d ECHOMSG 2\_s*' .. 1419 '\d ECHOMSG 2\_s*' ..
1433 def SomeStringArgAndReturn(arg: string): string 1436 def SomeStringArgAndReturn(arg: string): string
1434 return arg 1437 return arg
1435 enddef 1438 enddef
1436 1439
1437 def Test_display_func() 1440 def Test_display_func()
1438 let res1 = execute('function SomeStringArg') 1441 var res1 = execute('function SomeStringArg')
1439 assert_match('.* def SomeStringArg(arg: string)\_s*' .. 1442 assert_match('.* def SomeStringArg(arg: string)\_s*' ..
1440 '\d *echo arg.*' .. 1443 '\d *echo arg.*' ..
1441 ' *enddef', 1444 ' *enddef',
1442 res1) 1445 res1)
1443 1446
1444 let res2 = execute('function SomeAnyArg') 1447 var res2 = execute('function SomeAnyArg')
1445 assert_match('.* def SomeAnyArg(arg: any)\_s*' .. 1448 assert_match('.* def SomeAnyArg(arg: any)\_s*' ..
1446 '\d *echo arg\_s*' .. 1449 '\d *echo arg\_s*' ..
1447 ' *enddef', 1450 ' *enddef',
1448 res2) 1451 res2)
1449 1452
1450 let res3 = execute('function SomeStringArgAndReturn') 1453 var res3 = execute('function SomeStringArgAndReturn')
1451 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' .. 1454 assert_match('.* def SomeStringArgAndReturn(arg: string): string\_s*' ..
1452 '\d *return arg\_s*' .. 1455 '\d *return arg\_s*' ..
1453 ' *enddef', 1456 ' *enddef',
1454 res3) 1457 res3)
1455 enddef 1458 enddef
1456 1459
1457 def Test_vim9script_forward_func() 1460 def Test_vim9script_forward_func()
1458 let lines =<< trim END 1461 var lines =<< trim END
1459 vim9script 1462 vim9script
1460 def FuncOne(): string 1463 def FuncOne(): string
1461 return FuncTwo() 1464 return FuncTwo()
1462 enddef 1465 enddef
1463 def FuncTwo(): string 1466 def FuncTwo(): string
1490 def s:ComputeConstParen(): number 1493 def s:ComputeConstParen(): number
1491 return ((2 + 4) * (8 / 2)) / (3 + 4) 1494 return ((2 + 4) * (8 / 2)) / (3 + 4)
1492 enddef 1495 enddef
1493 1496
1494 def Test_simplify_const_expr() 1497 def Test_simplify_const_expr()
1495 let res = execute('disass s:ConcatStrings') 1498 var res = execute('disass s:ConcatStrings')
1496 assert_match('<SNR>\d*_ConcatStrings\_s*' .. 1499 assert_match('<SNR>\d*_ConcatStrings\_s*' ..
1497 "return 'one' .. 'two' .. 'three'\\_s*" .. 1500 "return 'one' .. 'two' .. 'three'\\_s*" ..
1498 '\d PUSHS "onetwothree"\_s*' .. 1501 '\d PUSHS "onetwothree"\_s*' ..
1499 '\d RETURN', 1502 '\d RETURN',
1500 res) 1503 res)
1517 def s:CallAppend() 1520 def s:CallAppend()
1518 eval "some text"->append(2) 1521 eval "some text"->append(2)
1519 enddef 1522 enddef
1520 1523
1521 def Test_shuffle() 1524 def Test_shuffle()
1522 let res = execute('disass s:CallAppend') 1525 var res = execute('disass s:CallAppend')
1523 assert_match('<SNR>\d*_CallAppend\_s*' .. 1526 assert_match('<SNR>\d*_CallAppend\_s*' ..
1524 'eval "some text"->append(2)\_s*' .. 1527 'eval "some text"->append(2)\_s*' ..
1525 '\d PUSHS "some text"\_s*' .. 1528 '\d PUSHS "some text"\_s*' ..
1526 '\d PUSHNR 2\_s*' .. 1529 '\d PUSHNR 2\_s*' ..
1527 '\d SHUFFLE 2 up 1\_s*' .. 1530 '\d SHUFFLE 2 up 1\_s*' ..