blob: 1cff3b61b202d87ff70013bc7b6eea1537c0639f [file] [log] [blame]
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01001" Test various aspects of the Vim9 script language.
2
Bram Moolenaar673660a2020-01-26 16:50:05 +01003source check.vim
4
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01005" Check that "lines" inside ":def" results in an "error" message.
6func CheckDefFailure(lines, error)
Bram Moolenaar978d1702020-01-26 17:38:12 +01007 call writefile(['def Func()'] + a:lines + ['enddef'], 'Xdef')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +01008 call assert_fails('so Xdef', a:error, a:lines)
9 call delete('Xdef')
10endfunc
11
12func CheckScriptFailure(lines, error)
13 call writefile(a:lines, 'Xdef')
14 call assert_fails('so Xdef', a:error, a:lines)
15 call delete('Xdef')
16endfunc
17
18def Test_syntax()
19 let var = 234
20 let other: list<string> = ['asdf']
21enddef
22
23func Test_def_basic()
24 def SomeFunc(): string
25 return 'yes'
26 enddef
27 call assert_equal('yes', SomeFunc())
28endfunc
29
30def Test_assignment()
31 let bool1: bool = true
32 assert_equal(v:true, bool1)
33 let bool2: bool = false
34 assert_equal(v:false, bool2)
35
36 let list1: list<string> = ['sdf', 'asdf']
37 let list2: list<number> = [1, 2, 3]
38
39 " TODO: does not work yet
40 " let listS: list<string> = []
41 " let listN: list<number> = []
42
43 let dict1: dict<string> = #{key: 'value'}
44 let dict2: dict<number> = #{one: 1, two: 2}
Bram Moolenaarb283a8a2020-02-02 22:24:04 +010045
46 v:char = 'abc'
47 call assert_equal('abc', v:char)
48
49 $ENVVAR = 'foobar'
50 call assert_equal('foobar', $ENVVAR)
51 $ENVVAR = ''
Bram Moolenaar8a7d6542020-01-26 15:56:19 +010052enddef
53
54func Test_assignment_failure()
55 call CheckDefFailure(['let var=234'], 'E1004:')
56 call CheckDefFailure(['let var =234'], 'E1004:')
57 call CheckDefFailure(['let var= 234'], 'E1004:')
58
59 call CheckDefFailure(['let true = 1'], 'E1034:')
60 call CheckDefFailure(['let false = 1'], 'E1034:')
61
62 call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
63 call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')
64
65 call CheckDefFailure(['let var: dict<string> = #{key: 123}'], 'expected dict<string> but got dict<number>')
66 call CheckDefFailure(['let var: dict<number> = #{key: "xx"}'], 'expected dict<number> but got dict<string>')
67
68 call CheckDefFailure(['let var = feedkeys("0")'], 'E1031:')
69 call CheckDefFailure(['let var: number = feedkeys("0")'], 'expected number but got void')
70endfunc
71
72func Test_const()
73 call CheckDefFailure(['const var = 234', 'var = 99'], 'E1018:')
74 call CheckDefFailure(['const one = 234', 'let one = 99'], 'E1017:')
75 call CheckDefFailure(['const two'], 'E1021:')
76endfunc
77
78def Test_block()
79 let outer = 1
80 {
81 let inner = 2
82 assert_equal(1, outer)
83 assert_equal(2, inner)
84 }
85 assert_equal(1, outer)
86enddef
87
88func Test_block_failure()
89 call CheckDefFailure(['{', 'let inner = 1', '}', 'echo inner'], 'E1001:')
90endfunc
91
92def ReturnString(): string
93 return 'string'
94enddef
95
96def ReturnNumber(): number
97 return 123
98enddef
99
100def Test_return_string()
101 assert_equal('string', ReturnString())
102 assert_equal(123, ReturnNumber())
103enddef
104
105func Increment()
106 let g:counter += 1
107endfunc
108
109def Test_call_ufunc_count()
110 g:counter = 1
111 Increment()
112 Increment()
113 Increment()
114 " works with and without :call
115 assert_equal(4, g:counter)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100116 call assert_equal(4, g:counter)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100117 unlet g:counter
118enddef
119
120def MyVarargs(arg: string, ...rest: list<string>): string
121 let res = arg
122 for s in rest
123 res ..= ',' .. s
124 endfor
125 return res
126enddef
127
128def Test_call_varargs()
129 assert_equal('one', MyVarargs('one'))
130 assert_equal('one,two', MyVarargs('one', 'two'))
131 assert_equal('one,two,three', MyVarargs('one', 'two', 'three'))
132enddef
133
Bram Moolenaar26e117e2020-02-04 21:24:15 +0100134"def Test_call_func_defined_later()
135" call assert_equal('one', DefineLater('one'))
136" call assert_fails('call NotDefined("one")', 'E99:')
137"enddef
138
139func DefineLater(arg)
140 return a:arg
141endfunc
142
143def MyDefaultArgs(name = 'string'): string
144 return name
145enddef
146
147func Test_call_default_args_from_func()
148 " TODO: implement using default value for optional argument
149 "call assert_equal('string', MyDefaultArgs())
150 call assert_fails('call MyDefaultArgs()', 'optional arguments not implemented yet')
151 call assert_equal('one', MyDefaultArgs('one'))
152 call assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
153endfunc
154
155def Test_call_default_args()
156 " TODO: implement using default value for optional argument
157 "assert_equal('string', MyDefaultArgs())
158 assert_equal('one', MyDefaultArgs('one'))
159 assert_fails('call MyDefaultArgs("one", "two")', 'E118:')
160enddef
161
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100162def Test_return_type_wrong()
Bram Moolenaar978d1702020-01-26 17:38:12 +0100163 CheckScriptFailure(['def Func(): number', 'return "a"', 'enddef'], 'expected number but got string')
164 CheckScriptFailure(['def Func(): string', 'return 1', 'enddef'], 'expected string but got number')
165 CheckScriptFailure(['def Func(): void', 'return "a"', 'enddef'], 'expected void but got string')
166 CheckScriptFailure(['def Func()', 'return "a"', 'enddef'], 'expected void but got string')
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100167enddef
168
Bram Moolenaarbfe12042020-02-04 21:54:07 +0100169def Test_arg_type_wrong()
170 CheckScriptFailure(['def Func3(items: list)', 'echo "a"', 'enddef'], 'E1008: Missing <type>')
171enddef
172
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100173def Test_try_catch()
174 let l = []
175 try
176 add(l, '1')
177 throw 'wrong'
178 add(l, '2')
179 catch
180 add(l, v:exception)
181 finally
182 add(l, '3')
183 endtry
184 assert_equal(['1', 'wrong', '3'], l)
185enddef
186
187let s:export_script_lines =<< trim END
188 vim9script
189 let name: string = 'bob'
190 def Concat(arg: string): string
191 return name .. arg
192 enddef
193 let g:result = Concat('bie')
194 let g:localname = name
195
196 export const CONST = 1234
197 export let exported = 9876
198 export def Exported(): string
199 return 'Exported'
200 enddef
201END
202
203def Test_vim9script()
204 let import_script_lines =<< trim END
205 vim9script
206 import {exported, Exported} from './Xexport.vim'
207 g:imported = exported
208 g:imported_func = Exported()
209 END
210
211 writefile(import_script_lines, 'Ximport.vim')
212 writefile(s:export_script_lines, 'Xexport.vim')
213
214 source Ximport.vim
215
216 assert_equal('bobbie', g:result)
217 assert_equal('bob', g:localname)
218 assert_equal(9876, g:imported)
219 assert_equal('Exported', g:imported_func)
220 assert_false(exists('g:name'))
221
222 unlet g:result
223 unlet g:localname
224 unlet g:imported
225 unlet g:imported_func
226 delete('Ximport.vim')
227 delete('Xexport.vim')
228
229 CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:')
230 CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:')
231enddef
232
233def Test_vim9script_call()
234 let lines =<< trim END
235 vim9script
236 let var = ''
237 def MyFunc(arg: string)
238 var = arg
239 enddef
240 MyFunc('foobar')
241 assert_equal('foobar', var)
242
243 let str = 'barfoo'
244 str->MyFunc()
245 assert_equal('barfoo', var)
246
247 let g:value = 'value'
248 g:value->MyFunc()
249 assert_equal('value', var)
250
251 let listvar = []
252 def ListFunc(arg: list<number>)
253 listvar = arg
254 enddef
255 [1, 2, 3]->ListFunc()
256 assert_equal([1, 2, 3], listvar)
257
258 let dictvar = {}
259 def DictFunc(arg: dict<number>)
260 dictvar = arg
261 enddef
262 {'a': 1, 'b': 2}->DictFunc()
263 assert_equal(#{a: 1, b: 2}, dictvar)
264 #{a: 3, b: 4}->DictFunc()
265 assert_equal(#{a: 3, b: 4}, dictvar)
266 END
267 writefile(lines, 'Xcall.vim')
268 source Xcall.vim
269 delete('Xcall.vim')
270enddef
271
272def Test_vim9script_call_fail_decl()
273 let lines =<< trim END
274 vim9script
275 let var = ''
276 def MyFunc(arg: string)
277 let var = 123
278 enddef
279 END
280 writefile(lines, 'Xcall_decl.vim')
281 assert_fails('source Xcall_decl.vim', 'E1054:')
282 delete('Xcall_decl.vim')
283enddef
284
285def Test_vim9script_call_fail_const()
286 let lines =<< trim END
287 vim9script
288 const var = ''
289 def MyFunc(arg: string)
290 var = 'asdf'
291 enddef
292 END
293 writefile(lines, 'Xcall_const.vim')
294 assert_fails('source Xcall_const.vim', 'E46:')
295 delete('Xcall_const.vim')
296enddef
297
298def Test_vim9script_reload()
299 let lines =<< trim END
300 vim9script
301 const var = ''
302 let valone = 1234
303 def MyFunc(arg: string)
304 valone = 5678
305 enddef
306 END
307 let morelines =<< trim END
308 let valtwo = 222
309 export def GetValtwo(): number
310 return valtwo
311 enddef
312 END
313 writefile(lines + morelines, 'Xreload.vim')
314 source Xreload.vim
315 source Xreload.vim
316 source Xreload.vim
317
318 let testlines =<< trim END
319 vim9script
320 def TheFunc()
321 import GetValtwo from './Xreload.vim'
322 assert_equal(222, GetValtwo())
323 enddef
324 TheFunc()
325 END
326 writefile(testlines, 'Ximport.vim')
327 source Ximport.vim
328
329 " test that when not using "morelines" valtwo is still defined
330 " need to source Xreload.vim again, import doesn't reload a script
331 writefile(lines, 'Xreload.vim')
332 source Xreload.vim
333 source Ximport.vim
334
335 " cannot declare a var twice
336 lines =<< trim END
337 vim9script
338 let valone = 1234
339 let valone = 5678
340 END
341 writefile(lines, 'Xreload.vim')
342 assert_fails('source Xreload.vim', 'E1041:')
343
344 delete('Xreload.vim')
345 delete('Ximport.vim')
346enddef
347
348def Test_import_absolute()
349 let import_lines = [
350 \ 'vim9script',
351 \ 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100352 \ 'def UseExported()',
353 \ ' g:imported_abs = exported',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100354 \ ' exported = 8888',
355 \ ' g:imported_after = exported',
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100356 \ 'enddef',
357 \ 'UseExported()',
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100358 \ 'g:import_disassembled = execute("disass UseExported")',
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100359 \ ]
360 writefile(import_lines, 'Ximport_abs.vim')
361 writefile(s:export_script_lines, 'Xexport_abs.vim')
362
363 source Ximport_abs.vim
364
365 assert_equal(9876, g:imported_abs)
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100366 assert_equal(8888, g:imported_after)
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100367 assert_match('<SNR>\d\+_UseExported.*'
368 \ .. 'g:imported_abs = exported.*'
369 \ .. '0 LOADSCRIPT exported from .*Xexport_abs.vim.*'
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100370 \ .. '1 STOREG g:imported_abs.*'
371 \ .. 'exported = 8888.*'
372 \ .. '3 STORESCRIPT exported in .*Xexport_abs.vim.*'
373 \ .. 'g:imported_after = exported.*'
374 \ .. '4 LOADSCRIPT exported from .*Xexport_abs.vim.*'
375 \ .. '5 STOREG g:imported_after.*'
376 \, g:import_disassembled)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100377 unlet g:imported_abs
Bram Moolenaar4e12a5d2020-02-03 20:50:59 +0100378 unlet g:import_disassembled
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100379
380 delete('Ximport_abs.vim')
381 delete('Xexport_abs.vim')
382enddef
383
384def Test_import_rtp()
385 let import_lines = [
386 \ 'vim9script',
387 \ 'import exported from "Xexport_rtp.vim"',
388 \ 'g:imported_rtp = exported',
389 \ ]
390 writefile(import_lines, 'Ximport_rtp.vim')
391 mkdir('import')
392 writefile(s:export_script_lines, 'import/Xexport_rtp.vim')
393
394 let save_rtp = &rtp
395 &rtp = getcwd()
396 source Ximport_rtp.vim
397 &rtp = save_rtp
398
399 assert_equal(9876, g:imported_rtp)
400 unlet g:imported_rtp
401
402 delete('Ximport_rtp.vim')
403 delete('import/Xexport_rtp.vim')
404 delete('import', 'd')
405enddef
406
407def Test_fixed_size_list()
408 " will be allocated as one piece of memory, check that changes work
409 let l = [1, 2, 3, 4]
410 l->remove(0)
411 l->add(5)
412 l->insert(99, 1)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100413 assert_equal([2, 99, 3, 4, 5], l)
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100414enddef
415
Bram Moolenaar673660a2020-01-26 16:50:05 +0100416" Test that inside :function a Python function can be defined, :def is not
417" recognized.
418func Test_function_python()
419 CheckFeature python3
420 let py = 'python3'
421 execute py "<< EOF"
422def do_something():
423 return 1
424EOF
425endfunc
426
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100427def HasEval()
428 if has('eval')
429 echo 'yes'
430 else
431 echo 'no'
432 endif
433enddef
434
435def HasNothing()
436 if has('nothing')
437 echo 'yes'
438 else
439 echo 'no'
440 endif
441enddef
442
443def Test_compile_const_expr()
444 assert_equal("\nyes", execute('call HasEval()'))
445 let instr = execute('disassemble HasEval')
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100446 assert_match('PUSHS "yes"', instr)
447 assert_notmatch('PUSHS "no"', instr)
448 assert_notmatch('JUMP', instr)
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100449
450 assert_equal("\nno", execute('call HasNothing()'))
451 instr = execute('disassemble HasNothing')
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100452 assert_notmatch('PUSHS "yes"', instr)
453 assert_match('PUSHS "no"', instr)
454 assert_notmatch('JUMP', instr)
455enddef
456
457func NotCompiled()
458 echo "not"
459endfunc
460
461let s:scriptvar = 4
462let g:globalvar = 'g'
463
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100464def s:ScriptFuncLoad(arg: string)
Bram Moolenaar0f18b6d2020-02-02 17:22:27 +0100465 let local = 1
466 buffers
467 echo arg
468 echo local
469 echo v:version
470 echo s:scriptvar
471 echo g:globalvar
472 echo &tabstop
473 echo $ENVVAR
474 echo @z
475enddef
476
Bram Moolenaar0de50862020-02-05 22:55:48 +0100477def Test_disassembleLoad()
478 assert_fails('disass NoFunc', 'E1061:')
479 assert_fails('disass NotCompiled', 'E1062:')
480
481 let res = execute('disass s:ScriptFuncLoad')
482 assert_match('<SNR>\d*_ScriptFuncLoad.*'
483 \ .. 'buffers.*'
484 \ .. ' EXEC \+buffers.*'
485 \ .. ' LOAD arg\[-1\].*'
486 \ .. ' LOAD $0.*'
487 \ .. ' LOADV v:version.*'
488 \ .. ' LOADS s:scriptvar from .*test_vim9_script.vim.*'
489 \ .. ' LOADG g:globalvar.*'
490 \ .. ' LOADENV $ENVVAR.*'
491 \ .. ' LOADREG @z.*'
492 \, res)
493enddef
494
Bram Moolenaarff80cb62020-02-05 22:10:05 +0100495def s:ScriptFuncPush()
496 let localbool = true
497 let localspec = v:none
498 let localblob = 0z1234
499 if has('float')
500 let localfloat = 1.234
501 endif
502enddef
503
Bram Moolenaar0de50862020-02-05 22:55:48 +0100504def Test_disassemblePush()
505 let res = execute('disass s:ScriptFuncPush')
506 assert_match('<SNR>\d*_ScriptFuncPush.*'
507 \ .. 'localbool = true.*'
508 \ .. ' PUSH v:true.*'
509 \ .. 'localspec = v:none.*'
510 \ .. ' PUSH v:none.*'
511 \ .. 'localblob = 0z1234.*'
512 \ .. ' PUSHBLOB 0z1234.*'
513 \, res)
514 if has('float')
515 assert_match('<SNR>\d*_ScriptFuncPush.*'
516 \ .. 'localfloat = 1.234.*'
517 \ .. ' PUSHF 1.234.*'
518 \, res)
519 endif
520enddef
521
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100522def s:ScriptFuncStore()
523 let localnr = 1
524 localnr = 2
525 let localstr = 'abc'
526 localstr = 'xyz'
527 v:char = 'abc'
528 s:scriptvar = 'sv'
529 g:globalvar = 'gv'
530 &tabstop = 8
531 $ENVVAR = 'ev'
532 @z = 'rv'
533enddef
534
Bram Moolenaar0de50862020-02-05 22:55:48 +0100535def Test_disassembleStore()
536 let res = execute('disass s:ScriptFuncStore')
Bram Moolenaarb283a8a2020-02-02 22:24:04 +0100537 assert_match('<SNR>\d*_ScriptFuncStore.*'
538 \ .. 'localnr = 2.*'
539 \ .. ' STORE 2 in $0.*'
540 \ .. 'localstr = ''xyz''.*'
541 \ .. ' STORE $1.*'
542 \ .. 'v:char = ''abc''.*'
543 \ .. 'STOREV v:char.*'
544 \ .. 's:scriptvar = ''sv''.*'
545 \ .. ' STORES s:scriptvar in .*test_vim9_script.vim.*'
546 \ .. 'g:globalvar = ''gv''.*'
547 \ .. ' STOREG g:globalvar.*'
548 \ .. '&tabstop = 8.*'
549 \ .. ' STOREOPT &tabstop.*'
550 \ .. '$ENVVAR = ''ev''.*'
551 \ .. ' STOREENV $ENVVAR.*'
552 \ .. '@z = ''rv''.*'
553 \ .. ' STOREREG @z.*'
554 \, res)
Bram Moolenaar0de50862020-02-05 22:55:48 +0100555enddef
Bram Moolenaarff80cb62020-02-05 22:10:05 +0100556
Bram Moolenaar0de50862020-02-05 22:55:48 +0100557def s:ScriptFuncTry()
558 try
559 echo 'yes'
560 catch /fail/
561 echo 'no'
562 finally
563 echo 'end'
564 endtry
565enddef
566
567def Test_disassembleTry()
568 let res = execute('disass s:ScriptFuncTry')
Bram Moolenaarff80cb62020-02-05 22:10:05 +0100569 assert_match('<SNR>\d*_ScriptFuncTry.*'
570 \ .. 'try.*'
571 \ .. 'TRY catch -> \d\+, finally -> \d\+.*'
572 \ .. 'catch /fail/.*'
573 \ .. ' JUMP -> \d\+.*'
574 \ .. ' PUSH v:exception.*'
575 \ .. ' PUSHS "fail".*'
576 \ .. ' COMPARESTRING =\~.*'
577 \ .. ' JUMP_IF_FALSE -> \d\+.*'
578 \ .. ' CATCH.*'
579 \ .. 'finally.*'
580 \ .. ' PUSHS "end".*'
581 \ .. 'endtry.*'
582 \ .. ' ENDTRY.*'
583 \, res)
Bram Moolenaara259d8d2020-01-31 20:10:50 +0100584enddef
585
Bram Moolenaar0de50862020-02-05 22:55:48 +0100586def s:ScriptFuncNew()
587 let ll = [1, "two", 333]
588 let dd = #{one: 1, two: "val"}
589enddef
590
591def Test_disassembleNew()
592 let res = execute('disass s:ScriptFuncNew')
593 assert_match('<SNR>\d*_ScriptFuncNew.*'
594 \ .. 'let ll = \[1, "two", 333].*'
595 \ .. 'PUSHNR 1.*'
596 \ .. 'PUSHS "two".*'
597 \ .. 'PUSHNR 333.*'
598 \ .. 'NEWLIST size 3.*'
599 \ .. 'let dd = #{one: 1, two: "val"}.*'
600 \ .. 'PUSHS "one".*'
601 \ .. 'PUSHNR 1.*'
602 \ .. 'PUSHS "two".*'
603 \ .. 'PUSHS "val".*'
604 \ .. 'NEWDICT size 2.*'
605 \, res)
606enddef
607
608def FuncWithArg(arg)
609 echo arg
610enddef
611
612func UserFunc()
613 echo 'nothing'
614endfunc
615
616func UserFuncWithArg(arg)
617 echo a:arg
618endfunc
619
620def s:ScriptFuncCall(): string
621 changenr()
622 char2nr("abc")
623 Test_disassembleNew()
624 FuncWithArg(343)
625 UserFunc()
626 UserFuncWithArg("foo")
627 let FuncRef = function("UserFunc")
628 FuncRef()
629 let FuncRefWithArg = function("UserFuncWithArg")
630 FuncRefWithArg("bar")
631 return "yes"
632enddef
633
634def Test_disassembleCall()
635 let res = execute('disass s:ScriptFuncCall')
636 assert_match('<SNR>\d*_ScriptFuncCall.*'
637 \ .. 'changenr().*'
638 \ .. ' BCALL changenr(argc 0).*'
639 \ .. 'char2nr("abc").*'
640 \ .. ' PUSHS "abc".*'
641 \ .. ' BCALL char2nr(argc 1).*'
642 \ .. 'Test_disassembleNew().*'
643 \ .. ' DCALL Test_disassembleNew(argc 0).*'
644 \ .. 'FuncWithArg(343).*'
645 \ .. ' PUSHNR 343.*'
646 \ .. ' DCALL FuncWithArg(argc 1).*'
647 \ .. 'UserFunc().*'
648 \ .. ' UCALL UserFunc(argc 0).*'
649 \ .. 'UserFuncWithArg("foo").*'
650 \ .. ' PUSHS "foo".*'
651 \ .. ' UCALL UserFuncWithArg(argc 1).*'
652 \ .. 'let FuncRef = function("UserFunc").*'
653 \ .. 'FuncRef().*'
654 \ .. ' LOAD $\d.*'
655 \ .. ' PCALL (argc 0).*'
656 \ .. 'let FuncRefWithArg = function("UserFuncWithArg").*'
657 \ .. 'FuncRefWithArg("bar").*'
658 \ .. ' PUSHS "bar".*'
659 \ .. ' LOAD $\d.*'
660 \ .. ' PCALL (argc 1).*'
661 \ .. 'return "yes".*'
662 \ .. ' PUSHS "yes".*'
663 \ .. ' RETURN.*'
664 \, res)
665enddef
666
Bram Moolenaar8a7d6542020-01-26 15:56:19 +0100667
668" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker