do --- debug-gc
-- Do not run this test unless the JIT compiler is turned off.
if jit and jit.status and jit.status() then return end
local caught, caught_line, caught_mm
local
if caught ~= "end" then
-- print(debug.traceback())
-- This may point to the wrong instruction if in a JIT trace.
-- But there's no guarantee if, when or where any GC steps occur.
local dbg = debug.getinfo(2)
caught_line = dbg.currentline
caught_mm = debug.getinfo(1).name
caught = true
end
end
local
collectgarbage()
caught = false
local u = newproxy(true)
getmetatable(u).__gc = gcmeta
u = nil
for i=1,100000 do
f(i)
-- This check may be hoisted. __gc is not supposed to have side-effects.
if caught then break end
end
if not caught then
error(mm.." metamethod not called", 2)
end
if type(caught_line) ~= "number" or caught_line < 0 then
error("bad linenumber in debug info", 2)
end
if caught_mm ~= mm then
error("bad name for metamethod in debug info", 2)
end
end
local x
testgc("__gc", function(i) x = {} end)
testgc("__gc", function(i) x = {1} end)
testgc("__gc", function(i) x = function() end end)
testgc("__concat", function(i) x = i.."" end)
caught = "end"
end