---
source: src/main.rs
expression: compiled
input_file: test-data/lua5.4-tests/big.lua
---
if _soft {
return 'a'
}
print("testing large tables");
local debug = require("debug")
local lim = 2 ^ 18 + 1000
local prog = {
"local y = {0"
}
for i = 1, lim {
prog[(#prog + 1)] = i
}
prog[(#prog + 1)] = "}\n"
prog[(#prog + 1)] = "X = y\n"
prog[(#prog + 1)] = ("assert(X[%d] == %d)")::format(lim - 1, lim - 2)
prog[(#prog + 1)] = "return 0"
prog = table.concat(prog, ";")
local env = {
string = string,
assert = assert
}
local f = assert(load(prog, nil, nil, env))
f();
assert(env.X[(lim)] == lim - 1 && env.X[(lim + 1)] == lim);
for k with pairs(env) {
env[(k)] = undef
}
setmetatable(env, {
__index = fn (t, n) {
coroutine.yield('g');
return _G[(n)]
},
__newindex = fn (t, n, v) {
coroutine.yield('s');
_G[(n)] = v
}
});
X = nil
co = coroutine.wrap(f)
assert(co() == 's');
assert(co() == 'g');
assert(co() == 'g');
assert(co() == 0);
assert(X[(lim)] == lim - 1 && X[(lim + 1)] == lim);
getmetatable(env).__index = fn () {
}
getmetatable(env).__newindex = fn () {
}
local e, m = pcall(f)
assert(!e && m::find("global 'X'"));
getmetatable(env).__newindex = fn () {
error("hi");
}
local e, m = xpcall(f, debug.traceback)
assert(!e && m::find("'newindex'"));
f, X = nil
coroutine.yield('b');
if 2 ^ 32 == 0 {
print("testing string length overflow");
local repstrings = 192
local ssize = math.ceil(2.0 ^ 32 / repstrings) + 1
assert(repstrings * ssize > 2.0 ^ 32);
local longs = string.rep("\0", ssize)
local rep = assert(load("local a = ...; return " .. string.rep("a", repstrings, "..")))
local a, b = pcall(rep, longs)
assert(!a && string.find(b, "overflow"));
}
print('OK');
return 'a'