From 1f54cd92096b163185fa15669f359e0dc70c1a73 Mon Sep 17 00:00:00 2001 From: Ivan Smirnov Date: Wed, 22 Jun 2016 00:42:10 +0100 Subject: [PATCH] Use object instead of ptrs in numpy descriptors --- include/pybind11/numpy.h | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/include/pybind11/numpy.h b/include/pybind11/numpy.h index 41d0fea9..28890998 100644 --- a/include/pybind11/numpy.h +++ b/include/pybind11/numpy.h @@ -96,7 +96,7 @@ public: template array(size_t size, const Type *ptr) { API& api = lookup_api(); - PyObject *descr = object(detail::npy_format_descriptor::descr(), true).release().ptr(); + PyObject *descr = detail::npy_format_descriptor::descr().release().ptr(); Py_intptr_t shape = (Py_intptr_t) size; object tmp = object(api.PyArray_NewFromDescr_( api.PyArray_Type_, descr, 1, &shape, nullptr, (void *) ptr, 0, nullptr), false); @@ -147,7 +147,7 @@ public: if (ptr == nullptr) return nullptr; API &api = lookup_api(); - PyObject *descr = object(detail::npy_format_descriptor::descr(), true).release().ptr(); + PyObject *descr = detail::npy_format_descriptor::descr().release().ptr(); PyObject *result = api.PyArray_FromAny_(ptr, descr, 0, 0, API::NPY_ENSURE_ARRAY_ | ExtraFlags, nullptr); if (!result) PyErr_Clear(); @@ -178,8 +178,8 @@ private: array::API::NPY_INT_, array::API::NPY_UINT_, array::API::NPY_LONGLONG_, array::API::NPY_ULONGLONG_ }; public: static int typenum() { return values[detail::log2(sizeof(T)) * 2 + (std::is_unsigned::value ? 1 : 0)]; } - static PyObject* descr() { - if (auto obj = array::lookup_api().PyArray_DescrFromType_(typenum())) return obj; + static py::object descr() { + if (auto ptr = array::lookup_api().PyArray_DescrFromType_(typenum())) return py::object(ptr, true); else pybind11_fail("Unsupported buffer format!"); } template ::value, int>::type = 0> @@ -192,8 +192,8 @@ template constexpr const int npy_format_descriptor< #define DECL_FMT(Type, NumPyName, Name) template<> struct npy_format_descriptor { \ static int typenum() { return array::API::NumPyName; } \ - static PyObject* descr() { \ - if (auto obj = array::lookup_api().PyArray_DescrFromType_(typenum())) return obj; \ + static py::object descr() { \ + if (auto ptr = array::lookup_api().PyArray_DescrFromType_(typenum())) return py::object(ptr, true); \ else pybind11_fail("Unsupported buffer format!"); \ } \ static PYBIND11_DESCR name() { return _(Name); } } @@ -207,7 +207,7 @@ DECL_FMT(std::complex, NPY_CDOUBLE_, "complex128"); struct field_descriptor { const char *name; int offset; - PyObject *descr; + py::object descr; }; template struct npy_format_descriptor @@ -220,10 +220,10 @@ template struct npy_format_descriptor { static PYBIND11_DESCR name() { return _("user-defined"); } - static PyObject* descr() { + static py::object descr() { if (!descr_()) pybind11_fail("NumPy: unsupported buffer format!"); - return descr_(); + return py::object(descr_(), true); } static const char* format_str() { @@ -239,7 +239,7 @@ template struct npy_format_descriptor pybind11_fail("NumPy: unsupported field dtype"); names.append(py::str(field.name)); offsets.append(py::int_(field.offset)); - formats.append(object(field.descr, true)); + formats.append(field.descr); } args["names"] = names; args["offsets"] = offsets; @@ -265,7 +265,8 @@ private: #define FIELD_DESCRIPTOR(Type, Field) \ ::pybind11::detail::field_descriptor { \ #Field, offsetof(Type, Field), \ - ::pybind11::detail::npy_format_descriptor(0)->Field)>::descr() } + ::pybind11::detail::npy_format_descriptor(0)->Field)>::descr() \ + } // The main idea of this macro is borrowed from https://github.com/swansontec/map-macro // (C) William Swanson, Paul Fultz