mirror of
https://github.com/luau-lang/luau.git
synced 2024-11-15 14:25:44 +08:00
34cf695fbc
- A series of major optimizations to type checking performance on complex programs/types (up to two orders of magnitude speedup for programs involving huge tagged unions) - Fix a few issues encountered by UBSAN (and maybe fix s390x builds) - Fix gcc-11 test builds - Fix a rare corner case where luau_load wouldn't wake inactive threads which could result in a use-after-free due to GC - Fix CLI crash when error object that's not a string escapes to top level
128 lines
2.9 KiB
Lua
128 lines
2.9 KiB
Lua
-- This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
-- This file is based on Lua 5.x tests -- https://github.com/lua/lua/tree/master/testes
|
|
print('testing local variables plus some extra stuff')
|
|
|
|
do
|
|
local i = 10
|
|
do local i = 100; assert(i==100) end
|
|
do local i = 1000; assert(i==1000) end
|
|
assert(i == 10)
|
|
if i ~= 10 then
|
|
local i = 20
|
|
else
|
|
local i = 30
|
|
assert(i == 30)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
f = nil
|
|
|
|
local f
|
|
x = 1
|
|
|
|
a = nil
|
|
loadstring('local a = {}')()
|
|
assert(type(a) ~= 'table')
|
|
|
|
function f (a)
|
|
local _1, _2, _3, _4, _5
|
|
local _6, _7, _8, _9, _10
|
|
local x = 3
|
|
local b = a
|
|
local c,d = a,b
|
|
if (d == b) then
|
|
local x = 'q'
|
|
x = b
|
|
assert(x == 2)
|
|
else
|
|
assert(nil)
|
|
end
|
|
assert(x == 3)
|
|
local f = 10
|
|
end
|
|
|
|
local b=10
|
|
local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3
|
|
|
|
|
|
assert(x == 1)
|
|
|
|
f(2)
|
|
assert(type(f) == 'function')
|
|
|
|
|
|
-- testing globals ;-)
|
|
do
|
|
local f = {}
|
|
local _G = getfenv()
|
|
for i=1,10 do f[i] = function (x) A=A+1; return A, _G.getfenv(x) end end
|
|
A=10; assert(f[1]() == 11)
|
|
for i=1,10 do assert(setfenv(f[i], {A=i}) == f[i]) end
|
|
assert(f[3]() == 4 and A == 11)
|
|
local a,b = f[8](1)
|
|
assert(b.A == 9)
|
|
a,b = f[8](0)
|
|
assert(b.A == 11) -- `real' global
|
|
local g
|
|
local function f () assert(setfenv(2, {a='10'}) == g) end
|
|
g = function () f(); _G.assert(_G.getfenv(1).a == '10') end
|
|
g(); assert(getfenv(g).a == '10')
|
|
end
|
|
|
|
-- test for global table of loaded chunks
|
|
local function foo (s)
|
|
return loadstring(s)
|
|
end
|
|
|
|
assert(getfenv(foo("")) == getfenv())
|
|
local a = {loadstring = loadstring}
|
|
setfenv(foo, a)
|
|
assert(getfenv(foo("")) == getfenv())
|
|
setfenv(0, a) -- change global environment
|
|
assert(getfenv(foo("")) == a)
|
|
setfenv(0, getfenv())
|
|
|
|
|
|
-- testing limits for special instructions
|
|
|
|
local a
|
|
local p = 4
|
|
for i=2,31 do
|
|
for j=-3,3 do
|
|
assert(loadstring(string.format([[local a=%s;a=a+
|
|
%s;
|
|
assert(a
|
|
==2^%s)]], j, p-j, i))) ()
|
|
assert(loadstring(string.format([[local a=%s;
|
|
a=a-%s;
|
|
assert(a==-2^%s)]], -j, p-j, i))) ()
|
|
assert(loadstring(string.format([[local a,b=0,%s;
|
|
a=b-%s;
|
|
assert(a==-2^%s)]], -j, p-j, i))) ()
|
|
end
|
|
p =2*p
|
|
end
|
|
|
|
print'+'
|
|
|
|
|
|
if rawget(_G, "querytab") then
|
|
-- testing clearing of dead elements from tables
|
|
collectgarbage("stop") -- stop GC
|
|
local a = {[{}] = 4, [3] = 0, alo = 1,
|
|
a1234567890123456789012345678901234567890 = 10}
|
|
|
|
local t = querytab(a)
|
|
|
|
for k,_ in pairs(a) do a[k] = nil end
|
|
collectgarbage() -- restore GC and collect dead fields in `a'
|
|
for i=0,t-1 do
|
|
local k = querytab(a, i)
|
|
assert(k == nil or type(k) == 'number' or k == 'alo')
|
|
end
|
|
end
|
|
|
|
return('OK')
|