As list administrator, your authorization is requested for the
following mailing list posting:
List: Lua-icx...@lists.sourceforge.net
From: dma...@gmail.com
Subject: Re: lua_icxx + swig
Reason: Post by non-member to a members-only list
At your convenience, visit:
https://lists.sourceforge.net/lists/admindb/lua-icxx-users
to approve or deny the request.
---------- Forwarded message ----------
From: Domenico Mangieri <dma...@gmail.com>
To: lua-icx...@lists.sourceforge.net
Cc:
Date: Sun, 5 Feb 2012 22:08:53 +0000
Subject: Re: lua_icxx + swig
After looking carefully at the source code, I found that you make use of pushValToStack.
This can be used for a custom stack allocation to handle the swig call.
Here is what I've done :
I restored the original lua_icxx source code and added to LuaObjRef.h the following code
struct LUA_ICXX_CPP_API
UserStackAllocation
{
virtual void pushToStack(lua_State* L) const = 0;
};
void pushValToStack(lua_State* L, const UserStackAllocation& objRef)
{
objRef.pushToStack(L);
}
In my code I derive from UserStackAllocation to handle the swig calls
class Swig : public UserStackAllocation
{
Swig(Foo* f);
void pushToStack(lua_State* L) const {
SWIG_Lua_NewPointerObj( L, .... );
}
}
Now I can simply use the standard way of calling a function
void execCallback()
{
cb( Swig( new Foo ) );
}
This solution is cleaner
Let me know if you are interested in adding it to the project
Thanks
DomOn Sun, Feb 5, 2012 at 7:12 PM, Domenico Mangieri <dma...@gmail.com> wrote:I doesn't work as it is so I modified slightly lua_icxx code to accommodate this requirement.
This is just a quick solution..
with the changed code I can do this
void execCallback()
{
LuaFuncCallParams call= cb.prepCall() // this is now public
SWIG_Lua_NewPointerObj( L, new Foo() .... ) // push wrapped object on the stack
call.doCall(1); // doCall gets extra number of params pushed on the stack
}
This works.
Maybe it can be implemented differently but I'm sure this could be a popular feature for lua_icxx as I think the combo swig + lua_icxx is a winner!
DomOn Sun, Feb 5, 2012 at 5:26 PM, Domenico Mangieri <dma...@gmail.com> wrote:
Hi .. more on this..
I found that I can use SWIG_Lua_NewPointerObj provided by swig generate file to create the wrapping object
void execCallback()
{
SWIG_Lua_NewPointerObj( L, new Foo() .... )
cb();
}
SWIG_Lua_NewPointerObj pushes the object into lua stack.
Now the question is, can I call cb with no args given the pointer is already in the stack ?
I'll give it a try..
DomOn Sun, Feb 5, 2012 at 3:34 PM, Domenico Mangieri <dma...@gmail.com> wrote:
Hi,
I'm playing around with lua_icxx. I find it very useful with its unique approach to lua calls within c++.
I'm currently using swig to wrap a large library and I'm using lua_icxx to provide callback supports from within c++ into lua.
Here is an example
c++
// Note : Foo is wrapped by swig
class Foo
{
public:
LuaFuncRef cb;
void registerCallback(const char* cb)
{
cb = _lua.eval(cb);
}
.....
void execCallback()
{
cb();
}
};
lua :
function test()
print("cool")
end
f = Foo()
f:registerCallback("test");
That's all good.
My problem now is to make use of swig wrap to pass c++ objects to lua callback;
Something like this
void execCallback()
{
cb( new Foo );
}
The callback works fine with basic types but not for UDT.
Any idead how that could be solved ?
Thank you for sharing this lib.
Dom
---------- Forwarded message ----------
From: lua-icxx-us...@lists.sourceforge.net
To:
Cc:
Date:
Subject: confirm 91d72a70ea205946d1c0b45150a7f89a9ea77d01
If you reply to this message, keeping the Subject: header intact,
Mailman will discard the held message. Do this if the message is
spam. If you reply to this message and include an Approved: header
with the list password in it, the message will be approved for posting
to the list. The Approved: header can also appear in the first line
of the body of the reply.
Hi Oliver,
Thanks for getting back.
You can generate the swig header file using the command swig.exe -lua -external-runtime
The header file contains SWIG_NewPointerObj along with other functions used by swig.
The template would be a nice solution but of difficult implementation as you need to know how to map the c++ class type to swig_type_info struct.
At the moment I'm doing that mapping manually in my code, as the number of classes that I use in the callbacks are few.
Here is an example :
Note : all the SWIGTYPE_p_* are pointers to swig_type_info defined the the generated swig cpp file
struct Swig : public UserAllocation
{
Swig():_ptr(nullptr),_type(nullptr) {}
template<typename T>
Swig(T* node) { set(node); }
void set(osg::Geode* node) { init(node,SWIGTYPE_p_osg__Geode); }
void set(osg::Group* node) { init(node,SWIGTYPE_p_osg__Group); }
void set(osg::NodeVisitor* node) { init(node,SWIGTYPE_p_osg__NodeVisitor); }
virtual void pushToStuck(lua_State* L) const
{
SWIG_NewPointerObj(L,_ptr,_type,_own);
}
protected:
void init(void* ptr, swig_type_info* type, int own = 1)
{
_ptr = ptr, _type = type,_own = own;
}
void* _ptr;
swig_type_info* _type;
int _own;
};
If you have an idea let me know I'm interested.
Thanks
Dom