diff options
-rw-r--r-- | lapi.c | 14 | ||||
-rw-r--r-- | lbaselib.c | 23 | ||||
-rw-r--r-- | ltests.h | 2 | ||||
-rw-r--r-- | lua.c | 2 | ||||
-rw-r--r-- | testes/gc.lua | 2 | ||||
-rw-r--r-- | testes/gengc.lua | 30 |
6 files changed, 20 insertions, 53 deletions
@@ -1186,25 +1186,11 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { | |||
1186 | break; | 1186 | break; |
1187 | } | 1187 | } |
1188 | case LUA_GCGEN: { | 1188 | case LUA_GCGEN: { |
1189 | #if defined(LUA_COMPAT_GCPARAMS) | ||
1190 | int minormul = va_arg(argp, int); | ||
1191 | int minormajor = va_arg(argp, int); | ||
1192 | if (minormul > 0) setgcparam(g, MINORMUL, minormul); | ||
1193 | if (minormajor > 0) setgcparam(g, MINORMAJOR, minormajor); | ||
1194 | #endif | ||
1195 | res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; | 1189 | res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; |
1196 | luaC_changemode(L, KGC_GENMINOR); | 1190 | luaC_changemode(L, KGC_GENMINOR); |
1197 | break; | 1191 | break; |
1198 | } | 1192 | } |
1199 | case LUA_GCINC: { | 1193 | case LUA_GCINC: { |
1200 | #if defined(LUA_COMPAT_GCPARAMS) | ||
1201 | int pause = va_arg(argp, int); | ||
1202 | int stepmul = va_arg(argp, int); | ||
1203 | int stepsize = va_arg(argp, int); | ||
1204 | if (pause > 0) setgcparam(g, PAUSE, pause); | ||
1205 | if (stepmul > 0) setgcparam(g, STEPMUL, stepmul); | ||
1206 | if (stepsize > 0) setgcparam(g, STEPSIZE, 1u << stepsize); | ||
1207 | #endif | ||
1208 | res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; | 1194 | res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; |
1209 | luaC_changemode(L, KGC_INC); | 1195 | luaC_changemode(L, KGC_INC); |
1210 | break; | 1196 | break; |
@@ -213,8 +213,7 @@ static int luaB_collectgarbage (lua_State *L) { | |||
213 | return 1; | 213 | return 1; |
214 | } | 214 | } |
215 | case LUA_GCSTEP: { | 215 | case LUA_GCSTEP: { |
216 | int step = (int)luaL_optinteger(L, 2, 0); | 216 | int res = lua_gc(L, o); |
217 | int res = lua_gc(L, o, step); | ||
218 | checkvalres(res); | 217 | checkvalres(res); |
219 | lua_pushboolean(L, res); | 218 | lua_pushboolean(L, res); |
220 | return 1; | 219 | return 1; |
@@ -226,26 +225,10 @@ static int luaB_collectgarbage (lua_State *L) { | |||
226 | return 1; | 225 | return 1; |
227 | } | 226 | } |
228 | case LUA_GCGEN: { | 227 | case LUA_GCGEN: { |
229 | #if defined(LUA_COMPAT_GCPARAMS) | 228 | return pushmode(L, lua_gc(L, o)); |
230 | int minormul = (int)luaL_optinteger(L, 2, -1); | ||
231 | int majorminor = (int)luaL_optinteger(L, 3, -1); | ||
232 | #else | ||
233 | int minormul = 0; | ||
234 | int majorminor = 0; | ||
235 | #endif | ||
236 | return pushmode(L, lua_gc(L, o, minormul, majorminor)); | ||
237 | } | 229 | } |
238 | case LUA_GCINC: { | 230 | case LUA_GCINC: { |
239 | #if defined(LUA_COMPAT_GCPARAMS) | 231 | return pushmode(L, lua_gc(L, o)); |
240 | int pause = (int)luaL_optinteger(L, 2, -1); | ||
241 | int stepmul = (int)luaL_optinteger(L, 3, -1); | ||
242 | int stepsize = (int)luaL_optinteger(L, 4, -1); | ||
243 | #else | ||
244 | int pause = 0; | ||
245 | int stepmul = 0; | ||
246 | int stepsize = 0; | ||
247 | #endif | ||
248 | return pushmode(L, lua_gc(L, o, pause, stepmul, stepsize)); | ||
249 | } | 232 | } |
250 | case LUA_GCSETPARAM: { | 233 | case LUA_GCSETPARAM: { |
251 | static const char *const params[] = { | 234 | static const char *const params[] = { |
@@ -15,8 +15,6 @@ | |||
15 | #define LUA_COMPAT_MATHLIB | 15 | #define LUA_COMPAT_MATHLIB |
16 | #define LUA_COMPAT_LT_LE | 16 | #define LUA_COMPAT_LT_LE |
17 | 17 | ||
18 | #define LUA_COMPAT_GCPARAMS | ||
19 | |||
20 | 18 | ||
21 | #define LUA_DEBUG | 19 | #define LUA_DEBUG |
22 | 20 | ||
@@ -646,7 +646,7 @@ static int pmain (lua_State *L) { | |||
646 | luai_openlibs(L); /* open standard libraries */ | 646 | luai_openlibs(L); /* open standard libraries */ |
647 | createargtable(L, argv, argc, script); /* create table 'arg' */ | 647 | createargtable(L, argv, argc, script); /* create table 'arg' */ |
648 | lua_gc(L, LUA_GCRESTART); /* start GC... */ | 648 | lua_gc(L, LUA_GCRESTART); /* start GC... */ |
649 | lua_gc(L, LUA_GCGEN, 0, 0); /* ...in generational mode */ | 649 | lua_gc(L, LUA_GCGEN); /* ...in generational mode */ |
650 | if (!(args & has_E)) { /* no option '-E'? */ | 650 | if (!(args & has_E)) { /* no option '-E'? */ |
651 | if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ | 651 | if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ |
652 | return 0; /* error running LUA_INIT */ | 652 | return 0; /* error running LUA_INIT */ |
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 | ||