4343#include < pdal/util/Algorithm.hpp>
4444#include < pdal/util/Extractor.hpp>
4545
46- # include " ../plang/Environment.hpp "
46+
4747
4848#if NPY_ABI_VERSION < 0x02000000
4949 #define PyDataType_FIELDS (descr ) ((descr)->fields)
@@ -138,10 +138,13 @@ void NumpyReader::setArray(PyObject* array)
138138 Py_XINCREF (m_array);
139139}
140140
141+
141142PyArrayObject* load_npy_file (std::string const & filename)
142143{
143144
144145 PyObject *py_filename = PyUnicode_FromString (filename.c_str ());
146+ if (!py_filename)
147+ throw pdal::pdal_error (plang::getTraceback ());
145148 PyObject *numpy_module = PyImport_ImportModule (" numpy" );
146149 if (!numpy_module)
147150 throw pdal::pdal_error (plang::getTraceback ());
@@ -165,7 +168,11 @@ PyArrayObject* load_npy_file(std::string const& filename)
165168 if (!array)
166169 throw pdal::pdal_error (plang::getTraceback ());
167170
168- return reinterpret_cast <PyArrayObject*>(array);
171+
172+ PyArrayObject* nparray = reinterpret_cast <PyArrayObject*>(array);
173+ if (!PyArray_Check (array))
174+ throw pdal_error (" Numpy file did not return an array!" );
175+ return nparray;
169176}
170177
171178PyArrayObject* load_npy_script (std::string const & source,
@@ -196,6 +203,9 @@ PyArrayObject* load_npy_script(std::string const& source,
196203
197204 Py_XDECREF (scriptArgs);
198205
206+ if (!PyArray_Check (array))
207+ throw pdal_error (" Numpy script did not return an array!" );
208+
199209 return reinterpret_cast <PyArrayObject*>(array);
200210}
201211
@@ -350,32 +360,24 @@ Dimension::Id NumpyReader::registerDim(PointLayoutPtr layout,
350360 return id;
351361}
352362
353- namespace
354- {
355363
356-
357- Dimension::Type getType (PyArray_Descr *dtype, const std::string& name)
364+ void NumpyReader::createFields (PointLayoutPtr layout)
358365{
359- if (!dtype)
360- throw pdal_error (" Can't fetch data type for numpy field." );
361366
362- Dimension::Type pdalType =
363- plang::Environment::getPDALDataType (dtype->type_num );
364- if (pdalType == Dimension::Type::None)
367+ auto getPDALType = [](int type_num, const std::string& name)
365368 {
366- std::ostringstream oss;
367- oss << " Unable to map dimension '" << name << " ' because its "
368- " type '" << dtype->type_num <<" ' is not mappable to PDAL" ;
369- throw pdal_error (oss.str ());
370- }
371- return pdalType;
372- }
373-
374- } // unnamed namespace
375-
369+ Dimension::Type pdalType =
370+ plang::Environment::getPDALDataType (type_num);
371+ if (pdalType == Dimension::Type::None)
372+ {
373+ std::ostringstream oss;
374+ oss << " Unable to map dimension '" << name << " ' because its "
375+ " type '" << type_num <<" ' is not mappable to PDAL" ;
376+ throw pdal_error (oss.str ());
377+ }
378+ return pdalType;
379+ };
376380
377- void NumpyReader::createFields (PointLayoutPtr layout)
378- {
379381 Dimension::Id id;
380382 Dimension::Type type;
381383 int offset;
@@ -388,7 +390,7 @@ void NumpyReader::createFields(PointLayoutPtr layout)
388390 // Array isn't structured - just a bunch of data.
389391 if (m_numFields <= 0 )
390392 {
391- type = getType (m_dtype, m_defaultDimension);
393+ type = getPDALType (m_dtype-> type_num , m_defaultDimension);
392394 id = registerDim (layout, m_defaultDimension, type);
393395 m_fields.push_back ({id, type, 0 });
394396 }
@@ -415,7 +417,7 @@ void NumpyReader::createFields(PointLayoutPtr layout)
415417
416418 // Get type.
417419 PyArray_Descr* dt = (PyArray_Descr *)PySequence_Fast_GET_ITEM (tup, 0 );
418- type = getType (dt, name);
420+ type = getPDALType (dt-> type_num , name);
419421
420422 char byteorder = dt->byteorder ;
421423 int elsize = (int ) PyDataType_ELSIZE (dt);
0 commit comments