[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: C-objects with __gc *and* __index?
 
- From: Uli Kusterer <witness.of.teachtext@...>
 
- Date: Sat, 6 Aug 2005 18:41:37 +0200
 
Hi,
 this must be something frustratingly simple, but neither googling  
nor reading the docs nor stupid trial-and-error seems to make this  
work. Maybe any of you can help? I'm trying to create an object (full  
userdata containing a pointer to a C++ object) that has instance  
methods defined in C (using a metatable in __index), automatically  
deletes the associated C++ object (using __gc) and prints something  
sensible when tostring() is used on it. Trouble is, neither tostring 
() nor the destructor call work. Anybody know what the mistake in my  
library init method is?
// "Room" class methods:
static const struct luaL_reg gRoomMethodTable[] =
{
    { "new", UKAdventureNewRoom },
    { NULL, NULL }  /* sentinel */
};
// "Room" instance methods:
static const struct luaL_reg gRoomMetaTable[] =
{
    { "__tostring", UKAdventureRoomToString },
    { "__gc", UKAdventureDeleteRoom },
    { NULL, NULL }  /* sentinel */
};
int        PACEmaker_luaopen( lua_State *pLuaState )
{
    // Init the "adventure" class:
    luaL_openlib( pLuaState, "Adventure", gAdventureTable, 0 );
    // Init the "room" class:
    luaL_openlib( pLuaState, "Room", gRoomMethodTable, 0 );    //  
Install class methods and define "Room" main class.
    luaL_newmetatable( pLuaState, "PACEmaker.Room" );
        // Install an index table that provides the array.something  
methods:
    lua_pushstring( pLuaState, "__index" );
    lua_pushvalue( pLuaState, -2 );            // pushes the metatable.
    lua_settable( pLuaState, -3 );            // metatable.__index =  
metatable.
    luaL_openlib( pLuaState, NULL, gRoomMetaTable, 0 );        //  
Install instance methods.
    luaL_getmetatable( pLuaState, "PACEmaker.Room" );
    lua_pushstring( pLuaState, "__gc" );
    lua_pushcfunction( pLuaState, UKAdventureDeleteRoom );
    lua_settable( pLuaState, -3 );
    luaL_getmetatable( pLuaState, "PACEmaker.Room" );
    lua_pushstring( pLuaState, "__tostring" );
    lua_pushcfunction( pLuaState, UKAdventureRoomToString );
    lua_settable( pLuaState, -3 );
    return 0;
}
When it didn't work, I tried adding those luaL_getmetatable calls,  
but it still didn't work. Even when I allocate and nil 100 objects,  
they never get deleted, and whenever I tostring() a "Room" subclass,  
it gives an error about concatenating a table :-( I tried some  
permutations of the code in the docs, but there's only separate  
examples of __index and __gc, and I seem to fail when it comes to  
combining them.
 Thanks for any clues, pointers to docs, sample code etc.
Cheers,
-- M. Uli Kusterer
http://www.zathras.de