Re: [pygccxml-development] Bug in virtual function wrapping with pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: Allen B. <al...@vr...> - 2006-05-23 19:58:12
|
Thanks for the quick turn around. :) I can verify that this now works with my test case. I will try it later today on the full library. Roman: Is there any way you can add a test for this one to the test suite to guard against any regressions in this behavior in the future? Thanks, Allen Roman Yakovenko wrote: > Allen, there is no work around for this bug, so I work on it right now. > I believe you will have an answer pretty soon. > > On 5/23/06, Allen Bierbaum <al...@vr...> wrote: > >> I should also have mentioned that as of yet I have not found a work >> around for this bug. >> >> I tried to work around it by "finalizing" the Son class, but I can't >> find a reliable way to finalize a class with pyplusplus. Until then I >> think I am at an impass. :( >> >> -Allen >> >> >> Allen Bierbaum wrote: >> >> > I think I have found a bug in the handling of virtual methods with >> > pyplusplus. >> > >> > I have attached a set of test classes and the generated bindings. >> > >> > The problem seems to be that when you have 3 classes derived from each >> > other as: >> > >> > class Grandpa >> > class Father : public Grandpa >> > class Son : public Father >> > >> > And Grandpa declares a pure virtual method that is defined in Father >> > but just used in Son, the wrapper for Son still thinks it is a pure >> > virtual and doesn't know to generate code with the default >> > implementation in Father. (See the attached code, it really makes >> > more sense with an example) >> > >> > -Allen >> > >> >------------------------------------------------------------------------ >> >> > >> >// This file has been generated by pyplusplus. >> > >> >#include "boost/python.hpp" >> > >> >#include "/home/allenb/temp/pypp_test/Classes.h" >> > >> >namespace bp = boost::python; >> > >> >struct Grandpa_wrapper : test_ns::Grandpa, bp::wrapper< >> test_ns::Grandpa > { >> > >> > Grandpa_wrapper() >> > : test_ns::Grandpa() >> > , bp::wrapper< test_ns::Grandpa >() >> > {} >> > >> > virtual int gp_pure( int i ){ >> > bp::override func_gp_pure = this->get_override( "gp_pure" ); >> > return func_gp_pure( i ); >> > } >> > >> >}; >> > >> >struct Father_wrapper : test_ns::Father, bp::wrapper< >> test_ns::Father > { >> > >> > Father_wrapper(test_ns::Father const & arg ) >> > : test_ns::Father( arg ) >> > , bp::wrapper< test_ns::Father >() >> > {} >> > >> > Father_wrapper() >> > : test_ns::Father() >> > , bp::wrapper< test_ns::Father >() >> > {} >> > >> > virtual int gp_pure( int i ) { >> > if( bp::override func_gp_pure = this->get_override( >> "gp_pure" ) ) >> > return func_gp_pure( i ); >> > else >> > return test_ns::Father::gp_pure( i ); >> > } >> > >> > >> > virtual int default_gp_pure( int i ) { >> > return test_ns::Father::gp_pure( i ); >> > } >> > >> >}; >> > >> >struct Son_wrapper : test_ns::Son, bp::wrapper< test_ns::Son > { >> > >> > Son_wrapper(test_ns::Son const & arg ) >> > : test_ns::Son( arg ) >> > , bp::wrapper< test_ns::Son >() >> > {} >> > >> > Son_wrapper() >> > : test_ns::Son() >> > , bp::wrapper< test_ns::Son >() >> > {} >> > >> > virtual int gp_pure( int i ){ >> > bp::override func_gp_pure = this->get_override( "gp_pure" ); >> > return func_gp_pure( i ); >> > } >> > >> >}; >> > >> >BOOST_PYTHON_MODULE(_test){ >> > bp::class_< Grandpa_wrapper, boost::noncopyable >( "Grandpa" ) >> > .def("gp_pure" >> > , bp::pure_virtual( &::test_ns::Grandpa::gp_pure ) >> > , ( bp::arg("i") ) >> > , bp::default_call_policies() ); >> > >> > bp::class_< Father_wrapper, bp::bases< test_ns::Grandpa > >( >> "Father" ) >> > .def("gp_pure" >> > , &::test_ns::Father::gp_pure >> > , &Father_wrapper::default_gp_pure >> > , ( bp::arg("i") ) >> > , bp::default_call_policies() ); >> > >> > bp::class_< Son_wrapper, bp::bases< test_ns::Father > >( "Son" ) >> > .def("gp_pure" >> > , bp::pure_virtual( &::test_ns::Grandpa::gp_pure ) >> > , ( bp::arg("i") ) >> > , bp::default_call_policies() ); >> >} >> > >> > >> >------------------------------------------------------------------------ >> >> > >> > >> >namespace test_ns >> >{ >> >class Grandpa >> >{ >> >public: >> > virtual int gp_pure(int i) = 0; >> >}; >> > >> >class Father : public Grandpa >> >{ >> >public: >> > virtual int gp_pure(int i); >> >}; >> > >> >class Son : public Father >> >{ >> >public: >> >}; >> > >> >} // namespace test_ns >> > >> > >> >> >> >> ------------------------------------------------------- >> All the advantages of Linux Managed Hosting--Without the Cost and Risk! >> Fully trained technicians. The highest number of Red Hat >> certifications in >> the hosting industry. Fanatical Support. Click to learn more >> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=107521&bid=248729&dat=121642 >> _______________________________________________ >> pygccxml-development mailing list >> pyg...@li... >> https://lists.sourceforge.net/lists/listinfo/pygccxml-development >> > > |