comparison src/testdir/test_vim9_disassemble.vim @ 27457:4c16acb2525f v8.2.4257

patch 8.2.4257: Vim9: finding global function without g: prefix inconsistent Commit: https://github.com/vim/vim/commit/62aec93bfdb9e1b40d03a6d2e8e9511f8b1bdb2d Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 29 21:45:34 2022 +0000 patch 8.2.4257: Vim9: finding global function without g: prefix inconsistent Problem: Vim9: finding global function without g: prefix but not finding global variable is inconsistent. Solution: Require using g: for a global function. Change the vim9.vim script into a Vim9 script with exports. Fix that import in legacy script does not work.
author Bram Moolenaar <Bram@vim.org>
date Sat, 29 Jan 2022 23:00:05 +0100
parents 69a48bcd1d80
children a14c4d3e3260
comparison
equal deleted inserted replaced
27456:a8e2d91995ce 27457:4c16acb2525f
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 source vim9.vim 4 import './vim9.vim' as v9
5 5
6 func NotCompiled() 6 func s:NotCompiled()
7 echo "not" 7 echo "not"
8 endfunc 8 endfunc
9 9
10 let s:scriptvar = 4 10 let s:scriptvar = 4
11 let g:globalvar = 'g' 11 let g:globalvar = 'g'
310 '0 AUTOLOAD autoscript#Opfunc\_s*' .. 310 '0 AUTOLOAD autoscript#Opfunc\_s*' ..
311 '1 STOREFUNCOPT &operatorfunc\_s*' .. 311 '1 STOREFUNCOPT &operatorfunc\_s*' ..
312 '2 RETURN void', 312 '2 RETURN void',
313 res) 313 res)
314 END 314 END
315 CheckScriptSuccess(lines) 315 v9.CheckScriptSuccess(lines)
316 316
317 delete('Xdir', 'rf') 317 delete('Xdir', 'rf')
318 &rtp = save_rtp 318 &rtp = save_rtp
319 enddef 319 enddef
320 320
688 '\d PUSHS "val"\_s*' .. 688 '\d PUSHS "val"\_s*' ..
689 '\d NEWDICT size 2\_s*', 689 '\d NEWDICT size 2\_s*',
690 res) 690 res)
691 enddef 691 enddef
692 692
693 def FuncWithArg(arg: any) 693 def s:FuncWithArg(arg: any)
694 echo arg 694 echo arg
695 enddef 695 enddef
696 696
697 func UserFunc() 697 func s:UserFunc()
698 echo 'nothing' 698 echo 'nothing'
699 endfunc 699 endfunc
700 700
701 func UserFuncWithArg(arg) 701 func s:UserFuncWithArg(arg)
702 echo a:arg 702 echo a:arg
703 endfunc 703 endfunc
704 704
705 def s:ScriptFuncCall(): string 705 def s:ScriptFuncCall(): string
706 changenr() 706 changenr()
707 char2nr("abc") 707 char2nr("abc")
708 Test_disassemble_new() 708 g:Test_disassemble_new()
709 FuncWithArg(343) 709 FuncWithArg(343)
710 ScriptFuncNew() 710 ScriptFuncNew()
711 s:ScriptFuncNew() 711 s:ScriptFuncNew()
712 UserFunc() 712 UserFunc()
713 UserFuncWithArg("foo") 713 UserFuncWithArg("foo")
726 '\d DROP\_s*' .. 726 '\d DROP\_s*' ..
727 'char2nr("abc")\_s*' .. 727 'char2nr("abc")\_s*' ..
728 '\d PUSHS "abc"\_s*' .. 728 '\d PUSHS "abc"\_s*' ..
729 '\d BCALL char2nr(argc 1)\_s*' .. 729 '\d BCALL char2nr(argc 1)\_s*' ..
730 '\d DROP\_s*' .. 730 '\d DROP\_s*' ..
731 'Test_disassemble_new()\_s*' .. 731 'g:Test_disassemble_new()\_s*' ..
732 '\d DCALL Test_disassemble_new(argc 0)\_s*' .. 732 '\d DCALL Test_disassemble_new(argc 0)\_s*' ..
733 '\d DROP\_s*' .. 733 '\d DROP\_s*' ..
734 'FuncWithArg(343)\_s*' .. 734 'FuncWithArg(343)\_s*' ..
735 '\d\+ PUSHNR 343\_s*' .. 735 '\d\+ PUSHNR 343\_s*' ..
736 '\d\+ DCALL FuncWithArg(argc 1)\_s*' .. 736 '\d\+ DCALL <SNR>\d\+_FuncWithArg(argc 1)\_s*' ..
737 '\d\+ DROP\_s*' .. 737 '\d\+ DROP\_s*' ..
738 'ScriptFuncNew()\_s*' .. 738 'ScriptFuncNew()\_s*' ..
739 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' .. 739 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
740 '\d\+ DROP\_s*' .. 740 '\d\+ DROP\_s*' ..
741 's:ScriptFuncNew()\_s*' .. 741 's:ScriptFuncNew()\_s*' ..
742 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' .. 742 '\d\+ DCALL <SNR>\d\+_ScriptFuncNew(argc 0)\_s*' ..
743 '\d\+ DROP\_s*' .. 743 '\d\+ DROP\_s*' ..
744 'UserFunc()\_s*' .. 744 'UserFunc()\_s*' ..
745 '\d\+ UCALL UserFunc(argc 0)\_s*' .. 745 '\d\+ UCALL <80><fd>R\d\+_UserFunc(argc 0)\_s*' ..
746 '\d\+ DROP\_s*' .. 746 '\d\+ DROP\_s*' ..
747 'UserFuncWithArg("foo")\_s*' .. 747 'UserFuncWithArg("foo")\_s*' ..
748 '\d\+ PUSHS "foo"\_s*' .. 748 '\d\+ PUSHS "foo"\_s*' ..
749 '\d\+ UCALL UserFuncWithArg(argc 1)\_s*' .. 749 '\d\+ UCALL <80><fd>R\d\+_UserFuncWithArg(argc 1)\_s*' ..
750 '\d\+ DROP\_s*' .. 750 '\d\+ DROP\_s*' ..
751 'var FuncRef = function("UserFunc")\_s*' .. 751 'var FuncRef = function("UserFunc")\_s*' ..
752 '\d\+ PUSHS "UserFunc"\_s*' .. 752 '\d\+ PUSHS "UserFunc"\_s*' ..
753 '\d\+ BCALL function(argc 1)\_s*' .. 753 '\d\+ BCALL function(argc 1)\_s*' ..
754 '\d\+ STORE $0\_s*' .. 754 '\d\+ STORE $0\_s*' ..
809 809
810 810
811 def EchoArg(arg: string): string 811 def EchoArg(arg: string): string
812 return arg 812 return arg
813 enddef 813 enddef
814 def RefThis(): func 814 def s:RefThis(): func
815 return function('EchoArg') 815 return function('EchoArg')
816 enddef 816 enddef
817 def s:ScriptPCall() 817 def s:ScriptPCall()
818 RefThis()("text") 818 RefThis()("text")
819 enddef 819 enddef
820 820
821 def Test_disassemble_pcall() 821 def Test_disassemble_pcall()
822 var res = execute('disass s:ScriptPCall') 822 var res = execute('disass s:ScriptPCall')
823 assert_match('<SNR>\d\+_ScriptPCall\_s*' .. 823 assert_match('<SNR>\d\+_ScriptPCall\_s*' ..
824 'RefThis()("text")\_s*' .. 824 'RefThis()("text")\_s*' ..
825 '\d DCALL RefThis(argc 0)\_s*' .. 825 '\d DCALL <SNR>\d\+_RefThis(argc 0)\_s*' ..
826 '\d PUSHS "text"\_s*' .. 826 '\d PUSHS "text"\_s*' ..
827 '\d PCALL top (argc 1)\_s*' .. 827 '\d PCALL top (argc 1)\_s*' ..
828 '\d PCALL end\_s*' .. 828 '\d PCALL end\_s*' ..
829 '\d DROP\_s*' .. 829 '\d DROP\_s*' ..
830 '\d RETURN void', 830 '\d RETURN void',
1114 '\d STORE $2\_s*' .. 1114 '\d STORE $2\_s*' ..
1115 '\d RETURN void', 1115 '\d RETURN void',
1116 instr) 1116 instr)
1117 enddef 1117 enddef
1118 1118
1119 def WithLambda(): string 1119 def s:WithLambda(): string
1120 var F = (a) => "X" .. a .. "X" 1120 var F = (a) => "X" .. a .. "X"
1121 return F("x") 1121 return F("x")
1122 enddef 1122 enddef
1123 1123
1124 def Test_disassemble_lambda() 1124 def Test_disassemble_lambda()
1147 '\d CONCAT\_s*' .. 1147 '\d CONCAT\_s*' ..
1148 '\d RETURN', 1148 '\d RETURN',
1149 instr) 1149 instr)
1150 enddef 1150 enddef
1151 1151
1152 def LambdaWithType(): number 1152 def s:LambdaWithType(): number
1153 var Ref = (a: number) => a + 10 1153 var Ref = (a: number) => a + 10
1154 return Ref(g:value) 1154 return Ref(g:value)
1155 enddef 1155 enddef
1156 1156
1157 def Test_disassemble_lambda_with_type() 1157 def Test_disassemble_lambda_with_type()
1208 '\d DEF /Info/\_s*' .. 1208 '\d DEF /Info/\_s*' ..
1209 '\d RETURN void', 1209 '\d RETURN void',
1210 instr) 1210 instr)
1211 enddef 1211 enddef
1212 1212
1213 def AndOr(arg: any): string 1213 def s:AndOr(arg: any): string
1214 if arg == 1 && arg != 2 || arg == 4 1214 if arg == 1 && arg != 2 || arg == 4
1215 return 'yes' 1215 return 'yes'
1216 endif 1216 endif
1217 return 'no' 1217 return 'no'
1218 enddef 1218 enddef
1237 '\d\+ COMPAREANY ==\_s*' .. 1237 '\d\+ COMPAREANY ==\_s*' ..
1238 '\d\+ JUMP_IF_FALSE -> \d\+', 1238 '\d\+ JUMP_IF_FALSE -> \d\+',
1239 instr) 1239 instr)
1240 enddef 1240 enddef
1241 1241
1242 def AndConstant(arg: any): string 1242 def s:AndConstant(arg: any): string
1243 if true && arg 1243 if true && arg
1244 return "yes" 1244 return "yes"
1245 endif 1245 endif
1246 if false && arg 1246 if false && arg
1247 return "never" 1247 return "never"
1269 '5 PUSHS "no"\_s*' .. 1269 '5 PUSHS "no"\_s*' ..
1270 '6 RETURN', 1270 '6 RETURN',
1271 instr) 1271 instr)
1272 enddef 1272 enddef
1273 1273
1274 def ForLoop(): list<number> 1274 def s:ForLoop(): list<number>
1275 var res: list<number> 1275 var res: list<number>
1276 for i in range(3) 1276 for i in range(3)
1277 res->add(i) 1277 res->add(i)
1278 endfor 1278 endfor
1279 return res 1279 return res
1302 '\d\+ JUMP -> \d\+\_s*' .. 1302 '\d\+ JUMP -> \d\+\_s*' ..
1303 '\d\+ DROP', 1303 '\d\+ DROP',
1304 instr) 1304 instr)
1305 enddef 1305 enddef
1306 1306
1307 def ForLoopEval(): string 1307 def s:ForLoopEval(): string
1308 var res = "" 1308 var res = ""
1309 for str in eval('["one", "two"]') 1309 for str in eval('["one", "two"]')
1310 res ..= str 1310 res ..= str
1311 endfor 1311 endfor
1312 return res 1312 return res
1338 '\d\+ LOAD $0\_s*' .. 1338 '\d\+ LOAD $0\_s*' ..
1339 '\d\+ RETURN', 1339 '\d\+ RETURN',
1340 instr) 1340 instr)
1341 enddef 1341 enddef
1342 1342
1343 def ForLoopUnpack() 1343 def s:ForLoopUnpack()
1344 for [x1, x2] in [[1, 2], [3, 4]] 1344 for [x1, x2] in [[1, 2], [3, 4]]
1345 echo x1 x2 1345 echo x1 x2
1346 endfor 1346 endfor
1347 enddef 1347 enddef
1348 1348
1371 '\d\+ DROP\_s*' .. 1371 '\d\+ DROP\_s*' ..
1372 '\d\+ RETURN void', 1372 '\d\+ RETURN void',
1373 instr) 1373 instr)
1374 enddef 1374 enddef
1375 1375
1376 def ForLoopContinue() 1376 def s:ForLoopContinue()
1377 for nr in [1, 2] 1377 for nr in [1, 2]
1378 try 1378 try
1379 echo "ok" 1379 echo "ok"
1380 try 1380 try
1381 echo "deeper" 1381 echo "deeper"
1430 instr) 1430 instr)
1431 enddef 1431 enddef
1432 1432
1433 let g:number = 42 1433 let g:number = 42
1434 1434
1435 def TypeCast() 1435 def s:TypeCast()
1436 var l: list<number> = [23, <number>g:number] 1436 var l: list<number> = [23, <number>g:number]
1437 enddef 1437 enddef
1438 1438
1439 def Test_disassemble_typecast() 1439 def Test_disassemble_typecast()
1440 var instr = execute('disassemble TypeCast') 1440 var instr = execute('disassemble TypeCast')
1448 '\d STORE $0\_s*' .. 1448 '\d STORE $0\_s*' ..
1449 '\d RETURN void\_s*', 1449 '\d RETURN void\_s*',
1450 instr) 1450 instr)
1451 enddef 1451 enddef
1452 1452
1453 def Computing() 1453 def s:Computing()
1454 var nr = 3 1454 var nr = 3
1455 var nrres = nr + 7 1455 var nrres = nr + 7
1456 nrres = nr - 7 1456 nrres = nr - 7
1457 nrres = nr * 7 1457 nrres = nr * 7
1458 nrres = nr / 7 1458 nrres = nr / 7
1523 '\d OPFLOAT /.*', 1523 '\d OPFLOAT /.*',
1524 instr) 1524 instr)
1525 endif 1525 endif
1526 enddef 1526 enddef
1527 1527
1528 def AddListBlob() 1528 def s:AddListBlob()
1529 var reslist = [1, 2] + [3, 4] 1529 var reslist = [1, 2] + [3, 4]
1530 var resblob = 0z1122 + 0z3344 1530 var resblob = 0z1122 + 0z3344
1531 enddef 1531 enddef
1532 1532
1533 def Test_disassemble_add_list_blob() 1533 def Test_disassemble_add_list_blob()
1549 '\d STORE $.*', 1549 '\d STORE $.*',
1550 instr) 1550 instr)
1551 enddef 1551 enddef
1552 1552
1553 let g:aa = 'aa' 1553 let g:aa = 'aa'
1554 def ConcatString(): string 1554 def s:ConcatString(): string
1555 var res = g:aa .. "bb" 1555 var res = g:aa .. "bb"
1556 return res 1556 return res
1557 enddef 1557 enddef
1558 1558
1559 def Test_disassemble_concat() 1559 def Test_disassemble_concat()
1567 '\d STORE $.*', 1567 '\d STORE $.*',
1568 instr) 1568 instr)
1569 assert_equal('aabb', ConcatString()) 1569 assert_equal('aabb', ConcatString())
1570 enddef 1570 enddef
1571 1571
1572 def StringIndex(): string 1572 def s:StringIndex(): string
1573 var s = "abcd" 1573 var s = "abcd"
1574 var res = s[1] 1574 var res = s[1]
1575 return res 1575 return res
1576 enddef 1576 enddef
1577 1577
1588 '\d STORE $1\_s*', 1588 '\d STORE $1\_s*',
1589 instr) 1589 instr)
1590 assert_equal('b', StringIndex()) 1590 assert_equal('b', StringIndex())
1591 enddef 1591 enddef
1592 1592
1593 def StringSlice(): string 1593 def s:StringSlice(): string
1594 var s = "abcd" 1594 var s = "abcd"
1595 var res = s[1 : 8] 1595 var res = s[1 : 8]
1596 return res 1596 return res
1597 enddef 1597 enddef
1598 1598
1610 '\d STORE $1\_s*', 1610 '\d STORE $1\_s*',
1611 instr) 1611 instr)
1612 assert_equal('bcd', StringSlice()) 1612 assert_equal('bcd', StringSlice())
1613 enddef 1613 enddef
1614 1614
1615 def ListIndex(): number 1615 def s:ListIndex(): number
1616 var l = [1, 2, 3] 1616 var l = [1, 2, 3]
1617 var res = l[1] 1617 var res = l[1]
1618 return res 1618 return res
1619 enddef 1619 enddef
1620 1620
1634 '\d STORE $1\_s*', 1634 '\d STORE $1\_s*',
1635 instr) 1635 instr)
1636 assert_equal(2, ListIndex()) 1636 assert_equal(2, ListIndex())
1637 enddef 1637 enddef
1638 1638
1639 def ListSlice(): list<number> 1639 def s:ListSlice(): list<number>
1640 var l = [1, 2, 3] 1640 var l = [1, 2, 3]
1641 var res = l[1 : 8] 1641 var res = l[1 : 8]
1642 return res 1642 return res
1643 enddef 1643 enddef
1644 1644
1659 '\d STORE $1\_s*', 1659 '\d STORE $1\_s*',
1660 instr) 1660 instr)
1661 assert_equal([2, 3], ListSlice()) 1661 assert_equal([2, 3], ListSlice())
1662 enddef 1662 enddef
1663 1663
1664 def DictMember(): number 1664 def s:DictMember(): number
1665 var d = {item: 1} 1665 var d = {item: 1}
1666 var res = d.item 1666 var res = d.item
1667 res = d["item"] 1667 res = d["item"]
1668 return res 1668 return res
1669 enddef 1669 enddef
1690 instr) 1690 instr)
1691 assert_equal(1, DictMember()) 1691 assert_equal(1, DictMember())
1692 enddef 1692 enddef
1693 1693
1694 let somelist = [1, 2, 3, 4, 5] 1694 let somelist = [1, 2, 3, 4, 5]
1695 def AnyIndex(): number 1695 def s:AnyIndex(): number
1696 var res = g:somelist[2] 1696 var res = g:somelist[2]
1697 return res 1697 return res
1698 enddef 1698 enddef
1699 1699
1700 def Test_disassemble_any_index() 1700 def Test_disassemble_any_index()
1711 '\d RETURN', 1711 '\d RETURN',
1712 instr) 1712 instr)
1713 assert_equal(3, AnyIndex()) 1713 assert_equal(3, AnyIndex())
1714 enddef 1714 enddef
1715 1715
1716 def AnySlice(): list<number> 1716 def s:AnySlice(): list<number>
1717 var res = g:somelist[1 : 3] 1717 var res = g:somelist[1 : 3]
1718 return res 1718 return res
1719 enddef 1719 enddef
1720 1720
1721 def Test_disassemble_any_slice() 1721 def Test_disassemble_any_slice()
1733 '\d RETURN', 1733 '\d RETURN',
1734 instr) 1734 instr)
1735 assert_equal([2, 3, 4], AnySlice()) 1735 assert_equal([2, 3, 4], AnySlice())
1736 enddef 1736 enddef
1737 1737
1738 def NegateNumber(): number 1738 def s:NegateNumber(): number
1739 g:nr = 9 1739 g:nr = 9
1740 var plus = +g:nr 1740 var plus = +g:nr
1741 var minus = -g:nr 1741 var minus = -g:nr
1742 return minus 1742 return minus
1743 enddef 1743 enddef
1759 '\d STORE $1\_s*', 1759 '\d STORE $1\_s*',
1760 instr) 1760 instr)
1761 assert_equal(-9, NegateNumber()) 1761 assert_equal(-9, NegateNumber())
1762 enddef 1762 enddef
1763 1763
1764 def InvertBool(): bool 1764 def s:InvertBool(): bool
1765 var flag = true 1765 var flag = true
1766 var invert = !flag 1766 var invert = !flag
1767 var res = !!flag 1767 var res = !!flag
1768 return res 1768 return res
1769 enddef 1769 enddef
1784 '\d STORE $2\_s*', 1784 '\d STORE $2\_s*',
1785 instr) 1785 instr)
1786 assert_equal(true, InvertBool()) 1786 assert_equal(true, InvertBool())
1787 enddef 1787 enddef
1788 1788
1789 def ReturnBool(): bool 1789 def s:ReturnBool(): bool
1790 var one = 1 1790 var one = 1
1791 var zero = 0 1791 var zero = 0
1792 var none: number 1792 var none: number
1793 var name: bool = one && zero || one 1793 var name: bool = one && zero || one
1794 return name 1794 return name
1816 '\d\+ RETURN', 1816 '\d\+ RETURN',
1817 instr) 1817 instr)
1818 assert_equal(true, InvertBool()) 1818 assert_equal(true, InvertBool())
1819 enddef 1819 enddef
1820 1820
1821 def AutoInit() 1821 def s:AutoInit()
1822 var t: number 1822 var t: number
1823 t = 1 1823 t = 1
1824 t = 0 1824 t = 0
1825 enddef 1825 enddef
1826 1826