Make buffer_info::as_pybuffer a memoryview ctor
diff --git a/include/pybind11/common.h b/include/pybind11/common.h
index 32e8abf..302d75a 100644
--- a/include/pybind11/common.h
+++ b/include/pybind11/common.h
@@ -232,30 +232,6 @@
if (view) { PyBuffer_Release(view); delete view; }
}
- Py_buffer& as_pybuffer() const {
- static Py_buffer buf { };
- // Py_buffer uses signed sizes, strides and shape!..
- static std::vector<Py_ssize_t> py_strides { };
- static std::vector<Py_ssize_t> py_shape { };
- buf.buf = ptr;
- buf.itemsize = (Py_ssize_t) itemsize;
- buf.format = const_cast<char *>(format.c_str());
- buf.ndim = (int) ndim;
- buf.len = (Py_ssize_t) size;
- py_strides.clear();
- py_shape.clear();
- for (size_t i = 0; i < ndim; ++i) {
- py_strides.push_back((Py_ssize_t) strides[i]);
- py_shape.push_back((Py_ssize_t) shape[i]);
- }
- buf.strides = py_strides.data();
- buf.shape = py_shape.data();
- buf.suboffsets = nullptr;
- buf.readonly = false;
- buf.internal = nullptr;
- return buf;
- }
-
private:
Py_buffer *view = nullptr;
};
diff --git a/include/pybind11/pytypes.h b/include/pybind11/pytypes.h
index 7a6cf6f..db87b08 100644
--- a/include/pybind11/pytypes.h
+++ b/include/pybind11/pytypes.h
@@ -572,10 +572,29 @@
class memoryview : public object {
public:
- memoryview(const buffer_info& info) : memoryview(&info.as_pybuffer()) { }
+ memoryview(const buffer_info& info) {
+ static Py_buffer buf { };
+ // Py_buffer uses signed sizes, strides and shape!..
+ static std::vector<Py_ssize_t> py_strides { };
+ static std::vector<Py_ssize_t> py_shape { };
+ buf.buf = info.ptr;
+ buf.itemsize = (Py_ssize_t) info.itemsize;
+ buf.format = const_cast<char *>(info.format.c_str());
+ buf.ndim = (int) info.ndim;
+ buf.len = (Py_ssize_t) info.size;
+ py_strides.clear();
+ py_shape.clear();
+ for (size_t i = 0; i < info.ndim; ++i) {
+ py_strides.push_back((Py_ssize_t) info.strides[i]);
+ py_shape.push_back((Py_ssize_t) info.shape[i]);
+ }
+ buf.strides = py_strides.data();
+ buf.shape = py_shape.data();
+ buf.suboffsets = nullptr;
+ buf.readonly = false;
+ buf.internal = nullptr;
- memoryview(Py_buffer* view)
- : object(PyMemoryView_FromBuffer(view), false) {
+ m_ptr = PyMemoryView_FromBuffer(&buf);
if (!m_ptr)
pybind11_fail("Unable to create memoryview from buffer descriptor");
}