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");
     }