1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- -- $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')
|