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&#39;t have time to investigate and prepare=
 minimal example of assertion failure I was experiencing. Thing is, I also =
didn&#39;t notice any unexpected behavior after commenting assertion out. T=
his time I am prepared tho:</div>
<div><br></div><div><div>extern &quot;C&quot;</div><div>{</div><div>=A0 #in=
clude &lt;lualib.h&gt;</div><div>};</div><div>#include &lt;luabind/luabind.=
hpp&gt;</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 &quot;no msg&quot;, 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 &lt;&lt; &quot;W=
idget::foo()&quot;;</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&lt;void&gt;(&quot;foo&quot;);</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-&gt;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 =
&quot;class &#39;MyWidget&#39; (Widget) \n&quot;</div><div>=A0 =A0 &quot;fu=
nction MyWidget:__init(msg, parent) \n&quot;</div>
<div>=A0 =A0 &quot; =A0Widget.__init(self, msg, parent) \n&quot;</div><div>=
=A0 =A0 &quot; =A0if parent ~=3D nil then \n&quot;</div><div>=A0 =A0 &quot;=
 =A0 =A0self.parent.num =3D 0 \n&quot;</div><div>=A0 =A0 &quot; =A0end \n&q=
uot;</div><div>=A0 =A0 &quot;end \n&quot;</div>
<div>=A0 =A0 &quot;function MyWidget:foo() \n&quot;</div><div>=A0 =A0 &quot=
; =A0self.parent.num =3D self.parent.num + 1 \n&quot;</div><div>=A0 =A0 &qu=
ot;end \n&quot;</div><div>=A0 =A0 &quot;parent =3D MyWidget(\&quot;parent\&=
quot;) \n&quot;</div>
<div>=A0 =A0 &quot;child =3D MyWidget(\&quot;child\&quot;, parent) \n&quot;=
;</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_&lt;Widget, WidgetWrap&gt;(&quot;Widget&=
quot;)</div><div>=A0 =A0 .def(constructor&lt;const char*, Widget*&gt;())</d=
iv><div>=A0 =A0 .def_readonly(&quot;parent&quot;, &amp;Widget::parent_)</di=
v><div>=A0 =A0 .def(&quot;Foo&quot;, &amp;Widget::foo, &amp;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&lt;Widget*&gt;(G[&quot;child&quot;]);</div><div=
><br></div>
<div>=A0 for (int i =3D 0; i &lt; 48; ++i)</div><div>=A0 {</div><div>=A0 =
=A0 child-&gt;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&#39;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==--