//----------------------------------------------------------------// void MOAILuaObject::SetInterfaceTable ( MOAILuaState& state, int idx ) { idx = state.AbsIndex ( idx ); this->PushMemberTable ( state ); // set the interface table as the member table's metatable lua_pushvalue ( state, idx ); lua_setmetatable ( state, -2 ); lua_pop ( state, 1 ); }
//----------------------------------------------------------------// int MOAILuaRefTable::Ref ( MOAILuaState& state, int idx ) { assert ( this->mTableID != LUA_NOREF ); idx = state.AbsIndex ( idx ); int refID = this->ReserveRefID (); lua_rawgeti ( state, LUA_REGISTRYINDEX, this->mTableID ); lua_pushnumber ( state, refID ); lua_pushvalue ( state, idx ); lua_settable ( state, -3 ); lua_pop ( state, 1 ); return refID; }
//----------------------------------------------------------------// void MOAILuaObject::SetLocal ( MOAILuaState& state, int idx, MOAILuaLocal& ref ) { idx = state.AbsIndex ( idx ); assert ( this->mInstanceTable ); this->mInstanceTable.PushRef ( state ); if ( ref ) { luaL_unref ( state, -1, ref.mRef ); ref.mRef = LUA_NOREF; } state.CopyToTop ( idx ); ref.mRef = luaL_ref ( state, -2 ); lua_pop ( state, 1 ); }
//----------------------------------------------------------------// void MOAILuaObject::SetMemberTable ( MOAILuaState& state, int idx ) { UNUSED ( state ); UNUSED ( idx ); // TODO: what if object is a singleton? assert ( !this->GetLuaClass ()->IsSingleton ()); // TODO: should actually set the member table, not just crash idx = state.AbsIndex ( idx ); this->PushLuaUserdata ( state ); // userdata lua_getmetatable ( state, - 1 ); // ref table lua_getmetatable ( state, - 1 ); // member table lua_getmetatable ( state, - 1 ); // interface table lua_pushvalue ( state, idx ); lua_replace ( state, -3 ); this->MakeLuaBinding ( state ); state.Pop ( 1 ); }
//----------------------------------------------------------------// 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" ); }