Mercurial > cpython-lru_cache-weakref
annotate Objects/memoryobject.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | adb471b9cba1 |
| children |
| 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 | 310 "memoryview assignment: lvalue and rvalue have different " |
| 311 "structures"); | |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
312 return 0; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
313 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
314 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
315 return 1; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
316 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
317 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
318 /* Base case for recursive multi-dimensional copying. Contiguous arrays are |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
319 copied with very little overhead. Assumptions: ndim == 1, mem == NULL or |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
320 sizeof(mem) == shape[0] * itemsize. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
321 static void |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
322 copy_base(const Py_ssize_t *shape, Py_ssize_t itemsize, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
323 char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
324 char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
325 char *mem) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
326 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
327 if (mem == NULL) { /* contiguous */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
328 Py_ssize_t size = shape[0] * itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
329 if (dptr + size < sptr || sptr + size < dptr) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
330 memcpy(dptr, sptr, size); /* no overlapping */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
331 else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
332 memmove(dptr, sptr, size); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
333 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
334 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
335 char *p; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
336 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
337 for (i=0, p=mem; i < shape[0]; p+=itemsize, sptr+=sstrides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
338 char *xsptr = ADJUST_PTR(sptr, ssuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
339 memcpy(p, xsptr, itemsize); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
340 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
341 for (i=0, p=mem; i < shape[0]; p+=itemsize, dptr+=dstrides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
342 char *xdptr = ADJUST_PTR(dptr, dsuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
343 memcpy(xdptr, p, itemsize); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
344 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
345 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
346 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
347 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
348 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
349 /* Recursively copy a source buffer to a destination buffer. The two buffers |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
350 have the same ndim, shape and itemsize. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
351 static void |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
352 copy_rec(const Py_ssize_t *shape, Py_ssize_t ndim, Py_ssize_t itemsize, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
353 char *dptr, const Py_ssize_t *dstrides, const Py_ssize_t *dsuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
354 char *sptr, const Py_ssize_t *sstrides, const Py_ssize_t *ssuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
355 char *mem) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
356 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
357 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
358 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
359 assert(ndim >= 1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
360 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
361 if (ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
362 copy_base(shape, itemsize, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
363 dptr, dstrides, dsuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
364 sptr, sstrides, ssuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
365 mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
366 return; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
367 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
368 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
369 for (i = 0; i < shape[0]; dptr+=dstrides[0], sptr+=sstrides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
370 char *xdptr = ADJUST_PTR(dptr, dsuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
371 char *xsptr = ADJUST_PTR(sptr, ssuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
372 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
373 copy_rec(shape+1, ndim-1, itemsize, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
374 xdptr, dstrides+1, dsuboffsets ? dsuboffsets+1 : NULL, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
375 xsptr, sstrides+1, ssuboffsets ? ssuboffsets+1 : NULL, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
376 mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
377 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
378 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
379 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
380 /* Faster copying of one-dimensional arrays. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
381 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
382 copy_single(Py_buffer *dest, Py_buffer *src) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
383 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
384 char *mem = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
385 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
386 assert(dest->ndim == 1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
387 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
388 if (!equiv_structure(dest, src)) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
389 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
390 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
391 if (!last_dim_is_contiguous(dest, src)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
392 mem = PyMem_Malloc(dest->shape[0] * dest->itemsize); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
393 if (mem == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
394 PyErr_NoMemory(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
395 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
396 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
397 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
398 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
399 copy_base(dest->shape, dest->itemsize, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
400 dest->buf, dest->strides, dest->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
401 src->buf, src->strides, src->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
402 mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
403 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
404 if (mem) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
405 PyMem_Free(mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
406 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
407 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
408 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
409 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
410 /* Recursively copy src to dest. Both buffers must have the same basic |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
411 structure. Copying is atomic, the function never fails with a partial |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
412 copy. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
413 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
414 copy_buffer(Py_buffer *dest, Py_buffer *src) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
415 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
416 char *mem = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
417 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
418 assert(dest->ndim > 0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
419 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
420 if (!equiv_structure(dest, src)) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
421 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
422 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
423 if (!last_dim_is_contiguous(dest, src)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
424 mem = PyMem_Malloc(dest->shape[dest->ndim-1] * dest->itemsize); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
425 if (mem == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
426 PyErr_NoMemory(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
427 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
428 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
429 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
430 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
431 copy_rec(dest->shape, dest->ndim, dest->itemsize, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
432 dest->buf, dest->strides, dest->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
433 src->buf, src->strides, src->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
434 mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
435 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
436 if (mem) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
437 PyMem_Free(mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
438 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
439 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
440 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
441 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
442 /* Initialize strides for a C-contiguous array. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
443 Py_LOCAL_INLINE(void) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
444 init_strides_from_shape(Py_buffer *view) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
445 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
446 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
447 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
448 assert(view->ndim > 0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
449 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
450 view->strides[view->ndim-1] = view->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
451 for (i = view->ndim-2; i >= 0; i--) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
452 view->strides[i] = view->strides[i+1] * view->shape[i+1]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
453 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
454 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
455 /* Initialize strides for a Fortran-contiguous array. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
456 Py_LOCAL_INLINE(void) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
457 init_fortran_strides_from_shape(Py_buffer *view) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
458 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
459 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
460 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
461 assert(view->ndim > 0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
462 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
463 view->strides[0] = view->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
464 for (i = 1; i < view->ndim; i++) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
465 view->strides[i] = view->strides[i-1] * view->shape[i-1]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
466 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
467 |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
468 /* Copy src to a contiguous representation. order is one of 'C', 'F' (Fortran) |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
469 or 'A' (Any). Assumptions: src has PyBUF_FULL information, src->ndim >= 1, |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
470 len(mem) == src->len. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
471 static int |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
472 buffer_to_contiguous(char *mem, Py_buffer *src, char order) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
473 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
474 Py_buffer dest; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
475 Py_ssize_t *strides; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
476 int ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
477 |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
478 assert(src->ndim >= 1); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
479 assert(src->shape != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
480 assert(src->strides != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
481 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
482 strides = PyMem_Malloc(src->ndim * (sizeof *src->strides)); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
483 if (strides == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
484 PyErr_NoMemory(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
485 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
486 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
487 |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
488 /* initialize dest */ |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
489 dest = *src; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
490 dest.buf = mem; |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
491 /* shape is constant and shared: the logical representation of the |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
492 array is unaltered. */ |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
493 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
494 /* The physical representation determined by strides (and possibly |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
495 suboffsets) may change. */ |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
496 dest.strides = strides; |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
497 if (order == 'C' || order == 'A') { |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
498 init_strides_from_shape(&dest); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
499 } |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
500 else { |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
501 init_fortran_strides_from_shape(&dest); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
502 } |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
503 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
504 dest.suboffsets = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
505 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
506 ret = copy_buffer(&dest, src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
507 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
508 PyMem_Free(strides); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
509 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
510 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
511 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
512 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
513 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
514 /* Constructors */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
515 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
516 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
517 /* Initialize values that are shared with the managed buffer. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
518 Py_LOCAL_INLINE(void) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
519 init_shared_values(Py_buffer *dest, const Py_buffer *src) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
520 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
521 dest->obj = src->obj; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
522 dest->buf = src->buf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
523 dest->len = src->len; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
524 dest->itemsize = src->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
525 dest->readonly = src->readonly; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
526 dest->format = src->format ? src->format : "B"; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
527 dest->internal = src->internal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
528 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
529 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
530 /* Copy shape and strides. Reconstruct missing values. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
531 static void |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
532 init_shape_strides(Py_buffer *dest, const Py_buffer *src) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
533 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
534 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
535 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
536 if (src->ndim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
537 dest->shape = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
538 dest->strides = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
539 return; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
540 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
541 if (src->ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
542 dest->shape[0] = src->shape ? src->shape[0] : src->len / src->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
543 dest->strides[0] = src->strides ? src->strides[0] : src->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
544 return; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
545 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
546 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
547 for (i = 0; i < src->ndim; i++) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
548 dest->shape[i] = src->shape[i]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
549 if (src->strides) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
550 for (i = 0; i < src->ndim; i++) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
551 dest->strides[i] = src->strides[i]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
552 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
553 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
554 init_strides_from_shape(dest); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
555 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
556 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
557 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
558 Py_LOCAL_INLINE(void) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
559 init_suboffsets(Py_buffer *dest, const Py_buffer *src) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
560 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
561 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
562 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
563 if (src->suboffsets == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
564 dest->suboffsets = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
565 return; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
566 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
567 for (i = 0; i < src->ndim; i++) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
568 dest->suboffsets[i] = src->suboffsets[i]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
569 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
570 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
571 /* len = product(shape) * itemsize */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
572 Py_LOCAL_INLINE(void) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
573 init_len(Py_buffer *view) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
574 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
575 Py_ssize_t i, len; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
576 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
577 len = 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
578 for (i = 0; i < view->ndim; i++) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
579 len *= view->shape[i]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
580 len *= view->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
581 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
582 view->len = len; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
583 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
584 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
585 /* Initialize memoryview buffer properties. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
586 static void |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
587 init_flags(PyMemoryViewObject *mv) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
588 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
589 const Py_buffer *view = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
590 int flags = 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
591 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
592 switch (view->ndim) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
593 case 0: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
594 flags |= (_Py_MEMORYVIEW_SCALAR|_Py_MEMORYVIEW_C| |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
595 _Py_MEMORYVIEW_FORTRAN); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
596 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
597 case 1: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
598 if (MV_CONTIGUOUS_NDIM1(view)) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
599 flags |= (_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
600 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
601 default: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
602 if (PyBuffer_IsContiguous(view, 'C')) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
603 flags |= _Py_MEMORYVIEW_C; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
604 if (PyBuffer_IsContiguous(view, 'F')) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
605 flags |= _Py_MEMORYVIEW_FORTRAN; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
606 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
607 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
608 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
609 if (view->suboffsets) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
610 flags |= _Py_MEMORYVIEW_PIL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
611 flags &= ~(_Py_MEMORYVIEW_C|_Py_MEMORYVIEW_FORTRAN); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
612 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
613 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
614 mv->flags = flags; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
615 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
616 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
617 /* Allocate a new memoryview and perform basic initialization. New memoryviews |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
618 are exclusively created through the mbuf_add functions. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
619 Py_LOCAL_INLINE(PyMemoryViewObject *) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
620 memory_alloc(int ndim) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
621 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
622 PyMemoryViewObject *mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
623 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
624 mv = (PyMemoryViewObject *) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
625 PyObject_GC_NewVar(PyMemoryViewObject, &PyMemoryView_Type, 3*ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
626 if (mv == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
627 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
628 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
629 mv->mbuf = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
630 mv->hash = -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
631 mv->flags = 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
632 mv->exports = 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
633 mv->view.ndim = ndim; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
634 mv->view.shape = mv->ob_array; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
635 mv->view.strides = mv->ob_array + ndim; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
636 mv->view.suboffsets = mv->ob_array + 2 * ndim; |
|
77213
bc0281f85409
Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents:
75440
diff
changeset
|
637 mv->weakreflist = NULL; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
638 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
639 _PyObject_GC_TRACK(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
640 return mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
641 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
642 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
643 /* |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
644 Return a new memoryview that is registered with mbuf. If src is NULL, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
645 use mbuf->master as the underlying buffer. Otherwise, use src. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
646 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
647 The new memoryview has full buffer information: shape and strides |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
648 are always present, suboffsets as needed. Arrays are copied to |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
649 the memoryview's ob_array field. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
650 */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
651 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
652 mbuf_add_view(_PyManagedBufferObject *mbuf, const Py_buffer *src) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
653 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
654 PyMemoryViewObject *mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
655 Py_buffer *dest; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
656 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
657 if (src == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
658 src = &mbuf->master; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
659 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
660 if (src->ndim > PyBUF_MAX_NDIM) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
661 PyErr_SetString(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
662 "memoryview: number of dimensions must not exceed " |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
663 STRINGIZE(PyBUF_MAX_NDIM)); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
664 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
665 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
666 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
667 mv = memory_alloc(src->ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
668 if (mv == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
669 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
670 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
671 dest = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
672 init_shared_values(dest, src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
673 init_shape_strides(dest, src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
674 init_suboffsets(dest, src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
675 init_flags(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
676 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
677 mv->mbuf = mbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
678 Py_INCREF(mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
679 mbuf->exports++; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
680 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
681 return (PyObject *)mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
682 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
683 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
684 /* Register an incomplete view: shape, strides, suboffsets and flags still |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
685 need to be initialized. Use 'ndim' instead of src->ndim to determine the |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
686 size of the memoryview's ob_array. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
687 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
688 Assumption: ndim <= PyBUF_MAX_NDIM. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
689 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
690 mbuf_add_incomplete_view(_PyManagedBufferObject *mbuf, const Py_buffer *src, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
691 int ndim) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
692 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
693 PyMemoryViewObject *mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
694 Py_buffer *dest; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
695 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
696 if (src == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
697 src = &mbuf->master; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
698 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
699 assert(ndim <= PyBUF_MAX_NDIM); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
700 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
701 mv = memory_alloc(ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
702 if (mv == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
703 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
704 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
705 dest = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
706 init_shared_values(dest, src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
707 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
708 mv->mbuf = mbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
709 Py_INCREF(mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
710 mbuf->exports++; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
711 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
712 return (PyObject *)mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
713 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
714 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
715 /* Expose a raw memory area as a view of contiguous bytes. flags can be |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
716 PyBUF_READ or PyBUF_WRITE. view->format is set to "B" (unsigned bytes). |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
717 The memoryview has complete buffer information. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
718 PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
719 PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
720 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
721 _PyManagedBufferObject *mbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
722 PyObject *mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
723 int readonly; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
724 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
725 assert(mem != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
726 assert(flags == PyBUF_READ || flags == PyBUF_WRITE); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
727 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
728 mbuf = mbuf_alloc(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
729 if (mbuf == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
730 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
731 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
732 readonly = (flags == PyBUF_WRITE) ? 0 : 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
733 (void)PyBuffer_FillInfo(&mbuf->master, NULL, mem, size, readonly, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
734 PyBUF_FULL_RO); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
735 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
736 mv = mbuf_add_view(mbuf, NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
737 Py_DECREF(mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
738 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
739 return mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
740 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
741 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
742 /* Create a memoryview from a given Py_buffer. For simple byte views, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
743 PyMemoryView_FromMemory() should be used instead. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
744 This function is the only entry point that can create a master buffer |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
745 without full information. Because of this fact init_shape_strides() |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
746 must be able to reconstruct missing values. */ |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
747 PyObject * |
|
48770
7511f3e672a2
#3560: cleanup C memoryview API
Antoine Pitrou <solipsis@pitrou.net>
parents:
48683
diff
changeset
|
748 PyMemoryView_FromBuffer(Py_buffer *info) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
749 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
750 _PyManagedBufferObject *mbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
751 PyObject *mv; |
|
43423
0476a2cc5658
Change PyBuffer to Py_buffer to be consistent with other non-object structures like Py_complex. Add some more functionality to the memoryview object.
Travis E. Oliphant <oliphant@enthought.com>
parents:
43384
diff
changeset
|
752 |
|
68127
cbcb26a9d2bd
Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents:
67675
diff
changeset
|
753 if (info->buf == NULL) { |
|
cbcb26a9d2bd
Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents:
67675
diff
changeset
|
754 PyErr_SetString(PyExc_ValueError, |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
755 "PyMemoryView_FromBuffer(): info->buf must not be NULL"); |
|
68127
cbcb26a9d2bd
Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents:
67675
diff
changeset
|
756 return NULL; |
|
cbcb26a9d2bd
Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents:
67675
diff
changeset
|
757 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
758 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
759 mbuf = mbuf_alloc(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
760 if (mbuf == NULL) |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
761 return NULL; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
762 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
763 /* info->obj is either NULL or a borrowed reference. This reference |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
764 should not be decremented in PyBuffer_Release(). */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
765 mbuf->master = *info; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
766 mbuf->master.obj = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
767 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
768 mv = mbuf_add_view(mbuf, NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
769 Py_DECREF(mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
770 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
771 return mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
772 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
773 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
774 /* Create a memoryview from an object that implements the buffer protocol. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
775 If the object is a memoryview, the new memoryview must be registered |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
776 with the same managed buffer. Otherwise, a new managed buffer is created. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
777 PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
778 PyMemoryView_FromObject(PyObject *v) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
779 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
780 _PyManagedBufferObject *mbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
781 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
782 if (PyMemoryView_Check(v)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
783 PyMemoryViewObject *mv = (PyMemoryViewObject *)v; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
784 CHECK_RELEASED(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
785 return mbuf_add_view(mv->mbuf, &mv->view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
786 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
787 else if (PyObject_CheckBuffer(v)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
788 PyObject *ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
789 mbuf = (_PyManagedBufferObject *)_PyManagedBuffer_FromObject(v); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
790 if (mbuf == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
791 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
792 ret = mbuf_add_view(mbuf, NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
793 Py_DECREF(mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
794 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
795 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
796 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
797 PyErr_Format(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
798 "memoryview: %.200s object does not have the buffer interface", |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
799 Py_TYPE(v)->tp_name); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
800 return NULL; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
801 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
802 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
803 /* Copy the format string from a base object that might vanish. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
804 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
805 mbuf_copy_format(_PyManagedBufferObject *mbuf, const char *fmt) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
806 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
807 if (fmt != NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
808 char *cp = PyMem_Malloc(strlen(fmt)+1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
809 if (cp == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
810 PyErr_NoMemory(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
811 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
812 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
813 mbuf->master.format = strcpy(cp, fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
814 mbuf->flags |= _Py_MANAGED_BUFFER_FREE_FORMAT; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
815 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
816 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
817 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
818 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
819 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
820 /* |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
821 Return a memoryview that is based on a contiguous copy of src. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
822 Assumptions: src has PyBUF_FULL_RO information, src->ndim > 0. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
823 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
824 Ownership rules: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
825 1) As usual, the returned memoryview has a private copy |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
826 of src->shape, src->strides and src->suboffsets. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
827 2) src->format is copied to the master buffer and released |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
828 in mbuf_dealloc(). The releasebufferproc of the bytes |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
829 object is NULL, so it does not matter that mbuf_release() |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
830 passes the altered format pointer to PyBuffer_Release(). |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
831 */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
832 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
833 memory_from_contiguous_copy(Py_buffer *src, char order) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
834 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
835 _PyManagedBufferObject *mbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
836 PyMemoryViewObject *mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
837 PyObject *bytes; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
838 Py_buffer *dest; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
839 int i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
840 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
841 assert(src->ndim > 0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
842 assert(src->shape != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
843 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
844 bytes = PyBytes_FromStringAndSize(NULL, src->len); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
845 if (bytes == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
846 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
847 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
848 mbuf = (_PyManagedBufferObject *)_PyManagedBuffer_FromObject(bytes); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
849 Py_DECREF(bytes); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
850 if (mbuf == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
851 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
852 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
853 if (mbuf_copy_format(mbuf, src->format) < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
854 Py_DECREF(mbuf); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
855 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
856 } |
|
43439
79b0db0356d3
Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents:
43423
diff
changeset
|
857 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
858 mv = (PyMemoryViewObject *)mbuf_add_incomplete_view(mbuf, NULL, src->ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
859 Py_DECREF(mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
860 if (mv == NULL) |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
861 return NULL; |
|
43439
79b0db0356d3
Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents:
43423
diff
changeset
|
862 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
863 dest = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
864 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
865 /* shared values are initialized correctly except for itemsize */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
866 dest->itemsize = src->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
867 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
868 /* shape and strides */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
869 for (i = 0; i < src->ndim; i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
870 dest->shape[i] = src->shape[i]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
871 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
872 if (order == 'C' || order == 'A') { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
873 init_strides_from_shape(dest); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
874 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
875 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
876 init_fortran_strides_from_shape(dest); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
877 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
878 /* suboffsets */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
879 dest->suboffsets = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
880 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
881 /* flags */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
882 init_flags(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
883 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
884 if (copy_buffer(dest, src) < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
885 Py_DECREF(mv); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
886 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
887 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
888 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
889 return (PyObject *)mv; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
890 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
891 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
892 /* |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
893 Return a new memoryview object based on a contiguous exporter with |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
894 buffertype={PyBUF_READ, PyBUF_WRITE} and order={'C', 'F'ortran, or 'A'ny}. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
895 The logical structure of the input and output buffers is the same |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
896 (i.e. tolist(input) == tolist(output)), but the physical layout in |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
897 memory can be explicitly chosen. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
898 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
899 As usual, if buffertype=PyBUF_WRITE, the exporter's buffer must be writable, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
900 otherwise it may be writable or read-only. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
901 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
902 If the exporter is already contiguous with the desired target order, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
903 the memoryview will be directly based on the exporter. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
904 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
905 Otherwise, if the buffertype is PyBUF_READ, the memoryview will be |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
906 based on a new bytes object. If order={'C', 'A'ny}, use 'C' order, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
907 'F'ortran order otherwise. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
908 */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
909 PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
910 PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char order) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
911 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
912 PyMemoryViewObject *mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
913 PyObject *ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
914 Py_buffer *view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
915 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
916 assert(buffertype == PyBUF_READ || buffertype == PyBUF_WRITE); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
917 assert(order == 'C' || order == 'F' || order == 'A'); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
918 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
919 mv = (PyMemoryViewObject *)PyMemoryView_FromObject(obj); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
920 if (mv == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
921 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
922 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
923 view = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
924 if (buffertype == PyBUF_WRITE && view->readonly) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
925 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
926 "underlying buffer is not writable"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
927 Py_DECREF(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
928 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
929 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
930 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
931 if (PyBuffer_IsContiguous(view, order)) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
932 return (PyObject *)mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
933 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
934 if (buffertype == PyBUF_WRITE) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
935 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
936 "writable contiguous buffer requested " |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
937 "for a non-contiguous object."); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
938 Py_DECREF(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
939 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
940 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
941 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
942 ret = memory_from_contiguous_copy(view, order); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
943 Py_DECREF(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
944 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
945 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
946 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
947 |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
948 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
949 memory_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
950 { |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
951 PyObject *obj; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
952 static char *kwlist[] = {"object", NULL}; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
953 |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
954 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:memoryview", kwlist, |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
955 &obj)) { |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
956 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
957 } |
|
43793
2d8d6855a602
Fixed memoryview constructor. It allowed arbitrary keyword arguments. The bug was found by mykhal from #python. I've also added a small test case in the new test_memoryview.py
Christian Heimes <christian@cheimes.de>
parents:
43687
diff
changeset
|
958 |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
959 return PyMemoryView_FromObject(obj); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
960 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
961 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
962 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
963 /****************************************************************************/ |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
964 /* Previously in abstract.c */ |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
965 /****************************************************************************/ |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
966 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
967 typedef struct { |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
968 Py_buffer view; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
969 Py_ssize_t array[1]; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
970 } Py_buffer_full; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
971 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
972 int |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
973 PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
974 { |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
975 Py_buffer_full *fb = NULL; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
976 int ret; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
977 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
978 assert(order == 'C' || order == 'F' || order == 'A'); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
979 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
980 if (len != src->len) { |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
981 PyErr_SetString(PyExc_ValueError, |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
982 "PyBuffer_ToContiguous: len != view->len"); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
983 return -1; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
984 } |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
985 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
986 if (PyBuffer_IsContiguous(src, order)) { |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
987 memcpy((char *)buf, src->buf, len); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
988 return 0; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
989 } |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
990 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
991 /* buffer_to_contiguous() assumes PyBUF_FULL */ |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
992 fb = PyMem_Malloc(sizeof *fb + 3 * src->ndim * (sizeof *fb->array)); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
993 if (fb == NULL) { |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
994 PyErr_NoMemory(); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
995 return -1; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
996 } |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
997 fb->view.ndim = src->ndim; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
998 fb->view.shape = fb->array; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
999 fb->view.strides = fb->array + src->ndim; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1000 fb->view.suboffsets = fb->array + 2 * src->ndim; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1001 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1002 init_shared_values(&fb->view, src); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1003 init_shape_strides(&fb->view, src); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1004 init_suboffsets(&fb->view, src); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1005 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1006 src = &fb->view; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1007 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1008 ret = buffer_to_contiguous(buf, src, order); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1009 PyMem_Free(fb); |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1010 return ret; |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1011 } |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1012 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1013 |
|
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
1014 /****************************************************************************/ |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1015 /* Release/GC management */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1016 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1017 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1018 /* Inform the managed buffer that this particular memoryview will not access |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1019 the underlying buffer again. If no other memoryviews are registered with |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1020 the managed buffer, the underlying buffer is released instantly and |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1021 marked as inaccessible for both the memoryview and the managed buffer. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1022 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1023 This function fails if the memoryview itself has exported buffers. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1024 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1025 _memory_release(PyMemoryViewObject *self) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1026 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1027 if (self->flags & _Py_MEMORYVIEW_RELEASED) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1028 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1029 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1030 if (self->exports == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1031 self->flags |= _Py_MEMORYVIEW_RELEASED; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1032 assert(self->mbuf->exports > 0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1033 if (--self->mbuf->exports == 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1034 mbuf_release(self->mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1035 return 0; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1036 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1037 if (self->exports > 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1038 PyErr_Format(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1039 "memoryview has %zd exported buffer%s", self->exports, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1040 self->exports==1 ? "" : "s"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1041 return -1; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1042 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1043 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1044 Py_FatalError("_memory_release(): negative export count"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1045 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1046 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1047 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1048 static PyObject * |
|
78303
c15edc6b9b97
Add unused parameter to a METH_NOARGS function.
Stefan Krah <skrah@bytereef.org>
parents:
78301
diff
changeset
|
1049 memory_release(PyMemoryViewObject *self, PyObject *noargs) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1050 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1051 if (_memory_release(self) < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1052 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1053 Py_RETURN_NONE; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1054 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1055 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1056 static void |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1057 memory_dealloc(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1058 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1059 assert(self->exports == 0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1060 _PyObject_GC_UNTRACK(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1061 (void)_memory_release(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1062 Py_CLEAR(self->mbuf); |
|
77213
bc0281f85409
Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents:
75440
diff
changeset
|
1063 if (self->weakreflist != NULL) |
|
bc0281f85409
Issue #14930: Make memoryview objects weakrefable.
Richard Oudkerk <shibturn@gmail.com>
parents:
75440
diff
changeset
|
1064 PyObject_ClearWeakRefs((PyObject *) self); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1065 PyObject_GC_Del(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1066 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1067 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1068 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1069 memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1070 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1071 Py_VISIT(self->mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1072 return 0; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1073 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1074 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1075 static int |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1076 memory_clear(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1077 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1078 (void)_memory_release(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1079 Py_CLEAR(self->mbuf); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1080 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1081 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1082 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1083 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1084 memory_enter(PyObject *self, PyObject *args) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1085 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1086 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1087 Py_INCREF(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1088 return self; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1089 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1090 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1091 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1092 memory_exit(PyObject *self, PyObject *args) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1093 { |
|
78303
c15edc6b9b97
Add unused parameter to a METH_NOARGS function.
Stefan Krah <skrah@bytereef.org>
parents:
78301
diff
changeset
|
1094 return memory_release((PyMemoryViewObject *)self, NULL); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1095 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1096 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1097 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1098 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1099 /* Casting format and shape */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1100 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1101 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1102 #define IS_BYTE_FORMAT(f) (f == 'b' || f == 'B' || f == 'c') |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1103 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1104 Py_LOCAL_INLINE(Py_ssize_t) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1105 get_native_fmtchar(char *result, const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1106 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1107 Py_ssize_t size = -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1108 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1109 if (fmt[0] == '@') fmt++; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1110 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1111 switch (fmt[0]) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1112 case 'c': case 'b': case 'B': size = sizeof(char); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1113 case 'h': case 'H': size = sizeof(short); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1114 case 'i': case 'I': size = sizeof(int); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1115 case 'l': case 'L': size = sizeof(long); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1116 #ifdef HAVE_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1117 case 'q': case 'Q': size = sizeof(PY_LONG_LONG); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1118 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1119 case 'n': case 'N': size = sizeof(Py_ssize_t); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1120 case 'f': size = sizeof(float); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1121 case 'd': size = sizeof(double); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1122 #ifdef HAVE_C99_BOOL |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1123 case '?': size = sizeof(_Bool); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1124 #else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1125 case '?': size = sizeof(char); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1126 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1127 case 'P': size = sizeof(void *); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1128 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1129 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1130 if (size > 0 && fmt[1] == '\0') { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1131 *result = fmt[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1132 return size; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1133 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1134 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1135 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1136 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1137 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1138 /* Cast a memoryview's data type to 'format'. The input array must be |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1139 C-contiguous. At least one of input-format, output-format must have |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1140 byte size. The output array is 1-D, with the same byte length as the |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1141 input array. Thus, view->len must be a multiple of the new itemsize. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1142 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1143 cast_to_1D(PyMemoryViewObject *mv, PyObject *format) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1144 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1145 Py_buffer *view = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1146 PyObject *asciifmt; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1147 char srcchar, destchar; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1148 Py_ssize_t itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1149 int ret = -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1150 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1151 assert(view->ndim >= 1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1152 assert(Py_SIZE(mv) == 3*view->ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1153 assert(view->shape == mv->ob_array); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1154 assert(view->strides == mv->ob_array + view->ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1155 assert(view->suboffsets == mv->ob_array + 2*view->ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1156 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1157 if (get_native_fmtchar(&srcchar, view->format) < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1158 PyErr_SetString(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1159 "memoryview: source format must be a native single character " |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1160 "format prefixed with an optional '@'"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1161 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1162 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1163 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1164 asciifmt = PyUnicode_AsASCIIString(format); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1165 if (asciifmt == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1166 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1167 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1168 itemsize = get_native_fmtchar(&destchar, PyBytes_AS_STRING(asciifmt)); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1169 if (itemsize < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1170 PyErr_SetString(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1171 "memoryview: destination format must be a native single " |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1172 "character format prefixed with an optional '@'"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1173 goto out; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1174 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1175 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1176 if (!IS_BYTE_FORMAT(srcchar) && !IS_BYTE_FORMAT(destchar)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1177 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1178 "memoryview: cannot cast between two non-byte formats"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1179 goto out; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1180 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1181 if (view->len % itemsize) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1182 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1183 "memoryview: length is not a multiple of itemsize"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1184 goto out; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1185 } |
|
43439
79b0db0356d3
Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents:
43423
diff
changeset
|
1186 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1187 strncpy(mv->format, PyBytes_AS_STRING(asciifmt), |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1188 _Py_MEMORYVIEW_MAX_FORMAT); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1189 mv->format[_Py_MEMORYVIEW_MAX_FORMAT-1] = '\0'; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1190 view->format = mv->format; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1191 view->itemsize = itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1192 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1193 view->ndim = 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1194 view->shape[0] = view->len / view->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1195 view->strides[0] = view->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1196 view->suboffsets = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1197 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1198 init_flags(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1199 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1200 ret = 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1201 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1202 out: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1203 Py_DECREF(asciifmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1204 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1205 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1206 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1207 /* The memoryview must have space for 3*len(seq) elements. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1208 static Py_ssize_t |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1209 copy_shape(Py_ssize_t *shape, const PyObject *seq, Py_ssize_t ndim, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1210 Py_ssize_t itemsize) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1211 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1212 Py_ssize_t x, i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1213 Py_ssize_t len = itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1214 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1215 for (i = 0; i < ndim; i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1216 PyObject *tmp = PySequence_Fast_GET_ITEM(seq, i); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1217 if (!PyLong_Check(tmp)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1218 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1219 "memoryview.cast(): elements of shape must be integers"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1220 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1221 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1222 x = PyLong_AsSsize_t(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1223 if (x == -1 && PyErr_Occurred()) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1224 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1225 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1226 if (x <= 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1227 /* In general elements of shape may be 0, but not for casting. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1228 PyErr_Format(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1229 "memoryview.cast(): elements of shape must be integers > 0"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1230 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1231 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1232 if (x > PY_SSIZE_T_MAX / len) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1233 PyErr_Format(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1234 "memoryview.cast(): product(shape) > SSIZE_MAX"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1235 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1236 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1237 len *= x; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1238 shape[i] = x; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1239 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1240 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1241 return len; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1242 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1243 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1244 /* Cast a 1-D array to a new shape. The result array will be C-contiguous. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1245 If the result array does not have exactly the same byte length as the |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1246 input array, raise ValueError. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1247 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1248 cast_to_ND(PyMemoryViewObject *mv, const PyObject *shape, int ndim) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1249 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1250 Py_buffer *view = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1251 Py_ssize_t len; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1252 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1253 assert(view->ndim == 1); /* ndim from cast_to_1D() */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1254 assert(Py_SIZE(mv) == 3*(ndim==0?1:ndim)); /* ndim of result array */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1255 assert(view->shape == mv->ob_array); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1256 assert(view->strides == mv->ob_array + (ndim==0?1:ndim)); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1257 assert(view->suboffsets == NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1258 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1259 view->ndim = ndim; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1260 if (view->ndim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1261 view->shape = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1262 view->strides = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1263 len = view->itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1264 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1265 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1266 len = copy_shape(view->shape, shape, ndim, view->itemsize); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1267 if (len < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1268 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1269 init_strides_from_shape(view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1270 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1271 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1272 if (view->len != len) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1273 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1274 "memoryview: product(shape) * itemsize != buffer size"); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1275 return -1; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1276 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1277 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1278 init_flags(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1279 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1280 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1281 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1282 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1283 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1284 zero_in_shape(PyMemoryViewObject *mv) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1285 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1286 Py_buffer *view = &mv->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1287 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1288 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1289 for (i = 0; i < view->ndim; i++) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1290 if (view->shape[i] == 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1291 return 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1292 |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1293 return 0; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1294 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1295 |
|
43439
79b0db0356d3
Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents:
43423
diff
changeset
|
1296 /* |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1297 Cast a copy of 'self' to a different view. The input view must |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1298 be C-contiguous. The function always casts the input view to a |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1299 1-D output according to 'format'. At least one of input-format, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1300 output-format must have byte size. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1301 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1302 If 'shape' is given, the 1-D view from the previous step will |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1303 be cast to a C-contiguous view with new shape and strides. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1304 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1305 All casts must result in views that will have the exact byte |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1306 size of the original input. Otherwise, an error is raised. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1307 */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1308 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1309 memory_cast(PyMemoryViewObject *self, PyObject *args, PyObject *kwds) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1310 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1311 static char *kwlist[] = {"format", "shape", NULL}; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1312 PyMemoryViewObject *mv = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1313 PyObject *shape = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1314 PyObject *format; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1315 Py_ssize_t ndim = 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1316 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1317 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1318 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1319 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1320 &format, &shape)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1321 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1322 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1323 if (!PyUnicode_Check(format)) { |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1324 PyErr_SetString(PyExc_TypeError, |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1325 "memoryview: format argument must be a string"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1326 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1327 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1328 if (!MV_C_CONTIGUOUS(self->flags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1329 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1330 "memoryview: casts are restricted to C-contiguous views"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1331 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1332 } |
|
85939
b08e092df155
Issue #19014: memoryview.cast() is now allowed on zero-length views.
Antoine Pitrou <solipsis@pitrou.net>
parents:
82263
diff
changeset
|
1333 if ((shape || self->view.ndim != 1) && zero_in_shape(self)) { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1334 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1335 "memoryview: cannot cast view with zeros in shape or strides"); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1336 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1337 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1338 if (shape) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1339 CHECK_LIST_OR_TUPLE(shape) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1340 ndim = PySequence_Fast_GET_SIZE(shape); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1341 if (ndim > PyBUF_MAX_NDIM) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1342 PyErr_SetString(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1343 "memoryview: number of dimensions must not exceed " |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1344 STRINGIZE(PyBUF_MAX_NDIM)); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1345 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1346 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1347 if (self->view.ndim != 1 && ndim != 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1348 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1349 "memoryview: cast must be 1D -> ND or ND -> 1D"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1350 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1351 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1352 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1353 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1354 mv = (PyMemoryViewObject *) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1355 mbuf_add_incomplete_view(self->mbuf, &self->view, ndim==0 ? 1 : (int)ndim); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1356 if (mv == NULL) |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1357 return NULL; |
|
43439
79b0db0356d3
Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents:
43423
diff
changeset
|
1358 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1359 if (cast_to_1D(mv, format) < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1360 goto error; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1361 if (shape && cast_to_ND(mv, shape, (int)ndim) < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1362 goto error; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1363 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1364 return (PyObject *)mv; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1365 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1366 error: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1367 Py_DECREF(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1368 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1369 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1370 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1371 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1372 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1373 /* getbuffer */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1374 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1375 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1376 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1377 memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1378 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1379 Py_buffer *base = &self->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1380 int baseflags = self->flags; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1381 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1382 CHECK_RELEASED_INT(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1383 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1384 /* start with complete information */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1385 *view = *base; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1386 view->obj = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1387 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1388 if (REQ_WRITABLE(flags) && base->readonly) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1389 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1390 "memoryview: underlying buffer is not writable"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1391 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1392 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1393 if (!REQ_FORMAT(flags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1394 /* NULL indicates that the buffer's data type has been cast to 'B'. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1395 view->itemsize is the _previous_ itemsize. If shape is present, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1396 the equality product(shape) * itemsize = len still holds at this |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1397 point. The equality calcsize(format) = itemsize does _not_ hold |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1398 from here on! */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1399 view->format = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1400 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1401 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1402 if (REQ_C_CONTIGUOUS(flags) && !MV_C_CONTIGUOUS(baseflags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1403 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1404 "memoryview: underlying buffer is not C-contiguous"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1405 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1406 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1407 if (REQ_F_CONTIGUOUS(flags) && !MV_F_CONTIGUOUS(baseflags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1408 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1409 "memoryview: underlying buffer is not Fortran contiguous"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1410 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1411 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1412 if (REQ_ANY_CONTIGUOUS(flags) && !MV_ANY_CONTIGUOUS(baseflags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1413 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1414 "memoryview: underlying buffer is not contiguous"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1415 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1416 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1417 if (!REQ_INDIRECT(flags) && (baseflags & _Py_MEMORYVIEW_PIL)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1418 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1419 "memoryview: underlying buffer requires suboffsets"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1420 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1421 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1422 if (!REQ_STRIDES(flags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1423 if (!MV_C_CONTIGUOUS(baseflags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1424 PyErr_SetString(PyExc_BufferError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1425 "memoryview: underlying buffer is not C-contiguous"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1426 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1427 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1428 view->strides = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1429 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1430 if (!REQ_SHAPE(flags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1431 /* PyBUF_SIMPLE or PyBUF_WRITABLE: at this point buf is C-contiguous, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1432 so base->buf = ndbuf->data. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1433 if (view->format != NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1434 /* PyBUF_SIMPLE|PyBUF_FORMAT and PyBUF_WRITABLE|PyBUF_FORMAT do |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1435 not make sense. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1436 PyErr_Format(PyExc_BufferError, |
| 82263 | 1437 "memoryview: cannot cast to unsigned bytes if the format flag " |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1438 "is present"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1439 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1440 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1441 /* product(shape) * itemsize = len and calcsize(format) = itemsize |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1442 do _not_ hold from here on! */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1443 view->ndim = 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1444 view->shape = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1445 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1446 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1447 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1448 view->obj = (PyObject *)self; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1449 Py_INCREF(view->obj); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1450 self->exports++; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1451 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1452 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1453 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1454 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1455 static void |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1456 memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1457 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1458 self->exports--; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1459 return; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1460 /* PyBuffer_Release() decrements view->obj after this function returns. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1461 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1462 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1463 /* Buffer methods */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1464 static PyBufferProcs memory_as_buffer = { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1465 (getbufferproc)memory_getbuf, /* bf_getbuffer */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1466 (releasebufferproc)memory_releasebuf, /* bf_releasebuffer */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1467 }; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1468 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1469 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1470 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1471 /* Optimized pack/unpack for all native format specifiers */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1472 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1473 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1474 /* |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1475 Fix exceptions: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1476 1) Include format string in the error message. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1477 2) OverflowError -> ValueError. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1478 3) The error message from PyNumber_Index() is not ideal. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1479 */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1480 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1481 type_error_int(const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1482 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1483 PyErr_Format(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1484 "memoryview: invalid type for format '%s'", fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1485 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1486 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1487 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1488 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1489 value_error_int(const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1490 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1491 PyErr_Format(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1492 "memoryview: invalid value for format '%s'", fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1493 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1494 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1495 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1496 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1497 fix_error_int(const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1498 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1499 assert(PyErr_Occurred()); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1500 if (PyErr_ExceptionMatches(PyExc_TypeError)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1501 PyErr_Clear(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1502 return type_error_int(fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1503 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1504 else if (PyErr_ExceptionMatches(PyExc_OverflowError) || |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1505 PyErr_ExceptionMatches(PyExc_ValueError)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1506 PyErr_Clear(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1507 return value_error_int(fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1508 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1509 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1510 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1511 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1512 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1513 /* Accept integer objects or objects with an __index__() method. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1514 static long |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1515 pylong_as_ld(PyObject *item) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1516 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1517 PyObject *tmp; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1518 long ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1519 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1520 tmp = PyNumber_Index(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1521 if (tmp == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1522 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1523 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1524 ld = PyLong_AsLong(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1525 Py_DECREF(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1526 return ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1527 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1528 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1529 static unsigned long |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1530 pylong_as_lu(PyObject *item) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1531 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1532 PyObject *tmp; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1533 unsigned long lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1534 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1535 tmp = PyNumber_Index(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1536 if (tmp == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1537 return (unsigned long)-1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1538 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1539 lu = PyLong_AsUnsignedLong(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1540 Py_DECREF(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1541 return lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1542 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1543 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1544 #ifdef HAVE_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1545 static PY_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1546 pylong_as_lld(PyObject *item) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1547 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1548 PyObject *tmp; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1549 PY_LONG_LONG lld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1550 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1551 tmp = PyNumber_Index(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1552 if (tmp == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1553 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1554 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1555 lld = PyLong_AsLongLong(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1556 Py_DECREF(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1557 return lld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1558 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1559 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1560 static unsigned PY_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1561 pylong_as_llu(PyObject *item) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1562 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1563 PyObject *tmp; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1564 unsigned PY_LONG_LONG llu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1565 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1566 tmp = PyNumber_Index(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1567 if (tmp == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1568 return (unsigned PY_LONG_LONG)-1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1569 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1570 llu = PyLong_AsUnsignedLongLong(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1571 Py_DECREF(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1572 return llu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1573 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1574 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1575 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1576 static Py_ssize_t |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1577 pylong_as_zd(PyObject *item) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1578 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1579 PyObject *tmp; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1580 Py_ssize_t zd; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1581 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1582 tmp = PyNumber_Index(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1583 if (tmp == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1584 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1585 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1586 zd = PyLong_AsSsize_t(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1587 Py_DECREF(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1588 return zd; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1589 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1590 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1591 static size_t |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1592 pylong_as_zu(PyObject *item) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1593 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1594 PyObject *tmp; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1595 size_t zu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1596 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1597 tmp = PyNumber_Index(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1598 if (tmp == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1599 return (size_t)-1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1600 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1601 zu = PyLong_AsSize_t(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1602 Py_DECREF(tmp); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1603 return zu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1604 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1605 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1606 /* Timings with the ndarray from _testbuffer.c indicate that using the |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1607 struct module is around 15x slower than the two functions below. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1608 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1609 #define UNPACK_SINGLE(dest, ptr, type) \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1610 do { \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1611 type x; \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1612 memcpy((char *)&x, ptr, sizeof x); \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1613 dest = x; \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1614 } while (0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1615 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1616 /* Unpack a single item. 'fmt' can be any native format character in struct |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1617 module syntax. This function is very sensitive to small changes. With this |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1618 layout gcc automatically generates a fast jump table. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1619 Py_LOCAL_INLINE(PyObject *) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1620 unpack_single(const char *ptr, const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1621 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1622 unsigned PY_LONG_LONG llu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1623 unsigned long lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1624 size_t zu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1625 PY_LONG_LONG lld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1626 long ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1627 Py_ssize_t zd; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1628 double d; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1629 unsigned char uc; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1630 void *p; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1631 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1632 switch (fmt[0]) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1633 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1634 /* signed integers and fast path for 'B' */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1635 case 'B': uc = *((unsigned char *)ptr); goto convert_uc; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1636 case 'b': ld = *((signed char *)ptr); goto convert_ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1637 case 'h': UNPACK_SINGLE(ld, ptr, short); goto convert_ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1638 case 'i': UNPACK_SINGLE(ld, ptr, int); goto convert_ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1639 case 'l': UNPACK_SINGLE(ld, ptr, long); goto convert_ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1640 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1641 /* boolean */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1642 #ifdef HAVE_C99_BOOL |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1643 case '?': UNPACK_SINGLE(ld, ptr, _Bool); goto convert_bool; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1644 #else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1645 case '?': UNPACK_SINGLE(ld, ptr, char); goto convert_bool; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1646 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1647 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1648 /* unsigned integers */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1649 case 'H': UNPACK_SINGLE(lu, ptr, unsigned short); goto convert_lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1650 case 'I': UNPACK_SINGLE(lu, ptr, unsigned int); goto convert_lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1651 case 'L': UNPACK_SINGLE(lu, ptr, unsigned long); goto convert_lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1652 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1653 /* native 64-bit */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1654 #ifdef HAVE_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1655 case 'q': UNPACK_SINGLE(lld, ptr, PY_LONG_LONG); goto convert_lld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1656 case 'Q': UNPACK_SINGLE(llu, ptr, unsigned PY_LONG_LONG); goto convert_llu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1657 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1658 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1659 /* ssize_t and size_t */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1660 case 'n': UNPACK_SINGLE(zd, ptr, Py_ssize_t); goto convert_zd; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1661 case 'N': UNPACK_SINGLE(zu, ptr, size_t); goto convert_zu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1662 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1663 /* floats */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1664 case 'f': UNPACK_SINGLE(d, ptr, float); goto convert_double; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1665 case 'd': UNPACK_SINGLE(d, ptr, double); goto convert_double; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1666 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1667 /* bytes object */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1668 case 'c': goto convert_bytes; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1669 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1670 /* pointer */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1671 case 'P': UNPACK_SINGLE(p, ptr, void *); goto convert_pointer; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1672 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1673 /* default */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1674 default: goto err_format; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1675 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1676 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1677 convert_uc: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1678 /* PyLong_FromUnsignedLong() is slower */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1679 return PyLong_FromLong(uc); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1680 convert_ld: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1681 return PyLong_FromLong(ld); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1682 convert_lu: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1683 return PyLong_FromUnsignedLong(lu); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1684 convert_lld: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1685 return PyLong_FromLongLong(lld); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1686 convert_llu: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1687 return PyLong_FromUnsignedLongLong(llu); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1688 convert_zd: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1689 return PyLong_FromSsize_t(zd); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1690 convert_zu: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1691 return PyLong_FromSize_t(zu); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1692 convert_double: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1693 return PyFloat_FromDouble(d); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1694 convert_bool: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1695 return PyBool_FromLong(ld); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1696 convert_bytes: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1697 return PyBytes_FromStringAndSize(ptr, 1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1698 convert_pointer: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1699 return PyLong_FromVoidPtr(p); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1700 err_format: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1701 PyErr_Format(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1702 "memoryview: format %s not supported", fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1703 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1704 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1705 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1706 #define PACK_SINGLE(ptr, src, type) \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1707 do { \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1708 type x; \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1709 x = (type)src; \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1710 memcpy(ptr, (char *)&x, sizeof x); \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1711 } while (0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1712 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1713 /* Pack a single item. 'fmt' can be any native format character in |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1714 struct module syntax. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1715 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1716 pack_single(char *ptr, PyObject *item, const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1717 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1718 unsigned PY_LONG_LONG llu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1719 unsigned long lu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1720 size_t zu; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1721 PY_LONG_LONG lld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1722 long ld; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1723 Py_ssize_t zd; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1724 double d; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1725 void *p; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1726 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1727 switch (fmt[0]) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1728 /* signed integers */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1729 case 'b': case 'h': case 'i': case 'l': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1730 ld = pylong_as_ld(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1731 if (ld == -1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1732 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1733 switch (fmt[0]) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1734 case 'b': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1735 if (ld < SCHAR_MIN || ld > SCHAR_MAX) goto err_range; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1736 *((signed char *)ptr) = (signed char)ld; break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1737 case 'h': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1738 if (ld < SHRT_MIN || ld > SHRT_MAX) goto err_range; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1739 PACK_SINGLE(ptr, ld, short); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1740 case 'i': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1741 if (ld < INT_MIN || ld > INT_MAX) goto err_range; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1742 PACK_SINGLE(ptr, ld, int); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1743 default: /* 'l' */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1744 PACK_SINGLE(ptr, ld, long); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1745 } |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1746 break; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1747 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1748 /* unsigned integers */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1749 case 'B': case 'H': case 'I': case 'L': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1750 lu = pylong_as_lu(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1751 if (lu == (unsigned long)-1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1752 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1753 switch (fmt[0]) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1754 case 'B': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1755 if (lu > UCHAR_MAX) goto err_range; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1756 *((unsigned char *)ptr) = (unsigned char)lu; break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1757 case 'H': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1758 if (lu > USHRT_MAX) goto err_range; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1759 PACK_SINGLE(ptr, lu, unsigned short); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1760 case 'I': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1761 if (lu > UINT_MAX) goto err_range; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1762 PACK_SINGLE(ptr, lu, unsigned int); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1763 default: /* 'L' */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1764 PACK_SINGLE(ptr, lu, unsigned long); break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1765 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1766 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1767 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1768 /* native 64-bit */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1769 #ifdef HAVE_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1770 case 'q': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1771 lld = pylong_as_lld(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1772 if (lld == -1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1773 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1774 PACK_SINGLE(ptr, lld, PY_LONG_LONG); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1775 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1776 case 'Q': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1777 llu = pylong_as_llu(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1778 if (llu == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1779 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1780 PACK_SINGLE(ptr, llu, unsigned PY_LONG_LONG); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1781 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1782 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1783 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1784 /* ssize_t and size_t */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1785 case 'n': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1786 zd = pylong_as_zd(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1787 if (zd == -1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1788 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1789 PACK_SINGLE(ptr, zd, Py_ssize_t); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1790 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1791 case 'N': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1792 zu = pylong_as_zu(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1793 if (zu == (size_t)-1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1794 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1795 PACK_SINGLE(ptr, zu, size_t); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1796 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1797 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1798 /* floats */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1799 case 'f': case 'd': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1800 d = PyFloat_AsDouble(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1801 if (d == -1.0 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1802 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1803 if (fmt[0] == 'f') { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1804 PACK_SINGLE(ptr, d, float); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1805 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1806 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1807 PACK_SINGLE(ptr, d, double); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1808 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1809 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1810 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1811 /* bool */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1812 case '?': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1813 ld = PyObject_IsTrue(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1814 if (ld < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1815 return -1; /* preserve original error */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1816 #ifdef HAVE_C99_BOOL |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1817 PACK_SINGLE(ptr, ld, _Bool); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1818 #else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1819 PACK_SINGLE(ptr, ld, char); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1820 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1821 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1822 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1823 /* bytes object */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1824 case 'c': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1825 if (!PyBytes_Check(item)) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1826 return type_error_int(fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1827 if (PyBytes_GET_SIZE(item) != 1) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1828 return value_error_int(fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1829 *ptr = PyBytes_AS_STRING(item)[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1830 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1831 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1832 /* pointer */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1833 case 'P': |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1834 p = PyLong_AsVoidPtr(item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1835 if (p == NULL && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1836 goto err_occurred; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1837 PACK_SINGLE(ptr, p, void *); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1838 break; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1839 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1840 /* default */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1841 default: goto err_format; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1842 } |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1843 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1844 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1845 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1846 err_occurred: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1847 return fix_error_int(fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1848 err_range: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1849 return value_error_int(fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1850 err_format: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1851 PyErr_Format(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1852 "memoryview: format %s not supported", fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1853 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1854 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1855 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1856 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1857 /****************************************************************************/ |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1858 /* unpack using the struct module */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1859 /****************************************************************************/ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1860 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1861 /* For reasonable performance it is necessary to cache all objects required |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1862 for unpacking. An unpacker can handle the format passed to unpack_from(). |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1863 Invariant: All pointer fields of the struct should either be NULL or valid |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1864 pointers. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1865 struct unpacker { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1866 PyObject *unpack_from; /* Struct.unpack_from(format) */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1867 PyObject *mview; /* cached memoryview */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1868 char *item; /* buffer for mview */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1869 Py_ssize_t itemsize; /* len(item) */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1870 }; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1871 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1872 static struct unpacker * |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1873 unpacker_new(void) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1874 { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1875 struct unpacker *x = PyMem_Malloc(sizeof *x); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1876 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1877 if (x == NULL) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1878 PyErr_NoMemory(); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1879 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
1880 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
1881 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1882 x->unpack_from = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1883 x->mview = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1884 x->item = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1885 x->itemsize = 0; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1886 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1887 return x; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1888 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1889 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1890 static void |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1891 unpacker_free(struct unpacker *x) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1892 { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1893 if (x) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1894 Py_XDECREF(x->unpack_from); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1895 Py_XDECREF(x->mview); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1896 PyMem_Free(x->item); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1897 PyMem_Free(x); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1898 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1899 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1900 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1901 /* Return a new unpacker for the given format. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1902 static struct unpacker * |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1903 struct_get_unpacker(const char *fmt, Py_ssize_t itemsize) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1904 { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1905 PyObject *structmodule; /* XXX cache these two */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1906 PyObject *Struct = NULL; /* XXX in globals? */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1907 PyObject *structobj = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1908 PyObject *format = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1909 struct unpacker *x = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1910 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1911 structmodule = PyImport_ImportModule("struct"); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1912 if (structmodule == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1913 return NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1914 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1915 Struct = PyObject_GetAttrString(structmodule, "Struct"); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1916 Py_DECREF(structmodule); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1917 if (Struct == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1918 return NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1919 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1920 x = unpacker_new(); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1921 if (x == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1922 goto error; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1923 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1924 format = PyBytes_FromString(fmt); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1925 if (format == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1926 goto error; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1927 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1928 structobj = PyObject_CallFunctionObjArgs(Struct, format, NULL); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1929 if (structobj == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1930 goto error; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1931 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1932 x->unpack_from = PyObject_GetAttrString(structobj, "unpack_from"); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1933 if (x->unpack_from == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1934 goto error; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1935 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1936 x->item = PyMem_Malloc(itemsize); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1937 if (x->item == NULL) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1938 PyErr_NoMemory(); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1939 goto error; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1940 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1941 x->itemsize = itemsize; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1942 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1943 x->mview = PyMemoryView_FromMemory(x->item, itemsize, PyBUF_WRITE); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1944 if (x->mview == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1945 goto error; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1946 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1947 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1948 out: |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1949 Py_XDECREF(Struct); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1950 Py_XDECREF(format); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1951 Py_XDECREF(structobj); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1952 return x; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1953 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1954 error: |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1955 unpacker_free(x); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1956 x = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1957 goto out; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1958 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1959 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1960 /* unpack a single item */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1961 static PyObject * |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1962 struct_unpack_single(const char *ptr, struct unpacker *x) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1963 { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1964 PyObject *v; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1965 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1966 memcpy(x->item, ptr, x->itemsize); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1967 v = PyObject_CallFunctionObjArgs(x->unpack_from, x->mview, NULL); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1968 if (v == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1969 return NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1970 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1971 if (PyTuple_GET_SIZE(v) == 1) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1972 PyObject *tmp = PyTuple_GET_ITEM(v, 0); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1973 Py_INCREF(tmp); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1974 Py_DECREF(v); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1975 return tmp; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1976 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1977 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1978 return v; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1979 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1980 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1981 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
1982 /****************************************************************************/ |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1983 /* Representations */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1984 /****************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1985 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1986 /* allow explicit form of native format */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1987 Py_LOCAL_INLINE(const char *) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1988 adjust_fmt(const Py_buffer *view) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1989 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1990 const char *fmt; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1991 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1992 fmt = (view->format[0] == '@') ? view->format+1 : view->format; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1993 if (fmt[0] && fmt[1] == '\0') |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1994 return fmt; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1995 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1996 PyErr_Format(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1997 "memoryview: unsupported format %s", view->format); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1998 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
1999 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2000 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2001 /* Base case for multi-dimensional unpacking. Assumption: ndim == 1. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2002 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2003 tolist_base(const char *ptr, const Py_ssize_t *shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2004 const Py_ssize_t *strides, const Py_ssize_t *suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2005 const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2006 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2007 PyObject *lst, *item; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2008 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2009 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2010 lst = PyList_New(shape[0]); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2011 if (lst == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2012 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2013 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2014 for (i = 0; i < shape[0]; ptr+=strides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2015 const char *xptr = ADJUST_PTR(ptr, suboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2016 item = unpack_single(xptr, fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2017 if (item == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2018 Py_DECREF(lst); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2019 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2020 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2021 PyList_SET_ITEM(lst, i, item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2022 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2023 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2024 return lst; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2025 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2026 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2027 /* Unpack a multi-dimensional array into a nested list. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2028 Assumption: ndim >= 1. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2029 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2030 tolist_rec(const char *ptr, Py_ssize_t ndim, const Py_ssize_t *shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2031 const Py_ssize_t *strides, const Py_ssize_t *suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2032 const char *fmt) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2033 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2034 PyObject *lst, *item; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2035 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2036 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2037 assert(ndim >= 1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2038 assert(shape != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2039 assert(strides != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2040 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2041 if (ndim == 1) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2042 return tolist_base(ptr, shape, strides, suboffsets, fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2043 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2044 lst = PyList_New(shape[0]); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2045 if (lst == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2046 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2047 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2048 for (i = 0; i < shape[0]; ptr+=strides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2049 const char *xptr = ADJUST_PTR(ptr, suboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2050 item = tolist_rec(xptr, ndim-1, shape+1, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2051 strides+1, suboffsets ? suboffsets+1 : NULL, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2052 fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2053 if (item == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2054 Py_DECREF(lst); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2055 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2056 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2057 PyList_SET_ITEM(lst, i, item); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2058 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2059 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2060 return lst; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2061 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2062 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2063 /* Return a list representation of the memoryview. Currently only buffers |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2064 with native format strings are supported. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2065 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2066 memory_tolist(PyMemoryViewObject *mv, PyObject *noargs) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2067 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2068 const Py_buffer *view = &(mv->view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2069 const char *fmt; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2070 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2071 CHECK_RELEASED(mv); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2072 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2073 fmt = adjust_fmt(view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2074 if (fmt == NULL) |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2075 return NULL; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2076 if (view->ndim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2077 return unpack_single(view->buf, fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2078 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2079 else if (view->ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2080 return tolist_base(view->buf, view->shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2081 view->strides, view->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2082 fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2083 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2084 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2085 return tolist_rec(view->buf, view->ndim, view->shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2086 view->strides, view->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2087 fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2088 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2089 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2090 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2091 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2092 memory_tobytes(PyMemoryViewObject *self, PyObject *dummy) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2093 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2094 Py_buffer *src = VIEW_ADDR(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2095 PyObject *bytes = NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2096 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2097 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2098 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2099 if (MV_C_CONTIGUOUS(self->flags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2100 return PyBytes_FromStringAndSize(src->buf, src->len); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2101 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2102 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2103 bytes = PyBytes_FromStringAndSize(NULL, src->len); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2104 if (bytes == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2105 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2106 |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
2107 if (buffer_to_contiguous(PyBytes_AS_STRING(bytes), src, 'C') < 0) { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2108 Py_DECREF(bytes); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2109 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2110 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2111 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2112 return bytes; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2113 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2114 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2115 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2116 memory_repr(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2117 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2118 if (self->flags & _Py_MEMORYVIEW_RELEASED) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2119 return PyUnicode_FromFormat("<released memory at %p>", self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2120 else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2121 return PyUnicode_FromFormat("<memory at %p>", self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2122 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2123 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2124 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2125 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2126 /* Indexing and slicing */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2127 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2128 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2129 /* Get the pointer to the item at index. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2130 static char * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2131 ptr_from_index(Py_buffer *view, Py_ssize_t index) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2132 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2133 char *ptr; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2134 Py_ssize_t nitems; /* items in the first dimension */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2135 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2136 assert(view->shape); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2137 assert(view->strides); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2138 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2139 nitems = view->shape[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2140 if (index < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2141 index += nitems; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2142 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2143 if (index < 0 || index >= nitems) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2144 PyErr_SetString(PyExc_IndexError, "index out of bounds"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2145 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2146 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2147 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2148 ptr = (char *)view->buf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2149 ptr += view->strides[0] * index; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2150 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2151 ptr = ADJUST_PTR(ptr, view->suboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2152 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2153 return ptr; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2154 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2155 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2156 /* Return the item at index. In a one-dimensional view, this is an object |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2157 with the type specified by view->format. Otherwise, the item is a sub-view. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2158 The function is used in memory_subscript() and memory_as_sequence. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2159 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2160 memory_item(PyMemoryViewObject *self, Py_ssize_t index) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2161 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2162 Py_buffer *view = &(self->view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2163 const char *fmt; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2164 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2165 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2166 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2167 fmt = adjust_fmt(view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2168 if (fmt == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2169 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2170 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2171 if (view->ndim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2172 PyErr_SetString(PyExc_TypeError, "invalid indexing of 0-dim memory"); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2173 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2174 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2175 if (view->ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2176 char *ptr = ptr_from_index(view, index); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2177 if (ptr == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2178 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2179 return unpack_single(ptr, fmt); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2180 } |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2181 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2182 PyErr_SetString(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2183 "multi-dimensional sub-views are not implemented"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2184 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2185 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2186 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2187 Py_LOCAL_INLINE(int) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2188 init_slice(Py_buffer *base, PyObject *key, int dim) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2189 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2190 Py_ssize_t start, stop, step, slicelength; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2191 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2192 if (PySlice_GetIndicesEx(key, base->shape[dim], |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2193 &start, &stop, &step, &slicelength) < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2194 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2195 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2196 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2197 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2198 if (base->suboffsets == NULL || dim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2199 adjust_buf: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2200 base->buf = (char *)base->buf + base->strides[dim] * start; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2201 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2202 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2203 Py_ssize_t n = dim-1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2204 while (n >= 0 && base->suboffsets[n] < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2205 n--; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2206 if (n < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2207 goto adjust_buf; /* all suboffsets are negative */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2208 base->suboffsets[n] = base->suboffsets[n] + base->strides[dim] * start; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2209 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2210 base->shape[dim] = slicelength; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2211 base->strides[dim] = base->strides[dim] * step; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2212 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2213 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2214 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2215 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2216 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2217 is_multislice(PyObject *key) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2218 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2219 Py_ssize_t size, i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2220 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2221 if (!PyTuple_Check(key)) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2222 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2223 size = PyTuple_GET_SIZE(key); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2224 if (size == 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2225 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2226 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2227 for (i = 0; i < size; i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2228 PyObject *x = PyTuple_GET_ITEM(key, i); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2229 if (!PySlice_Check(x)) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2230 return 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2231 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2232 return 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2233 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2234 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2235 /* mv[obj] returns an object holding the data for one element if obj |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2236 fully indexes the memoryview or another memoryview object if it |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2237 does not. |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2238 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2239 0-d memoryview objects can be referenced using mv[...] or mv[()] |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2240 but not with anything else. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2241 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2242 memory_subscript(PyMemoryViewObject *self, PyObject *key) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2243 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2244 Py_buffer *view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2245 view = &(self->view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2246 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2247 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2248 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2249 if (view->ndim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2250 if (PyTuple_Check(key) && PyTuple_GET_SIZE(key) == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2251 const char *fmt = adjust_fmt(view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2252 if (fmt == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2253 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2254 return unpack_single(view->buf, fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2255 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2256 else if (key == Py_Ellipsis) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2257 Py_INCREF(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2258 return (PyObject *)self; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2259 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2260 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2261 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2262 "invalid indexing of 0-dim memory"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2263 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2264 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2265 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2266 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2267 if (PyIndex_Check(key)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2268 Py_ssize_t index; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2269 index = PyNumber_AsSsize_t(key, PyExc_IndexError); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2270 if (index == -1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2271 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2272 return memory_item(self, index); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2273 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2274 else if (PySlice_Check(key)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2275 PyMemoryViewObject *sliced; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2276 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2277 sliced = (PyMemoryViewObject *)mbuf_add_view(self->mbuf, view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2278 if (sliced == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2279 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2280 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2281 if (init_slice(&sliced->view, key, 0) < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2282 Py_DECREF(sliced); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2283 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2284 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2285 init_len(&sliced->view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2286 init_flags(sliced); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2287 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2288 return (PyObject *)sliced; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2289 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2290 else if (is_multislice(key)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2291 PyErr_SetString(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2292 "multi-dimensional slicing is not implemented"); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2293 return NULL; |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2294 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2295 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2296 PyErr_SetString(PyExc_TypeError, "memoryview: invalid slice key"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2297 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2298 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2299 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2300 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2301 memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2302 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2303 Py_buffer *view = &(self->view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2304 Py_buffer src; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2305 const char *fmt; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2306 char *ptr; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2307 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2308 CHECK_RELEASED_INT(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2309 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2310 fmt = adjust_fmt(view); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2311 if (fmt == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2312 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2313 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2314 if (view->readonly) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2315 PyErr_SetString(PyExc_TypeError, "cannot modify read-only memory"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2316 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2317 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2318 if (value == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2319 PyErr_SetString(PyExc_TypeError, "cannot delete memory"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2320 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2321 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2322 if (view->ndim == 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2323 if (key == Py_Ellipsis || |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2324 (PyTuple_Check(key) && PyTuple_GET_SIZE(key)==0)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2325 ptr = (char *)view->buf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2326 return pack_single(ptr, value, fmt); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2327 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2328 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2329 PyErr_SetString(PyExc_TypeError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2330 "invalid indexing of 0-dim memory"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2331 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2332 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2333 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2334 if (view->ndim != 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2335 PyErr_SetString(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2336 "memoryview assignments are currently restricted to ndim = 1"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2337 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2338 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2339 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2340 if (PyIndex_Check(key)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2341 Py_ssize_t index = PyNumber_AsSsize_t(key, PyExc_IndexError); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2342 if (index == -1 && PyErr_Occurred()) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2343 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2344 ptr = ptr_from_index(view, index); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2345 if (ptr == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2346 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2347 return pack_single(ptr, value, fmt); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2348 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2349 /* one-dimensional: fast path */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2350 if (PySlice_Check(key) && view->ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2351 Py_buffer dest; /* sliced view */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2352 Py_ssize_t arrays[3]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2353 int ret = -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2354 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2355 /* rvalue must be an exporter */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2356 if (PyObject_GetBuffer(value, &src, PyBUF_FULL_RO) < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2357 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2358 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2359 dest = *view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2360 dest.shape = &arrays[0]; dest.shape[0] = view->shape[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2361 dest.strides = &arrays[1]; dest.strides[0] = view->strides[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2362 if (view->suboffsets) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2363 dest.suboffsets = &arrays[2]; dest.suboffsets[0] = view->suboffsets[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2364 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2365 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2366 if (init_slice(&dest, key, 0) < 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2367 goto end_block; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2368 dest.len = dest.shape[0] * dest.itemsize; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2369 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2370 ret = copy_single(&dest, &src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2371 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2372 end_block: |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2373 PyBuffer_Release(&src); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2374 return ret; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2375 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2376 else if (PySlice_Check(key) || is_multislice(key)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2377 /* Call memory_subscript() to produce a sliced lvalue, then copy |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2378 rvalue into lvalue. This is already implemented in _testbuffer.c. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2379 PyErr_SetString(PyExc_NotImplementedError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2380 "memoryview slice assignments are currently restricted " |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2381 "to ndim = 1"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2382 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2383 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2384 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2385 PyErr_SetString(PyExc_TypeError, "memoryview: invalid slice key"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2386 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2387 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2388 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2389 static Py_ssize_t |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2390 memory_length(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2391 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2392 CHECK_RELEASED_INT(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2393 return self->view.ndim == 0 ? 1 : self->view.shape[0]; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2394 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2395 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2396 /* As mapping */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2397 static PyMappingMethods memory_as_mapping = { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2398 (lenfunc)memory_length, /* mp_length */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2399 (binaryfunc)memory_subscript, /* mp_subscript */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2400 (objobjargproc)memory_ass_sub, /* mp_ass_subscript */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2401 }; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2402 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2403 /* As sequence */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2404 static PySequenceMethods memory_as_sequence = { |
|
85923
0dc604d58949
Close #19078: memoryview now supports reversed
Nick Coghlan <ncoghlan@gmail.com>
parents:
82263
diff
changeset
|
2405 (lenfunc)memory_length, /* sq_length */ |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2406 0, /* sq_concat */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2407 0, /* sq_repeat */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2408 (ssizeargfunc)memory_item, /* sq_item */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2409 }; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2410 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2411 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2412 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2413 /* Comparisons */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2414 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2415 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2416 #define MV_COMPARE_EX -1 /* exception */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2417 #define MV_COMPARE_NOT_IMPL -2 /* not implemented */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2418 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2419 /* Translate a StructError to "not equal". Preserve other exceptions. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2420 static int |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2421 fix_struct_error_int(void) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2422 { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2423 assert(PyErr_Occurred()); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2424 /* XXX Cannot get at StructError directly? */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2425 if (PyErr_ExceptionMatches(PyExc_ImportError) || |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2426 PyErr_ExceptionMatches(PyExc_MemoryError)) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2427 return MV_COMPARE_EX; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2428 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2429 /* StructError: invalid or unknown format -> not equal */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2430 PyErr_Clear(); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2431 return 0; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2432 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2433 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2434 /* Unpack and compare single items of p and q using the struct module. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2435 static int |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2436 struct_unpack_cmp(const char *p, const char *q, |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2437 struct unpacker *unpack_p, struct unpacker *unpack_q) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2438 { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2439 PyObject *v, *w; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2440 int ret; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2441 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2442 /* At this point any exception from the struct module should not be |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2443 StructError, since both formats have been accepted already. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2444 v = struct_unpack_single(p, unpack_p); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2445 if (v == NULL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2446 return MV_COMPARE_EX; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2447 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2448 w = struct_unpack_single(q, unpack_q); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2449 if (w == NULL) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2450 Py_DECREF(v); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2451 return MV_COMPARE_EX; |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2452 } |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2453 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2454 /* MV_COMPARE_EX == -1: exceptions are preserved */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2455 ret = PyObject_RichCompareBool(v, w, Py_EQ); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2456 Py_DECREF(v); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2457 Py_DECREF(w); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2458 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2459 return ret; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2460 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2461 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2462 /* Unpack and compare single items of p and q. If both p and q have the same |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2463 single element native format, the comparison uses a fast path (gcc creates |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2464 a jump table and converts memcpy into simple assignments on x86/x64). |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2465 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2466 Otherwise, the comparison is delegated to the struct module, which is |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2467 30-60x slower. */ |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2468 #define CMP_SINGLE(p, q, type) \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2469 do { \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2470 type x; \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2471 type y; \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2472 memcpy((char *)&x, p, sizeof x); \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2473 memcpy((char *)&y, q, sizeof y); \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2474 equal = (x == y); \ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2475 } while (0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2476 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2477 Py_LOCAL_INLINE(int) |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2478 unpack_cmp(const char *p, const char *q, char fmt, |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2479 struct unpacker *unpack_p, struct unpacker *unpack_q) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2480 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2481 int equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2482 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2483 switch (fmt) { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2484 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2485 /* signed integers and fast path for 'B' */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2486 case 'B': return *((unsigned char *)p) == *((unsigned char *)q); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2487 case 'b': return *((signed char *)p) == *((signed char *)q); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2488 case 'h': CMP_SINGLE(p, q, short); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2489 case 'i': CMP_SINGLE(p, q, int); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2490 case 'l': CMP_SINGLE(p, q, long); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2491 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2492 /* boolean */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2493 #ifdef HAVE_C99_BOOL |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2494 case '?': CMP_SINGLE(p, q, _Bool); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2495 #else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2496 case '?': CMP_SINGLE(p, q, char); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2497 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2498 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2499 /* unsigned integers */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2500 case 'H': CMP_SINGLE(p, q, unsigned short); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2501 case 'I': CMP_SINGLE(p, q, unsigned int); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2502 case 'L': CMP_SINGLE(p, q, unsigned long); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2503 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2504 /* native 64-bit */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2505 #ifdef HAVE_LONG_LONG |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2506 case 'q': CMP_SINGLE(p, q, PY_LONG_LONG); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2507 case 'Q': CMP_SINGLE(p, q, unsigned PY_LONG_LONG); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2508 #endif |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2509 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2510 /* ssize_t and size_t */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2511 case 'n': CMP_SINGLE(p, q, Py_ssize_t); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2512 case 'N': CMP_SINGLE(p, q, size_t); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2513 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2514 /* floats */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2515 /* XXX DBL_EPSILON? */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2516 case 'f': CMP_SINGLE(p, q, float); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2517 case 'd': CMP_SINGLE(p, q, double); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2518 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2519 /* bytes object */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2520 case 'c': return *p == *q; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2521 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2522 /* pointer */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2523 case 'P': CMP_SINGLE(p, q, void *); return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2524 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2525 /* use the struct module */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2526 case '_': |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2527 assert(unpack_p); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2528 assert(unpack_q); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2529 return struct_unpack_cmp(p, q, unpack_p, unpack_q); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2530 } |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2531 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2532 /* NOT REACHED */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2533 PyErr_SetString(PyExc_RuntimeError, |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2534 "memoryview: internal error in richcompare"); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2535 return MV_COMPARE_EX; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2536 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2537 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2538 /* Base case for recursive array comparisons. Assumption: ndim == 1. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2539 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2540 cmp_base(const char *p, const char *q, const Py_ssize_t *shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2541 const Py_ssize_t *pstrides, const Py_ssize_t *psuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2542 const Py_ssize_t *qstrides, const Py_ssize_t *qsuboffsets, |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2543 char fmt, struct unpacker *unpack_p, struct unpacker *unpack_q) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2544 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2545 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2546 int equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2547 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2548 for (i = 0; i < shape[0]; p+=pstrides[0], q+=qstrides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2549 const char *xp = ADJUST_PTR(p, psuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2550 const char *xq = ADJUST_PTR(q, qsuboffsets); |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2551 equal = unpack_cmp(xp, xq, fmt, unpack_p, unpack_q); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2552 if (equal <= 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2553 return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2554 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2555 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2556 return 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2557 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2558 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2559 /* Recursively compare two multi-dimensional arrays that have the same |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2560 logical structure. Assumption: ndim >= 1. */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2561 static int |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2562 cmp_rec(const char *p, const char *q, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2563 Py_ssize_t ndim, const Py_ssize_t *shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2564 const Py_ssize_t *pstrides, const Py_ssize_t *psuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2565 const Py_ssize_t *qstrides, const Py_ssize_t *qsuboffsets, |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2566 char fmt, struct unpacker *unpack_p, struct unpacker *unpack_q) |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2567 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2568 Py_ssize_t i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2569 int equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2570 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2571 assert(ndim >= 1); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2572 assert(shape != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2573 assert(pstrides != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2574 assert(qstrides != NULL); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2575 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2576 if (ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2577 return cmp_base(p, q, shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2578 pstrides, psuboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2579 qstrides, qsuboffsets, |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2580 fmt, unpack_p, unpack_q); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2581 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2582 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2583 for (i = 0; i < shape[0]; p+=pstrides[0], q+=qstrides[0], i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2584 const char *xp = ADJUST_PTR(p, psuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2585 const char *xq = ADJUST_PTR(q, qsuboffsets); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2586 equal = cmp_rec(xp, xq, ndim-1, shape+1, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2587 pstrides+1, psuboffsets ? psuboffsets+1 : NULL, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2588 qstrides+1, qsuboffsets ? qsuboffsets+1 : NULL, |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2589 fmt, unpack_p, unpack_q); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2590 if (equal <= 0) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2591 return equal; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2592 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2593 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2594 return 1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2595 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2596 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2597 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2598 memory_richcompare(PyObject *v, PyObject *w, int op) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2599 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2600 PyObject *res; |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2601 Py_buffer wbuf, *vv; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2602 Py_buffer *ww = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2603 struct unpacker *unpack_v = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2604 struct unpacker *unpack_w = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2605 char vfmt, wfmt; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2606 int equal = MV_COMPARE_NOT_IMPL; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2607 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2608 if (op != Py_EQ && op != Py_NE) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2609 goto result; /* Py_NotImplemented */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2610 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2611 assert(PyMemoryView_Check(v)); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2612 if (BASE_INACCESSIBLE(v)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2613 equal = (v == w); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2614 goto result; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2615 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2616 vv = VIEW_ADDR(v); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2617 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2618 if (PyMemoryView_Check(w)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2619 if (BASE_INACCESSIBLE(w)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2620 equal = (v == w); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2621 goto result; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2622 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2623 ww = VIEW_ADDR(w); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2624 } |
|
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2625 else { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2626 if (PyObject_GetBuffer(w, &wbuf, PyBUF_FULL_RO) < 0) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2627 PyErr_Clear(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2628 goto result; /* Py_NotImplemented */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2629 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2630 ww = &wbuf; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2631 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2632 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2633 if (!equiv_shape(vv, ww)) { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2634 PyErr_Clear(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2635 equal = 0; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2636 goto result; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2637 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2638 |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2639 /* Use fast unpacking for identical primitive C type formats. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2640 if (get_native_fmtchar(&vfmt, vv->format) < 0) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2641 vfmt = '_'; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2642 if (get_native_fmtchar(&wfmt, ww->format) < 0) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2643 wfmt = '_'; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2644 if (vfmt == '_' || wfmt == '_' || vfmt != wfmt) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2645 /* Use struct module unpacking. NOTE: Even for equal format strings, |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2646 memcmp() cannot be used for item comparison since it would give |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2647 incorrect results in the case of NaNs or uninitialized padding |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2648 bytes. */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2649 vfmt = '_'; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2650 unpack_v = struct_get_unpacker(vv->format, vv->itemsize); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2651 if (unpack_v == NULL) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2652 equal = fix_struct_error_int(); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2653 goto result; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2654 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2655 unpack_w = struct_get_unpacker(ww->format, ww->itemsize); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2656 if (unpack_w == NULL) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2657 equal = fix_struct_error_int(); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2658 goto result; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2659 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2660 } |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2661 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2662 if (vv->ndim == 0) { |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2663 equal = unpack_cmp(vv->buf, ww->buf, |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2664 vfmt, unpack_v, unpack_w); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2665 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2666 else if (vv->ndim == 1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2667 equal = cmp_base(vv->buf, ww->buf, vv->shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2668 vv->strides, vv->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2669 ww->strides, ww->suboffsets, |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2670 vfmt, unpack_v, unpack_w); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2671 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2672 else { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2673 equal = cmp_rec(vv->buf, ww->buf, vv->ndim, vv->shape, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2674 vv->strides, vv->suboffsets, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2675 ww->strides, ww->suboffsets, |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2676 vfmt, unpack_v, unpack_w); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2677 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2678 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2679 result: |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2680 if (equal < 0) { |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2681 if (equal == MV_COMPARE_NOT_IMPL) |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2682 res = Py_NotImplemented; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2683 else /* exception */ |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2684 res = NULL; |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2685 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2686 else if ((equal && op == Py_EQ) || (!equal && op == Py_NE)) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2687 res = Py_True; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2688 else |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2689 res = Py_False; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2690 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2691 if (ww == &wbuf) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2692 PyBuffer_Release(ww); |
|
78760
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2693 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2694 unpacker_free(unpack_v); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2695 unpacker_free(unpack_w); |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2696 |
|
afa3dedfee18
Close #15573: use value-based memoryview comparisons (patch by Stefan Krah)
Nick Coghlan <ncoghlan@gmail.com>
parents:
78303
diff
changeset
|
2697 Py_XINCREF(res); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2698 return res; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2699 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2700 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2701 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2702 /* Hash */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2703 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2704 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2705 static Py_hash_t |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2706 memory_hash(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2707 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2708 if (self->hash == -1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2709 Py_buffer *view = &self->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2710 char *mem = view->buf; |
|
80182
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2711 Py_ssize_t ret; |
|
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2712 char fmt; |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2713 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2714 CHECK_RELEASED_INT(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2715 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2716 if (!view->readonly) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2717 PyErr_SetString(PyExc_ValueError, |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2718 "cannot hash writable memoryview object"); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2719 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2720 } |
|
80182
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2721 ret = get_native_fmtchar(&fmt, view->format); |
|
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2722 if (ret < 0 || !IS_BYTE_FORMAT(fmt)) { |
|
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2723 PyErr_SetString(PyExc_ValueError, |
|
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2724 "memoryview: hashing is restricted to formats 'B', 'b' or 'c'"); |
|
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2725 return -1; |
|
969069d464bc
Issue #15814: Use hash function that is compatible with the equality
Stefan Krah <skrah@bytereef.org>
parents:
78850
diff
changeset
|
2726 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2727 if (view->obj != NULL && PyObject_Hash(view->obj) == -1) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2728 /* Keep the original error message */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2729 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2730 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2731 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2732 if (!MV_C_CONTIGUOUS(self->flags)) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2733 mem = PyMem_Malloc(view->len); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2734 if (mem == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2735 PyErr_NoMemory(); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2736 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2737 } |
|
78301
8fbbc7c8748e
Issue #12834: Fix PyBuffer_ToContiguous() for non-contiguous arrays.
Stefan Krah <skrah@bytereef.org>
parents:
77213
diff
changeset
|
2738 if (buffer_to_contiguous(mem, view, 'C') < 0) { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2739 PyMem_Free(mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2740 return -1; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2741 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2742 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2743 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2744 /* Can't fail */ |
|
87288
adb471b9cba1
ssue #19183: Implement PEP 456 'secure and interchangeable hash algorithm'.
Christian Heimes <christian@cheimes.de>
parents:
85940
diff
changeset
|
2745 self->hash = _Py_HashBytes(mem, view->len); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2746 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2747 if (mem != view->buf) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2748 PyMem_Free(mem); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2749 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2750 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2751 return self->hash; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2752 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2753 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2754 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2755 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2756 /* getters */ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2757 /**************************************************************************/ |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2758 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2759 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2760 _IntTupleFromSsizet(int len, Py_ssize_t *vals) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2761 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2762 int i; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2763 PyObject *o; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2764 PyObject *intTuple; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2765 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2766 if (vals == NULL) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2767 return PyTuple_New(0); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2768 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2769 intTuple = PyTuple_New(len); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2770 if (!intTuple) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2771 return NULL; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2772 for (i=0; i<len; i++) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2773 o = PyLong_FromSsize_t(vals[i]); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2774 if (!o) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2775 Py_DECREF(intTuple); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2776 return NULL; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2777 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2778 PyTuple_SET_ITEM(intTuple, i, o); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2779 } |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2780 return intTuple; |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2781 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2782 |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2783 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2784 memory_obj_get(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2785 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2786 Py_buffer *view = &self->view; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2787 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2788 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2789 if (view->obj == NULL) { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2790 Py_RETURN_NONE; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2791 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2792 Py_INCREF(view->obj); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2793 return view->obj; |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2794 } |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2795 |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2796 static PyObject * |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2797 memory_nbytes_get(PyMemoryViewObject *self) |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2798 { |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2799 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2800 return PyLong_FromSsize_t(self->view.len); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2801 } |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2802 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2803 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2804 memory_format_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2805 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2806 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2807 return PyUnicode_FromString(self->view.format); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2808 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2809 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2810 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2811 memory_itemsize_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2812 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2813 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2814 return PyLong_FromSsize_t(self->view.itemsize); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2815 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2816 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2817 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2818 memory_shape_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2819 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2820 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2821 return _IntTupleFromSsizet(self->view.ndim, self->view.shape); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2822 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2823 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2824 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2825 memory_strides_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2826 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2827 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2828 return _IntTupleFromSsizet(self->view.ndim, self->view.strides); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2829 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2830 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2831 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2832 memory_suboffsets_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2833 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2834 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2835 return _IntTupleFromSsizet(self->view.ndim, self->view.suboffsets); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2836 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2837 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2838 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2839 memory_readonly_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2840 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2841 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2842 return PyBool_FromLong(self->view.readonly); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2843 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2844 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2845 static PyObject * |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2846 memory_ndim_get(PyMemoryViewObject *self) |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2847 { |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2848 CHECK_RELEASED(self); |
|
50501
de2771070d85
Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
50490
diff
changeset
|
2849 return PyLong_FromLong(self->view.ndim); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2850 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2851 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2852 static PyObject * |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2853 memory_c_contiguous(PyMemoryViewObject *self, PyObject *dummy) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2854 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2855 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2856 return PyBool_FromLong(MV_C_CONTIGUOUS(self->flags)); |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2857 } |
|
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2858 |
|
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2859 static PyObject * |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2860 memory_f_contiguous(PyMemoryViewObject *self, PyObject *dummy) |
|
64584
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2861 { |
|
ba54096b7a42
Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents:
64361
diff
changeset
|
2862 CHECK_RELEASED(self); |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2863 return PyBool_FromLong(MV_F_CONTIGUOUS(self->flags)); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2864 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2865 |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2866 static PyObject * |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2867 memory_contiguous(PyMemoryViewObject *self, PyObject *dummy) |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2868 { |
|
75254
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2869 CHECK_RELEASED(self); |
|
3f9b3b6f7ff0
- Issue #10181: New memoryview implementation fixes multiple ownership
Stefan Krah <skrah@bytereef.org>
parents:
73669
diff
changeset
|
2870 return PyBool_FromLong(MV_ANY_CONTIGUOUS(self->flags)); |
|
42665
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2871 } |
|
85c22b4d4455
Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff
changeset
|
2872 |
|
78850
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2873 PyDoc_STRVAR(memory_obj_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2874 "The underlying object of the memoryview."); |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2875 PyDoc_STRVAR(memory_nbytes_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2876 "The amount of space in bytes that the array would use in\n" |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2877 " a contiguous representation."); |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2878 PyDoc_STRVAR(memory_readonly_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2879 "A bool indicating whether the memory is read only."); |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2880 PyDoc_STRVAR(memory_itemsize_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2881 "The size in bytes of each element of the memoryview."); |
|
78848
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2882 PyDoc_STRVAR(memory_format_doc, |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2883 "A string containing the format (in struct module style)\n" |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2884 " for each element in the view."); |
|
78850
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2885 PyDoc_STRVAR(memory_ndim_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2886 "An integer indicating how many dimensions of a multi-dimensional\n" |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2887 " array the memory represents."); |
|
78848
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2888 PyDoc_STRVAR(memory_shape_doc, |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2889 "A tuple of ndim integers giving the shape of the memory\n" |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2890 " as an N-dimensional array."); |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2891 PyDoc_STRVAR(memory_strides_doc, |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2892 "A tuple of ndim integers giving the size in bytes to access\n" |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2893 " each element for each dimension of the array."); |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2894 PyDoc_STRVAR(memory_suboffsets_doc, |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2895 "A tuple of integers used internally for PIL-style arrays."); |
|
78850
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2896 PyDoc_STRVAR(memory_c_contiguous_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2897 "A bool indicating whether the memory is C contiguous."); |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2898 PyDoc_STRVAR(memory_f_contiguous_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2899 "A bool indicating whether the memory is Fortran contiguous."); |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2900 PyDoc_STRVAR(memory_contiguous_doc, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2901 "A bool indicating whether the memory is contiguous."); |
|
78848
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2902 |
|
c49f89261d65
Issue #15855: added docstrings for memoryview methods and data descriptors.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
68257
diff
changeset
|
2903 static PyGetSetDef memory_getsetlist[] = { |
|
78850
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2904 {"obj", (getter)memory_obj_get, NULL, memory_obj_doc}, |
|
ba2c1def3710
Issue #15855: added docstrings for memoryview methods and data descriptors new in 3.3.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78849
diff
changeset
|
2905 {"nbytes", (getter)memory_nbytes_get, NULL, memory_nbytes_doc}, |
|
78849
16a69ccff5ce
Issue #15855: added docstrings for memoryview methods and data descriptors (merge 3.2).
Alexander Belopolsky <alexander.belopolsky@gmail.com>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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 }; |
