]> granicus.if.org Git - python/commitdiff
#3560: cleanup C memoryview API
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 19 Aug 2008 18:22:14 +0000 (18:22 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 19 Aug 2008 18:22:14 +0000 (18:22 +0000)
Include/memoryobject.h
Misc/NEWS
Modules/_json.c
Objects/memoryobject.c
Objects/unicodeobject.c

index ad2e8e781f62c2ce418bfbd318115afed2db8d51..3888259124fcde487ff77fd278391c7683970f13 100644 (file)
@@ -1,5 +1,4 @@
-
-/* Memory object interface */
+/* Memory view object. In Python this is available as "memoryview". */
 
 #ifndef Py_MEMORYOBJECT_H
 #define Py_MEMORYOBJECT_H
@@ -7,19 +6,15 @@
 extern "C" {
 #endif
 
-typedef struct {
-       PyObject_HEAD
-       PyObject *base;
-       Py_buffer view;
-} PyMemoryViewObject;
-
-
 PyAPI_DATA(PyTypeObject) PyMemoryView_Type;
 
-#define PyMemory_Check(op) (Py_TYPE(op) == &PyMemoryView_Type)
-#define PyMemoryView(op) (((PyMemoryViewObject *)(op))->view)
+#define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type)
+
+/* Get a pointer to the underlying Py_buffer of a memoryview object. */
+#define PyMemoryView_GET_BUFFER(op) (&((PyMemoryViewObject *)(op))->view)
+/* Get a pointer to the PyObject from which originates a memoryview object. */
+#define PyMemoryView_GET_BASE(op) (((PyMemoryViewObject *)(op))->view.obj)
 
-#define Py_END_OF_MEMORY       (-1)
 
 PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, 
                                                  int buffertype, 
@@ -58,10 +53,21 @@ PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base,
 
 PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(PyObject *base);
 
-PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(Py_buffer *info);
+PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info);
        /* create new if bufptr is NULL 
            will be a new bytesobject in base */
 
+       
+/* The struct is declared here so that macros can work, but it shouldn't
+   be considered public. Don't access those fields directly, use the macros
+   and functions instead! */
+typedef struct {
+       PyObject_HEAD
+       PyObject *base;
+       Py_buffer view;
+} PyMemoryViewObject;
+       
+
 #ifdef __cplusplus
 }
 #endif
index e8fa5f5ac50fde4170ad38351e070d6360da3619..8d163c214ab09c28fb191703408ceee620a257f1 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,12 @@ What's new in Python 3.0b3?
 Core and Builtins
 -----------------
 
+- Issue #3560: clean up the new C PyMemoryView API so that naming is
+  internally consistent; add macros PyMemoryView_GET_BASE() and
+  PyMemoryView_GET_BUFFER() to access useful properties of a memory views
+  without relying on a particular implementation; remove the ill-named
+  PyMemoryView() function (PyMemoryView_GET_BUFFER() can be used instead).
+
 - Issue #1819: function calls with several named parameters are now on
   average 35% faster (as measured by pybench).
 
index a724f89053f278a9457ec3f1ac844df73513a8b9..47c4a567ed53e2c610587f5bc8fdaeaf62e3d712 100644 (file)
@@ -264,7 +264,7 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict)
             if (PyBuffer_FillInfo(&info, NULL, &buf[end], next - end, 1, 0) < 0) {
                 goto bail;
             }
-            strchunk = PyMemoryView_FromMemory(&info);
+            strchunk = PyMemoryView_FromBuffer(&info);
             if (strchunk == NULL) {
                 goto bail;
             }
index b36c3a7ade599c2ae383ef3b71adfd036de5807e..c108363bf830bc48d3ed36454147bbdc3d9e1d65 100644 (file)
@@ -29,7 +29,7 @@ PyDoc_STRVAR(memory_doc,
 Create a new memoryview object which references the given object.");
 
 PyObject *
-PyMemoryView_FromMemory(Py_buffer *info)
+PyMemoryView_FromBuffer(Py_buffer *info)
 {
        PyMemoryViewObject *mview;
 
@@ -231,7 +231,7 @@ PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort)
         mem = PyObject_New(PyMemoryViewObject, &PyMemoryView_Type);
         if (mem == NULL) return NULL;
 
-        view = &PyMemoryView(mem);
+        view = &mem->view;
         flags = PyBUF_FULL_RO;
         switch(buffertype) {
         case PyBUF_WRITE:
@@ -534,7 +534,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key)
                        /* XXX:  This needs to be fixed so it
                                 actually returns a sub-view
                        */
-                       return PyMemoryView_FromMemory(&newview);
+                       return PyMemoryView_FromBuffer(&newview);
                }
        }
 
index 5de265d74df90f598787e26df971500704520953..c85a063db58abac9e112a9b975c8a0dbb92de9c4 100644 (file)
@@ -1200,7 +1200,7 @@ PyObject *PyUnicode_Decode(const char *s,
     buffer = NULL;
     if (PyBuffer_FillInfo(&info, NULL, (void *)s, size, 1, PyBUF_SIMPLE) < 0)
         goto onError;
-    buffer = PyMemoryView_FromMemory(&info);
+    buffer = PyMemoryView_FromBuffer(&info);
     if (buffer == NULL)
         goto onError;
     unicode = PyCodec_Decode(buffer, encoding, errors);