diff --git a/src/details.hpp b/src/details.hpp index 887880feb9f282d3dec5af5f1cdc4bdee38beab3..6e9816e657854798cf0b50caacb7f031a7bcf462 100644 --- a/src/details.hpp +++ b/src/details.hpp @@ -98,6 +98,16 @@ namespace eigenpy /* --- FROM PYTHON ------------------------------------------------------------ */ + template<typename MatType> + struct EigenObjectAllocator + { + static void allocate(PyArrayObject * pyArray, void * storage) + { + typename MapNumpy<MatType>::EigenMap numpyMap = MapNumpy<MatType>::map(pyArray); + new(storage) MatType(numpyMap); + } + }; + template<typename MatType> struct EigenFromPy { @@ -159,14 +169,13 @@ namespace eigenpy using namespace Eigen; PyArrayObject * pyArray = reinterpret_cast<PyArrayObject*>(pyObj); - typename MapNumpy<MatType>::EigenMap numpyMap = MapNumpy<MatType>::map(pyArray); - assert( (numpyMap.rows()<INT_MAX) && (numpyMap.cols()<INT_MAX) - && "Map range larger than int ... can never happen." ); + assert((PyArray_DIMS(pyArray)[0]<INT_MAX) && (PyArray_DIMS(pyArray)[1]<INT_MAX)); void* storage = ((bp::converter::rvalue_from_python_storage<MatType>*) ((void*)memory))->storage.bytes; - new(storage) MatType(numpyMap); + EigenObjectAllocator<MatType>::allocate(pyArray,storage); + memory->convertible = storage; } };