Thread: [pygccxml-development] Two problems
Brought to you by:
mbaas,
roman_yakovenko
From: Lakin W. <lak...@gm...> - 2006-05-31 19:44:31
|
In finishing the Ogre bindings, I have run into two problems (one is caused by the other). 1. First, I get an error when compiling Matrix4.cpp .. lakin@zedd:~/Desktop/OgrePython$ g++ `pkg-config --cflags OGRE` -I/usr/include/python2.4 -D"BOOST_PYTHON_MAX_ARITY=17" -O0 -g -I./ -fPIC -Ibuild -c -o build/Matrix4.pypp.os build/Matrix4.pypp.cpp /usr/include/boost/python/object/make_instance.hpp: In static member function 'static PyObject* boost::python::objects::make_instance_impl<T, Holder, Derived>::execute(Arg&) [with Arg = float*, T = float, Holder = boost::python::objects::pointer_holder<float*, float>, Derived = boost::python::objects::make_ptr_instance<float, boost::python::objects::pointer_holder<float*, float> >]': /usr/include/boost/python/to_python_indirect.hpp:96: instantiated from 'static PyObject* boost::python::detail::make_reference_holder::execute(T*) [with T = float]' /usr/include/boost/python/to_python_indirect.hpp:60: instantiated from 'PyObject* boost::python::to_python_indirect<T, MakeHolder>::execute(const U&, mpl_::false_) const [with U = float, T = const Ogre::Real* const, MakeHolder = boost::python::detail::make_reference_holder]' /usr/include/boost/python/to_python_indirect.hpp:48: instantiated from 'PyObject* boost::python::to_python_indirect<T, MakeHolder>::execute(U*, mpl_::true_) const [with U = const Ogre::Real, T = const Ogre::Real* const, MakeHolder = boost::python::detail::make_reference_holder]' /usr/include/boost/python/to_python_indirect.hpp:37: instantiated from 'PyObject* boost::python::to_python_indirect<T, MakeHolder>::operator()(const U&) const [with U = const Ogre::Real*, T = const Ogre::Real* const, MakeHolder = boost::python::detail::make_reference_holder]' /usr/include/boost/python/detail/invoke.hpp:88: instantiated from 'PyObject* boost::python::detail::invoke(boost::python::detail::invoke_tag_<false, true>, const RC&, F&, TC&, AC0&) [with RC = boost::python::to_python_indirect<const Ogre::Real* const, boost::python::detail::make_reference_holder>, F = const Ogre::Real* const (Ogre::Matrix4::*)(size_t)const, TC = boost::python::arg_from_python<Ogre::Matrix4&>, AC0 = boost::python::arg_from_python<long unsigned int>]' /usr/include/boost/python/detail/caller.hpp:199: instantiated from 'PyObject* boost::python::detail::caller_arity<2u>::impl<F, Policies, Sig>::operator()(PyObject*, PyObject*) [with F = const Ogre::Real* const (Ogre::Matrix4::*)(size_t)const, Policies = boost::python::return_internal_reference<1ul, boost::python::default_call_policies>, Sig = boost::mpl::vector3<const Ogre::Real* const, Ogre::Matrix4&, long unsigned int>]' /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<const Ogre::Real* const (Ogre::Matrix4::*)(size_t)const, boost::python::return_internal_reference<1ul, boost::python::default_call_policies>, boost::mpl::vector3<const Ogre::Real* const, Ogre::Matrix4&, long unsigned int> >]' build/Matrix4.pypp.cpp:113: instantiated from here /usr/include/boost/python/object/make_instance.hpp:24: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' 2. But if I take Matrix4 out, (just so I can test the basics of the bindings), I get the following: build/TagPoint.pypp.cpp:94: instantiated from here /usr/include/boost/python/detail/invoke.hpp:88: error: no match for call to '(const boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<const Ogre::Matrix4&>) (const Ogre::Matrix4&)' but, I have the following python code in my generate script, which (if I understand correctly) should take care of it: This code doesn't work, it returns 0 results: matrix4 = ogre_ns.calldefs(return_type="const Ogre::Matrix4&") matrix4.call_policies = call_policies.return_value_policy( call_policies.reference_existing_object ) This code works for nearly all other pointer/reference types, but I still get that error?! mem_funs = ogre_ns.calldefs() for mem_fun in mem_funs: if mem_fun.call_policies: continue if declarations.is_pointer (mem_fun.return_type) \ or declarations.is_reference (mem_fun.return_type): mem_fun.call_policies = call_policies.return_value_policy( call_policies.reference_existing_object ) Lakin |
From: Lakin W. <lak...@gm...> - 2006-05-31 19:43:52
|
Sorry, my mistake, the following code produces an exception: > This code doesn't work, it returns 0 results: > matrix4 = ogre_ns.calldefs(return_type="const Ogre::Matrix4&") > matrix4.call_policies = call_policies.return_value_policy( > call_policies.reference_existing_object ) Traceback (most recent call last): File "generate_code.py", line 140, in ? set_call_policies (mb) File "generate_code.py", line 118, in set_call_policies matrix4 = ogre_ns.calldefs(return_type="Ogre::Matrix4& const") File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/scopedef.py", line 384, in calldefs , allow_empty=allow_empty) File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/scopedef.py", line 295, in _find_multiple found = matcher_module.matcher.find( matcher, decls, False ) File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/matcher.py", line 35, in find return filter( decl_matcher, where ) File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/filters.py", line 339, in __call__ if not None is self.return_type \ File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/filters.py", line 360, in __compare_types if type_or_str != type.decl_string: AttributeError: 'NoneType' object has no attribute 'decl_string' Lakin |
From: Roman Y. <rom...@gm...> - 2006-05-31 19:58:18
|
On 5/31/06, Lakin Wecker <lak...@gm...> wrote: > Sorry, my mistake, the following code produces an exception: > > This code doesn't work, it returns 0 results: > > matrix4 = ogre_ns.calldefs(return_type="const Ogre::Matrix4&") > > matrix4.call_policies = call_policies.return_value_policy( > > call_policies.reference_existing_object ) > Traceback (most recent call last): > File "generate_code.py", line 140, in ? > set_call_policies (mb) > File "generate_code.py", line 118, in set_call_policies > matrix4 = ogre_ns.calldefs(return_type="Ogre::Matrix4& const") > File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/scopedef.py", > line 384, in calldefs > , allow_empty=allow_empty) > File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/scopedef.py", > line 295, in _find_multiple > found = matcher_module.matcher.find( matcher, decls, False ) > File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/matcher.py", > line 35, in find > return filter( decl_matcher, where ) > File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/filters.py", > line 339, in __call__ > if not None is self.return_type \ > File "/home/lakin/Documents/non-backup/Software/Compile/pygccxml/pygccxml_dev/pygccxml/declarations/filters.py", > line 360, in __compare_types > if type_or_str != type.decl_string: > AttributeError: 'NoneType' object has no attribute 'decl_string' Thanks for bug reporting. I think I found it and fixed. I will commit the change in few minutes. -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |
From: Roman Y. <rom...@gm...> - 2006-05-31 20:05:10
|
On 5/31/06, Lakin Wecker <lak...@gm...> wrote: > In finishing the Ogre bindings, I have run into two problems (one is > caused by the other). > > 1. First, I get an error when compiling Matrix4.cpp .. I will take a look and give you an answer > 2. But if I take Matrix4 out, (just so I can test the basics of the > bindings), I get the following: > build/TagPoint.pypp.cpp:94: instantiated from here > /usr/include/boost/python/detail/invoke.hpp:88: error: no match for > call to '(const > boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<const > Ogre::Matrix4&>) (const Ogre::Matrix4&)' If you does not register Matrix4 you can use API that takes it as argument or returns it. > but, I have the following python code in my generate script, which (if > I understand correctly) should take care of it: > > This code doesn't work, it returns 0 results: > matrix4 = ogre_ns.calldefs(return_type="const Ogre::Matrix4&") ----------------------------------------------------------^^^^^^^^^^^^^ I am not sure about this. The best way to do this is to find some function that return const Ogre::Matrix4& and then print func.return_type.decl_string After this you can use the printed text in queries. In this case I guess it will be written "Ogre::Matrix const &", but I could be wrong > matrix4.call_policies = call_policies.return_value_policy( > call_policies.reference_existing_object ) > > This code works for nearly all other pointer/reference types, but I > still get that error?! > mem_funs = ogre_ns.calldefs() > for mem_fun in mem_funs: > if mem_fun.call_policies: > continue > if declarations.is_pointer (mem_fun.return_type) \ > or declarations.is_reference (mem_fun.return_type): > mem_fun.call_policies = call_policies.return_value_policy( > call_policies.reference_existing_object ) I don't see any problem with the code. > Lakin -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |
From: Roman Y. <rom...@gm...> - 2006-05-31 20:33:39
|
On 5/31/06, Lakin Wecker <lak...@gm...> wrote: > In finishing the Ogre bindings, I have run into two problems (one is > caused by the other). > > 1. First, I get an error when compiling Matrix4.cpp .. I think, that the error caused by exported operator[]. By the way in this case call policies could be return_inernal_reference, but .... There is another problem here: those functions have next return type: [const] float *. The expression float* could not be translated to Python and manual wrapper is required. I took a look on Matrix3 class, it defines [S|G]etColumn. functions that returns Vector3 class. May be it will be possible to add such functions to Matrix4 class [G|S]Column and [G|S]Row? ( By the way I commeted the fix right now ) -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |
From: Lakin W. <lak...@gm...> - 2006-05-31 21:21:50
|
I'll look into adding the same functions to Matrix4. I'm sure Ogre will accept the patch. However, in the mean time I can avoid those functions ... In the end I'd like to have a more pythonic way of accessing Matrix{4|3}, Vector{4|3|2}, Quaternion, and ColourValue .... basically by interchanging python lists/tuples etc. Thanks Lakin On 5/31/06, Roman Yakovenko <rom...@gm...> wrote: > On 5/31/06, Lakin Wecker <lak...@gm...> wrote: > > In finishing the Ogre bindings, I have run into two problems (one is > > caused by the other). > > > > 1. First, I get an error when compiling Matrix4.cpp .. > > I think, that the error caused by exported operator[]. > > By the way in this case call policies could be > return_inernal_reference, but .... > There is another problem here: those functions have next return type: > [const] float *. The expression float* could not be translated to > Python and manual > wrapper is required. I took a look on Matrix3 class, it defines [S|G]etColumn. > functions that returns Vector3 class. May be it will be possible to > add such functions > to Matrix4 class [G|S]Column and [G|S]Row? > > ( By the way I commeted the fix right now ) > > -- > Roman Yakovenko > C++ Python language binding > http://www.language-binding.net/ > |
From: Roman Y. <rom...@gm...> - 2006-06-01 17:56:43
|
On 6/1/06, Lakin Wecker <lak...@gm...> wrote: > I'll look into adding the same functions to Matrix4. I'm sure Ogre > will accept the patch. However, in the mean time I can avoid those > functions ... boost.python has nice feature. It allows you to expose free function as a class method. class Matrix4{...}; Vector4 get_column( Matrix4& m, int i ){...} If you expose both declaration, then from Python you can write: import Ogre Ogre.Matrix4.GetColumn = Ogre.get_column Every user of Matrix4 in Python will not note the difference. You can take a look on pyplusplus_dev/examples/boost_dev rational example. I use this trick there > In the end I'd like to have a more pythonic way of accessing > Matrix{4|3}, Vector{4|3|2}, Quaternion, and ColourValue .... > basically by interchanging python lists/tuples etc. I thought about this. There are few ways to achieve the result. The idea is simple: Every time function takes as argument M[3|4] or V[2|3|4] It should able to take list or tuple. So you will need to write code that converts. You can choose, where to write the code in C++ or in Python. The C++ version will be a little faster, but it is much convenient to develop the functionality in Python. In Python there are 2 ways to implement what you want: 1. Simple approach: every relevant function should be redefined in Python and implements conversion. 2. Another idea is to use decorators. In Israel, at Python user group meeting, somebody solve problem similar to our using generators. -- Roman Yakovenko C++ Python language binding http://www.language-binding.net/ |