aboutsummaryrefslogtreecommitdiff
path: root/testes/gengc.lua
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--testes/gengc.lua83
1 files changed, 83 insertions, 0 deletions
diff --git a/testes/gengc.lua b/testes/gengc.lua
new file mode 100644
index 00000000..36aed806
--- /dev/null
+++ b/testes/gengc.lua
@@ -0,0 +1,83 @@
1-- $Id: gengc.lua $
2-- See Copyright Notice in file all.lua
3
4print('testing generational garbage collection')
5
6local debug = require"debug"
7
8assert(collectgarbage("isrunning"))
9
10collectgarbage()
11
12local oldmode = collectgarbage("generational")
13
14
15-- ensure that table barrier evolves correctly
16do
17 local U = {}
18 -- full collection makes 'U' old
19 collectgarbage()
20 assert(not T or T.gcage(U) == "old")
21
22 -- U refers to a new table, so it becomes 'touched1'
23 U[1] = {x = {234}}
24 assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new"))
25
26 -- both U and the table survive one more collection
27 collectgarbage("step", 0)
28 assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival"))
29
30 -- both U and the table survive yet another collection
31 -- now everything is old
32 collectgarbage("step", 0)
33 assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1"))
34
35 -- data was not corrupted
36 assert(U[1].x[1] == 234)
37end
38
39
40if T == nil then
41 (Message or print)('\n >>> testC not active: \z
42 skipping some generational tests <<<\n')
43 print 'OK'
44 return
45end
46
47
48-- ensure that userdata barrier evolves correctly
49do
50 local U = T.newuserdata(0, 1)
51 -- full collection makes 'U' old
52 collectgarbage()
53 assert(T.gcage(U) == "old")
54
55 -- U refers to a new table, so it becomes 'touched1'
56 debug.setuservalue(U, {x = {234}})
57 assert(T.gcage(U) == "touched1" and
58 T.gcage(debug.getuservalue(U)) == "new")
59
60 -- both U and the table survive one more collection
61 collectgarbage("step", 0)
62 assert(T.gcage(U) == "touched2" and
63 T.gcage(debug.getuservalue(U)) == "survival")
64
65 -- both U and the table survive yet another collection
66 -- now everything is old
67 collectgarbage("step", 0)
68 assert(T.gcage(U) == "old" and
69 T.gcage(debug.getuservalue(U)) == "old1")
70
71 -- data was not corrupted
72 assert(debug.getuservalue(U).x[1] == 234)
73end
74
75
76
77-- just to make sure
78assert(collectgarbage'isrunning')
79
80collectgarbage(oldmode)
81
82print('OK')
83