Re: redux and fix? objects derived from wrap_base
Ilia Trendafilov <[email protected]>
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <[email protected]> |
I will not comment your fix but the way you use luabind. Take
everything I say with a grain of salt as I'm not very experienced
luabind user - I hope the community will correct any mistakes in this
message.
Summary: don't instantiate luabind wrappers from C++, instantiate the
wrapped class instead.
Details:
I vaguely remember being in the situation you are describing. What I
did, however, was to restructure my classes:
class MyObject
{
// C++ interface goes here
};
// somewhere else, in the lua-specific parts of your application
class MyObjectWrapper : public luabind::wrap_base, public MyObject
{
// virtual functions that call(), etc
};
From this point, the code:
MyObject *pObj = new MyObject();
luabind::globals(pLState)["_Object"] = pObj;
should just work. You'll still be able to derive this class in Lua as
usual and you'll still get all the benefits from having a wrapper. And
bonus benefit: separating your application code from luabind code -
everyone who #include "MyObject.h" had to include a lot of luabind
headers which are not exactly fast to compile.
On Tue, Aug 4, 2009 at 6:37 AM, Thomas Nelson<[email protected]> wrote:
> I was running into a problem a while ago with objects derived from
> luabind:wrap_base. I think I have a fix but would like some feedback on
> whether or not I'm completely off base and what some of the side effects may
> be.
>
> The problem:
> I have a class structure that looks like this:
>
> class MyObject: public luabind::wrap_base
> {
> public:
> MyObject(): luabind::wrap_base {}
> };
>
>
> MyObject *pObj = new MyObject();
> luabind::globals(pLState)["_Object"] = pObj;
>
> In the code, this assignment will assert, wrap_base is constructed with its
> default constructor and when push attempts to determine the back reference
> it chokes since there is no lua state associated with the object.
>
> The fix?:
> In weakref.cpp change the state method to look like this:
> lua_State* weak_ref::state() const
> { // removed the assert and added an explicit NULL return
> --> if (m_impl)
> --> return m_impl->state;
> --> return NULL;
> }
>
> In back_reference.hpp add the two marked lines to get_back_reference:
> template<class T>
> bool get_back_reference(lua_State* L, T const& x)
> {
> #ifndef LUABIND_NO_RTTI
> if (wrap_base const* w = detail::get_back_reference(x))
> {
> --> if (!detail::wrap_access::ref(*w).state())
> --> return false;
> detail::wrap_access::ref(*w).get(L);
> return true;
> }
> #endif
> return false;
> }
>
> --
> Thomas Nelson [email protected]
> --------------------------------------------------------------
> "If you still have gas, you're not lost".
> - French explorer Pierre Frontage.
> (M.Frontage was so influential in the exploration of North America many
> roads are still named after him.)
>
>
>
>
> ------------------------------------------------------------------------------
> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
> trial. Simplify your report design, integration and deployment - and focus on
> what you do best, core application coding. Discover what's new with
> Crystal Reports now. http://p.sf.net/sfu/bobj-july
> _______________________________________________
> luabind-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/luabind-user
>
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user