Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex.  Add some more functionality to the memoryview object.
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index 1486c5e..c7fe751 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -50,7 +50,7 @@
 }
 
 static int
-bytes_getbuffer(PyBytesObject *obj, PyBuffer *view, int flags)
+bytes_getbuffer(PyBytesObject *obj, Py_buffer *view, int flags)
 {
         int ret;
         void *ptr;
@@ -70,13 +70,13 @@
 }
 
 static void
-bytes_releasebuffer(PyBytesObject *obj, PyBuffer *view)
+bytes_releasebuffer(PyBytesObject *obj, Py_buffer *view)
 {
         obj->ob_exports--;
 }
 
 static Py_ssize_t
-_getbuffer(PyObject *obj, PyBuffer *view)
+_getbuffer(PyObject *obj, Py_buffer *view)
 {
     PyBufferProcs *buffer = Py_Type(obj)->tp_as_buffer;
 
@@ -213,7 +213,7 @@
 PyBytes_Concat(PyObject *a, PyObject *b)
 {
     Py_ssize_t size;
-    PyBuffer va, vb;
+    Py_buffer va, vb;
     PyBytesObject *result;
 
     va.len = -1;
@@ -266,7 +266,7 @@
 {
     Py_ssize_t mysize;
     Py_ssize_t size;
-    PyBuffer vo;
+    Py_buffer vo;
 
     if (_getbuffer(other, &vo) < 0) {
         PyErr_Format(PyExc_TypeError, "can't concat bytes to %.100s",
@@ -462,7 +462,7 @@
 {
     Py_ssize_t avail, needed;
     void *bytes;
-    PyBuffer vbytes;
+    Py_buffer vbytes;
     int res = 0;
 
     vbytes.len = -1;
@@ -814,7 +814,7 @@
     /* Use the modern buffer interface */
     if (PyObject_CheckBuffer(arg)) {
         Py_ssize_t size;
-        PyBuffer view;
+        Py_buffer view;
         if (PyObject_GetBuffer(arg, &view, PyBUF_FULL_RO) < 0)
             return -1;
         size = view.len;
@@ -954,7 +954,7 @@
 bytes_richcompare(PyObject *self, PyObject *other, int op)
 {
     Py_ssize_t self_size, other_size;
-    PyBuffer self_bytes, other_bytes;
+    Py_buffer self_bytes, other_bytes;
     PyObject *res;
     Py_ssize_t minsize;
     int cmp;
@@ -1067,7 +1067,7 @@
 bytes_find_internal(PyBytesObject *self, PyObject *args, int dir)
 {
     PyObject *subobj;
-    PyBuffer subbuf;
+    Py_buffer subbuf;
     Py_ssize_t start=0, end=PY_SSIZE_T_MAX;
     Py_ssize_t res;
 
@@ -2033,7 +2033,7 @@
 {
     Py_ssize_t count = -1;
     PyObject *from, *to, *res;
-    PyBuffer vfrom, vto;
+    Py_buffer vfrom, vto;
 
     if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count))
         return NULL;
@@ -2187,7 +2187,7 @@
     Py_ssize_t maxsplit = -1, count = 0;
     const char *s = PyBytes_AS_STRING(self), *sub;
     PyObject *list, *str, *subobj = Py_None;
-    PyBuffer vsub;
+    Py_buffer vsub;
 #ifdef USE_FAST
     Py_ssize_t pos;
 #endif
@@ -2396,7 +2396,7 @@
     Py_ssize_t maxsplit = -1, count = 0;
     const char *s = PyBytes_AS_STRING(self), *sub;
     PyObject *list, *str, *subobj = Py_None;
-    PyBuffer vsub;
+    Py_buffer vsub;
 
     if (!PyArg_ParseTuple(args, "|On:rsplit", &subobj, &maxsplit))
         return NULL;
@@ -2647,7 +2647,7 @@
     Py_ssize_t left, right, mysize, argsize;
     void *myptr, *argptr;
     PyObject *arg = Py_None;
-    PyBuffer varg;
+    Py_buffer varg;
     if (!PyArg_ParseTuple(args, "|O:strip", &arg))
         return NULL;
     if (arg == Py_None) {
@@ -2683,7 +2683,7 @@
     Py_ssize_t left, right, mysize, argsize;
     void *myptr, *argptr;
     PyObject *arg = Py_None;
-    PyBuffer varg;
+    Py_buffer varg;
     if (!PyArg_ParseTuple(args, "|O:lstrip", &arg))
         return NULL;
     if (arg == Py_None) {
@@ -2716,7 +2716,7 @@
     Py_ssize_t left, right, mysize, argsize;
     void *myptr, *argptr;
     PyObject *arg = Py_None;
-    PyBuffer varg;
+    Py_buffer varg;
     if (!PyArg_ParseTuple(args, "|O:rstrip", &arg))
         return NULL;
     if (arg == Py_None) {