From e81f586001d767c8de9b760ae2e2c3b5da1542c6 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 22 Dec 2023 14:57:43 -0300 Subject: 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. --- lapi.c | 14 -------------- lbaselib.c | 23 +++-------------------- ltests.h | 2 -- lua.c | 2 +- testes/gc.lua | 2 +- testes/gengc.lua | 30 +++++++++++++++--------------- 6 files changed, 20 insertions(+), 53 deletions(-) diff --git a/lapi.c b/lapi.c index aa2ee735..dcdc1cd3 100644 --- a/lapi.c +++ b/lapi.c @@ -1186,25 +1186,11 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { break; } 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; luaC_changemode(L, KGC_GENMINOR); break; } 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; luaC_changemode(L, KGC_INC); break; diff --git a/lbaselib.c b/lbaselib.c index 03df57f8..a9d39e9f 100644 --- a/lbaselib.c +++ b/lbaselib.c @@ -213,8 +213,7 @@ static int luaB_collectgarbage (lua_State *L) { return 1; } case LUA_GCSTEP: { - int step = (int)luaL_optinteger(L, 2, 0); - int res = lua_gc(L, o, step); + int res = lua_gc(L, o); checkvalres(res); lua_pushboolean(L, res); return 1; @@ -226,26 +225,10 @@ static int luaB_collectgarbage (lua_State *L) { return 1; } case LUA_GCGEN: { -#if defined(LUA_COMPAT_GCPARAMS) - 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)); + return pushmode(L, lua_gc(L, o)); } case LUA_GCINC: { -#if defined(LUA_COMPAT_GCPARAMS) - 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)); + return pushmode(L, lua_gc(L, o)); } case LUA_GCSETPARAM: { static const char *const params[] = { diff --git a/ltests.h b/ltests.h index 70afa7a3..da773d6e 100644 --- a/ltests.h +++ b/ltests.h @@ -15,8 +15,6 @@ #define LUA_COMPAT_MATHLIB #define LUA_COMPAT_LT_LE -#define LUA_COMPAT_GCPARAMS - #define LUA_DEBUG diff --git a/lua.c b/lua.c index 1e884b07..e574ec9b 100644 --- a/lua.c +++ b/lua.c @@ -646,7 +646,7 @@ static int pmain (lua_State *L) { luai_openlibs(L); /* open standard libraries */ createargtable(L, argv, argc, script); /* create table 'arg' */ 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 (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ 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 do collectgarbage() collectgarbage"stop" - collectgarbage("step", 0) -- steps should not unblock the collector + collectgarbage("step") -- steps should not unblock the collector local x = gcinfo() repeat 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 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) + collectgarbage("step") 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) + collectgarbage("step") assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) -- data was not corrupted @@ -46,10 +46,10 @@ do assert(not T or T.gcage(old) == "old") setmetatable(old, {}) -- new table becomes OLD0 (barrier) 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") 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 @@ -65,18 +65,18 @@ do -- bug in 5.4.0 A[1] = obj -- anchor object assert(not T or T.gcage(obj) == "old1") 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 end collectgarbage() -- make A old 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") setmetatable(obj, {__gc = gcf, x = "+"}) -- create its metatable assert(not T or T.gcage(getmetatable(obj)) == "new") obj = nil -- clear object - collectgarbage("step", 0) -- will call obj's finalizer + collectgarbage("step") -- will call obj's finalizer end @@ -94,13 +94,13 @@ do -- another bug in 5.4.0 end ) 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' coroutine.resume(co, {123}) -- its value will be new co = nil - collectgarbage("step", 0) -- hit the barrier + collectgarbage("step") -- hit the barrier 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 assert(f() == 123 and old[1][1] == "hello") end @@ -112,12 +112,12 @@ do -- bug introduced in commit 9cf3299fa assert(not T or T.gcage(t) == "old") t[1] = {10} 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")) - 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 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 assert(t[1] == nil) -- fails with the bug end @@ -144,13 +144,13 @@ do T.gcage(debug.getuservalue(U)) == "new") -- both U and the table survive one more collection - collectgarbage("step", 0) + collectgarbage("step") 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) + collectgarbage("step") assert(T.gcage(U) == "old" and T.gcage(debug.getuservalue(U)) == "old1") -- cgit v1.2.3-55-g6feb