[python] Expose memory-aligned data types?
Using Boost.Python, is it possible to expose a C++ memory-aligned data type to Python? For example, I want to expose this data type. class __declspec(align(16)) foo { public: foo() {}; bool isAligned() { if ((int)this % 16 == 0) { return true; } else { return false; } } private: int a, b, c, d; }; I've written the following code to expose this class to Python: BOOST_PYTHON_MODULE(myModule) { boost::python::class_<foo>("foo", boost::python::init<>()) .def("isAligned", &bar.isAligned) ; } When compiling this code (MSVC 8.0, VS2005, Win32), I get the following error (entire error listed at the bottom): d:\...\boost\python\converter\as_to_python_function.hpp(21) : error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned Note that I used to get a STATIC_ASSERTION_FAILURE in the type_with_alignment class definition when compiling with Boost 1.34. I found adding a 16-byte aligned struct type to the BOOST_TT_ALIGNMENT_BASE_TYPES list in type_with_alignment.hpp made the ASSERT go away, but introduced the above error. In an attempt to fix it, I downloaded Boost revision 43984 from early April, 2008, which included a patch that I thought would help me. See http://svn.boost.org/trac/boost/changeset/43984. While the type_with_alignment.hpp included in that revision did correct the STATIC_ASSERTION_FAILURE, I am still hitting the above error. Now, if I try to build the same code in x64 instead of Win32 (again, from revision 43984), I do not encounter the error. Not only does it compile, but I have verified that any objects 16-byte aligned objects I instanciate in Python are actually aligned correctly. Unsurprisingly, however, the x64 build produces the same error when I try to expose a 32-byte aligned data type. On the other hand, the Win32 build still complains if I try it with an 8-byte aligned data type. I'm hoping there is a piece of Boost.Python code missing from the class exposition that I don't know about. I've scoured the documentation and internet (and code) for such a thing, but I may have overlooked it. Any advice? -Dan Fike Here is the entire error, as printed by VS2005... d:\...\boost\python\converter\as_to_python_function.hpp(21) : error C2719: 'unnamed-parameter': formal parameter with __declspec(align('16')) won't be aligned d:\...\boost\python\to_python_converter.hpp(88) : see reference to class template instantiation 'boost::python::converter::as_to_python_function' being compiled with [ T=foo, ToPython=boost::python::objects::class_cref_wrapper>> ] d:\...\boost\python\to_python_converter.hpp(82) : while compiling class template member function 'boost::python::to_python_converter::to_python_converter(void)' with [ T=foo, Conversion=boost::python::objects::class_cref_wrapper>>, has_get_pytype=true ] d:\...\boost\python\object\class_wrapper.hpp(26) : see reference to class template instantiation 'boost::python::to_python_converter' being compiled with [ T=foo, Conversion=boost::python::objects::class_cref_wrapper>>, has_get_pytype=true ] d:\...\boost\python\object\class_metadata.hpp(272) : see reference to class template instantiation 'boost::python::objects::class_cref_wrapper' being compiled with [ Src=foo, MakeInstance=boost::python::objects::make_instance> ] d:\...\boost\python\object\class_metadata.hpp(229) : see reference to function template instantiation 'void boost::python::objects::class_metadata::maybe_register_class_to_python(T2 *,boost::mpl::false_)' being compiled with [ T=foo, X1=boost::python::detail::not_specified, X2=boost::python::detail::not_specified, X3=boost::python::detail::not_specified, T2=foo ] d:\...\boost\python\object\class_metadata.hpp(219) : see reference to function template instantiation 'void boost::python::objects::class_metadata::register_aux2>(T2 *,Callback)' being compiled with [ T=foo, X1=boost::python::detail::not_specified, X2=boost::python::detail::not_specified, X3=boost::python::detail::not_specified, T2=foo, Callback=boost::integral_constant ] d:\...\boost\python\object\class_metadata.hpp(217) : while compiling class template member function 'void boost::python::objects::class_metadata::register_aux(void *)' with [ T=foo, X1=boost::python::detail::not_specified, X2=boost::python::detail::not_specified, X3=boost::python::detail::not_specified ] d:\...\boost\python\class.hpp(174) : see reference to class template instantiation 'boost::python::objects::class_metadata' being compiled with [ T=foo, X1=boost::python::detail::not_specified, X2=boost::python::detail::not_specified, X3=boost::python::detail::not_specified ] d:\...\boost\python\class.hpp(205) : see reference to class template instantiation 'boost::python::class_::id_vector' being compiled with [ W=foo ] d:\...\MyProject\my_project_python_modules.h(77) : see reference to function template instantiation 'boost::python::class_::class_>(const char *,const boost::python::init_base &)' being compiled with [ W=foo, DerivedT=boost::python::init<> ]
"Dan Fike"
I've written the following code to expose this class to Python:
BOOST_PYTHON_MODULE(myModule) { boost::python::class_<foo>("foo", boost::python::init<>()) .def("isAligned", &bar.isAligned) ; }
I made a minor typo in the above code when preparing it for the mailing list. It doesn't have any bearing on the rest of the thread. The 3rd line should read as follows: .def ("isAligned", &foo::isAligned)
participants (1)
-
Dan Fike