Mercurial > vim
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 |