lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Just a quick tip. This has bitten us before with our use of toLua. Forgive
me if it's obvious.

If your pPointerToClass is a "this" pointer, you need to use C++'s
static_cast<> operator if you want to address it by one of its base classes
within Lua.

Imagine:
class iBar {}

class Foo : public iBar
{
...
}

Foo * a;
// works fine:
lua_pushusertag(pLuaState, a, tolua_tag(pLuaState, "Foo"));

// althought this will work, it is not type-safe
lua_pushusertag(pLuaState, a, tolua_tag(pLuaState, "iBar"));

// do this instead:
lua_pushusertag(pLuaState, static_cast<iBar *>(a), tolua_tag(pLuaState,
"iBar"));

I've found it's good to get in the habit of using the static_cast here, even
though it is ugly.

Eric

> -----Original Message-----
> From: owner-lua-l@tecgraf.puc-rio.br
> [mailto:owner-lua-l@tecgraf.puc-rio.br]On Behalf Of Dirk Ringe
> Sent: Friday, September 07, 2001 2:26 PM
> To: Multiple recipients of list
> Subject: RE: Quick tolua question
>
>
> We do the following to get a pointer known in lua (like the this pointer):
>
> lua_pushusertag(pLuaState, pPointerToClass, tolua_tag(pLuaState,
> sTagName));
> lua_setglobal(pLuaState, sVarName);
>
> The sTagName is a string representation of the class name. The
> pPointerToClass is the "this" pointer or whatever else is needed. The
> sVarName is the name under which the pointer is known inside lua.
>
> Hope that helps,
>
>  Dirk
>
> -----Original Message-----
> From: owner-lua-l@tecgraf.puc-rio.br
> [mailto:owner-lua-l@tecgraf.puc-rio.br]On Behalf Of Matt Holmes
> Sent: Friday, September 07, 2001 8:01 PM
> To: Multiple recipients of list
> Subject: Quick tolua question
>
>
> I have a quick tolua question for someone out there :)
>
> In my MUD server, I am writing the entire scripting engine using
> Lua. I have
> a particular class, CScriptedObject, which is bound directly to Lua. This
> means that each CScriptedObject instance is represented in script
> form by a
> Lua script file. This is pretty straightforward. My question
> revolves around
> accessing "this" in the case of the script file. For instance, I have an
> event handling mechanism that hands off to the script based on certain
> global functions existing, for instance:
>
> function Create()
>     Templar:Log("Hello from Create!")
> end
>
> Templar is a special class which is bound to all lua states when they are
> created. Now, what I want to be able to do is this:
>
> function Create()
>     Templar:Log("Hello from create!")
>     this:Set("SomeProperty", 1)
> end
>
> Now of course I know that the Set method must exist as part of the
> CScriptedObject class, but what is the best way to refer to
> "this". Should I
> simply push the this pointer on as a global variable in Lua?
> Something like
> this:
>
> lua_pushusertag(m_pState, this, LUA_ANYTAG);
> lua_setglobal(m_pState, "this");
>
> Unfortunately, from what I understand of tolua and Lua, this won't work,
> because Lua has no clue that "this" is a table that resembles the
> CScriptedObject table that we pushed to Lua earlier. How do I
> tell Lua "hey,
> this is a CScriptedObject type table, and here is the instance"?
>
> It seems to me that I am trying to bind things backwards from what tolua
> would normally do. I am trying to bind the script to the class,
> so that the
> class owns the script, while tolua seems to bind the class to the
> script, so
> that the script creates and owns instances of the class. If this is the
> case, I am guessing that tolua is not the tool I need for this, and
> something custom written is going to be the order of the day?
>
> I guess my best solution would be to push a special global C
> function, call
> it Set, which has the "this" pointer pushed as a usertag, and can
> thus call
> the class "Set" method, something like
>
> int LuaSet(lua_State *pState)
> {
>     // Get the this pointer in to pClass, code skipped because we all know
> how to grab a global
>     // Also assume the args are popped from the stack
>     pClass->Set(arg1, arg2);
> }
>
> Each class owns its own lua_State, so this should theoretically
> work as the
> "this" pushed to each state will actually be the class instance which owns
> the lua_State which is passed to the function.
>
> This seems a bit kludgy though, I would much rather just expose the "this"
> pointer as an appropriate table to Lua. Has anyone figured out a way to
> easily do that?
>
> Matt "Kerion" Holmes
> Lead Developer
> Lua Studio - The Lua IDE (and the Templar MUD Engine, oy vey I work on too
> much ;)
> http://www.sourceforge.net/projects/visuallua/
>