Assertion failure in object_rep::add_dependency()
Szymon Gatner <[email protected]> Tue, 28 May 2013 11:11:33 +0200
| Newsgroups | gmane.comp.lang.lua.bind.user |
|---|---|
| Message-ID | <CALqx0+WvurGLLRsDt2U7q+ZfgJWq01ZBhA+2SbPEmfaViBOjaQ@mail.gmail.com> |
--===============4311040380996083161==
Content-Type: multipart/alternative; boundary=047d7b86f846d09e4504ddc3a69d
--047d7b86f846d09e4504ddc3a69d
Content-Type: text/plain; charset=ISO-8859-1
Hey,
I reported this issue some time ago already but at the time I didn't have
time to investigate and prepare minimal example of assertion failure I was
experiencing. Thing is, I also didn't notice any unexpected behavior after
commenting assertion out. This time I am prepared tho:
extern "C"
{
#include <lualib.h>
};
#include <luabind/luabind.hpp>
using namespace luabind;
namespace
{
class Widget
{
public:
Widget(const char* msg = "no msg", Widget* parent = 0) : msg_(msg),
parent_(parent)
{
}
virtual void foo()
{
std::cout << "Widget::foo()";
}
std::string msg_;
Widget* parent_;
};
class WidgetWrap : public Widget, public luabind::wrap_base
{
public:
WidgetWrap(const char* msg, Widget* parent) : Widget(msg, parent) {}
void foo() override
{
call<void>("foo");
}
static void defaultFoo(Widget* base)
{
base->Widget::foo();
}
};
}
void main()
{
const char* code =
"class 'MyWidget' (Widget) \n"
"function MyWidget:__init(msg, parent) \n"
" Widget.__init(self, msg, parent) \n"
" if parent ~= nil then \n"
" self.parent.num = 0 \n"
" end \n"
"end \n"
"function MyWidget:foo() \n"
" self.parent.num = self.parent.num + 1 \n"
"end \n"
"parent = MyWidget(\"parent\") \n"
"child = MyWidget(\"child\", parent) \n";
lua_State* L = luaL_newstate();
luaL_openlibs(L);
open(L);
module(L)
[
class_<Widget, WidgetWrap>("Widget")
.def(constructor<const char*, Widget*>())
.def_readonly("parent", &Widget::parent_)
.def("Foo", &Widget::foo, &WidgetWrap::defaultFoo)
];
luaL_dostring(L, code);
object G = globals(L);
Widget* child = object_cast<Widget*>(G["child"]);
for (int i = 0; i < 48; ++i)
{
child->foo();
}
}
This code triggers assertion failure in:
void object_rep::add_dependency(lua_State* L, int index);
calling foo() on a widget from the script causes the child to access its
parent. This seems to keep adding parent dependency every time the parent
is accessed.
I am using Ryan Pavlik's fork.
Regards,
Szymon Gatner
--047d7b86f846d09e4504ddc3a69d
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Hey,<div><br></div><div>I reported this issue some time ag=
o already but at the time I didn't have time to investigate and prepare=
minimal example of assertion failure I was experiencing. Thing is, I also =
didn't notice any unexpected behavior after commenting assertion out. T=
his time I am prepared tho:</div>
<div><br></div><div><div>extern "C"</div><div>{</div><div>=A0 #in=
clude <lualib.h></div><div>};</div><div>#include <luabind/luabind.=
hpp></div><div><br></div><div>using namespace luabind;</div><div><br></d=
iv>
<div>namespace</div><div>{</div><div>=A0 class Widget</div><div>=A0 {</div>=
<div>=A0 public:</div><div><br></div><div>=A0 =A0 Widget(const char* msg =
=3D "no msg", Widget* parent =3D 0) : msg_(msg), parent_(parent)<=
/div><div>=A0 =A0 {</div>
<div><br></div><div>=A0 =A0 }</div><div><br></div><div>=A0 =A0 virtual void=
foo()</div><div>=A0 =A0 {</div><div>=A0 =A0 =A0 std::cout << "W=
idget::foo()";</div><div>=A0 =A0 }</div><div><br></div><div>=A0 =A0 st=
d::string msg_;</div><div>
=A0 =A0 Widget* parent_;</div><div>=A0 };</div><div><br></div><div>=A0 clas=
s WidgetWrap : public Widget, public luabind::wrap_base</div><div>=A0 {</di=
v><div>=A0 public:</div><div><br></div><div>=A0 =A0 WidgetWrap(const char* =
msg, Widget* parent) : Widget(msg, parent) {}</div>
<div><br></div><div>=A0 =A0 void foo() override</div><div>=A0 =A0 {</div><d=
iv>=A0 =A0 =A0 call<void>("foo");</div><div>=A0 =A0 }</div>=
<div><br></div><div>=A0 =A0 static void defaultFoo(Widget* base)</div><div>=
=A0 =A0 {</div><div>=A0 =A0 =A0 base->Widget::foo();</div>
<div>=A0 =A0 }</div><div>=A0 };</div><div>}</div><div><br></div><div>void m=
ain()</div><div>{</div><div>=A0 const char* code =3D =A0</div><div>=A0 =A0 =
"class 'MyWidget' (Widget) \n"</div><div>=A0 =A0 "fu=
nction MyWidget:__init(msg, parent) \n"</div>
<div>=A0 =A0 " =A0Widget.__init(self, msg, parent) \n"</div><div>=
=A0 =A0 " =A0if parent ~=3D nil then \n"</div><div>=A0 =A0 "=
=A0 =A0self.parent.num =3D 0 \n"</div><div>=A0 =A0 " =A0end \n&q=
uot;</div><div>=A0 =A0 "end \n"</div>
<div>=A0 =A0 "function MyWidget:foo() \n"</div><div>=A0 =A0 "=
; =A0self.parent.num =3D self.parent.num + 1 \n"</div><div>=A0 =A0 &qu=
ot;end \n"</div><div>=A0 =A0 "parent =3D MyWidget(\"parent\&=
quot;) \n"</div>
<div>=A0 =A0 "child =3D MyWidget(\"child\", parent) \n"=
;</div><div><br></div><div>=A0 lua_State* L =3D luaL_newstate();</div><div>=
=A0 luaL_openlibs(L);</div><div>=A0 open(L);</div><div><br></div><div>=A0 m=
odule(L)</div>
<div>=A0 [</div><div>=A0 =A0 class_<Widget, WidgetWrap>("Widget&=
quot;)</div><div>=A0 =A0 .def(constructor<const char*, Widget*>())</d=
iv><div>=A0 =A0 .def_readonly("parent", &Widget::parent_)</di=
v><div>=A0 =A0 .def("Foo", &Widget::foo, &WidgetWrap::def=
aultFoo)</div>
<div>=A0 ];</div><div><br></div><div>=A0 luaL_dostring(L, code);</div><div>=
<br></div><div>=A0 object G =3D globals(L);</div><div><br></div><div>=A0 Wi=
dget* child =3D object_cast<Widget*>(G["child"]);</div><div=
><br></div>
<div>=A0 for (int i =3D 0; i < 48; ++i)</div><div>=A0 {</div><div>=A0 =
=A0 child->foo();</div><div>=A0 }</div><div>}</div><div><br></div><div s=
tyle>This code triggers assertion failure in:</div><div style><br></div><di=
v style>void object_rep::add_dependency(lua_State* L, int index);</div>
<div style><br></div><div style>calling foo() on a widget from the script c=
auses the child to access its parent. This seems to keep adding parent depe=
ndency every time the parent is accessed.</div><div style><br></div><div st=
yle>
I am using =A0Ryan Pavlik's fork.</div><div style><br></div><div style>=
Regards,</div><div style>Szymon Gatner</div><div><br></div></div></div>
--047d7b86f846d09e4504ddc3a69d--
--===============4311040380996083161==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may
--===============4311040380996083161==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
luabind-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/luabind-user
--===============4311040380996083161==--