[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: RE: Problem with userdata (metatable)
- From: jdarling@...
- Date: Wed, 12 Apr 2006 09:43:23 -0700
No idea, I'm still using Lua 5.0.2 but used the LUNA 5.1 as a reference
point for my wrapper classes. Hopefully this means that I'm ready for
5.1 when the headers are converted :).
- Jeremy
"Help I suffer from the oxymoron Corporate Security."
> -------- Original Message --------
> Subject: Re: Problem with userdata (metatable)
> From: "Anders Bergh" <anders@anders1.org>
> Date: Wed, April 12, 2006 11:17 am
> To: "Lua list" <lua@bazar2.conectiva.com.br>
>
> I'm going to test what you did in your Delphi code, and test it in my
> code to see if it works. How come the
> http://lua-users.org/wiki/UserDataWithPointerExample example doesn't
> work though? Did things change in Lua 5.1?
>
> Anders
>
> On 4/12/06, jdarling@eonclash.com <jdarling@eonclash.com> wrote:
> > Since you in C/C++ take a look at how LUNA is doing things. I'm no
> > vertran myself, but I have had some problems with methods in Delphi
> > (actually enough that I believe I see your problem).
> >
> > You need to track your methods table, object meta table, and object
> > table. For example some working code of mine (note again Delphi not C)
> > is:
> >
> > procedure RegisterMyClass(LuaScript:TLUAWrapper);
> > var
> > MetaTable,
> > MethodTable,
> > Methods : Integer;
> > begin
> > lua_newtable(LuaScript.LuaState);
> > Methods := lua_gettop(LuaScript.LuaState);
> >
> > // Lua<#ClassName#>ClassName - represents the class name in text
> > luaL_newmetatable(LuaScript.LuaState, Lua<#ClassName#>ClassName);
> > MetaTable := lua_gettop(LuaScript.LuaState);
> >
> > lua_pushstring(LuaScript.LuaState, Lua<#ClassName#>ClassName);
> > lua_pushvalue(LuaScript.LuaState, Methods);
> > lua_settable(LuaScript.LuaState, LUA_GLOBALSINDEX);
> >
> > lua_pushliteral(LuaScript.LuaState, '__metatable');
> > lua_pushvalue(LuaScript.LuaState, Methods);
> > lua_settable(LuaScript.LuaState, MetaTable);
> >
> > lua_pushliteral(LuaScript.LuaState, '__index');
> > lua_pushcfunction(LuaScript.LuaState, index_<#ClassName#>);
> > lua_settable(LuaScript.LuaState, MetaTable);
> >
> > lua_pushliteral(LuaScript.LuaState, '__newindex');
> > lua_pushcfunction(LuaScript.LuaState, newindex_<#ClassName#>);
> > lua_settable(LuaScript.LuaState, MetaTable);
> >
> > lua_pushliteral(LuaScript.LuaState, '__gc');
> > lua_pushcfunction(LuaScript.LuaState, gc_<#ClassName#>);
> > lua_settable(LuaScript.LuaState, MetaTable);
> >
> > lua_newtable(LuaScript.LuaState);
> > MethodTable := lua_gettop(LuaScript.LuaState);
> > lua_pushliteral(LuaScript.LuaState, '__call');
> > lua_pushcfunction(LuaScript.LuaState, new_<#ClassName#>);
> > lua_pushliteral(LuaScript.LuaState, '__new');
> > lua_pushvalue(LuaScript.LuaState, -2);
> > lua_settable(LuaScript.LuaState, Methods);
> > lua_settable(LuaScript.LuaState, MethodTable);
> > lua_setmetatable(LuaScript.LuaState, Methods);
> >
> > // for each method that you want to register
> > lua_pushcfunction(LuaScript.LuaState, lua<#ClassName#><#MethodName#>);
> > lua_settable(LuaScript.LuaState, Methods);
> > // end of for each method
> >
> > lua_pop(LuaScript.LuaState, 2);
> > end;
> >
> > - Jeremy
> >
> > "Help I suffer from the oxymoron Corporate Security."
> >
> >
> > > -------- Original Message --------
> > > Subject: Problem with userdata (metatable)
> > > From: "Anders Bergh" <anders@anders1.org>
> > > Date: Wed, April 12, 2006 8:25 am
> > > To: "Lua list" <lua@bazar2.conectiva.com.br>
> > >
> > > Hi!
> > >
> > > I'm using Lua 5.1 and I've been trying to add my own userdata type. It
> > > works except I couldn't get methods working. I've been reading the
> > > chapter in the first edition of pil and
> > > http://lua-users.org/wiki/UserDataWithPointerExample.
> > >
> > > Here's the code I use:
> > >
> > > static const luaL_reg llua_user_f[] = {
> > > /* Functions */
> > > {"FindByNick", llua_user_FindByNick},
> > >
> > > /* Methods */
> > > {"GetNick", llua_user_GetNick},
> > > {NULL, NULL}
> > > };
> > >
> > > /* Metatable */
> > > static const luaL_reg llua_user_m[] = {
> > > {"__tostring", llua_user_tostring},
> > > {NULL, NULL}
> > > };
> > >
> > > int lluaopen_user (lua_State *L) {
> > > luaL_openlib(L, "user", llua_user_f, 0);
> > > luaL_newmetatable(L, TYPE);
> > > luaL_openlib(L, 0, llua_user_m, 0); /* mt */
> > >
> > > lua_pushliteral(L, "__index");
> > > lua_pushvalue(L, -3);
> > > lua_rawset(L, -3);
> > >
> > > lua_pushliteral(L, "__metatable");
> > > lua_pushvalue(L, -3);
> > > lua_rawset(L, -3);
> > >
> > > lua_pop(L, 1);
> > > return 1;
> > > }
> > >
> > > When I use "user:GetNick()" in Lua, I get the error: attempt to index
> > > field '?' (a nil value).
> > >
> > > getmetatable(user) returns nil, tostring(user) returns "user:
> > > 0x815598c". What exactly am I doing wrong?
> > >
> > > Anders
> >
> >