#3560: cleanup C memoryview API
This commit is contained in:
parent
fd036451bf
commit
ee58fa484e
|
@ -1,5 +1,4 @@
|
||||||
|
/* 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 @@
|
||||||
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,
|
||||||
|
|
||||||
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?
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
/* 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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue