Bug: luaL_traceback may need more than 5 stack slots

This commit is contained in:
Roberto Ierusalimschy 2024-06-12 16:02:01 -03:00
parent d51022bf9e
commit b529aefc53
3 changed files with 20 additions and 1 deletions

View File

@ -80,6 +80,7 @@ static int pushglobalfuncname (lua_State *L, lua_Debug *ar) {
int top = lua_gettop(L); int top = lua_gettop(L);
lua_getinfo(L, "f", ar); /* push function */ lua_getinfo(L, "f", ar); /* push function */
lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
luaL_checkstack(L, 6, "not enough stack"); /* slots for 'findfield' */
if (findfield(L, top + 1, 2)) { if (findfield(L, top + 1, 2)) {
const char *name = lua_tostring(L, -1); const char *name = lua_tostring(L, -1);
if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */ if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */

View File

@ -1733,6 +1733,11 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
int nres; int nres;
status = lua_resume(lua_tothread(L1, i), L, getnum, &nres); status = lua_resume(lua_tothread(L1, i), L, getnum, &nres);
} }
else if EQ("traceback") {
const char *msg = getstring;
int level = getnum;
luaL_traceback(L1, L1, msg, level);
}
else if EQ("return") { else if EQ("return") {
int n = getnum; int n = getnum;
if (L1 != L) { if (L1 != L) {

View File

@ -91,7 +91,7 @@ end
if not T then if not T then
(Message or print) (Message or print)
('\n >>> testC not active: skipping memory message test <<<\n') ('\n >>> testC not active: skipping tests for messages in C <<<\n')
else else
print "testing memory error message" print "testing memory error message"
local a = {} local a = {}
@ -104,6 +104,19 @@ else
end) end)
T.totalmem(0) T.totalmem(0)
assert(not st and msg == "not enough" .. " memory") assert(not st and msg == "not enough" .. " memory")
-- stack space for luaL_traceback (bug in 5.4.6)
local res = T.testC[[
# push 16 elements on the stack
pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1;
pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1;
pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1;
pushnum 1;
# traceback should work with 4 remaining slots
traceback xuxu 1;
return 1
]]
assert(string.find(res, "xuxu.-main chunk"))
end end