annotate Objects/memoryobject.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents adb471b9cba1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1 /* Memoryview object implementation */
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
3 #include "Python.h"
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
4 #include <stddef.h>
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
5
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
6
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
7 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
8 /* ManagedBuffer Object */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
9 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
10
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
11 /*
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
12 ManagedBuffer Object:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
13 ---------------------
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
14
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
15 The purpose of this object is to facilitate the handling of chained
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
16 memoryviews that have the same underlying exporting object. PEP-3118
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
17 allows the underlying object to change while a view is exported. This
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
18 could lead to unexpected results when constructing a new memoryview
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
19 from an existing memoryview.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
20
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
21 Rather than repeatedly redirecting buffer requests to the original base
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
22 object, all chained memoryviews use a single buffer snapshot. This
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
23 snapshot is generated by the constructor _PyManagedBuffer_FromObject().
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
24
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
25 Ownership rules:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
26 ----------------
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
27
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
28 The master buffer inside a managed buffer is filled in by the original
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
29 base object. shape, strides, suboffsets and format are read-only for
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
30 all consumers.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
31
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
32 A memoryview's buffer is a private copy of the exporter's buffer. shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
33 strides and suboffsets belong to the memoryview and are thus writable.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
34
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
35 If a memoryview itself exports several buffers via memory_getbuf(), all
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
36 buffer copies share shape, strides and suboffsets. In this case, the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
37 arrays are NOT writable.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
38
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
39 Reference count assumptions:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
40 ----------------------------
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
41
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
42 The 'obj' member of a Py_buffer must either be NULL or refer to the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
43 exporting base object. In the Python codebase, all getbufferprocs
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
44 return a new reference to view.obj (example: bytes_buffer_getbuffer()).
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
45
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
46 PyBuffer_Release() decrements view.obj (if non-NULL), so the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
47 releasebufferprocs must NOT decrement view.obj.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
48 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
49
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
50
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
51 #define XSTRINGIZE(v) #v
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
52 #define STRINGIZE(v) XSTRINGIZE(v)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
53
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
54 #define CHECK_MBUF_RELEASED(mbuf) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
55 if (((_PyManagedBufferObject *)mbuf)->flags&_Py_MANAGED_BUFFER_RELEASED) { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
56 PyErr_SetString(PyExc_ValueError, \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
57 "operation forbidden on released memoryview object"); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
58 return NULL; \
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
59 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
60
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
61
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
62 Py_LOCAL_INLINE(_PyManagedBufferObject *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
63 mbuf_alloc(void)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
64 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
65 _PyManagedBufferObject *mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
66
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
67 mbuf = (_PyManagedBufferObject *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
68 PyObject_GC_New(_PyManagedBufferObject, &_PyManagedBuffer_Type);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
69 if (mbuf == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
70 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
71 mbuf->flags = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
72 mbuf->exports = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
73 mbuf->master.obj = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
74 _PyObject_GC_TRACK(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
75
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
76 return mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
77 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
78
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
79 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
80 _PyManagedBuffer_FromObject(PyObject *base)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
81 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
82 _PyManagedBufferObject *mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
83
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
84 mbuf = mbuf_alloc();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
85 if (mbuf == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
86 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
87
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
88 if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) {
75440
9f7d06a9eabe Issue #14181: Preserve backwards compatibility for getbufferprocs that a) do
Stefan Krah <skrah@bytereef.org>
parents: 75409
diff changeset
89 mbuf->master.obj = NULL;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
90 Py_DECREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
91 return NULL;
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
92 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
93
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
94 return (PyObject *)mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
95 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
96
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
97 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
98 mbuf_release(_PyManagedBufferObject *self)
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
99 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
100 if (self->flags&_Py_MANAGED_BUFFER_RELEASED)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
101 return;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
102
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
103 /* NOTE: at this point self->exports can still be > 0 if this function
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
104 is called from mbuf_clear() to break up a reference cycle. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
105 self->flags |= _Py_MANAGED_BUFFER_RELEASED;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
106
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
107 /* PyBuffer_Release() decrements master->obj and sets it to NULL. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
108 _PyObject_GC_UNTRACK(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
109 PyBuffer_Release(&self->master);
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
110 }
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
111
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
112 static void
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
113 mbuf_dealloc(_PyManagedBufferObject *self)
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
114 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
115 assert(self->exports == 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
116 mbuf_release(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
117 if (self->flags&_Py_MANAGED_BUFFER_FREE_FORMAT)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
118 PyMem_Free(self->master.format);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
119 PyObject_GC_Del(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
120 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
121
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
122 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
123 mbuf_traverse(_PyManagedBufferObject *self, visitproc visit, void *arg)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
124 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
125 Py_VISIT(self->master.obj);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
126 return 0;
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
127 }
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
128
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
129 static int
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
130 mbuf_clear(_PyManagedBufferObject *self)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
131 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
132 assert(self->exports >= 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
133 mbuf_release(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
134 return 0;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
135 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
136
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
137 PyTypeObject _PyManagedBuffer_Type = {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
138 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
139 "managedbuffer",
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
140 sizeof(_PyManagedBufferObject),
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
141 0,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
142 (destructor)mbuf_dealloc, /* tp_dealloc */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
143 0, /* tp_print */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
144 0, /* tp_getattr */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
145 0, /* tp_setattr */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
146 0, /* tp_reserved */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
147 0, /* tp_repr */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
148 0, /* tp_as_number */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
149 0, /* tp_as_sequence */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
150 0, /* tp_as_mapping */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
151 0, /* tp_hash */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
152 0, /* tp_call */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
153 0, /* tp_str */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
154 PyObject_GenericGetAttr, /* tp_getattro */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
155 0, /* tp_setattro */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
156 0, /* tp_as_buffer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
157 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
158 0, /* tp_doc */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
159 (traverseproc)mbuf_traverse, /* tp_traverse */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
160 (inquiry)mbuf_clear /* tp_clear */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
161 };
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
162
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
163
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
164 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
165 /* MemoryView Object */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
166 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
167
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
168 /* In the process of breaking reference cycles mbuf_release() can be
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
169 called before memory_release(). */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
170 #define BASE_INACCESSIBLE(mv) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
171 (((PyMemoryViewObject *)mv)->flags&_Py_MEMORYVIEW_RELEASED || \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
172 ((PyMemoryViewObject *)mv)->mbuf->flags&_Py_MANAGED_BUFFER_RELEASED)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
173
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
174 #define CHECK_RELEASED(mv) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
175 if (BASE_INACCESSIBLE(mv)) { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
176 PyErr_SetString(PyExc_ValueError, \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
177 "operation forbidden on released memoryview object"); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
178 return NULL; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
179 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
180
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
181 #define CHECK_RELEASED_INT(mv) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
182 if (BASE_INACCESSIBLE(mv)) { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
183 PyErr_SetString(PyExc_ValueError, \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
184 "operation forbidden on released memoryview object"); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
185 return -1; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
186 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
187
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
188 #define CHECK_LIST_OR_TUPLE(v) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
189 if (!PyList_Check(v) && !PyTuple_Check(v)) { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
190 PyErr_SetString(PyExc_TypeError, \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
191 #v " must be a list or a tuple"); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
192 return NULL; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
193 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
194
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
195 #define VIEW_ADDR(mv) (&((PyMemoryViewObject *)mv)->view)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
196
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
197 /* Check for the presence of suboffsets in the first dimension. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
198 #define HAVE_PTR(suboffsets) (suboffsets && suboffsets[0] >= 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
199 /* Adjust ptr if suboffsets are present. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
200 #define ADJUST_PTR(ptr, suboffsets) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
201 (HAVE_PTR(suboffsets) ? *((char**)ptr) + suboffsets[0] : ptr)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
202
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
203 /* Memoryview buffer properties */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
204 #define MV_C_CONTIGUOUS(flags) (flags&(_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
205 #define MV_F_CONTIGUOUS(flags) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
206 (flags&(_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_FORTRAN))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
207 #define MV_ANY_CONTIGUOUS(flags) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
208 (flags&(_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
209
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
210 /* Fast contiguity test. Caller must ensure suboffsets==NULL and ndim==1. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
211 #define MV_CONTIGUOUS_NDIM1(view) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
212 ((view)->shape[0] == 1 || (view)->strides[0] == (view)->itemsize)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
213
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
214 /* getbuffer() requests */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
215 #define REQ_INDIRECT(flags) ((flags&PyBUF_INDIRECT) == PyBUF_INDIRECT)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
216 #define REQ_C_CONTIGUOUS(flags) ((flags&PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
217 #define REQ_F_CONTIGUOUS(flags) ((flags&PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
218 #define REQ_ANY_CONTIGUOUS(flags) ((flags&PyBUF_ANY_CONTIGUOUS) == PyBUF_ANY_CONTIGUOUS)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
219 #define REQ_STRIDES(flags) ((flags&PyBUF_STRIDES) == PyBUF_STRIDES)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
220 #define REQ_SHAPE(flags) ((flags&PyBUF_ND) == PyBUF_ND)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
221 #define REQ_WRITABLE(flags) (flags&PyBUF_WRITABLE)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
222 #define REQ_FORMAT(flags) (flags&PyBUF_FORMAT)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
223
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
224
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
225 PyDoc_STRVAR(memory_doc,
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
226 "memoryview(object)\n\
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
227 \n\
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
228 Create a new memoryview object which references the given object.");
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
229
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
230
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
231 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
232 /* Copy memoryview buffers */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
233 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
234
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
235 /* The functions in this section take a source and a destination buffer
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
236 with the same logical structure: format, itemsize, ndim and shape
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
237 are identical, with ndim > 0.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
238
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
239 NOTE: All buffers are assumed to have PyBUF_FULL information, which
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
240 is the case for memoryviews! */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
241
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
242
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
243 /* Assumptions: ndim >= 1. The macro tests for a corner case that should
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
244 perhaps be explicitly forbidden in the PEP. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
245 #define HAVE_SUBOFFSETS_IN_LAST_DIM(view) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
246 (view->suboffsets && view->suboffsets[dest->ndim-1] >= 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
247
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
248 Py_LOCAL_INLINE(int)
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
249 last_dim_is_contiguous(const Py_buffer *dest, const Py_buffer *src)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
250 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
251 assert(dest->ndim > 0 && src->ndim > 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
252 return (!HAVE_SUBOFFSETS_IN_LAST_DIM(dest) &&
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
253 !HAVE_SUBOFFSETS_IN_LAST_DIM(src) &&
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
254 dest->strides[dest->ndim-1] == dest->itemsize &&
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
255 src->strides[src->ndim-1] == src->itemsize);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
256 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
257
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
258 /* This is not a general function for determining format equivalence.
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
259 It is used in copy_single() and copy_buffer() to weed out non-matching
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
260 formats. Skipping the '@' character is specifically used in slice
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
261 assignments, where the lvalue is already known to have a single character
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
262 format. This is a performance hack that could be rewritten (if properly
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
263 benchmarked). */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
264 Py_LOCAL_INLINE(int)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
265 equiv_format(const Py_buffer *dest, const Py_buffer *src)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
266 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
267 const char *dfmt, *sfmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
268
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
269 assert(dest->format && src->format);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
270 dfmt = dest->format[0] == '@' ? dest->format+1 : dest->format;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
271 sfmt = src->format[0] == '@' ? src->format+1 : src->format;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
272
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
273 if (strcmp(dfmt, sfmt) != 0 ||
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
274 dest->itemsize != src->itemsize) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
275 return 0;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
276 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
277
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
278 return 1;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
279 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
280
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
281 /* Two shapes are equivalent if they are either equal or identical up
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
282 to a zero element at the same position. For example, in NumPy arrays
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
283 the shapes [1, 0, 5] and [1, 0, 7] are equivalent. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
284 Py_LOCAL_INLINE(int)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
285 equiv_shape(const Py_buffer *dest, const Py_buffer *src)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
286 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
287 int i;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
288
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
289 if (dest->ndim != src->ndim)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
290 return 0;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
291
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
292 for (i = 0; i < dest->ndim; i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
293 if (dest->shape[i] != src->shape[i])
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
294 return 0;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
295 if (dest->shape[i] == 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
296 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
297 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
298
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
299 return 1;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
300 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
301
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
302 /* Check that the logical structure of the destination and source buffers
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
303 is identical. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
304 static int
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
305 equiv_structure(const Py_buffer *dest, const Py_buffer *src)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
306 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
307 if (!equiv_format(dest, src) ||
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
308 !equiv_shape(dest, src)) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
309 PyErr_SetString(PyExc_ValueError,
82263
8c4aa4cb7930 Fix error messages.
Stefan Krah <skrah@bytereef.org>
parents: 80182
diff changeset
310 "memoryview assignment: lvalue and rvalue have different "
8c4aa4cb7930 Fix error messages.
Stefan Krah <skrah@bytereef.org>
parents: 80182
diff changeset
311 "structures");
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
312 return 0;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
313 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
314
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
315 return 1;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
316 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
317
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
318 /* Base case for recursive multi-dimensional copying. Contiguous arrays are
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
319 copied with very little overhead. Assumptions: ndim == 1, mem == NULL or
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
320 sizeof(mem) == shape[0] * itemsize. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
321 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
322 copy_base(const Py_ssize_t *shape, Py_ssize_t itemsize,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
323 char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
324 char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
325 char *mem)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
326 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
327 if (mem == NULL) { /* contiguous */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
328 Py_ssize_t size = shape[0] * itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
329 if (dptr + size < sptr || sptr + size < dptr)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
330 memcpy(dptr, sptr, size); /* no overlapping */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
331 else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
332 memmove(dptr, sptr, size);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
333 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
334 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
335 char *p;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
336 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
337 for (i=0, p=mem; i < shape[0]; p+=itemsize, sptr+=sstrides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
338 char *xsptr = ADJUST_PTR(sptr, ssuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
339 memcpy(p, xsptr, itemsize);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
340 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
341 for (i=0, p=mem; i < shape[0]; p+=itemsize, dptr+=dstrides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
342 char *xdptr = ADJUST_PTR(dptr, dsuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
343 memcpy(xdptr, p, itemsize);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
344 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
345 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
346
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
347 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
348
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
349 /* Recursively copy a source buffer to a destination buffer. The two buffers
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
350 have the same ndim, shape and itemsize. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
351 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
352 copy_rec(const Py_ssize_t *shape, Py_ssize_t ndim, Py_ssize_t itemsize,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
353 char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
354 char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
355 char *mem)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
356 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
357 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
358
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
359 assert(ndim >= 1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
360
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
361 if (ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
362 copy_base(shape, itemsize,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
363 dptr, dstrides, dsuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
364 sptr, sstrides, ssuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
365 mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
366 return;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
367 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
368
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
369 for (i = 0; i < shape[0]; dptr+=dstrides[0], sptr+=sstrides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
370 char *xdptr = ADJUST_PTR(dptr, dsuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
371 char *xsptr = ADJUST_PTR(sptr, ssuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
372
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
373 copy_rec(shape+1, ndim-1, itemsize,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
374 xdptr, dstrides+1, dsuboffsets ? dsuboffsets+1 : NULL,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
375 xsptr, sstrides+1, ssuboffsets ? ssuboffsets+1 : NULL,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
376 mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
377 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
378 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
379
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
380 /* Faster copying of one-dimensional arrays. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
381 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
382 copy_single(Py_buffer *dest, Py_buffer *src)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
383 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
384 char *mem = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
385
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
386 assert(dest->ndim == 1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
387
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
388 if (!equiv_structure(dest, src))
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
389 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
390
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
391 if (!last_dim_is_contiguous(dest, src)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
392 mem = PyMem_Malloc(dest->shape[0] * dest->itemsize);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
393 if (mem == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
394 PyErr_NoMemory();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
395 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
396 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
397 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
398
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
399 copy_base(dest->shape, dest->itemsize,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
400 dest->buf, dest->strides, dest->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
401 src->buf, src->strides, src->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
402 mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
403
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
404 if (mem)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
405 PyMem_Free(mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
406
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
407 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
408 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
409
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
410 /* Recursively copy src to dest. Both buffers must have the same basic
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
411 structure. Copying is atomic, the function never fails with a partial
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
412 copy. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
413 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
414 copy_buffer(Py_buffer *dest, Py_buffer *src)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
415 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
416 char *mem = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
417
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
418 assert(dest->ndim > 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
419
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
420 if (!equiv_structure(dest, src))
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
421 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
422
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
423 if (!last_dim_is_contiguous(dest, src)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
424 mem = PyMem_Malloc(dest->shape[dest->ndim-1] * dest->itemsize);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
425 if (mem == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
426 PyErr_NoMemory();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
427 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
428 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
429 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
430
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
431 copy_rec(dest->shape, dest->ndim, dest->itemsize,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
432 dest->buf, dest->strides, dest->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
433 src->buf, src->strides, src->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
434 mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
435
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
436 if (mem)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
437 PyMem_Free(mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
438
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
439 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
440 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
441
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
442 /* Initialize strides for a C-contiguous array. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
443 Py_LOCAL_INLINE(void)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
444 init_strides_from_shape(Py_buffer *view)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
445 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
446 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
447
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
448 assert(view->ndim > 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
449
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
450 view->strides[view->ndim-1] = view->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
451 for (i = view->ndim-2; i >= 0; i--)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
452 view->strides[i] = view->strides[i+1] * view->shape[i+1];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
453 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
454
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
455 /* Initialize strides for a Fortran-contiguous array. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
456 Py_LOCAL_INLINE(void)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
457 init_fortran_strides_from_shape(Py_buffer *view)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
458 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
459 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
460
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
461 assert(view->ndim > 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
462
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
463 view->strides[0] = view->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
464 for (i = 1; i < view->ndim; i++)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
465 view->strides[i] = view->strides[i-1] * view->shape[i-1];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
466 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
467
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
468 /* Copy src to a contiguous representation. order is one of 'C', 'F' (Fortran)
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
469 or 'A' (Any). Assumptions: src has PyBUF_FULL information, src->ndim >= 1,
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
470 len(mem) == src->len. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
471 static int
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
472 buffer_to_contiguous(char *mem, Py_buffer *src, char order)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
473 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
474 Py_buffer dest;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
475 Py_ssize_t *strides;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
476 int ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
477
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
478 assert(src->ndim >= 1);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
479 assert(src->shape != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
480 assert(src->strides != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
481
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
482 strides = PyMem_Malloc(src->ndim * (sizeof *src->strides));
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
483 if (strides == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
484 PyErr_NoMemory();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
485 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
486 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
487
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
488 /* initialize dest */
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
489 dest = *src;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
490 dest.buf = mem;
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
491 /* shape is constant and shared: the logical representation of the
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
492 array is unaltered. */
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
493
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
494 /* The physical representation determined by strides (and possibly
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
495 suboffsets) may change. */
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
496 dest.strides = strides;
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
497 if (order == 'C' || order == 'A') {
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
498 init_strides_from_shape(&dest);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
499 }
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
500 else {
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
501 init_fortran_strides_from_shape(&dest);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
502 }
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
503
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
504 dest.suboffsets = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
505
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
506 ret = copy_buffer(&dest, src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
507
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
508 PyMem_Free(strides);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
509 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
510 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
511
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
512
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
513 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
514 /* Constructors */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
515 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
516
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
517 /* Initialize values that are shared with the managed buffer. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
518 Py_LOCAL_INLINE(void)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
519 init_shared_values(Py_buffer *dest, const Py_buffer *src)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
520 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
521 dest->obj = src->obj;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
522 dest->buf = src->buf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
523 dest->len = src->len;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
524 dest->itemsize = src->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
525 dest->readonly = src->readonly;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
526 dest->format = src->format ? src->format : "B";
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
527 dest->internal = src->internal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
528 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
529
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
530 /* Copy shape and strides. Reconstruct missing values. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
531 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
532 init_shape_strides(Py_buffer *dest, const Py_buffer *src)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
533 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
534 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
535
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
536 if (src->ndim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
537 dest->shape = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
538 dest->strides = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
539 return;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
540 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
541 if (src->ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
542 dest->shape[0] = src->shape ? src->shape[0] : src->len / src->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
543 dest->strides[0] = src->strides ? src->strides[0] : src->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
544 return;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
545 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
546
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
547 for (i = 0; i < src->ndim; i++)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
548 dest->shape[i] = src->shape[i];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
549 if (src->strides) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
550 for (i = 0; i < src->ndim; i++)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
551 dest->strides[i] = src->strides[i];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
552 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
553 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
554 init_strides_from_shape(dest);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
555 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
556 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
557
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
558 Py_LOCAL_INLINE(void)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
559 init_suboffsets(Py_buffer *dest, const Py_buffer *src)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
560 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
561 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
562
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
563 if (src->suboffsets == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
564 dest->suboffsets = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
565 return;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
566 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
567 for (i = 0; i < src->ndim; i++)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
568 dest->suboffsets[i] = src->suboffsets[i];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
569 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
570
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
571 /* len = product(shape) * itemsize */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
572 Py_LOCAL_INLINE(void)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
573 init_len(Py_buffer *view)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
574 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
575 Py_ssize_t i, len;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
576
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
577 len = 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
578 for (i = 0; i < view->ndim; i++)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
579 len *= view->shape[i];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
580 len *= view->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
581
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
582 view->len = len;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
583 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
584
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
585 /* Initialize memoryview buffer properties. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
586 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
587 init_flags(PyMemoryViewObject *mv)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
588 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
589 const Py_buffer *view = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
590 int flags = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
591
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
592 switch (view->ndim) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
593 case 0:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
594 flags |= (_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C|
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
595 _Py_MEMORYVIEW_FORTRAN);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
596 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
597 case 1:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
598 if (MV_CONTIGUOUS_NDIM1(view))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
599 flags |= (_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
600 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
601 default:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
602 if (PyBuffer_IsContiguous(view, 'C'))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
603 flags |= _Py_MEMORYVIEW_C;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
604 if (PyBuffer_IsContiguous(view, 'F'))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
605 flags |= _Py_MEMORYVIEW_FORTRAN;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
606 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
607 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
608
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
609 if (view->suboffsets) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
610 flags |= _Py_MEMORYVIEW_PIL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
611 flags &= ~(_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
612 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
613
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
614 mv->flags = flags;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
615 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
616
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
617 /* Allocate a new memoryview and perform basic initialization. New memoryviews
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
618 are exclusively created through the mbuf_add functions. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
619 Py_LOCAL_INLINE(PyMemoryViewObject *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
620 memory_alloc(int ndim)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
621 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
622 PyMemoryViewObject *mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
623
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
624 mv = (PyMemoryViewObject *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
625 PyObject_GC_NewVar(PyMemoryViewObject, &PyMemoryView_Type, 3*ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
626 if (mv == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
627 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
628
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
629 mv->mbuf = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
630 mv->hash = -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
631 mv->flags = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
632 mv->exports = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
633 mv->view.ndim = ndim;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
634 mv->view.shape = mv->ob_array;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
635 mv->view.strides = mv->ob_array + ndim;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
636 mv->view.suboffsets = mv->ob_array + 2 * ndim;
77213
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75440
diff changeset
637 mv->weakreflist = NULL;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
638
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
639 _PyObject_GC_TRACK(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
640 return mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
641 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
642
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
643 /*
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
644 Return a new memoryview that is registered with mbuf. If src is NULL,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
645 use mbuf->master as the underlying buffer. Otherwise, use src.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
646
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
647 The new memoryview has full buffer information: shape and strides
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
648 are always present, suboffsets as needed. Arrays are copied to
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
649 the memoryview's ob_array field.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
650 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
651 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
652 mbuf_add_view(_PyManagedBufferObject *mbuf, const Py_buffer *src)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
653 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
654 PyMemoryViewObject *mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
655 Py_buffer *dest;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
656
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
657 if (src == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
658 src = &mbuf->master;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
659
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
660 if (src->ndim > PyBUF_MAX_NDIM) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
661 PyErr_SetString(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
662 "memoryview: number of dimensions must not exceed "
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
663 STRINGIZE(PyBUF_MAX_NDIM));
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
664 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
665 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
666
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
667 mv = memory_alloc(src->ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
668 if (mv == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
669 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
670
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
671 dest = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
672 init_shared_values(dest, src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
673 init_shape_strides(dest, src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
674 init_suboffsets(dest, src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
675 init_flags(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
676
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
677 mv->mbuf = mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
678 Py_INCREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
679 mbuf->exports++;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
680
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
681 return (PyObject *)mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
682 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
683
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
684 /* Register an incomplete view: shape, strides, suboffsets and flags still
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
685 need to be initialized. Use 'ndim' instead of src->ndim to determine the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
686 size of the memoryview's ob_array.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
687
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
688 Assumption: ndim <= PyBUF_MAX_NDIM. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
689 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
690 mbuf_add_incomplete_view(_PyManagedBufferObject *mbuf, const Py_buffer *src,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
691 int ndim)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
692 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
693 PyMemoryViewObject *mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
694 Py_buffer *dest;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
695
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
696 if (src == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
697 src = &mbuf->master;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
698
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
699 assert(ndim <= PyBUF_MAX_NDIM);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
700
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
701 mv = memory_alloc(ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
702 if (mv == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
703 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
704
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
705 dest = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
706 init_shared_values(dest, src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
707
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
708 mv->mbuf = mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
709 Py_INCREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
710 mbuf->exports++;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
711
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
712 return (PyObject *)mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
713 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
714
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
715 /* Expose a raw memory area as a view of contiguous bytes. flags can be
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
716 PyBUF_READ or PyBUF_WRITE. view->format is set to "B" (unsigned bytes).
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
717 The memoryview has complete buffer information. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
718 PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
719 PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
720 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
721 _PyManagedBufferObject *mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
722 PyObject *mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
723 int readonly;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
724
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
725 assert(mem != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
726 assert(flags == PyBUF_READ || flags == PyBUF_WRITE);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
727
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
728 mbuf = mbuf_alloc();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
729 if (mbuf == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
730 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
731
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
732 readonly = (flags == PyBUF_WRITE) ? 0 : 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
733 (void)PyBuffer_FillInfo(&mbuf->master, NULL, mem, size, readonly,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
734 PyBUF_FULL_RO);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
735
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
736 mv = mbuf_add_view(mbuf, NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
737 Py_DECREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
738
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
739 return mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
740 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
741
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
742 /* Create a memoryview from a given Py_buffer. For simple byte views,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
743 PyMemoryView_FromMemory() should be used instead.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
744 This function is the only entry point that can create a master buffer
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
745 without full information. Because of this fact init_shape_strides()
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
746 must be able to reconstruct missing values. */
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
747 PyObject *
48770
7511f3e672a2 #3560: cleanup C memoryview API
Antoine Pitrou <solipsis@pitrou.net>
parents: 48683
diff changeset
748 PyMemoryView_FromBuffer(Py_buffer *info)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
749 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
750 _PyManagedBufferObject *mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
751 PyObject *mv;
43423
0476a2cc5658 Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex. Add some more functionality to the memoryview object.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43384
diff changeset
752
68127
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
753 if (info->buf == NULL) {
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
754 PyErr_SetString(PyExc_ValueError,
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
755 "PyMemoryView_FromBuffer(): info->buf must not be NULL");
68127
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
756 return NULL;
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
757 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
758
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
759 mbuf = mbuf_alloc();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
760 if (mbuf == NULL)
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
761 return NULL;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
762
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
763 /* info->obj is either NULL or a borrowed reference. This reference
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
764 should not be decremented in PyBuffer_Release(). */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
765 mbuf->master = *info;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
766 mbuf->master.obj = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
767
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
768 mv = mbuf_add_view(mbuf, NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
769 Py_DECREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
770
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
771 return mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
772 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
773
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
774 /* Create a memoryview from an object that implements the buffer protocol.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
775 If the object is a memoryview, the new memoryview must be registered
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
776 with the same managed buffer. Otherwise, a new managed buffer is created. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
777 PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
778 PyMemoryView_FromObject(PyObject *v)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
779 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
780 _PyManagedBufferObject *mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
781
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
782 if (PyMemoryView_Check(v)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
783 PyMemoryViewObject *mv = (PyMemoryViewObject *)v;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
784 CHECK_RELEASED(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
785 return mbuf_add_view(mv->mbuf, &mv->view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
786 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
787 else if (PyObject_CheckBuffer(v)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
788 PyObject *ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
789 mbuf = (_PyManagedBufferObject *)_PyManagedBuffer_FromObject(v);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
790 if (mbuf == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
791 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
792 ret = mbuf_add_view(mbuf, NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
793 Py_DECREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
794 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
795 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
796
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
797 PyErr_Format(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
798 "memoryview: %.200s object does not have the buffer interface",
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
799 Py_TYPE(v)->tp_name);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
800 return NULL;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
801 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
802
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
803 /* Copy the format string from a base object that might vanish. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
804 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
805 mbuf_copy_format(_PyManagedBufferObject *mbuf, const char *fmt)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
806 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
807 if (fmt != NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
808 char *cp = PyMem_Malloc(strlen(fmt)+1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
809 if (cp == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
810 PyErr_NoMemory();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
811 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
812 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
813 mbuf->master.format = strcpy(cp, fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
814 mbuf->flags |= _Py_MANAGED_BUFFER_FREE_FORMAT;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
815 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
816
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
817 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
818 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
819
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
820 /*
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
821 Return a memoryview that is based on a contiguous copy of src.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
822 Assumptions: src has PyBUF_FULL_RO information, src->ndim > 0.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
823
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
824 Ownership rules:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
825 1) As usual, the returned memoryview has a private copy
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
826 of src->shape, src->strides and src->suboffsets.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
827 2) src->format is copied to the master buffer and released
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
828 in mbuf_dealloc(). The releasebufferproc of the bytes
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
829 object is NULL, so it does not matter that mbuf_release()
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
830 passes the altered format pointer to PyBuffer_Release().
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
831 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
832 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
833 memory_from_contiguous_copy(Py_buffer *src, char order)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
834 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
835 _PyManagedBufferObject *mbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
836 PyMemoryViewObject *mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
837 PyObject *bytes;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
838 Py_buffer *dest;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
839 int i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
840
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
841 assert(src->ndim > 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
842 assert(src->shape != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
843
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
844 bytes = PyBytes_FromStringAndSize(NULL, src->len);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
845 if (bytes == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
846 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
847
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
848 mbuf = (_PyManagedBufferObject *)_PyManagedBuffer_FromObject(bytes);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
849 Py_DECREF(bytes);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
850 if (mbuf == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
851 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
852
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
853 if (mbuf_copy_format(mbuf, src->format) < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
854 Py_DECREF(mbuf);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
855 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
856 }
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
857
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
858 mv = (PyMemoryViewObject *)mbuf_add_incomplete_view(mbuf, NULL, src->ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
859 Py_DECREF(mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
860 if (mv == NULL)
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
861 return NULL;
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
862
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
863 dest = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
864
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
865 /* shared values are initialized correctly except for itemsize */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
866 dest->itemsize = src->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
867
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
868 /* shape and strides */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
869 for (i = 0; i < src->ndim; i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
870 dest->shape[i] = src->shape[i];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
871 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
872 if (order == 'C' || order == 'A') {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
873 init_strides_from_shape(dest);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
874 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
875 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
876 init_fortran_strides_from_shape(dest);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
877 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
878 /* suboffsets */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
879 dest->suboffsets = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
880
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
881 /* flags */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
882 init_flags(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
883
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
884 if (copy_buffer(dest, src) < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
885 Py_DECREF(mv);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
886 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
887 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
888
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
889 return (PyObject *)mv;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
890 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
891
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
892 /*
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
893 Return a new memoryview object based on a contiguous exporter with
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
894 buffertype={PyBUF_READ, PyBUF_WRITE} and order={'C', 'F'ortran, or 'A'ny}.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
895 The logical structure of the input and output buffers is the same
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
896 (i.e. tolist(input) == tolist(output)), but the physical layout in
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
897 memory can be explicitly chosen.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
898
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
899 As usual, if buffertype=PyBUF_WRITE, the exporter's buffer must be writable,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
900 otherwise it may be writable or read-only.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
901
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
902 If the exporter is already contiguous with the desired target order,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
903 the memoryview will be directly based on the exporter.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
904
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
905 Otherwise, if the buffertype is PyBUF_READ, the memoryview will be
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
906 based on a new bytes object. If order={'C', 'A'ny}, use 'C' order,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
907 'F'ortran order otherwise.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
908 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
909 PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
910 PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char order)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
911 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
912 PyMemoryViewObject *mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
913 PyObject *ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
914 Py_buffer *view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
915
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
916 assert(buffertype == PyBUF_READ || buffertype == PyBUF_WRITE);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
917 assert(order == 'C' || order == 'F' || order == 'A');
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
918
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
919 mv = (PyMemoryViewObject *)PyMemoryView_FromObject(obj);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
920 if (mv == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
921 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
922
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
923 view = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
924 if (buffertype == PyBUF_WRITE && view->readonly) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
925 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
926 "underlying buffer is not writable");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
927 Py_DECREF(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
928 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
929 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
930
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
931 if (PyBuffer_IsContiguous(view, order))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
932 return (PyObject *)mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
933
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
934 if (buffertype == PyBUF_WRITE) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
935 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
936 "writable contiguous buffer requested "
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
937 "for a non-contiguous object.");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
938 Py_DECREF(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
939 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
940 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
941
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
942 ret = memory_from_contiguous_copy(view, order);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
943 Py_DECREF(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
944 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
945 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
946
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
947
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
948 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
949 memory_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
950 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
951 PyObject *obj;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
952 static char *kwlist[] = {"object", NULL};
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
953
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
954 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:memoryview", kwlist,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
955 &obj)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
956 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
957 }
43793
2d8d6855a602 Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents: 43687
diff changeset
958
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
959 return PyMemoryView_FromObject(obj);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
960 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
961
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
962
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
963 /****************************************************************************/
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
964 /* Previously in abstract.c */
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
965 /****************************************************************************/
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
966
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
967 typedef struct {
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
968 Py_buffer view;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
969 Py_ssize_t array[1];
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
970 } Py_buffer_full;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
971
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
972 int
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
973 PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
974 {
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
975 Py_buffer_full *fb = NULL;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
976 int ret;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
977
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
978 assert(order == 'C' || order == 'F' || order == 'A');
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
979
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
980 if (len != src->len) {
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
981 PyErr_SetString(PyExc_ValueError,
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
982 "PyBuffer_ToContiguous: len != view->len");
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
983 return -1;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
984 }
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
985
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
986 if (PyBuffer_IsContiguous(src, order)) {
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
987 memcpy((char *)buf, src->buf, len);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
988 return 0;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
989 }
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
990
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
991 /* buffer_to_contiguous() assumes PyBUF_FULL */
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
992 fb = PyMem_Malloc(sizeof *fb + 3 * src->ndim * (sizeof *fb->array));
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
993 if (fb == NULL) {
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
994 PyErr_NoMemory();
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
995 return -1;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
996 }
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
997 fb->view.ndim = src->ndim;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
998 fb->view.shape = fb->array;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
999 fb->view.strides = fb->array + src->ndim;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1000 fb->view.suboffsets = fb->array + 2 * src->ndim;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1001
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1002 init_shared_values(&fb->view, src);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1003 init_shape_strides(&fb->view, src);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1004 init_suboffsets(&fb->view, src);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1005
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1006 src = &fb->view;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1007
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1008 ret = buffer_to_contiguous(buf, src, order);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1009 PyMem_Free(fb);
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1010 return ret;
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1011 }
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1012
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1013
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
1014 /****************************************************************************/
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1015 /* Release/GC management */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1016 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1017
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1018 /* Inform the managed buffer that this particular memoryview will not access
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1019 the underlying buffer again. If no other memoryviews are registered with
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1020 the managed buffer, the underlying buffer is released instantly and
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1021 marked as inaccessible for both the memoryview and the managed buffer.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1022
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1023 This function fails if the memoryview itself has exported buffers. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1024 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1025 _memory_release(PyMemoryViewObject *self)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1026 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1027 if (self->flags & _Py_MEMORYVIEW_RELEASED)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1028 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1029
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1030 if (self->exports == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1031 self->flags |= _Py_MEMORYVIEW_RELEASED;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1032 assert(self->mbuf->exports > 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1033 if (--self->mbuf->exports == 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1034 mbuf_release(self->mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1035 return 0;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1036 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1037 if (self->exports > 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1038 PyErr_Format(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1039 "memoryview has %zd exported buffer%s", self->exports,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1040 self->exports==1 ? "" : "s");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1041 return -1;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1042 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1043
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1044 Py_FatalError("_memory_release(): negative export count");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1045 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1046 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1047
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1048 static PyObject *
78303
c15edc6b9b97 Add unused parameter to a METH_NOARGS function.
Stefan Krah <skrah@bytereef.org>
parents: 78301
diff changeset
1049 memory_release(PyMemoryViewObject *self, PyObject *noargs)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1050 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1051 if (_memory_release(self) < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1052 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1053 Py_RETURN_NONE;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1054 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1055
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1056 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1057 memory_dealloc(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1058 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1059 assert(self->exports == 0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1060 _PyObject_GC_UNTRACK(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1061 (void)_memory_release(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1062 Py_CLEAR(self->mbuf);
77213
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75440
diff changeset
1063 if (self->weakreflist != NULL)
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75440
diff changeset
1064 PyObject_ClearWeakRefs((PyObject *) self);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1065 PyObject_GC_Del(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1066 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1067
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1068 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1069 memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1070 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1071 Py_VISIT(self->mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1072 return 0;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1073 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1074
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1075 static int
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1076 memory_clear(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1077 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1078 (void)_memory_release(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1079 Py_CLEAR(self->mbuf);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1080 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1081 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1082
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1083 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1084 memory_enter(PyObject *self, PyObject *args)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1085 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1086 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1087 Py_INCREF(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1088 return self;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1089 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1090
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1091 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1092 memory_exit(PyObject *self, PyObject *args)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1093 {
78303
c15edc6b9b97 Add unused parameter to a METH_NOARGS function.
Stefan Krah <skrah@bytereef.org>
parents: 78301
diff changeset
1094 return memory_release((PyMemoryViewObject *)self, NULL);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1095 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1096
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1097
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1098 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1099 /* Casting format and shape */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1100 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1101
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1102 #define IS_BYTE_FORMAT(f) (f == 'b' || f == 'B' || f == 'c')
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1103
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1104 Py_LOCAL_INLINE(Py_ssize_t)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1105 get_native_fmtchar(char *result, const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1106 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1107 Py_ssize_t size = -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1108
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1109 if (fmt[0] == '@') fmt++;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1110
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1111 switch (fmt[0]) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1112 case 'c': case 'b': case 'B': size = sizeof(char); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1113 case 'h': case 'H': size = sizeof(short); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1114 case 'i': case 'I': size = sizeof(int); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1115 case 'l': case 'L': size = sizeof(long); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1116 #ifdef HAVE_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1117 case 'q': case 'Q': size = sizeof(PY_LONG_LONG); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1118 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1119 case 'n': case 'N': size = sizeof(Py_ssize_t); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1120 case 'f': size = sizeof(float); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1121 case 'd': size = sizeof(double); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1122 #ifdef HAVE_C99_BOOL
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1123 case '?': size = sizeof(_Bool); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1124 #else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1125 case '?': size = sizeof(char); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1126 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1127 case 'P': size = sizeof(void *); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1128 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1129
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1130 if (size > 0 && fmt[1] == '\0') {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1131 *result = fmt[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1132 return size;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1133 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1134
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1135 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1136 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1137
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1138 /* Cast a memoryview's data type to 'format'. The input array must be
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1139 C-contiguous. At least one of input-format, output-format must have
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1140 byte size. The output array is 1-D, with the same byte length as the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1141 input array. Thus, view->len must be a multiple of the new itemsize. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1142 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1143 cast_to_1D(PyMemoryViewObject *mv, PyObject *format)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1144 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1145 Py_buffer *view = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1146 PyObject *asciifmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1147 char srcchar, destchar;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1148 Py_ssize_t itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1149 int ret = -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1150
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1151 assert(view->ndim >= 1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1152 assert(Py_SIZE(mv) == 3*view->ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1153 assert(view->shape == mv->ob_array);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1154 assert(view->strides == mv->ob_array + view->ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1155 assert(view->suboffsets == mv->ob_array + 2*view->ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1156
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1157 if (get_native_fmtchar(&srcchar, view->format) < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1158 PyErr_SetString(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1159 "memoryview: source format must be a native single character "
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1160 "format prefixed with an optional '@'");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1161 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1162 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1163
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1164 asciifmt = PyUnicode_AsASCIIString(format);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1165 if (asciifmt == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1166 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1167
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1168 itemsize = get_native_fmtchar(&destchar, PyBytes_AS_STRING(asciifmt));
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1169 if (itemsize < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1170 PyErr_SetString(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1171 "memoryview: destination format must be a native single "
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1172 "character format prefixed with an optional '@'");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1173 goto out;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1174 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1175
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1176 if (!IS_BYTE_FORMAT(srcchar) && !IS_BYTE_FORMAT(destchar)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1177 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1178 "memoryview: cannot cast between two non-byte formats");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1179 goto out;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1180 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1181 if (view->len % itemsize) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1182 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1183 "memoryview: length is not a multiple of itemsize");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1184 goto out;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1185 }
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1186
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1187 strncpy(mv->format, PyBytes_AS_STRING(asciifmt),
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1188 _Py_MEMORYVIEW_MAX_FORMAT);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1189 mv->format[_Py_MEMORYVIEW_MAX_FORMAT-1] = '\0';
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1190 view->format = mv->format;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1191 view->itemsize = itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1192
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1193 view->ndim = 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1194 view->shape[0] = view->len / view->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1195 view->strides[0] = view->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1196 view->suboffsets = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1197
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1198 init_flags(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1199
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1200 ret = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1201
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1202 out:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1203 Py_DECREF(asciifmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1204 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1205 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1206
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1207 /* The memoryview must have space for 3*len(seq) elements. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1208 static Py_ssize_t
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1209 copy_shape(Py_ssize_t *shape, const PyObject *seq, Py_ssize_t ndim,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1210 Py_ssize_t itemsize)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1211 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1212 Py_ssize_t x, i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1213 Py_ssize_t len = itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1214
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1215 for (i = 0; i < ndim; i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1216 PyObject *tmp = PySequence_Fast_GET_ITEM(seq, i);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1217 if (!PyLong_Check(tmp)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1218 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1219 "memoryview.cast(): elements of shape must be integers");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1220 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1221 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1222 x = PyLong_AsSsize_t(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1223 if (x == -1 && PyErr_Occurred()) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1224 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1225 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1226 if (x <= 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1227 /* In general elements of shape may be 0, but not for casting. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1228 PyErr_Format(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1229 "memoryview.cast(): elements of shape must be integers > 0");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1230 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1231 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1232 if (x > PY_SSIZE_T_MAX / len) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1233 PyErr_Format(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1234 "memoryview.cast(): product(shape) > SSIZE_MAX");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1235 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1236 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1237 len *= x;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1238 shape[i] = x;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1239 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1240
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1241 return len;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1242 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1243
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1244 /* Cast a 1-D array to a new shape. The result array will be C-contiguous.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1245 If the result array does not have exactly the same byte length as the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1246 input array, raise ValueError. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1247 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1248 cast_to_ND(PyMemoryViewObject *mv, const PyObject *shape, int ndim)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1249 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1250 Py_buffer *view = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1251 Py_ssize_t len;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1252
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1253 assert(view->ndim == 1); /* ndim from cast_to_1D() */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1254 assert(Py_SIZE(mv) == 3*(ndim==0?1:ndim)); /* ndim of result array */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1255 assert(view->shape == mv->ob_array);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1256 assert(view->strides == mv->ob_array + (ndim==0?1:ndim));
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1257 assert(view->suboffsets == NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1258
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1259 view->ndim = ndim;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1260 if (view->ndim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1261 view->shape = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1262 view->strides = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1263 len = view->itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1264 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1265 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1266 len = copy_shape(view->shape, shape, ndim, view->itemsize);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1267 if (len < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1268 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1269 init_strides_from_shape(view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1270 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1271
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1272 if (view->len != len) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1273 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1274 "memoryview: product(shape) * itemsize != buffer size");
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1275 return -1;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1276 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1277
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1278 init_flags(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1279
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1280 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1281 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1282
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1283 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1284 zero_in_shape(PyMemoryViewObject *mv)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1285 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1286 Py_buffer *view = &mv->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1287 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1288
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1289 for (i = 0; i < view->ndim; i++)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1290 if (view->shape[i] == 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1291 return 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1292
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1293 return 0;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1294 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1295
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1296 /*
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1297 Cast a copy of 'self' to a different view. The input view must
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1298 be C-contiguous. The function always casts the input view to a
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1299 1-D output according to 'format'. At least one of input-format,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1300 output-format must have byte size.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1301
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1302 If 'shape' is given, the 1-D view from the previous step will
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1303 be cast to a C-contiguous view with new shape and strides.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1304
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1305 All casts must result in views that will have the exact byte
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1306 size of the original input. Otherwise, an error is raised.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1307 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1308 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1309 memory_cast(PyMemoryViewObject *self, PyObject *args, PyObject *kwds)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1310 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1311 static char *kwlist[] = {"format", "shape", NULL};
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1312 PyMemoryViewObject *mv = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1313 PyObject *shape = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1314 PyObject *format;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1315 Py_ssize_t ndim = 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1316
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1317 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1318
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1319 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1320 &format, &shape)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1321 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1322 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1323 if (!PyUnicode_Check(format)) {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1324 PyErr_SetString(PyExc_TypeError,
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1325 "memoryview: format argument must be a string");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1326 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1327 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1328 if (!MV_C_CONTIGUOUS(self->flags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1329 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1330 "memoryview: casts are restricted to C-contiguous views");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1331 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1332 }
85939
b08e092df155 Issue #19014: memoryview.cast() is now allowed on zero-length views.
Antoine Pitrou <solipsis@pitrou.net>
parents: 82263
diff changeset
1333 if ((shape || self->view.ndim != 1) && zero_in_shape(self)) {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1334 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1335 "memoryview: cannot cast view with zeros in shape or strides");
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1336 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1337 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1338 if (shape) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1339 CHECK_LIST_OR_TUPLE(shape)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1340 ndim = PySequence_Fast_GET_SIZE(shape);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1341 if (ndim > PyBUF_MAX_NDIM) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1342 PyErr_SetString(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1343 "memoryview: number of dimensions must not exceed "
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1344 STRINGIZE(PyBUF_MAX_NDIM));
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1345 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1346 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1347 if (self->view.ndim != 1 && ndim != 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1348 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1349 "memoryview: cast must be 1D -> ND or ND -> 1D");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1350 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1351 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1352 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1353
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1354 mv = (PyMemoryViewObject *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1355 mbuf_add_incomplete_view(self->mbuf, &self->view, ndim==0 ? 1 : (int)ndim);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1356 if (mv == NULL)
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1357 return NULL;
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
1358
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1359 if (cast_to_1D(mv, format) < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1360 goto error;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1361 if (shape && cast_to_ND(mv, shape, (int)ndim) < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1362 goto error;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1363
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1364 return (PyObject *)mv;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1365
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1366 error:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1367 Py_DECREF(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1368 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1369 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1370
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1371
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1372 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1373 /* getbuffer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1374 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1375
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1376 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1377 memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1378 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1379 Py_buffer *base = &self->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1380 int baseflags = self->flags;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1381
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1382 CHECK_RELEASED_INT(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1383
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1384 /* start with complete information */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1385 *view = *base;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1386 view->obj = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1387
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1388 if (REQ_WRITABLE(flags) && base->readonly) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1389 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1390 "memoryview: underlying buffer is not writable");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1391 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1392 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1393 if (!REQ_FORMAT(flags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1394 /* NULL indicates that the buffer's data type has been cast to 'B'.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1395 view->itemsize is the _previous_ itemsize. If shape is present,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1396 the equality product(shape) * itemsize = len still holds at this
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1397 point. The equality calcsize(format) = itemsize does _not_ hold
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1398 from here on! */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1399 view->format = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1400 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1401
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1402 if (REQ_C_CONTIGUOUS(flags) && !MV_C_CONTIGUOUS(baseflags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1403 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1404 "memoryview: underlying buffer is not C-contiguous");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1405 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1406 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1407 if (REQ_F_CONTIGUOUS(flags) && !MV_F_CONTIGUOUS(baseflags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1408 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1409 "memoryview: underlying buffer is not Fortran contiguous");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1410 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1411 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1412 if (REQ_ANY_CONTIGUOUS(flags) && !MV_ANY_CONTIGUOUS(baseflags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1413 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1414 "memoryview: underlying buffer is not contiguous");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1415 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1416 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1417 if (!REQ_INDIRECT(flags) && (baseflags & _Py_MEMORYVIEW_PIL)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1418 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1419 "memoryview: underlying buffer requires suboffsets");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1420 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1421 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1422 if (!REQ_STRIDES(flags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1423 if (!MV_C_CONTIGUOUS(baseflags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1424 PyErr_SetString(PyExc_BufferError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1425 "memoryview: underlying buffer is not C-contiguous");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1426 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1427 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1428 view->strides = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1429 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1430 if (!REQ_SHAPE(flags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1431 /* PyBUF_SIMPLE or PyBUF_WRITABLE: at this point buf is C-contiguous,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1432 so base->buf = ndbuf->data. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1433 if (view->format != NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1434 /* PyBUF_SIMPLE|PyBUF_FORMAT and PyBUF_WRITABLE|PyBUF_FORMAT do
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1435 not make sense. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1436 PyErr_Format(PyExc_BufferError,
82263
8c4aa4cb7930 Fix error messages.
Stefan Krah <skrah@bytereef.org>
parents: 80182
diff changeset
1437 "memoryview: cannot cast to unsigned bytes if the format flag "
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1438 "is present");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1439 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1440 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1441 /* product(shape) * itemsize = len and calcsize(format) = itemsize
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1442 do _not_ hold from here on! */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1443 view->ndim = 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1444 view->shape = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1445 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1446
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1447
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1448 view->obj = (PyObject *)self;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1449 Py_INCREF(view->obj);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1450 self->exports++;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1451
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1452 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1453 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1454
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1455 static void
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1456 memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1457 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1458 self->exports--;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1459 return;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1460 /* PyBuffer_Release() decrements view->obj after this function returns. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1461 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1462
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1463 /* Buffer methods */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1464 static PyBufferProcs memory_as_buffer = {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1465 (getbufferproc)memory_getbuf, /* bf_getbuffer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1466 (releasebufferproc)memory_releasebuf, /* bf_releasebuffer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1467 };
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1468
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1469
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1470 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1471 /* Optimized pack/unpack for all native format specifiers */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1472 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1473
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1474 /*
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1475 Fix exceptions:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1476 1) Include format string in the error message.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1477 2) OverflowError -> ValueError.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1478 3) The error message from PyNumber_Index() is not ideal.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1479 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1480 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1481 type_error_int(const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1482 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1483 PyErr_Format(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1484 "memoryview: invalid type for format '%s'", fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1485 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1486 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1487
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1488 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1489 value_error_int(const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1490 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1491 PyErr_Format(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1492 "memoryview: invalid value for format '%s'", fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1493 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1494 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1495
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1496 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1497 fix_error_int(const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1498 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1499 assert(PyErr_Occurred());
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1500 if (PyErr_ExceptionMatches(PyExc_TypeError)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1501 PyErr_Clear();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1502 return type_error_int(fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1503 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1504 else if (PyErr_ExceptionMatches(PyExc_OverflowError) ||
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1505 PyErr_ExceptionMatches(PyExc_ValueError)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1506 PyErr_Clear();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1507 return value_error_int(fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1508 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1509
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1510 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1511 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1512
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1513 /* Accept integer objects or objects with an __index__() method. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1514 static long
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1515 pylong_as_ld(PyObject *item)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1516 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1517 PyObject *tmp;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1518 long ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1519
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1520 tmp = PyNumber_Index(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1521 if (tmp == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1522 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1523
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1524 ld = PyLong_AsLong(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1525 Py_DECREF(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1526 return ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1527 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1528
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1529 static unsigned long
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1530 pylong_as_lu(PyObject *item)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1531 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1532 PyObject *tmp;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1533 unsigned long lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1534
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1535 tmp = PyNumber_Index(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1536 if (tmp == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1537 return (unsigned long)-1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1538
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1539 lu = PyLong_AsUnsignedLong(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1540 Py_DECREF(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1541 return lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1542 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1543
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1544 #ifdef HAVE_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1545 static PY_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1546 pylong_as_lld(PyObject *item)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1547 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1548 PyObject *tmp;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1549 PY_LONG_LONG lld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1550
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1551 tmp = PyNumber_Index(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1552 if (tmp == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1553 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1554
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1555 lld = PyLong_AsLongLong(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1556 Py_DECREF(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1557 return lld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1558 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1559
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1560 static unsigned PY_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1561 pylong_as_llu(PyObject *item)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1562 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1563 PyObject *tmp;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1564 unsigned PY_LONG_LONG llu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1565
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1566 tmp = PyNumber_Index(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1567 if (tmp == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1568 return (unsigned PY_LONG_LONG)-1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1569
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1570 llu = PyLong_AsUnsignedLongLong(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1571 Py_DECREF(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1572 return llu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1573 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1574 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1575
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1576 static Py_ssize_t
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1577 pylong_as_zd(PyObject *item)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1578 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1579 PyObject *tmp;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1580 Py_ssize_t zd;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1581
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1582 tmp = PyNumber_Index(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1583 if (tmp == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1584 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1585
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1586 zd = PyLong_AsSsize_t(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1587 Py_DECREF(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1588 return zd;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1589 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1590
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1591 static size_t
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1592 pylong_as_zu(PyObject *item)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1593 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1594 PyObject *tmp;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1595 size_t zu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1596
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1597 tmp = PyNumber_Index(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1598 if (tmp == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1599 return (size_t)-1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1600
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1601 zu = PyLong_AsSize_t(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1602 Py_DECREF(tmp);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1603 return zu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1604 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1605
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1606 /* Timings with the ndarray from _testbuffer.c indicate that using the
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1607 struct module is around 15x slower than the two functions below. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1608
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1609 #define UNPACK_SINGLE(dest, ptr, type) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1610 do { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1611 type x; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1612 memcpy((char *)&x, ptr, sizeof x); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1613 dest = x; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1614 } while (0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1615
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1616 /* Unpack a single item. 'fmt' can be any native format character in struct
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1617 module syntax. This function is very sensitive to small changes. With this
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1618 layout gcc automatically generates a fast jump table. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1619 Py_LOCAL_INLINE(PyObject *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1620 unpack_single(const char *ptr, const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1621 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1622 unsigned PY_LONG_LONG llu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1623 unsigned long lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1624 size_t zu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1625 PY_LONG_LONG lld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1626 long ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1627 Py_ssize_t zd;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1628 double d;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1629 unsigned char uc;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1630 void *p;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1631
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1632 switch (fmt[0]) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1633
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1634 /* signed integers and fast path for 'B' */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1635 case 'B': uc = *((unsigned char *)ptr); goto convert_uc;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1636 case 'b': ld = *((signed char *)ptr); goto convert_ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1637 case 'h': UNPACK_SINGLE(ld, ptr, short); goto convert_ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1638 case 'i': UNPACK_SINGLE(ld, ptr, int); goto convert_ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1639 case 'l': UNPACK_SINGLE(ld, ptr, long); goto convert_ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1640
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1641 /* boolean */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1642 #ifdef HAVE_C99_BOOL
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1643 case '?': UNPACK_SINGLE(ld, ptr, _Bool); goto convert_bool;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1644 #else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1645 case '?': UNPACK_SINGLE(ld, ptr, char); goto convert_bool;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1646 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1647
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1648 /* unsigned integers */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1649 case 'H': UNPACK_SINGLE(lu, ptr, unsigned short); goto convert_lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1650 case 'I': UNPACK_SINGLE(lu, ptr, unsigned int); goto convert_lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1651 case 'L': UNPACK_SINGLE(lu, ptr, unsigned long); goto convert_lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1652
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1653 /* native 64-bit */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1654 #ifdef HAVE_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1655 case 'q': UNPACK_SINGLE(lld, ptr, PY_LONG_LONG); goto convert_lld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1656 case 'Q': UNPACK_SINGLE(llu, ptr, unsigned PY_LONG_LONG); goto convert_llu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1657 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1658
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1659 /* ssize_t and size_t */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1660 case 'n': UNPACK_SINGLE(zd, ptr, Py_ssize_t); goto convert_zd;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1661 case 'N': UNPACK_SINGLE(zu, ptr, size_t); goto convert_zu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1662
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1663 /* floats */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1664 case 'f': UNPACK_SINGLE(d, ptr, float); goto convert_double;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1665 case 'd': UNPACK_SINGLE(d, ptr, double); goto convert_double;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1666
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1667 /* bytes object */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1668 case 'c': goto convert_bytes;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1669
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1670 /* pointer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1671 case 'P': UNPACK_SINGLE(p, ptr, void *); goto convert_pointer;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1672
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1673 /* default */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1674 default: goto err_format;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1675 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1676
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1677 convert_uc:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1678 /* PyLong_FromUnsignedLong() is slower */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1679 return PyLong_FromLong(uc);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1680 convert_ld:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1681 return PyLong_FromLong(ld);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1682 convert_lu:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1683 return PyLong_FromUnsignedLong(lu);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1684 convert_lld:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1685 return PyLong_FromLongLong(lld);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1686 convert_llu:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1687 return PyLong_FromUnsignedLongLong(llu);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1688 convert_zd:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1689 return PyLong_FromSsize_t(zd);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1690 convert_zu:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1691 return PyLong_FromSize_t(zu);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1692 convert_double:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1693 return PyFloat_FromDouble(d);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1694 convert_bool:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1695 return PyBool_FromLong(ld);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1696 convert_bytes:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1697 return PyBytes_FromStringAndSize(ptr, 1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1698 convert_pointer:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1699 return PyLong_FromVoidPtr(p);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1700 err_format:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1701 PyErr_Format(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1702 "memoryview: format %s not supported", fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1703 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1704 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1705
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1706 #define PACK_SINGLE(ptr, src, type) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1707 do { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1708 type x; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1709 x = (type)src; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1710 memcpy(ptr, (char *)&x, sizeof x); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1711 } while (0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1712
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1713 /* Pack a single item. 'fmt' can be any native format character in
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1714 struct module syntax. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1715 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1716 pack_single(char *ptr, PyObject *item, const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1717 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1718 unsigned PY_LONG_LONG llu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1719 unsigned long lu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1720 size_t zu;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1721 PY_LONG_LONG lld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1722 long ld;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1723 Py_ssize_t zd;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1724 double d;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1725 void *p;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1726
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1727 switch (fmt[0]) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1728 /* signed integers */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1729 case 'b': case 'h': case 'i': case 'l':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1730 ld = pylong_as_ld(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1731 if (ld == -1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1732 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1733 switch (fmt[0]) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1734 case 'b':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1735 if (ld < SCHAR_MIN || ld > SCHAR_MAX) goto err_range;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1736 *((signed char *)ptr) = (signed char)ld; break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1737 case 'h':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1738 if (ld < SHRT_MIN || ld > SHRT_MAX) goto err_range;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1739 PACK_SINGLE(ptr, ld, short); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1740 case 'i':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1741 if (ld < INT_MIN || ld > INT_MAX) goto err_range;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1742 PACK_SINGLE(ptr, ld, int); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1743 default: /* 'l' */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1744 PACK_SINGLE(ptr, ld, long); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1745 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1746 break;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1747
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1748 /* unsigned integers */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1749 case 'B': case 'H': case 'I': case 'L':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1750 lu = pylong_as_lu(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1751 if (lu == (unsigned long)-1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1752 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1753 switch (fmt[0]) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1754 case 'B':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1755 if (lu > UCHAR_MAX) goto err_range;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1756 *((unsigned char *)ptr) = (unsigned char)lu; break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1757 case 'H':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1758 if (lu > USHRT_MAX) goto err_range;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1759 PACK_SINGLE(ptr, lu, unsigned short); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1760 case 'I':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1761 if (lu > UINT_MAX) goto err_range;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1762 PACK_SINGLE(ptr, lu, unsigned int); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1763 default: /* 'L' */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1764 PACK_SINGLE(ptr, lu, unsigned long); break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1765 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1766 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1767
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1768 /* native 64-bit */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1769 #ifdef HAVE_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1770 case 'q':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1771 lld = pylong_as_lld(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1772 if (lld == -1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1773 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1774 PACK_SINGLE(ptr, lld, PY_LONG_LONG);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1775 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1776 case 'Q':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1777 llu = pylong_as_llu(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1778 if (llu == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1779 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1780 PACK_SINGLE(ptr, llu, unsigned PY_LONG_LONG);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1781 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1782 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1783
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1784 /* ssize_t and size_t */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1785 case 'n':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1786 zd = pylong_as_zd(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1787 if (zd == -1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1788 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1789 PACK_SINGLE(ptr, zd, Py_ssize_t);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1790 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1791 case 'N':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1792 zu = pylong_as_zu(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1793 if (zu == (size_t)-1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1794 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1795 PACK_SINGLE(ptr, zu, size_t);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1796 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1797
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1798 /* floats */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1799 case 'f': case 'd':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1800 d = PyFloat_AsDouble(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1801 if (d == -1.0 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1802 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1803 if (fmt[0] == 'f') {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1804 PACK_SINGLE(ptr, d, float);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1805 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1806 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1807 PACK_SINGLE(ptr, d, double);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1808 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1809 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1810
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1811 /* bool */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1812 case '?':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1813 ld = PyObject_IsTrue(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1814 if (ld < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1815 return -1; /* preserve original error */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1816 #ifdef HAVE_C99_BOOL
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1817 PACK_SINGLE(ptr, ld, _Bool);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1818 #else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1819 PACK_SINGLE(ptr, ld, char);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1820 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1821 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1822
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1823 /* bytes object */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1824 case 'c':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1825 if (!PyBytes_Check(item))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1826 return type_error_int(fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1827 if (PyBytes_GET_SIZE(item) != 1)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1828 return value_error_int(fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1829 *ptr = PyBytes_AS_STRING(item)[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1830 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1831
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1832 /* pointer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1833 case 'P':
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1834 p = PyLong_AsVoidPtr(item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1835 if (p == NULL && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1836 goto err_occurred;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1837 PACK_SINGLE(ptr, p, void *);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1838 break;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1839
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1840 /* default */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1841 default: goto err_format;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1842 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1843
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1844 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1845
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1846 err_occurred:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1847 return fix_error_int(fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1848 err_range:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1849 return value_error_int(fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1850 err_format:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1851 PyErr_Format(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1852 "memoryview: format %s not supported", fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1853 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1854 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1855
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1856
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1857 /****************************************************************************/
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1858 /* unpack using the struct module */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1859 /****************************************************************************/
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1860
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1861 /* For reasonable performance it is necessary to cache all objects required
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1862 for unpacking. An unpacker can handle the format passed to unpack_from().
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1863 Invariant: All pointer fields of the struct should either be NULL or valid
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1864 pointers. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1865 struct unpacker {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1866 PyObject *unpack_from; /* Struct.unpack_from(format) */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1867 PyObject *mview; /* cached memoryview */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1868 char *item; /* buffer for mview */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1869 Py_ssize_t itemsize; /* len(item) */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1870 };
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1871
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1872 static struct unpacker *
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1873 unpacker_new(void)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1874 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1875 struct unpacker *x = PyMem_Malloc(sizeof *x);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1876
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1877 if (x == NULL) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1878 PyErr_NoMemory();
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1879 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
1880 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1881
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1882 x->unpack_from = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1883 x->mview = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1884 x->item = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1885 x->itemsize = 0;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1886
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1887 return x;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1888 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1889
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1890 static void
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1891 unpacker_free(struct unpacker *x)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1892 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1893 if (x) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1894 Py_XDECREF(x->unpack_from);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1895 Py_XDECREF(x->mview);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1896 PyMem_Free(x->item);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1897 PyMem_Free(x);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1898 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1899 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1900
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1901 /* Return a new unpacker for the given format. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1902 static struct unpacker *
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1903 struct_get_unpacker(const char *fmt, Py_ssize_t itemsize)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1904 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1905 PyObject *structmodule; /* XXX cache these two */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1906 PyObject *Struct = NULL; /* XXX in globals? */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1907 PyObject *structobj = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1908 PyObject *format = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1909 struct unpacker *x = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1910
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1911 structmodule = PyImport_ImportModule("struct");
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1912 if (structmodule == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1913 return NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1914
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1915 Struct = PyObject_GetAttrString(structmodule, "Struct");
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1916 Py_DECREF(structmodule);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1917 if (Struct == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1918 return NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1919
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1920 x = unpacker_new();
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1921 if (x == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1922 goto error;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1923
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1924 format = PyBytes_FromString(fmt);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1925 if (format == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1926 goto error;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1927
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1928 structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1929 if (structobj == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1930 goto error;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1931
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1932 x->unpack_from = PyObject_GetAttrString(structobj, "unpack_from");
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1933 if (x->unpack_from == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1934 goto error;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1935
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1936 x->item = PyMem_Malloc(itemsize);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1937 if (x->item == NULL) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1938 PyErr_NoMemory();
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1939 goto error;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1940 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1941 x->itemsize = itemsize;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1942
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1943 x->mview = PyMemoryView_FromMemory(x->item, itemsize, PyBUF_WRITE);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1944 if (x->mview == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1945 goto error;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1946
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1947
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1948 out:
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1949 Py_XDECREF(Struct);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1950 Py_XDECREF(format);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1951 Py_XDECREF(structobj);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1952 return x;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1953
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1954 error:
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1955 unpacker_free(x);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1956 x = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1957 goto out;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1958 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1959
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1960 /* unpack a single item */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1961 static PyObject *
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1962 struct_unpack_single(const char *ptr, struct unpacker *x)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1963 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1964 PyObject *v;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1965
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1966 memcpy(x->item, ptr, x->itemsize);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1967 v = PyObject_CallFunctionObjArgs(x->unpack_from, x->mview, NULL);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1968 if (v == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1969 return NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1970
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1971 if (PyTuple_GET_SIZE(v) == 1) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1972 PyObject *tmp = PyTuple_GET_ITEM(v, 0);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1973 Py_INCREF(tmp);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1974 Py_DECREF(v);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1975 return tmp;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1976 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1977
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1978 return v;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1979 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1980
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1981
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
1982 /****************************************************************************/
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1983 /* Representations */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1984 /****************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1985
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1986 /* allow explicit form of native format */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1987 Py_LOCAL_INLINE(const char *)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1988 adjust_fmt(const Py_buffer *view)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1989 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1990 const char *fmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1991
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1992 fmt = (view->format[0] == '@') ? view->format+1 : view->format;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1993 if (fmt[0] && fmt[1] == '\0')
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1994 return fmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1995
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1996 PyErr_Format(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1997 "memoryview: unsupported format %s", view->format);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1998 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1999 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2000
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2001 /* Base case for multi-dimensional unpacking. Assumption: ndim == 1. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2002 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2003 tolist_base(const char *ptr, const Py_ssize_t *shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2004 const Py_ssize_t *strides, const Py_ssize_t *suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2005 const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2006 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2007 PyObject *lst, *item;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2008 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2009
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2010 lst = PyList_New(shape[0]);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2011 if (lst == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2012 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2013
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2014 for (i = 0; i < shape[0]; ptr+=strides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2015 const char *xptr = ADJUST_PTR(ptr, suboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2016 item = unpack_single(xptr, fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2017 if (item == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2018 Py_DECREF(lst);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2019 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2020 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2021 PyList_SET_ITEM(lst, i, item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2022 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2023
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2024 return lst;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2025 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2026
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2027 /* Unpack a multi-dimensional array into a nested list.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2028 Assumption: ndim >= 1. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2029 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2030 tolist_rec(const char *ptr, Py_ssize_t ndim, const Py_ssize_t *shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2031 const Py_ssize_t *strides, const Py_ssize_t *suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2032 const char *fmt)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2033 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2034 PyObject *lst, *item;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2035 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2036
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2037 assert(ndim >= 1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2038 assert(shape != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2039 assert(strides != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2040
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2041 if (ndim == 1)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2042 return tolist_base(ptr, shape, strides, suboffsets, fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2043
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2044 lst = PyList_New(shape[0]);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2045 if (lst == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2046 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2047
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2048 for (i = 0; i < shape[0]; ptr+=strides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2049 const char *xptr = ADJUST_PTR(ptr, suboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2050 item = tolist_rec(xptr, ndim-1, shape+1,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2051 strides+1, suboffsets ? suboffsets+1 : NULL,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2052 fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2053 if (item == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2054 Py_DECREF(lst);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2055 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2056 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2057 PyList_SET_ITEM(lst, i, item);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2058 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2059
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2060 return lst;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2061 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2062
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2063 /* Return a list representation of the memoryview. Currently only buffers
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2064 with native format strings are supported. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2065 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2066 memory_tolist(PyMemoryViewObject *mv, PyObject *noargs)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2067 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2068 const Py_buffer *view = &(mv->view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2069 const char *fmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2070
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2071 CHECK_RELEASED(mv);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2072
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2073 fmt = adjust_fmt(view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2074 if (fmt == NULL)
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2075 return NULL;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2076 if (view->ndim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2077 return unpack_single(view->buf, fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2078 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2079 else if (view->ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2080 return tolist_base(view->buf, view->shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2081 view->strides, view->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2082 fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2083 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2084 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2085 return tolist_rec(view->buf, view->ndim, view->shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2086 view->strides, view->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2087 fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2088 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2089 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2090
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2091 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2092 memory_tobytes(PyMemoryViewObject *self, PyObject *dummy)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2093 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2094 Py_buffer *src = VIEW_ADDR(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2095 PyObject *bytes = NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2096
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2097 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2098
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2099 if (MV_C_CONTIGUOUS(self->flags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2100 return PyBytes_FromStringAndSize(src->buf, src->len);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2101 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2102
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2103 bytes = PyBytes_FromStringAndSize(NULL, src->len);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2104 if (bytes == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2105 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2106
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
2107 if (buffer_to_contiguous(PyBytes_AS_STRING(bytes), src, 'C') < 0) {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2108 Py_DECREF(bytes);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2109 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2110 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2111
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2112 return bytes;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2113 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2114
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2115 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2116 memory_repr(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2117 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2118 if (self->flags & _Py_MEMORYVIEW_RELEASED)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2119 return PyUnicode_FromFormat("<released memory at %p>", self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2120 else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2121 return PyUnicode_FromFormat("<memory at %p>", self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2122 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2123
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2124
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2125 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2126 /* Indexing and slicing */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2127 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2128
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2129 /* Get the pointer to the item at index. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2130 static char *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2131 ptr_from_index(Py_buffer *view, Py_ssize_t index)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2132 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2133 char *ptr;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2134 Py_ssize_t nitems; /* items in the first dimension */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2135
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2136 assert(view->shape);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2137 assert(view->strides);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2138
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2139 nitems = view->shape[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2140 if (index < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2141 index += nitems;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2142 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2143 if (index < 0 || index >= nitems) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2144 PyErr_SetString(PyExc_IndexError, "index out of bounds");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2145 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2146 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2147
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2148 ptr = (char *)view->buf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2149 ptr += view->strides[0] * index;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2150
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2151 ptr = ADJUST_PTR(ptr, view->suboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2152
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2153 return ptr;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2154 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2155
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2156 /* Return the item at index. In a one-dimensional view, this is an object
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2157 with the type specified by view->format. Otherwise, the item is a sub-view.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2158 The function is used in memory_subscript() and memory_as_sequence. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2159 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2160 memory_item(PyMemoryViewObject *self, Py_ssize_t index)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2161 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2162 Py_buffer *view = &(self->view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2163 const char *fmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2164
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2165 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2166
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2167 fmt = adjust_fmt(view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2168 if (fmt == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2169 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2170
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2171 if (view->ndim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2172 PyErr_SetString(PyExc_TypeError, "invalid indexing of 0-dim memory");
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2173 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2174 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2175 if (view->ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2176 char *ptr = ptr_from_index(view, index);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2177 if (ptr == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2178 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2179 return unpack_single(ptr, fmt);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2180 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2181
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2182 PyErr_SetString(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2183 "multi-dimensional sub-views are not implemented");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2184 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2185 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2186
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2187 Py_LOCAL_INLINE(int)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2188 init_slice(Py_buffer *base, PyObject *key, int dim)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2189 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2190 Py_ssize_t start, stop, step, slicelength;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2191
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2192 if (PySlice_GetIndicesEx(key, base->shape[dim],
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2193 &start, &stop, &step, &slicelength) < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2194 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2195 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2196
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2197
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2198 if (base->suboffsets == NULL || dim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2199 adjust_buf:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2200 base->buf = (char *)base->buf + base->strides[dim] * start;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2201 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2202 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2203 Py_ssize_t n = dim-1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2204 while (n >= 0 && base->suboffsets[n] < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2205 n--;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2206 if (n < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2207 goto adjust_buf; /* all suboffsets are negative */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2208 base->suboffsets[n] = base->suboffsets[n] + base->strides[dim] * start;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2209 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2210 base->shape[dim] = slicelength;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2211 base->strides[dim] = base->strides[dim] * step;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2212
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2213 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2214 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2215
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2216 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2217 is_multislice(PyObject *key)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2218 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2219 Py_ssize_t size, i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2220
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2221 if (!PyTuple_Check(key))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2222 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2223 size = PyTuple_GET_SIZE(key);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2224 if (size == 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2225 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2226
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2227 for (i = 0; i < size; i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2228 PyObject *x = PyTuple_GET_ITEM(key, i);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2229 if (!PySlice_Check(x))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2230 return 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2231 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2232 return 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2233 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2234
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2235 /* mv[obj] returns an object holding the data for one element if obj
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2236 fully indexes the memoryview or another memoryview object if it
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2237 does not.
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2238
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2239 0-d memoryview objects can be referenced using mv[...] or mv[()]
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2240 but not with anything else. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2241 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2242 memory_subscript(PyMemoryViewObject *self, PyObject *key)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2243 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2244 Py_buffer *view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2245 view = &(self->view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2246
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2247 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2248
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2249 if (view->ndim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2250 if (PyTuple_Check(key) && PyTuple_GET_SIZE(key) == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2251 const char *fmt = adjust_fmt(view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2252 if (fmt == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2253 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2254 return unpack_single(view->buf, fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2255 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2256 else if (key == Py_Ellipsis) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2257 Py_INCREF(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2258 return (PyObject *)self;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2259 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2260 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2261 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2262 "invalid indexing of 0-dim memory");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2263 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2264 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2265 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2266
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2267 if (PyIndex_Check(key)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2268 Py_ssize_t index;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2269 index = PyNumber_AsSsize_t(key, PyExc_IndexError);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2270 if (index == -1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2271 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2272 return memory_item(self, index);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2273 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2274 else if (PySlice_Check(key)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2275 PyMemoryViewObject *sliced;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2276
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2277 sliced = (PyMemoryViewObject *)mbuf_add_view(self->mbuf, view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2278 if (sliced == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2279 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2280
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2281 if (init_slice(&sliced->view, key, 0) < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2282 Py_DECREF(sliced);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2283 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2284 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2285 init_len(&sliced->view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2286 init_flags(sliced);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2287
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2288 return (PyObject *)sliced;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2289 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2290 else if (is_multislice(key)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2291 PyErr_SetString(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2292 "multi-dimensional slicing is not implemented");
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2293 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2294 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2295
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2296 PyErr_SetString(PyExc_TypeError, "memoryview: invalid slice key");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2297 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2298 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2299
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2300 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2301 memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2302 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2303 Py_buffer *view = &(self->view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2304 Py_buffer src;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2305 const char *fmt;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2306 char *ptr;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2307
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2308 CHECK_RELEASED_INT(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2309
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2310 fmt = adjust_fmt(view);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2311 if (fmt == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2312 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2313
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2314 if (view->readonly) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2315 PyErr_SetString(PyExc_TypeError, "cannot modify read-only memory");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2316 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2317 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2318 if (value == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2319 PyErr_SetString(PyExc_TypeError, "cannot delete memory");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2320 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2321 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2322 if (view->ndim == 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2323 if (key == Py_Ellipsis ||
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2324 (PyTuple_Check(key) && PyTuple_GET_SIZE(key)==0)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2325 ptr = (char *)view->buf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2326 return pack_single(ptr, value, fmt);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2327 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2328 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2329 PyErr_SetString(PyExc_TypeError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2330 "invalid indexing of 0-dim memory");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2331 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2332 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2333 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2334 if (view->ndim != 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2335 PyErr_SetString(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2336 "memoryview assignments are currently restricted to ndim = 1");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2337 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2338 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2339
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2340 if (PyIndex_Check(key)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2341 Py_ssize_t index = PyNumber_AsSsize_t(key, PyExc_IndexError);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2342 if (index == -1 && PyErr_Occurred())
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2343 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2344 ptr = ptr_from_index(view, index);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2345 if (ptr == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2346 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2347 return pack_single(ptr, value, fmt);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2348 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2349 /* one-dimensional: fast path */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2350 if (PySlice_Check(key) && view->ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2351 Py_buffer dest; /* sliced view */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2352 Py_ssize_t arrays[3];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2353 int ret = -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2354
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2355 /* rvalue must be an exporter */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2356 if (PyObject_GetBuffer(value, &src, PyBUF_FULL_RO) < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2357 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2358
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2359 dest = *view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2360 dest.shape = &arrays[0]; dest.shape[0] = view->shape[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2361 dest.strides = &arrays[1]; dest.strides[0] = view->strides[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2362 if (view->suboffsets) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2363 dest.suboffsets = &arrays[2]; dest.suboffsets[0] = view->suboffsets[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2364 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2365
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2366 if (init_slice(&dest, key, 0) < 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2367 goto end_block;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2368 dest.len = dest.shape[0] * dest.itemsize;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2369
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2370 ret = copy_single(&dest, &src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2371
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2372 end_block:
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2373 PyBuffer_Release(&src);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2374 return ret;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2375 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2376 else if (PySlice_Check(key) || is_multislice(key)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2377 /* Call memory_subscript() to produce a sliced lvalue, then copy
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2378 rvalue into lvalue. This is already implemented in _testbuffer.c. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2379 PyErr_SetString(PyExc_NotImplementedError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2380 "memoryview slice assignments are currently restricted "
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2381 "to ndim = 1");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2382 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2383 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2384
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2385 PyErr_SetString(PyExc_TypeError, "memoryview: invalid slice key");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2386 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2387 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2388
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2389 static Py_ssize_t
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2390 memory_length(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2391 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2392 CHECK_RELEASED_INT(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2393 return self->view.ndim == 0 ? 1 : self->view.shape[0];
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2394 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2395
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2396 /* As mapping */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2397 static PyMappingMethods memory_as_mapping = {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2398 (lenfunc)memory_length, /* mp_length */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2399 (binaryfunc)memory_subscript, /* mp_subscript */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2400 (objobjargproc)memory_ass_sub, /* mp_ass_subscript */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2401 };
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2402
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2403 /* As sequence */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2404 static PySequenceMethods memory_as_sequence = {
85923
0dc604d58949 Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents: 82263
diff changeset
2405 (lenfunc)memory_length, /* sq_length */
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2406 0, /* sq_concat */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2407 0, /* sq_repeat */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2408 (ssizeargfunc)memory_item, /* sq_item */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2409 };
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2410
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2411
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2412 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2413 /* Comparisons */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2414 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2415
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2416 #define MV_COMPARE_EX -1 /* exception */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2417 #define MV_COMPARE_NOT_IMPL -2 /* not implemented */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2418
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2419 /* Translate a StructError to "not equal". Preserve other exceptions. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2420 static int
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2421 fix_struct_error_int(void)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2422 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2423 assert(PyErr_Occurred());
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2424 /* XXX Cannot get at StructError directly? */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2425 if (PyErr_ExceptionMatches(PyExc_ImportError) ||
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2426 PyErr_ExceptionMatches(PyExc_MemoryError)) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2427 return MV_COMPARE_EX;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2428 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2429 /* StructError: invalid or unknown format -> not equal */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2430 PyErr_Clear();
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2431 return 0;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2432 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2433
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2434 /* Unpack and compare single items of p and q using the struct module. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2435 static int
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2436 struct_unpack_cmp(const char *p, const char *q,
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2437 struct unpacker *unpack_p, struct unpacker *unpack_q)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2438 {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2439 PyObject *v, *w;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2440 int ret;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2441
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2442 /* At this point any exception from the struct module should not be
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2443 StructError, since both formats have been accepted already. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2444 v = struct_unpack_single(p, unpack_p);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2445 if (v == NULL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2446 return MV_COMPARE_EX;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2447
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2448 w = struct_unpack_single(q, unpack_q);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2449 if (w == NULL) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2450 Py_DECREF(v);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2451 return MV_COMPARE_EX;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2452 }
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2453
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2454 /* MV_COMPARE_EX == -1: exceptions are preserved */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2455 ret = PyObject_RichCompareBool(v, w, Py_EQ);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2456 Py_DECREF(v);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2457 Py_DECREF(w);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2458
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2459 return ret;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2460 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2461
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2462 /* Unpack and compare single items of p and q. If both p and q have the same
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2463 single element native format, the comparison uses a fast path (gcc creates
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2464 a jump table and converts memcpy into simple assignments on x86/x64).
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2465
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2466 Otherwise, the comparison is delegated to the struct module, which is
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2467 30-60x slower. */
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2468 #define CMP_SINGLE(p, q, type) \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2469 do { \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2470 type x; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2471 type y; \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2472 memcpy((char *)&x, p, sizeof x); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2473 memcpy((char *)&y, q, sizeof y); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2474 equal = (x == y); \
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2475 } while (0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2476
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2477 Py_LOCAL_INLINE(int)
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2478 unpack_cmp(const char *p, const char *q, char fmt,
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2479 struct unpacker *unpack_p, struct unpacker *unpack_q)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2480 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2481 int equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2482
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2483 switch (fmt) {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2484
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2485 /* signed integers and fast path for 'B' */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2486 case 'B': return *((unsigned char *)p) == *((unsigned char *)q);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2487 case 'b': return *((signed char *)p) == *((signed char *)q);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2488 case 'h': CMP_SINGLE(p, q, short); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2489 case 'i': CMP_SINGLE(p, q, int); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2490 case 'l': CMP_SINGLE(p, q, long); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2491
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2492 /* boolean */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2493 #ifdef HAVE_C99_BOOL
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2494 case '?': CMP_SINGLE(p, q, _Bool); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2495 #else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2496 case '?': CMP_SINGLE(p, q, char); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2497 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2498
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2499 /* unsigned integers */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2500 case 'H': CMP_SINGLE(p, q, unsigned short); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2501 case 'I': CMP_SINGLE(p, q, unsigned int); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2502 case 'L': CMP_SINGLE(p, q, unsigned long); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2503
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2504 /* native 64-bit */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2505 #ifdef HAVE_LONG_LONG
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2506 case 'q': CMP_SINGLE(p, q, PY_LONG_LONG); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2507 case 'Q': CMP_SINGLE(p, q, unsigned PY_LONG_LONG); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2508 #endif
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2509
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2510 /* ssize_t and size_t */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2511 case 'n': CMP_SINGLE(p, q, Py_ssize_t); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2512 case 'N': CMP_SINGLE(p, q, size_t); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2513
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2514 /* floats */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2515 /* XXX DBL_EPSILON? */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2516 case 'f': CMP_SINGLE(p, q, float); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2517 case 'd': CMP_SINGLE(p, q, double); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2518
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2519 /* bytes object */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2520 case 'c': return *p == *q;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2521
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2522 /* pointer */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2523 case 'P': CMP_SINGLE(p, q, void *); return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2524
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2525 /* use the struct module */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2526 case '_':
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2527 assert(unpack_p);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2528 assert(unpack_q);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2529 return struct_unpack_cmp(p, q, unpack_p, unpack_q);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2530 }
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2531
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2532 /* NOT REACHED */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2533 PyErr_SetString(PyExc_RuntimeError,
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2534 "memoryview: internal error in richcompare");
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2535 return MV_COMPARE_EX;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2536 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2537
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2538 /* Base case for recursive array comparisons. Assumption: ndim == 1. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2539 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2540 cmp_base(const char *p, const char *q, const Py_ssize_t *shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2541 const Py_ssize_t *pstrides, const Py_ssize_t *psuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2542 const Py_ssize_t *qstrides, const Py_ssize_t *qsuboffsets,
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2543 char fmt, struct unpacker *unpack_p, struct unpacker *unpack_q)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2544 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2545 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2546 int equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2547
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2548 for (i = 0; i < shape[0]; p+=pstrides[0], q+=qstrides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2549 const char *xp = ADJUST_PTR(p, psuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2550 const char *xq = ADJUST_PTR(q, qsuboffsets);
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2551 equal = unpack_cmp(xp, xq, fmt, unpack_p, unpack_q);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2552 if (equal <= 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2553 return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2554 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2555
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2556 return 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2557 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2558
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2559 /* Recursively compare two multi-dimensional arrays that have the same
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2560 logical structure. Assumption: ndim >= 1. */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2561 static int
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2562 cmp_rec(const char *p, const char *q,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2563 Py_ssize_t ndim, const Py_ssize_t *shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2564 const Py_ssize_t *pstrides, const Py_ssize_t *psuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2565 const Py_ssize_t *qstrides, const Py_ssize_t *qsuboffsets,
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2566 char fmt, struct unpacker *unpack_p, struct unpacker *unpack_q)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2567 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2568 Py_ssize_t i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2569 int equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2570
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2571 assert(ndim >= 1);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2572 assert(shape != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2573 assert(pstrides != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2574 assert(qstrides != NULL);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2575
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2576 if (ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2577 return cmp_base(p, q, shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2578 pstrides, psuboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2579 qstrides, qsuboffsets,
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2580 fmt, unpack_p, unpack_q);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2581 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2582
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2583 for (i = 0; i < shape[0]; p+=pstrides[0], q+=qstrides[0], i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2584 const char *xp = ADJUST_PTR(p, psuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2585 const char *xq = ADJUST_PTR(q, qsuboffsets);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2586 equal = cmp_rec(xp, xq, ndim-1, shape+1,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2587 pstrides+1, psuboffsets ? psuboffsets+1 : NULL,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2588 qstrides+1, qsuboffsets ? qsuboffsets+1 : NULL,
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2589 fmt, unpack_p, unpack_q);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2590 if (equal <= 0)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2591 return equal;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2592 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2593
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2594 return 1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2595 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2596
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2597 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2598 memory_richcompare(PyObject *v, PyObject *w, int op)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2599 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2600 PyObject *res;
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2601 Py_buffer wbuf, *vv;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2602 Py_buffer *ww = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2603 struct unpacker *unpack_v = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2604 struct unpacker *unpack_w = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2605 char vfmt, wfmt;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2606 int equal = MV_COMPARE_NOT_IMPL;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2607
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2608 if (op != Py_EQ && op != Py_NE)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2609 goto result; /* Py_NotImplemented */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2610
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2611 assert(PyMemoryView_Check(v));
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2612 if (BASE_INACCESSIBLE(v)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2613 equal = (v == w);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2614 goto result;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2615 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2616 vv = VIEW_ADDR(v);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2617
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2618 if (PyMemoryView_Check(w)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2619 if (BASE_INACCESSIBLE(w)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2620 equal = (v == w);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2621 goto result;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2622 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2623 ww = VIEW_ADDR(w);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2624 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2625 else {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2626 if (PyObject_GetBuffer(w, &wbuf, PyBUF_FULL_RO) < 0) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2627 PyErr_Clear();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2628 goto result; /* Py_NotImplemented */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2629 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2630 ww = &wbuf;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2631 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2632
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2633 if (!equiv_shape(vv, ww)) {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2634 PyErr_Clear();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2635 equal = 0;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2636 goto result;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2637 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2638
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2639 /* Use fast unpacking for identical primitive C type formats. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2640 if (get_native_fmtchar(&vfmt, vv->format) < 0)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2641 vfmt = '_';
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2642 if (get_native_fmtchar(&wfmt, ww->format) < 0)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2643 wfmt = '_';
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2644 if (vfmt == '_' || wfmt == '_' || vfmt != wfmt) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2645 /* Use struct module unpacking. NOTE: Even for equal format strings,
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2646 memcmp() cannot be used for item comparison since it would give
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2647 incorrect results in the case of NaNs or uninitialized padding
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2648 bytes. */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2649 vfmt = '_';
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2650 unpack_v = struct_get_unpacker(vv->format, vv->itemsize);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2651 if (unpack_v == NULL) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2652 equal = fix_struct_error_int();
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2653 goto result;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2654 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2655 unpack_w = struct_get_unpacker(ww->format, ww->itemsize);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2656 if (unpack_w == NULL) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2657 equal = fix_struct_error_int();
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2658 goto result;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2659 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2660 }
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2661
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2662 if (vv->ndim == 0) {
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2663 equal = unpack_cmp(vv->buf, ww->buf,
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2664 vfmt, unpack_v, unpack_w);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2665 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2666 else if (vv->ndim == 1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2667 equal = cmp_base(vv->buf, ww->buf, vv->shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2668 vv->strides, vv->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2669 ww->strides, ww->suboffsets,
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2670 vfmt, unpack_v, unpack_w);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2671 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2672 else {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2673 equal = cmp_rec(vv->buf, ww->buf, vv->ndim, vv->shape,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2674 vv->strides, vv->suboffsets,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2675 ww->strides, ww->suboffsets,
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2676 vfmt, unpack_v, unpack_w);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2677 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2678
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2679 result:
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2680 if (equal < 0) {
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2681 if (equal == MV_COMPARE_NOT_IMPL)
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2682 res = Py_NotImplemented;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2683 else /* exception */
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2684 res = NULL;
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2685 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2686 else if ((equal && op == Py_EQ) || (!equal && op == Py_NE))
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2687 res = Py_True;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2688 else
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2689 res = Py_False;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2690
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2691 if (ww == &wbuf)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2692 PyBuffer_Release(ww);
78760
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2693
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2694 unpacker_free(unpack_v);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2695 unpacker_free(unpack_w);
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2696
afa3dedfee18 Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents: 78303
diff changeset
2697 Py_XINCREF(res);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2698 return res;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2699 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2700
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2701 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2702 /* Hash */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2703 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2704
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2705 static Py_hash_t
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2706 memory_hash(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2707 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2708 if (self->hash == -1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2709 Py_buffer *view = &self->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2710 char *mem = view->buf;
80182
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2711 Py_ssize_t ret;
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2712 char fmt;
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2713
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2714 CHECK_RELEASED_INT(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2715
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2716 if (!view->readonly) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2717 PyErr_SetString(PyExc_ValueError,
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2718 "cannot hash writable memoryview object");
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2719 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2720 }
80182
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2721 ret = get_native_fmtchar(&fmt, view->format);
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2722 if (ret < 0 || !IS_BYTE_FORMAT(fmt)) {
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2723 PyErr_SetString(PyExc_ValueError,
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2724 "memoryview: hashing is restricted to formats 'B', 'b' or 'c'");
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2725 return -1;
969069d464bc Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents: 78850
diff changeset
2726 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2727 if (view->obj != NULL && PyObject_Hash(view->obj) == -1) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2728 /* Keep the original error message */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2729 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2730 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2731
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2732 if (!MV_C_CONTIGUOUS(self->flags)) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2733 mem = PyMem_Malloc(view->len);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2734 if (mem == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2735 PyErr_NoMemory();
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2736 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2737 }
78301
8fbbc7c8748e Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents: 77213
diff changeset
2738 if (buffer_to_contiguous(mem, view, 'C') < 0) {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2739 PyMem_Free(mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2740 return -1;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2741 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2742 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2743
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2744 /* Can't fail */
87288
adb471b9cba1 ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents: 85940
diff changeset
2745 self->hash = _Py_HashBytes(mem, view->len);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2746
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2747 if (mem != view->buf)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2748 PyMem_Free(mem);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2749 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2750
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2751 return self->hash;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2752 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2753
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2754
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2755 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2756 /* getters */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2757 /**************************************************************************/
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2758
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2759 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2760 _IntTupleFromSsizet(int len, Py_ssize_t *vals)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2761 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2762 int i;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2763 PyObject *o;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2764 PyObject *intTuple;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2765
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2766 if (vals == NULL)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2767 return PyTuple_New(0);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2768
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2769 intTuple = PyTuple_New(len);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2770 if (!intTuple)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2771 return NULL;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2772 for (i=0; i<len; i++) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2773 o = PyLong_FromSsize_t(vals[i]);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2774 if (!o) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2775 Py_DECREF(intTuple);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2776 return NULL;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2777 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2778 PyTuple_SET_ITEM(intTuple, i, o);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2779 }
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2780 return intTuple;
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2781 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2782
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2783 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2784 memory_obj_get(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2785 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2786 Py_buffer *view = &self->view;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2787
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2788 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2789 if (view->obj == NULL) {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2790 Py_RETURN_NONE;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2791 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2792 Py_INCREF(view->obj);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2793 return view->obj;
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2794 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2795
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2796 static PyObject *
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2797 memory_nbytes_get(PyMemoryViewObject *self)
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2798 {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2799 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2800 return PyLong_FromSsize_t(self->view.len);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2801 }
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2802
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2803 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2804 memory_format_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2805 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2806 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2807 return PyUnicode_FromString(self->view.format);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2808 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2809
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2810 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2811 memory_itemsize_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2812 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2813 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2814 return PyLong_FromSsize_t(self->view.itemsize);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2815 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2816
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2817 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2818 memory_shape_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2819 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2820 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2821 return _IntTupleFromSsizet(self->view.ndim, self->view.shape);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2822 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2823
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2824 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2825 memory_strides_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2826 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2827 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2828 return _IntTupleFromSsizet(self->view.ndim, self->view.strides);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2829 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2830
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2831 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2832 memory_suboffsets_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2833 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2834 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2835 return _IntTupleFromSsizet(self->view.ndim, self->view.suboffsets);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2836 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2837
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2838 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2839 memory_readonly_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2840 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2841 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2842 return PyBool_FromLong(self->view.readonly);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2843 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2844
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2845 static PyObject *
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2846 memory_ndim_get(PyMemoryViewObject *self)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2847 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2848 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2849 return PyLong_FromLong(self->view.ndim);
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2850 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2851
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2852 static PyObject *
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2853 memory_c_contiguous(PyMemoryViewObject *self, PyObject *dummy)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2854 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2855 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2856 return PyBool_FromLong(MV_C_CONTIGUOUS(self->flags));
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2857 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2858
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2859 static PyObject *
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2860 memory_f_contiguous(PyMemoryViewObject *self, PyObject *dummy)
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2861 {
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
2862 CHECK_RELEASED(self);
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2863 return PyBool_FromLong(MV_F_CONTIGUOUS(self->flags));
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2864 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2865
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2866 static PyObject *
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2867 memory_contiguous(PyMemoryViewObject *self, PyObject *dummy)
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2868 {
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2869 CHECK_RELEASED(self);
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2870 return PyBool_FromLong(MV_ANY_CONTIGUOUS(self->flags));
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2871 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2872
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2873 PyDoc_STRVAR(memory_obj_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2874 "The underlying object of the memoryview.");
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2875 PyDoc_STRVAR(memory_nbytes_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2876 "The amount of space in bytes that the array would use in\n"
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2877 " a contiguous representation.");
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2878 PyDoc_STRVAR(memory_readonly_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2879 "A bool indicating whether the memory is read only.");
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2880 PyDoc_STRVAR(memory_itemsize_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2881 "The size in bytes of each element of the memoryview.");
78848
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2882 PyDoc_STRVAR(memory_format_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2883 "A string containing the format (in struct module style)\n"
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2884 " for each element in the view.");
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2885 PyDoc_STRVAR(memory_ndim_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2886 "An integer indicating how many dimensions of a multi-dimensional\n"
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2887 " array the memory represents.");
78848
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2888 PyDoc_STRVAR(memory_shape_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2889 "A tuple of ndim integers giving the shape of the memory\n"
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2890 " as an N-dimensional array.");
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2891 PyDoc_STRVAR(memory_strides_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2892 "A tuple of ndim integers giving the size in bytes to access\n"
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2893 " each element for each dimension of the array.");
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2894 PyDoc_STRVAR(memory_suboffsets_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2895 "A tuple of integers used internally for PIL-style arrays.");
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2896 PyDoc_STRVAR(memory_c_contiguous_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2897 "A bool indicating whether the memory is C contiguous.");
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2898 PyDoc_STRVAR(memory_f_contiguous_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2899 "A bool indicating whether the memory is Fortran contiguous.");
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2900 PyDoc_STRVAR(memory_contiguous_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2901 "A bool indicating whether the memory is contiguous.");
78848
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2902
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2903 static PyGetSetDef memory_getsetlist[] = {
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2904 {"obj", (getter)memory_obj_get, NULL, memory_obj_doc},
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2905 {"nbytes", (getter)memory_nbytes_get, NULL, memory_nbytes_doc},
78849
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2906 {"readonly", (getter)memory_readonly_get, NULL, memory_readonly_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2907 {"itemsize", (getter)memory_itemsize_get, NULL, memory_itemsize_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2908 {"format", (getter)memory_format_get, NULL, memory_format_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2909 {"ndim", (getter)memory_ndim_get, NULL, memory_ndim_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2910 {"shape", (getter)memory_shape_get, NULL, memory_shape_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2911 {"strides", (getter)memory_strides_get, NULL, memory_strides_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2912 {"suboffsets", (getter)memory_suboffsets_get, NULL, memory_suboffsets_doc},
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2913 {"c_contiguous", (getter)memory_c_contiguous, NULL, memory_c_contiguous_doc},
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2914 {"f_contiguous", (getter)memory_f_contiguous, NULL, memory_f_contiguous_doc},
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2915 {"contiguous", (getter)memory_contiguous, NULL, memory_contiguous_doc},
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2916 {NULL, NULL, NULL, NULL},
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2917 };
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2918
78848
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2919 PyDoc_STRVAR(memory_release_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2920 "M.release() -> None\n\
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2921 \n\
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2922 Release the underlying buffer exposed by the memoryview object.");
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2923 PyDoc_STRVAR(memory_tobytes_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2924 "M.tobytes() -> bytes\n\
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2925 \n\
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2926 Return the data in the buffer as a byte string.");
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2927 PyDoc_STRVAR(memory_tolist_doc,
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2928 "M.tolist() -> list\n\
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2929 \n\
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2930 Return the data in the buffer as a list of elements.");
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2931 PyDoc_STRVAR(memory_cast_doc,
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2932 "M.cast(format[, shape]) -> memoryview\n\
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2933 \n\
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2934 Cast a memoryview to a new format or shape.");
78848
c49f89261d65 Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 68257
diff changeset
2935
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2936 static PyMethodDef memory_methods[] = {
78849
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2937 {"release", (PyCFunction)memory_release, METH_NOARGS, memory_release_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2938 {"tobytes", (PyCFunction)memory_tobytes, METH_NOARGS, memory_tobytes_doc},
16a69ccff5ce Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78760 78848
diff changeset
2939 {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, memory_tolist_doc},
78850
ba2c1def3710 Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 78849
diff changeset
2940 {"cast", (PyCFunction)memory_cast, METH_VARARGS|METH_KEYWORDS, memory_cast_doc},
78303
c15edc6b9b97 Add unused parameter to a METH_NOARGS function.
Stefan Krah <skrah@bytereef.org>
parents: 78301
diff changeset
2941 {"__enter__", memory_enter, METH_NOARGS, NULL},
c15edc6b9b97 Add unused parameter to a METH_NOARGS function.
Stefan Krah <skrah@bytereef.org>
parents: 78301
diff changeset
2942 {"__exit__", memory_exit, METH_VARARGS, NULL},
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2943 {NULL, NULL}
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2944 };
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2945
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2946
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2947 PyTypeObject PyMemoryView_Type = {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2948 PyVarObject_HEAD_INIT(&PyType_Type, 0)
75254
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2949 "memoryview", /* tp_name */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2950 offsetof(PyMemoryViewObject, ob_array), /* tp_basicsize */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2951 sizeof(Py_ssize_t), /* tp_itemsize */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2952 (destructor)memory_dealloc, /* tp_dealloc */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2953 0, /* tp_print */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2954 0, /* tp_getattr */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2955 0, /* tp_setattr */
51271
87fbbf22adf3 Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50501
diff changeset
2956 0, /* tp_reserved */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2957 (reprfunc)memory_repr, /* tp_repr */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2958 0, /* tp_as_number */
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
2959 &memory_as_sequence, /* tp_as_sequence */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2960 &memory_as_mapping, /* tp_as_mapping */
73669
215690b782f8 Issue #13411: memoryview objects are now hashable when the underlying object is hashable.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71810
diff changeset
2961 (hashfunc)memory_hash, /* tp_hash */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2962 0, /* tp_call */
51468
4313b4d4bdc7 Merged revisions 69438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 51271
diff changeset
2963 0, /* tp_str */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2964 PyObject_GenericGetAttr, /* tp_getattro */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2965 0, /* tp_setattro */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2966 &memory_as_buffer, /* tp_as_buffer */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2967 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2968 memory_doc, /* tp_doc */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2969 (traverseproc)memory_traverse, /* tp_traverse */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2970 (inquiry)memory_clear, /* tp_clear */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2971 memory_richcompare, /* tp_richcompare */
77213
bc0281f85409 Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents: 75440
diff changeset
2972 offsetof(PyMemoryViewObject, weakreflist),/* tp_weaklistoffset */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2973 0, /* tp_iter */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2974 0, /* tp_iternext */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2975 memory_methods, /* tp_methods */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2976 0, /* tp_members */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2977 memory_getsetlist, /* tp_getset */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2978 0, /* tp_base */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2979 0, /* tp_dict */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2980 0, /* tp_descr_get */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2981 0, /* tp_descr_set */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2982 0, /* tp_dictoffset */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2983 0, /* tp_init */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2984 0, /* tp_alloc */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
2985 memory_new, /* tp_new */
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
2986 };