diff options
Diffstat (limited to 'testes')
-rw-r--r-- | testes/gc.lua | 2 | ||||
-rw-r--r-- | testes/gengc.lua | 30 |
2 files changed, 16 insertions, 16 deletions
diff --git a/testes/gc.lua b/testes/gc.lua index 61b5da9c..8bacffa0 100644 --- a/testes/gc.lua +++ b/testes/gc.lua | |||
@@ -504,7 +504,7 @@ end | |||
504 | do | 504 | do |
505 | collectgarbage() | 505 | collectgarbage() |
506 | collectgarbage"stop" | 506 | collectgarbage"stop" |
507 | collectgarbage("step", 0) -- steps should not unblock the collector | 507 | collectgarbage("step") -- steps should not unblock the collector |
508 | local x = gcinfo() | 508 | local x = gcinfo() |
509 | repeat | 509 | repeat |
510 | for i=1,1000 do _ENV.a = {} end -- no collection during the loop | 510 | for i=1,1000 do _ENV.a = {} end -- no collection during the loop |
diff --git a/testes/gengc.lua b/testes/gengc.lua index cae07285..51872cc1 100644 --- a/testes/gengc.lua +++ b/testes/gengc.lua | |||
@@ -24,12 +24,12 @@ do | |||
24 | assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new")) | 24 | assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new")) |
25 | 25 | ||
26 | -- both U and the table survive one more collection | 26 | -- both U and the table survive one more collection |
27 | collectgarbage("step", 0) | 27 | collectgarbage("step") |
28 | assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival")) | 28 | assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival")) |
29 | 29 | ||
30 | -- both U and the table survive yet another collection | 30 | -- both U and the table survive yet another collection |
31 | -- now everything is old | 31 | -- now everything is old |
32 | collectgarbage("step", 0) | 32 | collectgarbage("step") |
33 | assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) | 33 | assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) |
34 | 34 | ||
35 | -- data was not corrupted | 35 | -- data was not corrupted |
@@ -46,10 +46,10 @@ do | |||
46 | assert(not T or T.gcage(old) == "old") | 46 | assert(not T or T.gcage(old) == "old") |
47 | setmetatable(old, {}) -- new table becomes OLD0 (barrier) | 47 | setmetatable(old, {}) -- new table becomes OLD0 (barrier) |
48 | assert(not T or T.gcage(getmetatable(old)) == "old0") | 48 | assert(not T or T.gcage(getmetatable(old)) == "old0") |
49 | collectgarbage("step", 0) -- new table becomes OLD1 and firstold1 | 49 | collectgarbage("step") -- new table becomes OLD1 and firstold1 |
50 | assert(not T or T.gcage(getmetatable(old)) == "old1") | 50 | assert(not T or T.gcage(getmetatable(old)) == "old1") |
51 | setmetatable(getmetatable(old), {__gc = foo}) -- get it out of allgc list | 51 | setmetatable(getmetatable(old), {__gc = foo}) -- get it out of allgc list |
52 | collectgarbage("step", 0) -- should not seg. fault | 52 | collectgarbage("step") -- should not seg. fault |
53 | end | 53 | end |
54 | 54 | ||
55 | 55 | ||
@@ -65,18 +65,18 @@ do -- bug in 5.4.0 | |||
65 | A[1] = obj -- anchor object | 65 | A[1] = obj -- anchor object |
66 | assert(not T or T.gcage(obj) == "old1") | 66 | assert(not T or T.gcage(obj) == "old1") |
67 | obj = nil -- remove it from the stack | 67 | obj = nil -- remove it from the stack |
68 | collectgarbage("step", 0) -- do a young collection | 68 | collectgarbage("step") -- do a young collection |
69 | print(getmetatable(A[1]).x) -- metatable was collected | 69 | print(getmetatable(A[1]).x) -- metatable was collected |
70 | end | 70 | end |
71 | 71 | ||
72 | collectgarbage() -- make A old | 72 | collectgarbage() -- make A old |
73 | local obj = {} -- create a new object | 73 | local obj = {} -- create a new object |
74 | collectgarbage("step", 0) -- make it a survival | 74 | collectgarbage("step") -- make it a survival |
75 | assert(not T or T.gcage(obj) == "survival") | 75 | assert(not T or T.gcage(obj) == "survival") |
76 | setmetatable(obj, {__gc = gcf, x = "+"}) -- create its metatable | 76 | setmetatable(obj, {__gc = gcf, x = "+"}) -- create its metatable |
77 | assert(not T or T.gcage(getmetatable(obj)) == "new") | 77 | assert(not T or T.gcage(getmetatable(obj)) == "new") |
78 | obj = nil -- clear object | 78 | obj = nil -- clear object |
79 | collectgarbage("step", 0) -- will call obj's finalizer | 79 | collectgarbage("step") -- will call obj's finalizer |
80 | end | 80 | end |
81 | 81 | ||
82 | 82 | ||
@@ -94,13 +94,13 @@ do -- another bug in 5.4.0 | |||
94 | end | 94 | end |
95 | ) | 95 | ) |
96 | local _, f = coroutine.resume(co) -- create closure over 'x' in coroutine | 96 | local _, f = coroutine.resume(co) -- create closure over 'x' in coroutine |
97 | collectgarbage("step", 0) -- make upvalue a survival | 97 | collectgarbage("step") -- make upvalue a survival |
98 | old[1] = {"hello"} -- 'old' go to grayagain as 'touched1' | 98 | old[1] = {"hello"} -- 'old' go to grayagain as 'touched1' |
99 | coroutine.resume(co, {123}) -- its value will be new | 99 | coroutine.resume(co, {123}) -- its value will be new |
100 | co = nil | 100 | co = nil |
101 | collectgarbage("step", 0) -- hit the barrier | 101 | collectgarbage("step") -- hit the barrier |
102 | assert(f() == 123 and old[1][1] == "hello") | 102 | assert(f() == 123 and old[1][1] == "hello") |
103 | collectgarbage("step", 0) -- run the collector once more | 103 | collectgarbage("step") -- run the collector once more |
104 | -- make sure old[1] was not collected | 104 | -- make sure old[1] was not collected |
105 | assert(f() == 123 and old[1][1] == "hello") | 105 | assert(f() == 123 and old[1][1] == "hello") |
106 | end | 106 | end |
@@ -112,12 +112,12 @@ do -- bug introduced in commit 9cf3299fa | |||
112 | assert(not T or T.gcage(t) == "old") | 112 | assert(not T or T.gcage(t) == "old") |
113 | t[1] = {10} | 113 | t[1] = {10} |
114 | assert(not T or (T.gcage(t) == "touched1" and T.gccolor(t) == "gray")) | 114 | assert(not T or (T.gcage(t) == "touched1" and T.gccolor(t) == "gray")) |
115 | collectgarbage("step", 0) -- minor collection | 115 | collectgarbage("step") -- minor collection |
116 | assert(not T or (T.gcage(t) == "touched2" and T.gccolor(t) == "black")) | 116 | assert(not T or (T.gcage(t) == "touched2" and T.gccolor(t) == "black")) |
117 | collectgarbage("step", 0) -- minor collection | 117 | collectgarbage("step") -- minor collection |
118 | assert(not T or T.gcage(t) == "old") -- t should be black, but it was gray | 118 | assert(not T or T.gcage(t) == "old") -- t should be black, but it was gray |
119 | t[1] = {10} -- no barrier here, so t was still old | 119 | t[1] = {10} -- no barrier here, so t was still old |
120 | collectgarbage("step", 0) -- minor collection | 120 | collectgarbage("step") -- minor collection |
121 | -- t, being old, is ignored by the collection, so it is not cleared | 121 | -- t, being old, is ignored by the collection, so it is not cleared |
122 | assert(t[1] == nil) -- fails with the bug | 122 | assert(t[1] == nil) -- fails with the bug |
123 | end | 123 | end |
@@ -144,13 +144,13 @@ do | |||
144 | T.gcage(debug.getuservalue(U)) == "new") | 144 | T.gcage(debug.getuservalue(U)) == "new") |
145 | 145 | ||
146 | -- both U and the table survive one more collection | 146 | -- both U and the table survive one more collection |
147 | collectgarbage("step", 0) | 147 | collectgarbage("step") |
148 | assert(T.gcage(U) == "touched2" and | 148 | assert(T.gcage(U) == "touched2" and |
149 | T.gcage(debug.getuservalue(U)) == "survival") | 149 | T.gcage(debug.getuservalue(U)) == "survival") |
150 | 150 | ||
151 | -- both U and the table survive yet another collection | 151 | -- both U and the table survive yet another collection |
152 | -- now everything is old | 152 | -- now everything is old |
153 | collectgarbage("step", 0) | 153 | collectgarbage("step") |
154 | assert(T.gcage(U) == "old" and | 154 | assert(T.gcage(U) == "old" and |
155 | T.gcage(debug.getuservalue(U)) == "old1") | 155 | T.gcage(debug.getuservalue(U)) == "old1") |
156 | 156 | ||