--- 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'