-- $Id: testes/gengc.lua $ -- See Copyright Notice in file all.lua print('testing generational garbage collection') local debug = require"debug" assert(collectgarbage("isrunning")) collectgarbage() local oldmode = collectgarbage("generational") -- ensure that table barrier evolves correctly do local U = {} -- full collection makes 'U' old collectgarbage() assert(not T or T.gcage(U) == "old") -- U refers to a new table, so it becomes 'touched1' U[1] = {x = {234}} assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new")) -- both U and the table survive one more collection collectgarbage("step", 0) assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival")) -- both U and the table survive yet another collection -- now everything is old collectgarbage("step", 0) assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) -- data was not corrupted assert(U[1].x[1] == 234) end if T == nil then (Message or print)('\n >>> testC not active: \z skipping some generational tests <<<\n') print 'OK' return end -- ensure that userdata barrier evolves correctly do local U = T.newuserdata(0, 1) -- full collection makes 'U' old collectgarbage() assert(T.gcage(U) == "old") -- U refers to a new table, so it becomes 'touched1' debug.setuservalue(U, {x = {234}}) assert(T.gcage(U) == "touched1" and T.gcage(debug.getuservalue(U)) == "new") -- both U and the table survive one more collection collectgarbage("step", 0) assert(T.gcage(U) == "touched2" and T.gcage(debug.getuservalue(U)) == "survival") -- both U and the table survive yet another collection -- now everything is old collectgarbage("step", 0) assert(T.gcage(U) == "old" and T.gcage(debug.getuservalue(U)) == "old1") -- data was not corrupted assert(debug.getuservalue(U).x[1] == 234) end -- just to make sure assert(collectgarbage'isrunning') collectgarbage(oldmode) print('OK')