Luiz Henrique de Figueiredo wrote:
Here's another version, based on code from PiL:
http://www.lua.org/pil/24.2.3.html
static void dumpstack (lua_State *L, const char *message) {
int i;
int top=lua_gettop(L);
printf("dumpstack -- %s\n",message);
for (i=1; i<=top; i++) {
printf("%d\t%s\t",i,luaL_typename(L,i));
switch (lua_type(L, i)) {
case LUA_TNUMBER:
printf("%g\n",lua_tonumber(L,i));
break;
case LUA_TSTRING:
printf("%s\n",lua_tostring(L,i));
break;
case LUA_TBOOLEAN:
printf("%s\n", (lua_toboolean(L, i) ? "true" : "false"));
break;
case LUA_TNIL:
printf("%s\n", "nil");
break;
default:
printf("%p\n",lua_topointer(L,i));
break;
}
}
printf("dumpstack -- END\n");
}
Sometimes seeing coroutine status is helpful, too:
// For Lua 5.1.1 & 5.0.2
case LUA_TTHREAD:
{
lua_State *pThread = lua_tothread(L, i);
if (pThread)
{
if (pThread == L)
{
printf("running\n");
}
else
{
#if LUA_VER >= 511
switch (lua_status(pThread))
{
case LUA_YIELD: printf("suspended\n"); break;
case 0:
{
lua_Debug ar;
if (lua_getstack(pThread, 0, &ar) > 0)
printf("normal\n");
else if (lua_gettop(pThread) == 0)
printf("dead\n");
else
printf("suspended\n");
}
break;
default: printf("dead\n"); break;
}
#else
lua_debug ar;
if ((lua_getstack(pThread, 0, &ar) == 0) &&
(lua_gettop(pThread) == 0))
printf("dead\n");
else
printf("suspended\n");
#endif
}
}
}
break;