annotate Objects/memoryobject.c @ 73323:dad02a080bbc

Improve byte-compilation in packaging to be independent of -O or -B. The code I fixed to comply with PEP 3147 still had one bug: When run under python -O, some paths for pyc files would be pyo, because I called imp.cache_from_source without explicit debug_override argument in some places, and under -O that would return .pyo (this is well explained in the imp docs). Now all code (util.byte_compile, build_py, install_lib) can create .pyo files according to options given by users, without interference from the calling Python’s own optimize mode. On a related topic, I also removed the code that prevented byte compilation under python -B. The rationale is that packaging gives control over the creation of pyc files to the user with its own explicit option, and the behavior should not be changed if the calling Python happens to run with -B for whatever reason. I will argue that this is a bug fix and ask to be allowed to backport this change to distutils. Finally, I moved one nugget of information about the --compile and --optimize options from the source into the doc. It clears up a misunderstanding that I (and maybe other people) had.
author Éric Araujo <merwok@netwok.org>
date Thu, 03 Nov 2011 05:08:28 +0100
parents d0b0fcbb40db
children 215690b782f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42665
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
1
85c22b4d4455 Merged in py3k-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 /* 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
3
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
4 #include "Python.h"
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
5
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
6 #define IS_RELEASED(memobj) \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
7 (((PyMemoryViewObject *) memobj)->view.buf == NULL)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
8
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
9 #define CHECK_RELEASED(memobj) \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
10 if (IS_RELEASED(memobj)) { \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
11 PyErr_SetString(PyExc_ValueError, \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
12 "operation forbidden on released memoryview object"); \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
13 return NULL; \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
14 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
15
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
16 #define CHECK_RELEASED_INT(memobj) \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
17 if (IS_RELEASED(memobj)) { \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
18 PyErr_SetString(PyExc_ValueError, \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
19 "operation forbidden on released memoryview object"); \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
20 return -1; \
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
21 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
22
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
23 static Py_ssize_t
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
24 get_shape0(Py_buffer *buf)
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
25 {
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
26 if (buf->shape != NULL)
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
27 return buf->shape[0];
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
28 if (buf->ndim == 0)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
29 return 1;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
30 PyErr_SetString(PyExc_TypeError,
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
31 "exported buffer does not have any shape information associated "
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
32 "to it");
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
33 return -1;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
34 }
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
35
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
36 static void
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
37 dup_buffer(Py_buffer *dest, Py_buffer *src)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
38 {
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
39 *dest = *src;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
40 if (src->ndim == 1 && src->shape != NULL) {
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
41 dest->shape = &(dest->smalltable[0]);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
42 dest->shape[0] = get_shape0(src);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
43 }
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
44 if (src->ndim == 1 && src->strides != NULL) {
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
45 dest->strides = &(dest->smalltable[1]);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
46 dest->strides[0] = src->strides[0];
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
47 }
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
48 }
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
49
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
50 static int
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
51 memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int 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
52 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
53 int res = 0;
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
54 CHECK_RELEASED_INT(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
55 if (self->view.obj != NULL)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
56 res = PyObject_GetBuffer(self->view.obj, view, flags);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
57 if (view)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
58 dup_buffer(view, &self->view);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
59 return res;
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
60 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
61
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
62 static void
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
63 memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view)
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
64 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
65 PyBuffer_Release(view);
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
66 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
67
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
68 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
69 "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
70 \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
71 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
72
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
73 PyObject *
48770
7511f3e672a2 #3560: cleanup C memoryview API
Antoine Pitrou <solipsis@pitrou.net>
parents: 48683
diff changeset
74 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
75 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
76 PyMemoryViewObject *mview;
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
77
68127
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
78 if (info->buf == NULL) {
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
79 PyErr_SetString(PyExc_ValueError,
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
80 "cannot make memory view from a buffer with a NULL data pointer");
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
81 return NULL;
cbcb26a9d2bd Issue #11286: Raise a ValueError from calling PyMemoryView_FromBuffer with
Antoine Pitrou <solipsis@pitrou.net>
parents: 67675
diff changeset
82 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
83 mview = (PyMemoryViewObject *)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
84 PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
85 if (mview == NULL)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
86 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
87 dup_buffer(&mview->view, info);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
88 /* NOTE: mview->view.obj should already have been incref'ed as
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
89 part of PyBuffer_FillInfo(). */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
90 _PyObject_GC_TRACK(mview);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
91 return (PyObject *)mview;
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
92 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
93
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
94 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
95 PyMemoryView_FromObject(PyObject *base)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
96 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
97 PyMemoryViewObject *mview;
58645
cd00a94186c9 Merged revisions 77916 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55580
diff changeset
98 Py_buffer view;
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
99
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
100 if (!PyObject_CheckBuffer(base)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
101 PyErr_SetString(PyExc_TypeError,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
102 "cannot make memory view because object does "
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
103 "not have the buffer interface");
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
104 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
105 }
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
106
58645
cd00a94186c9 Merged revisions 77916 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55580
diff changeset
107 if (PyObject_GetBuffer(base, &view, PyBUF_FULL_RO) < 0)
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
108 return NULL;
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
109
58645
cd00a94186c9 Merged revisions 77916 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55580
diff changeset
110 mview = (PyMemoryViewObject *)PyMemoryView_FromBuffer(&view);
cd00a94186c9 Merged revisions 77916 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55580
diff changeset
111 if (mview == NULL) {
cd00a94186c9 Merged revisions 77916 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 55580
diff changeset
112 PyBuffer_Release(&view);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
113 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
114 }
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
115
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
116 return (PyObject *)mview;
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
117 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
118
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
119 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
120 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
121 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
122 PyObject *obj;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
123 static char *kwlist[] = {"object", 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
124
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
125 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:memoryview", kwlist,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
126 &obj)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
127 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
128 }
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
129
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
130 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
131 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
132
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
133
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
134 static void
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
135 _strided_copy_nd(char *dest, char *src, int nd, Py_ssize_t *shape,
43687
6ab64f6b4c03 Fix some Py_ssize_t warnings on Win64 that were probably bugs
Neal Norwitz <nnorwitz@gmail.com>
parents: 43550
diff changeset
136 Py_ssize_t *strides, Py_ssize_t itemsize, char fort)
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
137 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
138 int k;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
139 Py_ssize_t outstride;
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
140
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
141 if (nd==0) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
142 memcpy(dest, src, itemsize);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
143 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
144 else if (nd == 1) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
145 for (k = 0; k<shape[0]; k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
146 memcpy(dest, src, itemsize);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
147 dest += itemsize;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
148 src += strides[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
149 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
150 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
151 else {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
152 if (fort == 'F') {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
153 /* Copy first dimension first,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
154 second dimension second, etc...
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
155 Set up the recursive loop backwards so that final
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
156 dimension is actually copied last.
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
157 */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
158 outstride = itemsize;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
159 for (k=1; k<nd-1;k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
160 outstride *= shape[k];
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
161 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
162 for (k=0; k<shape[nd-1]; k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
163 _strided_copy_nd(dest, src, nd-1, shape,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
164 strides, itemsize, fort);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
165 dest += outstride;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
166 src += strides[nd-1];
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
167 }
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
168 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
169
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
170 else {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
171 /* Copy last dimension first,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
172 second-to-last dimension second, etc.
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
173 Set up the recursion so that the
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
174 first dimension is copied last
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
175 */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
176 outstride = itemsize;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
177 for (k=1; k < nd; k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
178 outstride *= shape[k];
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
179 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
180 for (k=0; k<shape[0]; k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
181 _strided_copy_nd(dest, src, nd-1, shape+1,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
182 strides+1, itemsize,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
183 fort);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
184 dest += outstride;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
185 src += strides[0];
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
186 }
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
187 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
188 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
189 return;
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
190 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
191
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
192 static int
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
193 _indirect_copy_nd(char *dest, Py_buffer *view, char fort)
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
194 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
195 Py_ssize_t *indices;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
196 int k;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
197 Py_ssize_t elements;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
198 char *ptr;
64362
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64344
diff changeset
199 void (*func)(int, Py_ssize_t *, const Py_ssize_t *);
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
200
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
201 if (view->ndim > PY_SSIZE_T_MAX / sizeof(Py_ssize_t)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
202 PyErr_NoMemory();
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
203 return -1;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
204 }
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
205
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
206 indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view->ndim);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
207 if (indices == NULL) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
208 PyErr_NoMemory();
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
209 return -1;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
210 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
211 for (k=0; k<view->ndim;k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
212 indices[k] = 0;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
213 }
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
214
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
215 elements = 1;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
216 for (k=0; k<view->ndim; k++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
217 elements *= view->shape[k];
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
218 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
219 if (fort == 'F') {
64344
b3b8d08f9d06 Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62964
diff changeset
220 func = _Py_add_one_to_index_F;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
221 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
222 else {
64344
b3b8d08f9d06 Merged revisions 84391 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 62964
diff changeset
223 func = _Py_add_one_to_index_C;
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
224 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
225 while (elements--) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
226 func(view->ndim, indices, view->shape);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
227 ptr = PyBuffer_GetPointer(view, indices);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
228 memcpy(dest, ptr, view->itemsize);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
229 dest += view->itemsize;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
230 }
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
231
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
232 PyMem_Free(indices);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
233 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
234 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
235
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
236 /*
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
237 Get a the data from an object as a contiguous chunk of memory (in
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
238 either 'C' or 'F'ortran order) even if it means copying it into a
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
239 separate memory area.
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
240
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
241 Returns a new reference to a Memory view object. If no copy is needed,
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
242 the memory view object points to the original memory and holds a
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
243 lock on the original. If a copy is needed, then the memory view object
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
244 points to a brand-new Bytes object (and holds a memory lock on it).
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
245
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
246 buffertype
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
247
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
248 PyBUF_READ buffer only needs to be read-only
43384
4e57c36f6d2e Fixing the spelling of "writeable" to "writable", particularly PyBUF_WRITEABLE.
Sean Reifscheider <jafo@tummy.com>
parents: 42671
diff changeset
249 PyBUF_WRITE buffer needs to be writable (give error if not contiguous)
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
250 PyBUF_SHADOW buffer needs to be writable so shadow it with
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
251 a contiguous buffer if it is not. The view will point to
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
252 the shadow buffer which can be written to and then
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
253 will be copied back into the other buffer when the memory
48623
bf50085fbcd3 #2538: bytes objects can only provide read-only buffers
Antoine Pitrou <solipsis@pitrou.net>
parents: 48330
diff changeset
254 view is de-allocated. While the shadow buffer is
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
255 being used, it will have an exclusive write lock on
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
256 the original buffer.
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
257 */
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
258
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
259 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
260 PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
261 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
262 PyMemoryViewObject *mem;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
263 PyObject *bytes;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
264 Py_buffer *view;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
265 int flags;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
266 char *dest;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
267
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
268 if (!PyObject_CheckBuffer(obj)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
269 PyErr_SetString(PyExc_TypeError,
55580
7b495c8f2a24 Merged revisions 73941-73943,74076,74094,74186,74211-74214,74247,74254,74262,74311,74334,74368 via svnmerge from
Georg Brandl <georg@python.org>
parents: 54828
diff changeset
270 "object does not support the buffer interface");
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
271 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
272 }
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
273
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
274 mem = PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
275 if (mem == NULL)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
276 return NULL;
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
277
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
278 view = &mem->view;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
279 flags = PyBUF_FULL_RO;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
280 switch(buffertype) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
281 case PyBUF_WRITE:
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
282 flags = PyBUF_FULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
283 break;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
284 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
285
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
286 if (PyObject_GetBuffer(obj, view, flags) != 0) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
287 Py_DECREF(mem);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
288 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
289 }
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
290
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
291 if (PyBuffer_IsContiguous(view, fort)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
292 /* no copy needed */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
293 _PyObject_GC_TRACK(mem);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
294 return (PyObject *)mem;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
295 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
296 /* otherwise a copy is needed */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
297 if (buffertype == PyBUF_WRITE) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
298 Py_DECREF(mem);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
299 PyErr_SetString(PyExc_BufferError,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
300 "writable contiguous buffer requested "
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
301 "for a non-contiguousobject.");
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
302 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
303 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
304 bytes = PyBytes_FromStringAndSize(NULL, view->len);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
305 if (bytes == NULL) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
306 Py_DECREF(mem);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
307 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
308 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
309 dest = PyBytes_AS_STRING(bytes);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
310 /* different copying strategy depending on whether
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
311 or not any pointer de-referencing is needed
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
312 */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
313 /* strided or in-direct copy */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
314 if (view->suboffsets==NULL) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
315 _strided_copy_nd(dest, view->buf, view->ndim, view->shape,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
316 view->strides, view->itemsize, fort);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
317 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
318 else {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
319 if (_indirect_copy_nd(dest, view, fort) < 0) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
320 Py_DECREF(bytes);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
321 Py_DECREF(mem);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
322 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
323 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
324 PyBuffer_Release(view); /* XXX ? */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
325 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
326 _PyObject_GC_TRACK(mem);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
327 return (PyObject *)mem;
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
328 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
329
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
330
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
331 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
332 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
333 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
334 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
335 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
336 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
337
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
338 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
339 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
340 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
341 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
342 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
343 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
344
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
345 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
346 _IntTupleFromSsizet(int len, Py_ssize_t *vals)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
347 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
348 int i;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
349 PyObject *o;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
350 PyObject *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
351
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
352 if (vals == NULL) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
353 Py_INCREF(Py_None);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
354 return Py_None;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
355 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
356 intTuple = PyTuple_New(len);
65921
4d1ab2d25baf deuglify
Benjamin Peterson <benjamin@python.org>
parents: 64584
diff changeset
357 if (!intTuple)
4d1ab2d25baf deuglify
Benjamin Peterson <benjamin@python.org>
parents: 64584
diff changeset
358 return NULL;
4d1ab2d25baf deuglify
Benjamin Peterson <benjamin@python.org>
parents: 64584
diff changeset
359 for (i=0; i<len; i++) {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
360 o = PyLong_FromSsize_t(vals[i]);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
361 if (!o) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
362 Py_DECREF(intTuple);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
363 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
364 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
365 PyTuple_SET_ITEM(intTuple, i, o);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
366 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
367 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
368 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
369
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
370 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
371 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
372 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
373 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
374 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
375 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
376
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
377 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
378 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
379 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
380 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
381 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
382 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
383
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
384 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
385 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
386 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
387 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
388 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
389 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
390
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
391 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
392 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
393 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
394 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
395 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
396 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
397
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
398 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
399 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
400 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
401 CHECK_RELEASED(self);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
402 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
403 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
404
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
405 static PyGetSetDef memory_getsetlist[] ={
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
406 {"format", (getter)memory_format_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
407 {"itemsize", (getter)memory_itemsize_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
408 {"shape", (getter)memory_shape_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
409 {"strides", (getter)memory_strides_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
410 {"suboffsets", (getter)memory_suboffsets_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
411 {"readonly", (getter)memory_readonly_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
412 {"ndim", (getter)memory_ndim_get, NULL, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
413 {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
414 };
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
415
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
416
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
417 static PyObject *
42669
2c51be9904de Code review of the new buffer protocol. Mostly add questions that should
Neal Norwitz <nnorwitz@gmail.com>
parents: 42665
diff changeset
418 memory_tobytes(PyMemoryViewObject *mem, PyObject *noargs)
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
419 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
420 CHECK_RELEASED(mem);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
421 return PyObject_CallFunctionObjArgs(
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
422 (PyObject *) &PyBytes_Type, mem, 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
423 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
424
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
425 /* TODO: rewrite this function using the struct module to unpack
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
426 each buffer item */
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
427
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
428 static PyObject *
42669
2c51be9904de Code review of the new buffer protocol. Mostly add questions that should
Neal Norwitz <nnorwitz@gmail.com>
parents: 42665
diff changeset
429 memory_tolist(PyMemoryViewObject *mem, PyObject *noargs)
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
430 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
431 Py_buffer *view = &(mem->view);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
432 Py_ssize_t i;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
433 PyObject *res, *item;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
434 char *buf;
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
435
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
436 CHECK_RELEASED(mem);
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
437 if (strcmp(view->format, "B") || view->itemsize != 1) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
438 PyErr_SetString(PyExc_NotImplementedError,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
439 "tolist() only supports byte views");
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
440 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
441 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
442 if (view->ndim != 1) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
443 PyErr_SetString(PyExc_NotImplementedError,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
444 "tolist() only supports one-dimensional objects");
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
445 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
446 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
447 res = PyList_New(view->len);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
448 if (res == NULL)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
449 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
450 buf = view->buf;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
451 for (i = 0; i < view->len; i++) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
452 item = PyLong_FromUnsignedLong((unsigned char) *buf);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
453 if (item == NULL) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
454 Py_DECREF(res);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
455 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
456 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
457 PyList_SET_ITEM(res, i, item);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
458 buf++;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
459 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
460 return res;
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
461 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
462
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
463 static void
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
464 do_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
465 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
466 if (self->view.obj != NULL) {
65944
3292cc222d5c Issue #10293: Remove obsolete field in the PyMemoryView structure,
Antoine Pitrou <solipsis@pitrou.net>
parents: 65921
diff changeset
467 PyBuffer_Release(&(self->view));
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
468 }
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
469 self->view.obj = NULL;
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
470 self->view.buf = NULL;
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
471 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
472
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
473 static PyObject *
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
474 memory_enter(PyObject *self, PyObject *args)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
475 {
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
476 CHECK_RELEASED(self);
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
477 Py_INCREF(self);
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
478 return self;
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
479 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
480
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
481 static PyObject *
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
482 memory_exit(PyObject *self, PyObject *args)
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
483 {
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
484 do_release((PyMemoryViewObject *) self);
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
485 Py_RETURN_NONE;
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
486 }
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
487
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
488 static PyMethodDef memory_methods[] = {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
489 {"release", memory_exit, METH_NOARGS},
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
490 {"tobytes", (PyCFunction)memory_tobytes, METH_NOARGS, NULL},
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
491 {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, NULL},
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
492 {"__enter__", memory_enter, METH_NOARGS},
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
493 {"__exit__", memory_exit, METH_VARARGS},
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
494 {NULL, NULL} /* sentinel */
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
495 };
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
496
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
497
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
498 static void
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
499 memory_dealloc(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
500 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
501 _PyObject_GC_UNTRACK(self);
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
502 do_release(self);
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
503 PyObject_GC_Del(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
504 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
505
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
506 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
507 memory_repr(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
508 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
509 if (IS_RELEASED(self))
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
510 return PyUnicode_FromFormat("<released memory at %p>", self);
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
511 else
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
512 return PyUnicode_FromFormat("<memory at %p>", 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
513 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
514
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
515 /* Sequence methods */
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
516 static Py_ssize_t
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
517 memory_length(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
518 {
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
519 CHECK_RELEASED_INT(self);
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
520 return get_shape0(&self->view);
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
521 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
522
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
523 /* Alternate version of memory_subcript that only accepts indices.
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
524 Used by PySeqIter_New().
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
525 */
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
526 static PyObject *
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
527 memory_item(PyMemoryViewObject *self, Py_ssize_t result)
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
528 {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
529 Py_buffer *view = &(self->view);
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
530
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
531 CHECK_RELEASED(self);
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
532 if (view->ndim == 0) {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
533 PyErr_SetString(PyExc_IndexError,
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
534 "invalid indexing of 0-dim memory");
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
535 return NULL;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
536 }
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
537 if (view->ndim == 1) {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
538 /* Return a bytes object */
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
539 char *ptr;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
540 ptr = (char *)view->buf;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
541 if (result < 0) {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
542 result += get_shape0(view);
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
543 }
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
544 if ((result < 0) || (result >= get_shape0(view))) {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
545 PyErr_SetString(PyExc_IndexError,
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
546 "index out of bounds");
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
547 return NULL;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
548 }
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
549 if (view->strides == NULL)
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
550 ptr += view->itemsize * result;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
551 else
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
552 ptr += view->strides[0] * result;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
553 if (view->suboffsets != NULL &&
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
554 view->suboffsets[0] >= 0) {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
555 ptr = *((char **)ptr) + view->suboffsets[0];
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
556 }
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
557 return PyBytes_FromStringAndSize(ptr, view->itemsize);
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
558 } else {
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
559 /* Return a new memory-view object */
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
560 Py_buffer newview;
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
561 memset(&newview, 0, sizeof(newview));
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
562 /* XXX: This needs to be fixed so it actually returns a sub-view */
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
563 return PyMemoryView_FromBuffer(&newview);
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
564 }
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
565 }
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
566
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
567 /*
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
568 mem[obj] returns a bytes object holding the data for one element if
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
569 obj fully indexes the memory view or another memory-view object
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
570 if it does not.
43439
79b0db0356d3 Whitespace and line lengrth cleanup.
Guido van Rossum <guido@python.org>
parents: 43423
diff changeset
571
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
572 0-d memory-view objects can be referenced using ... or () but
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
573 not with anything else.
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
574 */
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
575 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
576 memory_subscript(PyMemoryViewObject *self, PyObject *key)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
577 {
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
578 Py_buffer *view;
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
579 view = &(self->view);
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
580
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
581 CHECK_RELEASED(self);
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
582 if (view->ndim == 0) {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
583 if (key == Py_Ellipsis ||
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
584 (PyTuple_Check(key) && PyTuple_GET_SIZE(key)==0)) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
585 Py_INCREF(self);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
586 return (PyObject *)self;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
587 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
588 else {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
589 PyErr_SetString(PyExc_IndexError,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
590 "invalid indexing of 0-dim memory");
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
591 return NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
592 }
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
593 }
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
594 if (PyIndex_Check(key)) {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
595 Py_ssize_t result;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
596 result = PyNumber_AsSsize_t(key, NULL);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
597 if (result == -1 && PyErr_Occurred())
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
598 return NULL;
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
599 return memory_item(self, result);
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
600 }
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
601 else if (PySlice_Check(key)) {
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
602 Py_ssize_t start, stop, step, slicelength;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
603
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65944
diff changeset
604 if (PySlice_GetIndicesEx(key, get_shape0(view),
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
605 &start, &stop, &step, &slicelength) < 0) {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
606 return NULL;
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
607 }
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
608
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
609 if (step == 1 && view->ndim == 1) {
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
610 Py_buffer newview;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
611 void *newbuf = (char *) view->buf
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
612 + start * view->itemsize;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
613 int newflags = view->readonly
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
614 ? PyBUF_CONTIG_RO : PyBUF_CONTIG;
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
615
50490
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
616 /* XXX There should be an API to create a subbuffer */
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
617 if (view->obj != NULL) {
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
618 if (PyObject_GetBuffer(view->obj, &newview, newflags) == -1)
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
619 return NULL;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
620 }
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
621 else {
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
622 newview = *view;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
623 }
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
624 newview.buf = newbuf;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
625 newview.len = slicelength * newview.itemsize;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
626 newview.format = view->format;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
627 newview.shape = &(newview.smalltable[0]);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
628 newview.shape[0] = slicelength;
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
629 newview.strides = &(newview.itemsize);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
630 return PyMemoryView_FromBuffer(&newview);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
631 }
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
632 PyErr_SetNone(PyExc_NotImplementedError);
26045ed0c26e Merged revisions 68200 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50083
diff changeset
633 return NULL;
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
634 }
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
635 PyErr_Format(PyExc_TypeError,
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
636 "cannot index memory using \"%.200s\"",
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
637 key->ob_type->tp_name);
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
638 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
639 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
640
43550
4ea945cbbb6d Fix problems with memoryview object. There is still more to do to finish PEP 3118. The memory-view object needs to be fleshed out and the struct module needs to be modified.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43488
diff changeset
641
4ea945cbbb6d Fix problems with memoryview object. There is still more to do to finish PEP 3118. The memory-view object needs to be fleshed out and the struct module needs to be modified.
Travis E. Oliphant <oliphant@enthought.com>
parents: 43488
diff changeset
642 /* Need to support assigning memory if we can */
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
643 static int
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
644 memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value)
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
645 {
62964
189fa92d15dc Issue #7616: Fix copying of overlapping memoryview slices with the Intel
Antoine Pitrou <solipsis@pitrou.net>
parents: 58645
diff changeset
646 Py_ssize_t start, len, bytelen;
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
647 Py_buffer srcview;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
648 Py_buffer *view = &(self->view);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
649 char *srcbuf, *destbuf;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
650
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
651 CHECK_RELEASED_INT(self);
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
652 if (view->readonly) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
653 PyErr_SetString(PyExc_TypeError,
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
654 "cannot modify read-only memory");
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
655 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
656 }
64362
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64344
diff changeset
657 if (value == NULL) {
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64344
diff changeset
658 PyErr_SetString(PyExc_TypeError,
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64344
diff changeset
659 "cannot delete memory");
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64344
diff changeset
660 return -1;
4547b1491169 Merged revisions 84408-84409 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 64344
diff changeset
661 }
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
662 if (view->ndim != 1) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
663 PyErr_SetNone(PyExc_NotImplementedError);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
664 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
665 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
666 if (PyIndex_Check(key)) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
667 start = PyNumber_AsSsize_t(key, NULL);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
668 if (start == -1 && PyErr_Occurred())
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
669 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
670 if (start < 0) {
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
671 start += get_shape0(view);
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
672 }
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
673 if ((start < 0) || (start >= get_shape0(view))) {
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
674 PyErr_SetString(PyExc_IndexError,
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
675 "index out of bounds");
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
676 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
677 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
678 len = 1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
679 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
680 else if (PySlice_Check(key)) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
681 Py_ssize_t stop, step;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
682
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 65944
diff changeset
683 if (PySlice_GetIndicesEx(key, get_shape0(view),
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
684 &start, &stop, &step, &len) < 0) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
685 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
686 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
687 if (step != 1) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
688 PyErr_SetNone(PyExc_NotImplementedError);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
689 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
690 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
691 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
692 else {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
693 PyErr_Format(PyExc_TypeError,
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
694 "cannot index memory using \"%.200s\"",
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
695 key->ob_type->tp_name);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
696 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
697 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
698 if (PyObject_GetBuffer(value, &srcview, PyBUF_CONTIG_RO) == -1) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
699 return -1;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
700 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
701 /* XXX should we allow assignment of different item sizes
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
702 as long as the byte length is the same?
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
703 (e.g. assign 2 shorts to a 4-byte slice) */
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
704 if (srcview.itemsize != view->itemsize) {
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
705 PyErr_Format(PyExc_TypeError,
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
706 "mismatching item sizes for \"%.200s\" and \"%.200s\"",
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
707 view->obj->ob_type->tp_name, srcview.obj->ob_type->tp_name);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
708 goto _error;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
709 }
50083
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
710 bytelen = len * view->itemsize;
725192c64c28 Merged revisions 67650 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 49136
diff changeset
711 if (bytelen != srcview.len) {
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
712 PyErr_SetString(PyExc_ValueError,
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
713 "cannot modify size of memoryview object");
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
714 goto _error;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
715 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
716 /* Do the actual copy */
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
717 destbuf = (char *) view->buf + start * view->itemsize;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
718 srcbuf = (char *) srcview.buf;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
719 if (destbuf + bytelen < srcbuf || srcbuf + bytelen < destbuf)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
720 /* No overlapping */
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
721 memcpy(destbuf, srcbuf, bytelen);
62964
189fa92d15dc Issue #7616: Fix copying of overlapping memoryview slices with the Intel
Antoine Pitrou <solipsis@pitrou.net>
parents: 58645
diff changeset
722 else
189fa92d15dc Issue #7616: Fix copying of overlapping memoryview slices with the Intel
Antoine Pitrou <solipsis@pitrou.net>
parents: 58645
diff changeset
723 memmove(destbuf, srcbuf, bytelen);
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
724
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
725 PyBuffer_Release(&srcview);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
726 return 0;
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
727
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
728 _error:
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
729 PyBuffer_Release(&srcview);
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
730 return -1;
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
731 }
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
732
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
733 static PyObject *
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
734 memory_richcompare(PyObject *v, PyObject *w, int op)
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
735 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
736 Py_buffer vv, ww;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
737 int equal = 0;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
738 PyObject *res;
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
739
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
740 vv.obj = NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
741 ww.obj = NULL;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
742 if (op != Py_EQ && op != Py_NE)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
743 goto _notimpl;
64584
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
744 if ((PyMemoryView_Check(v) && IS_RELEASED(v)) ||
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
745 (PyMemoryView_Check(w) && IS_RELEASED(w))) {
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
746 equal = (v == w);
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
747 goto _end;
ba54096b7a42 Issue #9757: memoryview objects get a release() method to release the
Antoine Pitrou <solipsis@pitrou.net>
parents: 64361
diff changeset
748 }
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
749 if (PyObject_GetBuffer(v, &vv, PyBUF_CONTIG_RO) == -1) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
750 PyErr_Clear();
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
751 goto _notimpl;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
752 }
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
753 if (PyObject_GetBuffer(w, &ww, PyBUF_CONTIG_RO) == -1) {
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
754 PyErr_Clear();
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
755 goto _notimpl;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
756 }
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
757
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
758 if (vv.itemsize != ww.itemsize || vv.len != ww.len)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
759 goto _end;
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
760
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
761 equal = !memcmp(vv.buf, ww.buf, vv.len);
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
762
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
763 _end:
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
764 PyBuffer_Release(&vv);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
765 PyBuffer_Release(&ww);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
766 if ((equal && op == Py_EQ) || (!equal && op == Py_NE))
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
767 res = Py_True;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
768 else
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
769 res = Py_False;
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
770 Py_INCREF(res);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
771 return res;
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
772
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
773 _notimpl:
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
774 PyBuffer_Release(&vv);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
775 PyBuffer_Release(&ww);
71810
d0b0fcbb40db Replace Py_NotImplemented returns with the macro form Py_RETURN_NOTIMPLEMENTED.
Brian Curtin <brian@python.org>
parents: 68257
diff changeset
776 Py_RETURN_NOTIMPLEMENTED;
48782
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
777 }
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
778
501256c54c84 Issue #2394: implement more of the memoryview API.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48770
diff changeset
779
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
780 static int
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
781 memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg)
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
782 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
783 if (self->view.obj != NULL)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
784 Py_VISIT(self->view.obj);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
785 return 0;
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
786 }
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
787
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
788 static int
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
789 memory_clear(PyMemoryViewObject *self)
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
790 {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
791 PyBuffer_Release(&self->view);
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
792 return 0;
48928
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
793 }
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
794
696f5d8419f2 #3712: The memoryview object had a reference leak and didn't support cyclic garbage collection.
Antoine Pitrou <solipsis@pitrou.net>
parents: 48782
diff changeset
795
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
796 /* As mapping */
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
797 static PyMappingMethods memory_as_mapping = {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
798 (lenfunc)memory_length, /* mp_length */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
799 (binaryfunc)memory_subscript, /* mp_subscript */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
800 (objobjargproc)memory_ass_sub, /* mp_ass_subscript */
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
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
803 static PySequenceMethods memory_as_sequence = {
63924
9108e7dcd7d8 Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62964
diff changeset
804 0, /* sq_length */
9108e7dcd7d8 Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62964
diff changeset
805 0, /* sq_concat */
9108e7dcd7d8 Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62964
diff changeset
806 0, /* sq_repeat */
9108e7dcd7d8 Issue #2443: Added a new macro, Py_VA_COPY, which is equivalent to C99
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents: 62964
diff changeset
807 (ssizeargfunc)memory_item, /* sq_item */
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
808 };
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
809
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
810 /* Buffer methods */
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
811
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
812 static PyBufferProcs memory_as_buffer = {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
813 (getbufferproc)memory_getbuf, /* bf_getbuffer */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
814 (releasebufferproc)memory_releasebuf, /* bf_releasebuffer */
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
815 };
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
816
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
817
85c22b4d4455 Merged in py3k-buffer branch to main line. All objects now use the buffer protocol in PEP 3118.
Travis E. Oliphant <oliphant@enthought.com>
parents:
diff changeset
818 PyTypeObject PyMemoryView_Type = {
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
819 PyVarObject_HEAD_INIT(&PyType_Type, 0)
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
820 "memoryview",
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
821 sizeof(PyMemoryViewObject),
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
822 0,
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
823 (destructor)memory_dealloc, /* tp_dealloc */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
824 0, /* tp_print */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
825 0, /* tp_getattr */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
826 0, /* tp_setattr */
51271
87fbbf22adf3 Merged revisions 69214 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 50501
diff changeset
827 0, /* tp_reserved */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
828 (reprfunc)memory_repr, /* tp_repr */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
829 0, /* tp_as_number */
54828
b4d0c020e357 Issue 6329: Fix iteration for memoryviews.
Raymond Hettinger <python@rcn.com>
parents: 51468
diff changeset
830 &memory_as_sequence, /* tp_as_sequence */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
831 &memory_as_mapping, /* tp_as_mapping */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
832 0, /* tp_hash */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
833 0, /* tp_call */
51468
4313b4d4bdc7 Merged revisions 69438 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 51271
diff changeset
834 0, /* tp_str */
50501
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
835 PyObject_GenericGetAttr, /* tp_getattro */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
836 0, /* tp_setattro */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
837 &memory_as_buffer, /* tp_as_buffer */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
838 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
839 memory_doc, /* tp_doc */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
840 (traverseproc)memory_traverse, /* tp_traverse */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
841 (inquiry)memory_clear, /* tp_clear */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
842 memory_richcompare, /* tp_richcompare */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
843 0, /* tp_weaklistoffset */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
844 0, /* tp_iter */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
845 0, /* tp_iternext */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
846 memory_methods, /* tp_methods */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
847 0, /* tp_members */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
848 memory_getsetlist, /* tp_getset */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
849 0, /* tp_base */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
850 0, /* tp_dict */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
851 0, /* tp_descr_get */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
852 0, /* tp_descr_set */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
853 0, /* tp_dictoffset */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
854 0, /* tp_init */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
855 0, /* tp_alloc */
de2771070d85 Merged revisions 68212 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 50490
diff changeset
856 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
857 };