I made some progress with the removing constness issue,
but now I'm having problems that seem to be related to
some kind of interaction between virtualness, function
transformation and return value policies.

The attached .hh and .pypp files illustrate the problem.
The transformation is applied correctly to a non-virtual
member function, but something goes wrong when the function
is virtual.
--
Pertti
class C {};

class A {
protected:
    virtual ~A();
};

class B {
public:
  virtual C *h(A const & x);  // this does not work
  //C *h(A const & x);        // this works
  //virtual C *h();           // and this
};
import pyplusplus
from pygccxml import declarations
from pyplusplus import function_transformers as FT
from pyplusplus.module_builder.call_policies import *

def remove_const_ref(type):
    """Converts "T const&" into "T &"
    """
    if declarations.type_traits.is_reference(type):
        t = 
declarations.cpptypes.reference_t(declarations.type_traits.remove_const(type.base))
        return t
    return type

mb = pyplusplus.module_builder.module_builder_t(["virtual_const.hh"])
h = mb.mem_fun( 'h' )
h.add_transformation( FT.modify_type(0, remove_const_ref ) )
h.call_policies = return_internal_reference()
mb.build_code_creator( module_name="virtual_const" )
mb.write_module("virtual_const_bindings.cpp")

/usr/include/boost/python/detail/invoke.hpp: In function ”PyObject* 
boost::python::detail::invoke(boost::python::detail::invoke_tag_<false, false>, 
const RC&, F&, AC0&, AC1&) [with RC = 
boost::python::detail::caller_arity<2u>::impl<F, Policies, 
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object 
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, Sig = 
boost::mpl::vector3<boost::python::api::object, B&, A&>]::result_converter, F = 
boost::python::api::object (*)(B&, A&), AC0 = 
boost::python::detail::caller_arity<2u>::impl<F, Policies, 
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object 
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, Sig = 
boost::mpl::vector3<boost::python::api::object, B&, A&>]::c_t0, AC1 = 
boost::python::detail::caller_arity<2u>::impl<F, Policies, 
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object 
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, Sig = 
boost::mpl::vector3<boost::python::api::object, B&, A&>]::c_t1]”:
/usr/include/boost/python/detail/caller.hpp:223:   instantiated from 
”PyObject* boost::python::detail::caller_arity<2u>::impl<F, Policies, 
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object 
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, Sig = 
boost::mpl::vector3<boost::python::api::object, B&, A&>]”
/usr/include/boost/python/object/py_function.hpp:38:   instantiated from 
”PyObject* 
boost::python::objects::caller_py_function_impl<Caller>::operator()(PyObject*, 
PyObject*) [with Caller = 
boost::python::detail::caller<boost::python::api::object (*)(B&, A&), 
boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, 
boost::mpl::vector3<boost::python::api::object, B&, A&> >]”
virtual_const_bindings.cpp:51:   instantiated from here
/usr/include/boost/python/detail/invoke.hpp:75: virhe: no match for call to 
”(const 
boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<boost::python::api::object>)
 (boost::python::api::object)”
/usr/include/boost/python/detail/caller.hpp: In static member function 
”static const PyTypeObject* 
boost::python::detail::converter_target_type<ResultConverter>::get_pytype() 
[with ResultConverter = 
boost::python::detail::reference_existing_object_requires_a_pointer_or_reference_return_type<boost::python::api::object>]”:
/usr/include/boost/python/detail/caller.hpp:242:   instantiated from ”static 
boost::python::detail::py_func_sig_info 
boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::signature() 
[with F = boost::python::api::object (*)(B&, A&), Policies = 
boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, Sig = 
boost::mpl::vector3<boost::python::api::object, B&, A&>]”
/usr/include/boost/python/object/py_function.hpp:48:   instantiated from 
”boost::python::detail::py_func_sig_info 
boost::python::objects::caller_py_function_impl<Caller>::signature() const 
[with Caller = boost::python::detail::caller<boost::python::api::object (*)(B&, 
A&), boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, 
boost::mpl::vector3<boost::python::api::object, B&, A&> >]”
virtual_const_bindings.cpp:51:   instantiated from here
/usr/include/boost/python/detail/caller.hpp:102: virhe: ”struct 
boost::python::detail::caller_arity<2u>::impl<F, Policies, 
Sig>::operator()(PyObject*, PyObject*) [with F = boost::python::api::object 
(*)(B&, A&), Policies = boost::python::return_internal_reference<1u, 
boost::python::default_call_policies>, Sig = 
boost::mpl::vector3<boost::python::api::object, B&, A&>]::result_converter” 
has no member named ”get_pytype”
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to