int debug_getsize(lua_State* L) { TValue* o = L->base; switch (o->tt) { /* Container types */ case LUA_TTABLE: { Table *h = hvalue(o); lua_pushinteger(L, sizeof(Table) + sizeof(TValue) * h->sizearray + sizeof(Node) * sizenode(h)); break; } case LUA_TFUNCTION: { Closure *cl = clvalue(o); lua_pushinteger(L, (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : sizeLclosure(cl->l.nupvalues)); break; } case LUA_TTHREAD: { lua_State *th = thvalue(o); lua_pushinteger(L, sizeof(lua_State) + sizeof(TValue) * th->stacksize + sizeof(CallInfo) * th->size_ci); break; } case LUA_TPROTO: { Proto *p = pvalue(o); lua_pushinteger(L, sizeof(Proto) + sizeof(Instruction) * p->sizecode + sizeof(Proto *) * p->sizep + sizeof(TValue) * p->sizek + sizeof(int) * p->sizelineinfo + sizeof(LocVar) * p->sizelocvars + sizeof(TString *) * p->sizeupvalues); break; } /* Non-containers */ case LUA_TUSERDATA: { lua_pushnumber(L, uvalue(o)->len); break; } case LUA_TLIGHTUSERDATA: { lua_pushnumber(L, sizeof(void*)); break; } case LUA_TSTRING: { TString *s = rawtsvalue(o); lua_pushinteger(L, sizeof(TString) + s->tsv.len + 1); break; } case LUA_TNUMBER: { lua_pushinteger(L, sizeof(lua_Number)); break; } case LUA_TBOOLEAN: { lua_pushinteger(L, sizeof(int)); break; } default: return 0; } return 1; }
LUA_API const void *lua_topointer (lua_State *L, int idx) { StkId o = index2addr(L, idx); switch (ttype(o)) { case LUA_TTABLE: return hvalue(o); case LUA_TLCL: return clLvalue(o); case LUA_TCCL: return clCvalue(o); case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o))); case LUA_TTHREAD: return thvalue(o); case LUA_TUSERDATA: return getudatamem(uvalue(o)); case LUA_TLIGHTUSERDATA: return pvalue(o); default: return NULL; } }
LUA_API const void *lua_topointer (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); if (o == NULL) return NULL; else { switch (ttype(o)) { case LUA_TTABLE: return hvalue(o); case LUA_TFUNCTION: return clvalue(o); case LUA_TTHREAD: return thvalue(o); case LUA_TUSERDATA: case LUA_TLIGHTUSERDATA: return lua_touserdata(L, idx); default: return NULL; } } }
LUA_API lua_State *lua_tothread (lua_State *L, int idx) { StkId o = index2addr(L, idx); return (!ttisthread(o)) ? NULL : thvalue(o); }
LUA_API lua_State *lua_tothread (lua_State *L, int idx) { StkId o = luaA_indexAcceptable(L, idx); return (o == NULL || !ttisthread(o)) ? NULL : thvalue(o); }
//----------------------------------------------------------------// static void _dumpType ( lua_State* L, int idx, const char *name, bool verbose, TableSet& foundTables ) { MOAILuaState state ( L ); const char *format = DUMP_FORMAT; idx = state.AbsIndex( idx ); StkId tvalue = state->base + idx - 1; switch ( lua_type ( state, idx )) { case LUA_TBOOLEAN: ZLLog::Print ( format, tvalue, "bool", name ); ZLLog::Print ( " = %s", lua_toboolean ( state, idx ) ? "true" : "false" ); break; case LUA_TFUNCTION: { const char *funcType = iscfunction ( tvalue ) ? "C function" : "Lua function"; ZLLog::Print ( format, clvalue ( tvalue ), funcType, name ); break; } case LUA_TLIGHTUSERDATA: ZLLog::Print ( format, pvalue ( tvalue ), "pointer", name ); break; case LUA_TNIL: ZLLog::Print ( format, tvalue, "nil", name ); break; case LUA_TNONE: // Intentionally do nothing--not even the line break. return; case LUA_TNUMBER: ZLLog::Print ( format, tvalue, "number", name ); ZLLog::Print ( " = %f", lua_tonumber ( state, idx )); break; case LUA_TSTRING: ZLLog::Print ( format, rawtsvalue( tvalue ), "string", name ); ZLLog::Print ( " = \"%s\"", lua_tostring ( state, idx )); break; case LUA_TTABLE: { struct Table* htable = hvalue( tvalue ); if ( foundTables.contains ( htable )) { ZLLog::Print ( DUMP_FORMAT " (see above)", htable, "table", name ); break; } else { foundTables.insert ( htable ); ZLLog::Print ( format, htable, "table", name ); if ( verbose ) { ZLLog::Print ( "\n" ); lua_pushnil ( state ); while ( lua_next ( state, idx ) ) { STLString elementName( name ); elementName.append ( "." ); elementName.append ( lua_tostring ( state, -2 )); _dumpType ( state, -1, elementName.c_str (), verbose, foundTables ); lua_pop ( state, 1 ); } } } } return; // suppress newline case LUA_TTHREAD: ZLLog::Print ( format, thvalue( tvalue ), "thread", name ); break; case LUA_TUSERDATA: if ( lua_islightuserdata ( state, idx ) ) { ZLLog::Print ( format, lua_topointer ( state, idx ) , "light userdata", name ); } else { ZLLog::Print ( format, lua_topointer( state, idx ), "userdata", name ); if ( verbose ) { lua_getglobal ( state, "tostring" ); lua_pushvalue ( state, idx ); lua_pcall ( state, 1, 1, 0 ); ZLLog::Print ( "\n\t%s", lua_tostring ( state, -1 )); state.Pop ( 1 ); } } break; default: ZLLog::Print ( "*** Unexpected type: %d ***", lua_type ( state, idx )); } ZLLog::Print ( "\n" ); }