From cfba28b46a26dccbc06dbdd400b6bf1fb66efe49 Mon Sep 17 00:00:00 2001
From: jcarpent <jcarpent@laas.fr>
Date: Tue, 9 Jan 2018 11:49:17 +0100
Subject: [PATCH] [Core] Introduce dedicated struct for allocation

---
 src/details.hpp | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/details.hpp b/src/details.hpp
index 887880fe..6e9816e6 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;
     }
   };
-- 
GitLab