annotate Objects/memoryobject.c @ 84007:dbfbdf2b5c19 3.3

Fix #17967: For ftp urls CWD to target instead of hopping to each directory towards target. This fixes a bug where target is accessible, but parent directories are restricted.
author Senthil Kumaran <senthil@uthcode.com>
date Sat, 01 Jun 2013 08:27:06 -0700
parents 8c4aa4cb7930
children b08e092df155 0dc604d58949
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 }
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
1333 if (zero_in_shape(self)) {
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 = {
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2405 0, /* sq_length */
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 */
3f9b3b6f7ff0 - Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents: 73669
diff changeset
2745 self->hash = _Py_HashBytes((unsigned char *)mem, view->len);
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 };