diff --git a/Include/memoryobject.h b/Include/memoryobject.h index ad2e8e781f6..3888259124f 100644 --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -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 diff --git a/Misc/NEWS b/Misc/NEWS index e8fa5f5ac50..8d163c214ab 100644 --- 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). diff --git a/Modules/_json.c b/Modules/_json.c index a724f89053f..47c4a567ed5 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -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; } diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index b36c3a7ade5..c108363bf83 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -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); } } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5de265d74df..c85a063db58 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -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);