Re: [pygccxml-development] Parameter passing, ownership semantics
Brought to you by:
mbaas,
roman_yakovenko
From: Gustavo C. <gjc...@gm...> - 2007-02-24 12:57:52
|
On 2/22/07, Roman Yakovenko <rom...@gm...> wrote: > > On 2/22/07, Gustavo Carneiro <gjc...@gm...> wrote: > > That wiki entry didn't apply anymore probably due to changing > > boost::python interfaces, but it provided very useful clues. I managed > to > > get it working 100% correctly using another hack. Here's the diff of > the > > manual changes I made to the wrapper: > > > > --- ns3.cpp 2007-02-21 23:46:44.000000000 +0000 > > +++ ns3-working.cpp 2007-02-21 23:44:34.000000000 +0000 > > @@ -9,19 +9,32 @@ > > namespace bp = boost::python; > > > > struct EventImpl_wrapper : ns3::EventImpl, bp::wrapper< ns3::EventImpl > > { > > + ~EventImpl_wrapper() { > > + if (this->pyobj) { > > + Py_DECREF(this->pyobj); > > + this->pyobj = 0; > > + } > > + > > + } > > > > EventImpl_wrapper() > > : ns3::EventImpl() > > - , bp::wrapper< ns3::EventImpl >(){ > > - // null constructor > > + , bp::wrapper< ns3::EventImpl > (), pyobj(0) { > > > > } > > > > virtual void Notify( ){ > > + if (!this->pyobj) { > > + this->pyobj = > > bp::detail::wrapper_base_::get_owner(*this); > > + Py_INCREF(this->pyobj); > > + } > > bp::override func_Notify = this->get_override( "Notify" ); > > func_Notify( ); > > } > > > > +protected: > > + PyObject *pyobj; > > + > > }; > > > > static void Schedule_b8544467c482930a621aca2e7ac87dca( > > std::auto_ptr< ::ns3::EventImpl > event ){ > > > > Hi Gustavo. I tested the code you post and it doesn't work for me :-(. > I also doesn't understand how it works for you. You should increment > reference > on the object before you pass it "Schedule" member function, otherwise > you get same "Segmentation fault". Am I missing something? > I can avoid it by commenting the destructor code. You are right. In my case it worked due to a bug in my code. I forgot to make ~EventImpl() virtual, and so ~EventImpl_wrapper() was never called! :P I hate C++ :( Also I added new functionality, which allows you to implement the patch: > > http://pygccxml.svn.sourceforge.net/viewvc/pygccxml/pyplusplus_dev/unittests/transfer_ownership_tester.py?view=markup > > http://pygccxml.svn.sourceforge.net/viewvc/pygccxml/pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp?view=markup Thanks, it works perfectly! :-) -- Gustavo J. A. M. Carneiro "The universe is always one step beyond logic." |