Removed compatibility option LUA_COMPAT_GCPARAMS

The meaning of different GC parameters changed, so there is point in
supporting old values for them. The new code simply ignores the
parameters when changing the GC mode, so the incompatibility is small.
This commit is contained in:
Roberto Ierusalimschy 2023-12-22 14:57:43 -03:00
parent e2cc179454
commit e81f586001
6 changed files with 20 additions and 53 deletions

14
lapi.c
View File

@ -1186,25 +1186,11 @@ LUA_API int lua_gc (lua_State *L, int what, ...) {
break; break;
} }
case LUA_GCGEN: { case LUA_GCGEN: {
#if defined(LUA_COMPAT_GCPARAMS)
int minormul = va_arg(argp, int);
int minormajor = va_arg(argp, int);
if (minormul > 0) setgcparam(g, MINORMUL, minormul);
if (minormajor > 0) setgcparam(g, MINORMAJOR, minormajor);
#endif
res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN;
luaC_changemode(L, KGC_GENMINOR); luaC_changemode(L, KGC_GENMINOR);
break; break;
} }
case LUA_GCINC: { case LUA_GCINC: {
#if defined(LUA_COMPAT_GCPARAMS)
int pause = va_arg(argp, int);
int stepmul = va_arg(argp, int);
int stepsize = va_arg(argp, int);
if (pause > 0) setgcparam(g, PAUSE, pause);
if (stepmul > 0) setgcparam(g, STEPMUL, stepmul);
if (stepsize > 0) setgcparam(g, STEPSIZE, 1u << stepsize);
#endif
res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN;
luaC_changemode(L, KGC_INC); luaC_changemode(L, KGC_INC);
break; break;

View File

@ -213,8 +213,7 @@ static int luaB_collectgarbage (lua_State *L) {
return 1; return 1;
} }
case LUA_GCSTEP: { case LUA_GCSTEP: {
int step = (int)luaL_optinteger(L, 2, 0); int res = lua_gc(L, o);
int res = lua_gc(L, o, step);
checkvalres(res); checkvalres(res);
lua_pushboolean(L, res); lua_pushboolean(L, res);
return 1; return 1;
@ -226,26 +225,10 @@ static int luaB_collectgarbage (lua_State *L) {
return 1; return 1;
} }
case LUA_GCGEN: { case LUA_GCGEN: {
#if defined(LUA_COMPAT_GCPARAMS) return pushmode(L, lua_gc(L, o));
int minormul = (int)luaL_optinteger(L, 2, -1);
int majorminor = (int)luaL_optinteger(L, 3, -1);
#else
int minormul = 0;
int majorminor = 0;
#endif
return pushmode(L, lua_gc(L, o, minormul, majorminor));
} }
case LUA_GCINC: { case LUA_GCINC: {
#if defined(LUA_COMPAT_GCPARAMS) return pushmode(L, lua_gc(L, o));
int pause = (int)luaL_optinteger(L, 2, -1);
int stepmul = (int)luaL_optinteger(L, 3, -1);
int stepsize = (int)luaL_optinteger(L, 4, -1);
#else
int pause = 0;
int stepmul = 0;
int stepsize = 0;
#endif
return pushmode(L, lua_gc(L, o, pause, stepmul, stepsize));
} }
case LUA_GCSETPARAM: { case LUA_GCSETPARAM: {
static const char *const params[] = { static const char *const params[] = {

View File

@ -15,8 +15,6 @@
#define LUA_COMPAT_MATHLIB #define LUA_COMPAT_MATHLIB
#define LUA_COMPAT_LT_LE #define LUA_COMPAT_LT_LE
#define LUA_COMPAT_GCPARAMS
#define LUA_DEBUG #define LUA_DEBUG

2
lua.c
View File

@ -646,7 +646,7 @@ static int pmain (lua_State *L) {
luai_openlibs(L); /* open standard libraries */ luai_openlibs(L); /* open standard libraries */
createargtable(L, argv, argc, script); /* create table 'arg' */ createargtable(L, argv, argc, script); /* create table 'arg' */
lua_gc(L, LUA_GCRESTART); /* start GC... */ lua_gc(L, LUA_GCRESTART); /* start GC... */
lua_gc(L, LUA_GCGEN, 0, 0); /* ...in generational mode */ lua_gc(L, LUA_GCGEN); /* ...in generational mode */
if (!(args & has_E)) { /* no option '-E'? */ if (!(args & has_E)) { /* no option '-E'? */
if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */
return 0; /* error running LUA_INIT */ return 0; /* error running LUA_INIT */

View File

@ -504,7 +504,7 @@ end
do do
collectgarbage() collectgarbage()
collectgarbage"stop" collectgarbage"stop"
collectgarbage("step", 0) -- steps should not unblock the collector collectgarbage("step") -- steps should not unblock the collector
local x = gcinfo() local x = gcinfo()
repeat repeat
for i=1,1000 do _ENV.a = {} end -- no collection during the loop for i=1,1000 do _ENV.a = {} end -- no collection during the loop

View File

@ -24,12 +24,12 @@ do
assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new")) assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new"))
-- both U and the table survive one more collection -- both U and the table survive one more collection
collectgarbage("step", 0) collectgarbage("step")
assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival")) assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival"))
-- both U and the table survive yet another collection -- both U and the table survive yet another collection
-- now everything is old -- now everything is old
collectgarbage("step", 0) collectgarbage("step")
assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1"))
-- data was not corrupted -- data was not corrupted
@ -46,10 +46,10 @@ do
assert(not T or T.gcage(old) == "old") assert(not T or T.gcage(old) == "old")
setmetatable(old, {}) -- new table becomes OLD0 (barrier) setmetatable(old, {}) -- new table becomes OLD0 (barrier)
assert(not T or T.gcage(getmetatable(old)) == "old0") assert(not T or T.gcage(getmetatable(old)) == "old0")
collectgarbage("step", 0) -- new table becomes OLD1 and firstold1 collectgarbage("step") -- new table becomes OLD1 and firstold1
assert(not T or T.gcage(getmetatable(old)) == "old1") assert(not T or T.gcage(getmetatable(old)) == "old1")
setmetatable(getmetatable(old), {__gc = foo}) -- get it out of allgc list setmetatable(getmetatable(old), {__gc = foo}) -- get it out of allgc list
collectgarbage("step", 0) -- should not seg. fault collectgarbage("step") -- should not seg. fault
end end
@ -65,18 +65,18 @@ do -- bug in 5.4.0
A[1] = obj -- anchor object A[1] = obj -- anchor object
assert(not T or T.gcage(obj) == "old1") assert(not T or T.gcage(obj) == "old1")
obj = nil -- remove it from the stack obj = nil -- remove it from the stack
collectgarbage("step", 0) -- do a young collection collectgarbage("step") -- do a young collection
print(getmetatable(A[1]).x) -- metatable was collected print(getmetatable(A[1]).x) -- metatable was collected
end end
collectgarbage() -- make A old collectgarbage() -- make A old
local obj = {} -- create a new object local obj = {} -- create a new object
collectgarbage("step", 0) -- make it a survival collectgarbage("step") -- make it a survival
assert(not T or T.gcage(obj) == "survival") assert(not T or T.gcage(obj) == "survival")
setmetatable(obj, {__gc = gcf, x = "+"}) -- create its metatable setmetatable(obj, {__gc = gcf, x = "+"}) -- create its metatable
assert(not T or T.gcage(getmetatable(obj)) == "new") assert(not T or T.gcage(getmetatable(obj)) == "new")
obj = nil -- clear object obj = nil -- clear object
collectgarbage("step", 0) -- will call obj's finalizer collectgarbage("step") -- will call obj's finalizer
end end
@ -94,13 +94,13 @@ do -- another bug in 5.4.0
end end
) )
local _, f = coroutine.resume(co) -- create closure over 'x' in coroutine local _, f = coroutine.resume(co) -- create closure over 'x' in coroutine
collectgarbage("step", 0) -- make upvalue a survival collectgarbage("step") -- make upvalue a survival
old[1] = {"hello"} -- 'old' go to grayagain as 'touched1' old[1] = {"hello"} -- 'old' go to grayagain as 'touched1'
coroutine.resume(co, {123}) -- its value will be new coroutine.resume(co, {123}) -- its value will be new
co = nil co = nil
collectgarbage("step", 0) -- hit the barrier collectgarbage("step") -- hit the barrier
assert(f() == 123 and old[1][1] == "hello") assert(f() == 123 and old[1][1] == "hello")
collectgarbage("step", 0) -- run the collector once more collectgarbage("step") -- run the collector once more
-- make sure old[1] was not collected -- make sure old[1] was not collected
assert(f() == 123 and old[1][1] == "hello") assert(f() == 123 and old[1][1] == "hello")
end end
@ -112,12 +112,12 @@ do -- bug introduced in commit 9cf3299fa
assert(not T or T.gcage(t) == "old") assert(not T or T.gcage(t) == "old")
t[1] = {10} t[1] = {10}
assert(not T or (T.gcage(t) == "touched1" and T.gccolor(t) == "gray")) assert(not T or (T.gcage(t) == "touched1" and T.gccolor(t) == "gray"))
collectgarbage("step", 0) -- minor collection collectgarbage("step") -- minor collection
assert(not T or (T.gcage(t) == "touched2" and T.gccolor(t) == "black")) assert(not T or (T.gcage(t) == "touched2" and T.gccolor(t) == "black"))
collectgarbage("step", 0) -- minor collection collectgarbage("step") -- minor collection
assert(not T or T.gcage(t) == "old") -- t should be black, but it was gray assert(not T or T.gcage(t) == "old") -- t should be black, but it was gray
t[1] = {10} -- no barrier here, so t was still old t[1] = {10} -- no barrier here, so t was still old
collectgarbage("step", 0) -- minor collection collectgarbage("step") -- minor collection
-- t, being old, is ignored by the collection, so it is not cleared -- t, being old, is ignored by the collection, so it is not cleared
assert(t[1] == nil) -- fails with the bug assert(t[1] == nil) -- fails with the bug
end end
@ -144,13 +144,13 @@ do
T.gcage(debug.getuservalue(U)) == "new") T.gcage(debug.getuservalue(U)) == "new")
-- both U and the table survive one more collection -- both U and the table survive one more collection
collectgarbage("step", 0) collectgarbage("step")
assert(T.gcage(U) == "touched2" and assert(T.gcage(U) == "touched2" and
T.gcage(debug.getuservalue(U)) == "survival") T.gcage(debug.getuservalue(U)) == "survival")
-- both U and the table survive yet another collection -- both U and the table survive yet another collection
-- now everything is old -- now everything is old
collectgarbage("step", 0) collectgarbage("step")
assert(T.gcage(U) == "old" and assert(T.gcage(U) == "old" and
T.gcage(debug.getuservalue(U)) == "old1") T.gcage(debug.getuservalue(U)) == "old1")