Kaydet (Commit) ee58fa48 authored tarafından Antoine Pitrou's avatar Antoine Pitrou

#3560: cleanup C memoryview API

üst fd036451
/* Memory view object. In Python this is available as "memoryview". */
/* Memory object interface */
#ifndef Py_MEMORYOBJECT_H #ifndef Py_MEMORYOBJECT_H
#define Py_MEMORYOBJECT_H #define Py_MEMORYOBJECT_H
...@@ -7,19 +6,15 @@ ...@@ -7,19 +6,15 @@
extern "C" { extern "C" {
#endif #endif
typedef struct {
PyObject_HEAD
PyObject *base;
Py_buffer view;
} PyMemoryViewObject;
PyAPI_DATA(PyTypeObject) PyMemoryView_Type; PyAPI_DATA(PyTypeObject) PyMemoryView_Type;
#define PyMemory_Check(op) (Py_TYPE(op) == &PyMemoryView_Type) #define PyMemoryView_Check(op) (Py_TYPE(op) == &PyMemoryView_Type)
#define PyMemoryView(op) (((PyMemoryViewObject *)(op))->view)
/* 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, PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base,
int buffertype, int buffertype,
...@@ -58,10 +53,21 @@ PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, ...@@ -58,10 +53,21 @@ PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base,
PyAPI_FUNC(PyObject *) PyMemoryView_FromObject(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 /* create new if bufptr is NULL
will be a new bytesobject in base */ 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 #ifdef __cplusplus
} }
#endif #endif
......
...@@ -12,6 +12,12 @@ What's new in Python 3.0b3? ...@@ -12,6 +12,12 @@ What's new in Python 3.0b3?
Core and Builtins 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 - Issue #1819: function calls with several named parameters are now on
average 35% faster (as measured by pybench). average 35% faster (as measured by pybench).
......
...@@ -264,7 +264,7 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict) ...@@ -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) { if (PyBuffer_FillInfo(&info, NULL, &buf[end], next - end, 1, 0) < 0) {
goto bail; goto bail;
} }
strchunk = PyMemoryView_FromMemory(&info); strchunk = PyMemoryView_FromBuffer(&info);
if (strchunk == NULL) { if (strchunk == NULL) {
goto bail; goto bail;
} }
......
...@@ -29,7 +29,7 @@ PyDoc_STRVAR(memory_doc, ...@@ -29,7 +29,7 @@ PyDoc_STRVAR(memory_doc,
Create a new memoryview object which references the given object."); Create a new memoryview object which references the given object.");
PyObject * PyObject *
PyMemoryView_FromMemory(Py_buffer *info) PyMemoryView_FromBuffer(Py_buffer *info)
{ {
PyMemoryViewObject *mview; PyMemoryViewObject *mview;
...@@ -231,7 +231,7 @@ PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort) ...@@ -231,7 +231,7 @@ PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort)
mem = PyObject_New(PyMemoryViewObject, &PyMemoryView_Type); mem = PyObject_New(PyMemoryViewObject, &PyMemoryView_Type);
if (mem == NULL) return NULL; if (mem == NULL) return NULL;
view = &PyMemoryView(mem); view = &mem->view;
flags = PyBUF_FULL_RO; flags = PyBUF_FULL_RO;
switch(buffertype) { switch(buffertype) {
case PyBUF_WRITE: case PyBUF_WRITE:
...@@ -534,7 +534,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key) ...@@ -534,7 +534,7 @@ memory_subscript(PyMemoryViewObject *self, PyObject *key)
/* XXX: This needs to be fixed so it /* XXX: This needs to be fixed so it
actually returns a sub-view actually returns a sub-view
*/ */
return PyMemoryView_FromMemory(&newview); return PyMemoryView_FromBuffer(&newview);
} }
} }
......
...@@ -1200,7 +1200,7 @@ PyObject *PyUnicode_Decode(const char *s, ...@@ -1200,7 +1200,7 @@ PyObject *PyUnicode_Decode(const char *s,
buffer = NULL; buffer = NULL;
if (PyBuffer_FillInfo(&info, NULL, (void *)s, size, 1, PyBUF_SIMPLE) < 0) if (PyBuffer_FillInfo(&info, NULL, (void *)s, size, 1, PyBUF_SIMPLE) < 0)
goto onError; goto onError;
buffer = PyMemoryView_FromMemory(&info); buffer = PyMemoryView_FromBuffer(&info);
if (buffer == NULL) if (buffer == NULL)
goto onError; goto onError;
unicode = PyCodec_Decode(buffer, encoding, errors); unicode = PyCodec_Decode(buffer, encoding, errors);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment