From c4d22398dcbe45b428e6d7c149e0bc46bad30d79 Mon Sep 17 00:00:00 2001 From: Justin Carpentier <justin.carpentier@inria.fr> Date: Thu, 18 Jul 2019 17:50:53 +0200 Subject: [PATCH] core: add fix for bug in boost::rvalue_from_python_data --- CMakeLists.txt | 1 + include/eigenpy/details.hpp | 1 + .../details/rvalue_from_python_data.hpp | 55 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 include/eigenpy/details/rvalue_from_python_data.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5568d339..818699d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ SET(${PROJECT_NAME}_HEADERS include/eigenpy/quaternion.hpp include/eigenpy/stride.hpp include/eigenpy/ref.hpp + include/eigenpy/details/rvalue_from_python_data.hpp ) INCLUDE_DIRECTORIES(${${PROJECT_NAME}_BINARY_DIR}/include) diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index 5fa79557..47cb7a31 100644 --- a/include/eigenpy/details.hpp +++ b/include/eigenpy/details.hpp @@ -6,6 +6,7 @@ #ifndef __eigenpy_details_hpp__ #define __eigenpy_details_hpp__ +#include "eigenpy/details/rvalue_from_python_data.hpp" #include "eigenpy/fwd.hpp" #include <patchlevel.h> // For PY_MAJOR_VERSION diff --git a/include/eigenpy/details/rvalue_from_python_data.hpp b/include/eigenpy/details/rvalue_from_python_data.hpp new file mode 100644 index 00000000..3cd94e97 --- /dev/null +++ b/include/eigenpy/details/rvalue_from_python_data.hpp @@ -0,0 +1,55 @@ +#ifndef __eigenpy_details_rvalue_from_python_data_hpp__ +#define __eigenpy_details_rvalue_from_python_data_hpp__ + +#include <boost/python/converter/rvalue_from_python_data.hpp> +#include <Eigen/Core> + +namespace boost +{ + namespace python + { + namespace converter + { + + /// \brief Template specialization of rvalue_from_python_data + template<typename Derived> + struct rvalue_from_python_data<Eigen::MatrixBase<Derived> const & > + : rvalue_from_python_storage<Eigen::MatrixBase<Derived> const & > + { + typedef Eigen::MatrixBase<Derived> const & T; + +# if (!defined(__MWERKS__) || __MWERKS__ >= 0x3000) \ +&& (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 245) \ +&& (!defined(__DECCXX_VER) || __DECCXX_VER > 60590014) \ +&& !defined(BOOST_PYTHON_SYNOPSIS) /* Synopsis' OpenCXX has trouble parsing this */ + // This must always be a POD struct with m_data its first member. + BOOST_STATIC_ASSERT(BOOST_PYTHON_OFFSETOF(rvalue_from_python_storage<T>,stage1) == 0); +# endif + + // The usual constructor + rvalue_from_python_data(rvalue_from_python_stage1_data const & _stage1) + { + this->stage1 = _stage1; + } + + // This constructor just sets m_convertible -- used by + // implicitly_convertible<> to perform the final step of the + // conversion, where the construct() function is already known. + rvalue_from_python_data(void* convertible) + { + this->stage1.convertible = convertible; + } + + // Destroys any object constructed in the storage. + ~rvalue_from_python_data() + { + if (this->stage1.convertible == this->storage.bytes) + static_cast<Derived *>((void *)this->storage.bytes)->~Derived(); + } + }; + + } + } +} // namespace boost::python::converter + +#endif // ifndef __eigenpy_details_rvalue_from_python_data_hpp__ -- GitLab