annotate Objects/bufferobject.c @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents 6b7704fe1be1
children 6b3217b96a77
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Buffer object implementation */
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
3
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #include "Python.h"
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 typedef struct {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
8 PyObject_HEAD
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
9 PyObject *b_base;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
10 void *b_ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
11 Py_ssize_t b_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
12 Py_ssize_t b_offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
13 int b_readonly;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
14 long b_hash;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 } PyBufferObject;
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
17
38676
5bc7272b81e5 Buffer objects would return the read or write buffer for a wrapped object when
Brett Cannon <bcannon@gmail.com>
parents: 37589
diff changeset
18 enum buffer_t {
38693
72e37ada4170 Fix inconsistency in naming within an enum.
Brett Cannon <bcannon@gmail.com>
parents: 38676
diff changeset
19 READ_BUFFER,
72e37ada4170 Fix inconsistency in naming within an enum.
Brett Cannon <bcannon@gmail.com>
parents: 38676
diff changeset
20 WRITE_BUFFER,
72e37ada4170 Fix inconsistency in naming within an enum.
Brett Cannon <bcannon@gmail.com>
parents: 38676
diff changeset
21 CHAR_BUFFER,
41996
1bbcd392417d Bug #1733488: Fix compilation of bufferobject.c on AIX.
Martin v. Löwis <martin@v.loewis.de>
parents: 39395
diff changeset
22 ANY_BUFFER
38676
5bc7272b81e5 Buffer objects would return the read or write buffer for a wrapped object when
Brett Cannon <bcannon@gmail.com>
parents: 37589
diff changeset
23 };
5bc7272b81e5 Buffer objects would return the read or write buffer for a wrapped object when
Brett Cannon <bcannon@gmail.com>
parents: 37589
diff changeset
24
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
25 static int
38676
5bc7272b81e5 Buffer objects would return the read or write buffer for a wrapped object when
Brett Cannon <bcannon@gmail.com>
parents: 37589
diff changeset
26 get_buf(PyBufferObject *self, void **ptr, Py_ssize_t *size,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
27 enum buffer_t buffer_type)
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
28 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
29 if (self->b_base == NULL) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
30 assert (ptr != NULL);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
31 *ptr = self->b_ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
32 *size = self->b_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
33 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
34 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
35 Py_ssize_t count, offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
36 readbufferproc proc = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
37 PyBufferProcs *bp = self->b_base->ob_type->tp_as_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
38 if ((*bp->bf_getsegcount)(self->b_base, NULL) != 1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
39 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
40 "single-segment buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
41 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
42 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
43 if ((buffer_type == READ_BUFFER) ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
44 ((buffer_type == ANY_BUFFER) && self->b_readonly))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
45 proc = bp->bf_getreadbuffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
46 else if ((buffer_type == WRITE_BUFFER) ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
47 (buffer_type == ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
48 proc = (readbufferproc)bp->bf_getwritebuffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
49 else if (buffer_type == CHAR_BUFFER) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
50 if (!PyType_HasFeature(self->ob_type,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
51 Py_TPFLAGS_HAVE_GETCHARBUFFER)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
52 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
53 "Py_TPFLAGS_HAVE_GETCHARBUFFER needed");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
54 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
55 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
56 proc = (readbufferproc)bp->bf_getcharbuffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
57 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
58 if (!proc) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
59 char *buffer_type_name;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
60 switch (buffer_type) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
61 case READ_BUFFER:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
62 buffer_type_name = "read";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
63 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
64 case WRITE_BUFFER:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
65 buffer_type_name = "write";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
66 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
67 case CHAR_BUFFER:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
68 buffer_type_name = "char";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
69 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
70 default:
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
71 buffer_type_name = "no";
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
72 break;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
73 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
74 PyErr_Format(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
75 "%s buffer type not available",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
76 buffer_type_name);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
77 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
78 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
79 if ((count = (*proc)(self->b_base, 0, ptr)) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
80 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
81 /* apply constraints to the start/end */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
82 if (self->b_offset > count)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
83 offset = count;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
84 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
85 offset = self->b_offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
86 *(char **)ptr = *(char **)ptr + offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
87 if (self->b_size == Py_END_OF_BUFFER)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
88 *size = count;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
89 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
90 *size = self->b_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
91 if (offset + *size > count)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
92 *size = count - offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
93 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
94 return 1;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
95 }
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
96
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
97
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
99 buffer_from_memory(PyObject *base, Py_ssize_t size, Py_ssize_t offset, void *ptr,
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
100 int readonly)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
102 PyBufferObject * b;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
104 if (size < 0 && size != Py_END_OF_BUFFER) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
105 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
106 "size must be zero or positive");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
107 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
108 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
109 if (offset < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
110 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
111 "offset must be zero or positive");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
112 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
113 }
10427
e6799a855af7 Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents: 9305
diff changeset
114
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
115 b = PyObject_NEW(PyBufferObject, &PyBuffer_Type);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
116 if ( b == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
117 return NULL;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
118
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
119 Py_XINCREF(base);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
120 b->b_base = base;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
121 b->b_ptr = ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
122 b->b_size = size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
123 b->b_offset = offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
124 b->b_readonly = readonly;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
125 b->b_hash = -1;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
126
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
127 return (PyObject *) b;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
129
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
131 buffer_from_object(PyObject *base, Py_ssize_t size, Py_ssize_t offset, int readonly)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
133 if (offset < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
134 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
135 "offset must be zero or positive");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
136 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
137 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
138 if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
139 /* another buffer, refer to the base object */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
140 PyBufferObject *b = (PyBufferObject *)base;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
141 if (b->b_size != Py_END_OF_BUFFER) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
142 Py_ssize_t base_size = b->b_size - offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
143 if (base_size < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
144 base_size = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
145 if (size == Py_END_OF_BUFFER || size > base_size)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
146 size = base_size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
147 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
148 offset += b->b_offset;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
149 base = b->b_base;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
150 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
151 return buffer_from_memory(base, size, offset, NULL, readonly);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
153
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
154
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
156 PyBuffer_FromObject(PyObject *base, Py_ssize_t offset, Py_ssize_t size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
158 PyBufferProcs *pb = base->ob_type->tp_as_buffer;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
160 if ( pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
161 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
162 pb->bf_getsegcount == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
163 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
164 PyErr_SetString(PyExc_TypeError, "buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
165 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
166 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
167
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
168 return buffer_from_object(base, size, offset, 1);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
170
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
172 PyBuffer_FromReadWriteObject(PyObject *base, Py_ssize_t offset, Py_ssize_t size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
174 PyBufferProcs *pb = base->ob_type->tp_as_buffer;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
176 if ( pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
177 pb->bf_getwritebuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
178 pb->bf_getsegcount == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
179 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
180 PyErr_SetString(PyExc_TypeError, "buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
181 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
182 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
183
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
184 return buffer_from_object(base, size, offset, 0);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
186
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
188 PyBuffer_FromMemory(void *ptr, Py_ssize_t size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
190 return buffer_from_memory(NULL, size, 0, ptr, 1);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
194 PyBuffer_FromReadWriteMemory(void *ptr, Py_ssize_t size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
196 return buffer_from_memory(NULL, size, 0, ptr, 0);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
198
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
200 PyBuffer_New(Py_ssize_t size)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
202 PyObject *o;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
203 PyBufferObject * b;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
204
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
205 if (size < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
206 PyErr_SetString(PyExc_ValueError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
207 "size must be zero or positive");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
208 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
209 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
210 if (sizeof(*b) > PY_SSIZE_T_MAX - size) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
211 /* unlikely */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
212 return PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
213 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
214 /* Inline PyObject_New */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
215 o = (PyObject *)PyObject_MALLOC(sizeof(*b) + size);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
216 if ( o == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
217 return PyErr_NoMemory();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
218 b = (PyBufferObject *) PyObject_INIT(o, &PyBuffer_Type);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
219
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
220 b->b_base = NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
221 b->b_ptr = (void *)(b + 1);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
222 b->b_size = size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
223 b->b_offset = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
224 b->b_readonly = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
225 b->b_hash = -1;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
226
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
227 return o;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
229
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 /* Methods */
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
231
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
232 static PyObject *
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
233 buffer_new(PyTypeObject *type, PyObject *args, PyObject *kw)
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
234 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
235 PyObject *ob;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
236 Py_ssize_t offset = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
237 Py_ssize_t size = Py_END_OF_BUFFER;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
238
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
239 if (PyErr_WarnPy3k("buffer() not supported in 3.x", 1) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
240 return NULL;
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
241
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
242 if (!_PyArg_NoKeywords("buffer()", kw))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
243 return NULL;
35450
97c97194e64b Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents: 33560
diff changeset
244
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
245 if (!PyArg_ParseTuple(args, "O|nn:buffer", &ob, &offset, &size))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
246 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
247 return PyBuffer_FromObject(ob, offset, size);
23868
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
248 }
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
249
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
250 PyDoc_STRVAR(buffer_doc,
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
251 "buffer(object [, offset[, size]])\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
252 \n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
253 Create a new buffer object which references the given object.\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
254 The buffer will reference a slice of the target object from the\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
255 start of the object (or at the specified offset). The slice will\n\
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
256 extend to the end of the target object (or with the specified size).");
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
257
8e6760bf1884 SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents: 22651
diff changeset
258
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 static void
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
260 buffer_dealloc(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
262 Py_XDECREF(self->b_base);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
263 PyObject_DEL(self);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
265
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 static int
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
267 buffer_compare(PyBufferObject *self, PyBufferObject *other)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
269 void *p1, *p2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
270 Py_ssize_t len_self, len_other, min_len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
271 int cmp;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
272
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
273 if (!get_buf(self, &p1, &len_self, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
274 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
275 if (!get_buf(other, &p2, &len_other, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
276 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
277 min_len = (len_self < len_other) ? len_self : len_other;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
278 if (min_len > 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
279 cmp = memcmp(p1, p2, min_len);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
280 if (cmp != 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
281 return cmp < 0 ? -1 : 1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
282 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
283 return (len_self < len_other) ? -1 : (len_self > len_other) ? 1 : 0;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
284 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
285
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
287 buffer_repr(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
289 const char *status = self->b_readonly ? "read-only" : "read-write";
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
290
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
291 if ( self->b_base == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
292 return PyString_FromFormat("<%s buffer ptr %p, size %zd at %p>",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
293 status,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
294 self->b_ptr,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
295 self->b_size,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
296 self);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
297 else
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
298 return PyString_FromFormat(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
299 "<%s buffer for %p, size %zd, offset %zd at %p>",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
300 status,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
301 self->b_base,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
302 self->b_size,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
303 self->b_offset,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
304 self);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
306
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 static long
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
308 buffer_hash(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
310 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
311 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
312 register Py_ssize_t len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
313 register unsigned char *p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
314 register long x;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
315
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
316 if ( self->b_hash != -1 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
317 return self->b_hash;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
318
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
319 /* XXX potential bugs here, a readonly buffer does not imply that the
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
320 * underlying memory is immutable. b_readonly is a necessary but not
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
321 * sufficient condition for a buffer to be hashable. Perhaps it would
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
322 * be better to only allow hashing if the underlying object is known to
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
323 * be immutable (e.g. PyString_Check() is true). Another idea would
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
324 * be to call tp_hash on the underlying object and see if it raises
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
325 * an error. */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
326 if ( !self->b_readonly )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
327 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
328 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
329 "writable buffers are not hashable");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
330 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
331 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
332
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
333 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
334 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
335 p = (unsigned char *) ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
336 len = size;
75100
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
337 /*
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
338 We make the hash of the empty buffer be 0, rather than using
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
339 (prefix ^ suffix), since this slightly obfuscates the hash secret
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
340 */
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
341 if (len == 0) {
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
342 self->b_hash = 0;
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
343 return 0;
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
344 }
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
345 x = _Py_HashSecret.prefix;
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
346 x ^= *p << 7;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
347 while (--len >= 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
348 x = (1000003*x) ^ *p++;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
349 x ^= size;
75100
6b7704fe1be1 - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED
Barry Warsaw <barry@python.org>
parents: 68255
diff changeset
350 x ^= _Py_HashSecret.suffix;
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
351 if (x == -1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
352 x = -2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
353 self->b_hash = x;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
354 return x;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
356
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
358 buffer_str(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
360 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
361 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
362 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
363 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
364 return PyString_FromStringAndSize((const char *)ptr, size);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
366
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 /* Sequence methods */
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
368
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
369 static Py_ssize_t
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
370 buffer_length(PyBufferObject *self)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
372 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
373 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
374 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
375 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
376 return size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
378
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 static PyObject *
13449
0409a98cd582 ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
380 buffer_concat(PyBufferObject *self, PyObject *other)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
382 PyBufferProcs *pb = other->ob_type->tp_as_buffer;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
383 void *ptr1, *ptr2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
384 char *p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
385 PyObject *ob;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
386 Py_ssize_t size, count;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
387
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
388 if ( pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
389 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
390 pb->bf_getsegcount == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
391 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
392 PyErr_BadArgument();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
393 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
394 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
395 if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
396 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
397 /* ### use a different exception type/message? */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
398 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
399 "single-segment buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
400 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
401 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
402
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
403 if (!get_buf(self, &ptr1, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
404 return NULL;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
405
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
406 /* optimize special case */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
407 if ( size == 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
408 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
409 Py_INCREF(other);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
410 return other;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
411 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
412
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
413 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
414 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
415
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
416 assert(count <= PY_SIZE_MAX - size);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
417
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
418 ob = PyString_FromStringAndSize(NULL, size + count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
419 if ( ob == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
420 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
421 p = PyString_AS_STRING(ob);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
422 memcpy(p, ptr1, size);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
423 memcpy(p + size, ptr2, count);
45337
8cbe0bd93c28 Added checks for integer overflows, contributed by Google. Some are
Martin v. Löwis <martin@v.loewis.de>
parents: 41996
diff changeset
424
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
425 /* there is an extra byte in the string object, so this is safe */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
426 p[size + count] = '\0';
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
427
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
428 return ob;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
430
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
432 buffer_repeat(PyBufferObject *self, Py_ssize_t count)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
434 PyObject *ob;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
435 register char *p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
436 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
437 Py_ssize_t size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
438
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
439 if ( count < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
440 count = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
441 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
442 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
443 if (count > PY_SSIZE_T_MAX / size) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
444 PyErr_SetString(PyExc_MemoryError, "result too large");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
445 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
446 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
447 ob = PyString_FromStringAndSize(NULL, size * count);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
448 if ( ob == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
449 return NULL;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
450
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
451 p = PyString_AS_STRING(ob);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
452 while ( count-- )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
453 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
454 memcpy(p, ptr, size);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
455 p += size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
456 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
457
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
458 /* there is an extra byte in the string object, so this is safe */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
459 *p = '\0';
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
460
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
461 return ob;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
463
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
465 buffer_item(PyBufferObject *self, Py_ssize_t idx)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
467 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
468 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
469 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
470 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
471 if ( idx < 0 || idx >= size ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
472 PyErr_SetString(PyExc_IndexError, "buffer index out of range");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
473 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
474 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
475 return PyString_FromStringAndSize((char *)ptr + idx, 1);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
477
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 static PyObject *
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
479 buffer_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
481 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
482 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
483 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
484 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
485 if ( left < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
486 left = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
487 if ( right < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
488 right = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
489 if ( right > size )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
490 right = size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
491 if ( right < left )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
492 right = left;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
493 return PyString_FromStringAndSize((char *)ptr + left,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
494 right - left);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
496
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
497 static PyObject *
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
498 buffer_subscript(PyBufferObject *self, PyObject *item)
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
499 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
500 void *p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
501 Py_ssize_t size;
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
502
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
503 if (!get_buf(self, &p, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
504 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
505 if (PyIndex_Check(item)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
506 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
507 if (i == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
508 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
509 if (i < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
510 i += size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
511 return buffer_item(self, i);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
512 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
513 else if (PySlice_Check(item)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
514 Py_ssize_t start, stop, step, slicelength, cur, i;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
515
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
516 if (PySlice_GetIndicesEx((PySliceObject*)item, size,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
517 &start, &stop, &step, &slicelength) < 0) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
518 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
519 }
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
520
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
521 if (slicelength <= 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
522 return PyString_FromStringAndSize("", 0);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
523 else if (step == 1)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
524 return PyString_FromStringAndSize((char *)p + start,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
525 stop - start);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
526 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
527 PyObject *result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
528 char *source_buf = (char *)p;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
529 char *result_buf = (char *)PyMem_Malloc(slicelength);
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
530
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
531 if (result_buf == NULL)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
532 return PyErr_NoMemory();
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
533
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
534 for (cur = start, i = 0; i < slicelength;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
535 cur += step, i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
536 result_buf[i] = source_buf[cur];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
537 }
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
538
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
539 result = PyString_FromStringAndSize(result_buf,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
540 slicelength);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
541 PyMem_Free(result_buf);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
542 return result;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
543 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
544 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
545 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
546 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
547 "sequence index must be integer");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
548 return NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
549 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
550 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
551
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
552 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
553 buffer_ass_item(PyBufferObject *self, Py_ssize_t idx, PyObject *other)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
554 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
555 PyBufferProcs *pb;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
556 void *ptr1, *ptr2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
557 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
558 Py_ssize_t count;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
559
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
560 if ( self->b_readonly ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
561 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
562 "buffer is read-only");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
563 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
564 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
565
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
566 if (!get_buf(self, &ptr1, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
567 return -1;
31640
42f8820686c9 Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 31639
diff changeset
568
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
569 if (idx < 0 || idx >= size) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
570 PyErr_SetString(PyExc_IndexError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
571 "buffer assignment index out of range");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
572 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
573 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
574
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
575 pb = other ? other->ob_type->tp_as_buffer : NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
576 if ( pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
577 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
578 pb->bf_getsegcount == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
579 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
580 PyErr_BadArgument();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
581 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
582 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
583 if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
584 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
585 /* ### use a different exception type/message? */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
586 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
587 "single-segment buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
588 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
589 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
590
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
591 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
592 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
593 if ( count != 1 ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
594 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
595 "right operand must be a single byte");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
596 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
597 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
598
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
599 ((char *)ptr1)[idx] = *(char *)ptr2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
600 return 0;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
601 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
602
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
603 static int
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
604 buffer_ass_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right, PyObject *other)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
605 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
606 PyBufferProcs *pb;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
607 void *ptr1, *ptr2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
608 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
609 Py_ssize_t slice_len;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
610 Py_ssize_t count;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
611
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
612 if ( self->b_readonly ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
613 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
614 "buffer is read-only");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
615 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
616 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
617
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
618 pb = other ? other->ob_type->tp_as_buffer : NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
619 if ( pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
620 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
621 pb->bf_getsegcount == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
622 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
623 PyErr_BadArgument();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
624 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
625 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
626 if ( (*pb->bf_getsegcount)(other, NULL) != 1 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
627 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
628 /* ### use a different exception type/message? */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
629 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
630 "single-segment buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
631 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
632 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
633 if (!get_buf(self, &ptr1, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
634 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
635 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
636 return -1;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
637
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
638 if ( left < 0 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
639 left = 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
640 else if ( left > size )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
641 left = size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
642 if ( right < left )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
643 right = left;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
644 else if ( right > size )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
645 right = size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
646 slice_len = right - left;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
647
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
648 if ( count != slice_len ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
649 PyErr_SetString(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
650 PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
651 "right operand length must match slice length");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
652 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
653 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
654
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
655 if ( slice_len )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
656 memcpy((char *)ptr1 + left, ptr2, slice_len);
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
657
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
658 return 0;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
659 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
660
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
661 static int
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
662 buffer_ass_subscript(PyBufferObject *self, PyObject *item, PyObject *value)
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
663 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
664 PyBufferProcs *pb;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
665 void *ptr1, *ptr2;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
666 Py_ssize_t selfsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
667 Py_ssize_t othersize;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
668
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
669 if ( self->b_readonly ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
670 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
671 "buffer is read-only");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
672 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
673 }
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
674
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
675 pb = value ? value->ob_type->tp_as_buffer : NULL;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
676 if ( pb == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
677 pb->bf_getreadbuffer == NULL ||
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
678 pb->bf_getsegcount == NULL )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
679 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
680 PyErr_BadArgument();
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
681 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
682 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
683 if ( (*pb->bf_getsegcount)(value, NULL) != 1 )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
684 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
685 /* ### use a different exception type/message? */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
686 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
687 "single-segment buffer object expected");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
688 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
689 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
690 if (!get_buf(self, &ptr1, &selfsize, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
691 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
692 if (PyIndex_Check(item)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
693 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
694 if (i == -1 && PyErr_Occurred())
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
695 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
696 if (i < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
697 i += selfsize;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
698 return buffer_ass_item(self, i, value);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
699 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
700 else if (PySlice_Check(item)) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
701 Py_ssize_t start, stop, step, slicelength;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
702
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
703 if (PySlice_GetIndicesEx((PySliceObject *)item, selfsize,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
704 &start, &stop, &step, &slicelength) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
705 return -1;
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
706
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
707 if ((othersize = (*pb->bf_getreadbuffer)(value, 0, &ptr2)) < 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
708 return -1;
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
709
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
710 if (othersize != slicelength) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
711 PyErr_SetString(
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
712 PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
713 "right operand length must match slice length");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
714 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
715 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
716
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
717 if (slicelength == 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
718 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
719 else if (step == 1) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
720 memcpy((char *)ptr1 + start, ptr2, slicelength);
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
721 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
722 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
723 else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
724 Py_ssize_t cur, i;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
725
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
726 for (cur = start, i = 0; i < slicelength;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
727 cur += step, i++) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
728 ((char *)ptr1)[cur] = ((char *)ptr2)[i];
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
729 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
730
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
731 return 0;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
732 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
733 } else {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
734 PyErr_SetString(PyExc_TypeError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
735 "buffer indices must be integers");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
736 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
737 }
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
738 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
739
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
740 /* Buffer methods */
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
741
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
742 static Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
743 buffer_getreadbuf(PyBufferObject *self, Py_ssize_t idx, void **pp)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
744 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
745 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
746 if ( idx != 0 ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
747 PyErr_SetString(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
748 "accessing non-existent buffer segment");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
749 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
750 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
751 if (!get_buf(self, pp, &size, READ_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
752 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
753 return size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
755
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
756 static Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
757 buffer_getwritebuf(PyBufferObject *self, Py_ssize_t idx, void **pp)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
759 Py_ssize_t size;
38676
5bc7272b81e5 Buffer objects would return the read or write buffer for a wrapped object when
Brett Cannon <bcannon@gmail.com>
parents: 37589
diff changeset
760
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
761 if ( self->b_readonly )
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
762 {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
763 PyErr_SetString(PyExc_TypeError, "buffer is read-only");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
764 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
765 }
38676
5bc7272b81e5 Buffer objects would return the read or write buffer for a wrapped object when
Brett Cannon <bcannon@gmail.com>
parents: 37589
diff changeset
766
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
767 if ( idx != 0 ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
768 PyErr_SetString(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
769 "accessing non-existent buffer segment");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
770 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
771 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
772 if (!get_buf(self, pp, &size, WRITE_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
773 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
774 return size;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
775 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
776
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
777 static Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
778 buffer_getsegcount(PyBufferObject *self, Py_ssize_t *lenp)
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
779 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
780 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
781 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
782 if (!get_buf(self, &ptr, &size, ANY_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
783 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
784 if (lenp)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
785 *lenp = size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
786 return 1;
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
787 }
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
788
36501
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
789 static Py_ssize_t
7fdc639bc5b4 Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents: 36082
diff changeset
790 buffer_getcharbuf(PyBufferObject *self, Py_ssize_t idx, const char **pp)
9305
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
791 {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
792 void *ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
793 Py_ssize_t size;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
794 if ( idx != 0 ) {
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
795 PyErr_SetString(PyExc_SystemError,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
796 "accessing non-existent buffer segment");
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
797 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
798 }
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
799 if (!get_buf(self, &ptr, &size, CHAR_BUFFER))
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
800 return -1;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
801 *pp = (const char *)ptr;
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
802 return size;
9305
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
803 }
083efa076366 Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents: 9286
diff changeset
804
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
805 static PySequenceMethods buffer_as_sequence = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
806 (lenfunc)buffer_length, /*sq_length*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
807 (binaryfunc)buffer_concat, /*sq_concat*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
808 (ssizeargfunc)buffer_repeat, /*sq_repeat*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
809 (ssizeargfunc)buffer_item, /*sq_item*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
810 (ssizessizeargfunc)buffer_slice, /*sq_slice*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
811 (ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
812 (ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
813 };
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
814
42951
9620134010a5 Improve extended slicing support in builtin types and classes. Specifically:
Thomas Wouters <thomas@python.org>
parents: 42333
diff changeset
815 static PyMappingMethods buffer_as_mapping = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
816 (lenfunc)buffer_length,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
817 (binaryfunc)buffer_subscript,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
818 (objobjargproc)buffer_ass_subscript,
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
819 };
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
820
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
821 static PyBufferProcs buffer_as_buffer = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
822 (readbufferproc)buffer_getreadbuf,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
823 (writebufferproc)buffer_getwritebuf,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
824 (segcountproc)buffer_getsegcount,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
825 (charbufferproc)buffer_getcharbuf,
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
826 };
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
827
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
828 PyTypeObject PyBuffer_Type = {
61465
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
829 PyVarObject_HEAD_INIT(&PyType_Type, 0)
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
830 "buffer",
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
831 sizeof(PyBufferObject),
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
832 0,
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
833 (destructor)buffer_dealloc, /* tp_dealloc */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
834 0, /* tp_print */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
835 0, /* tp_getattr */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
836 0, /* tp_setattr */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
837 (cmpfunc)buffer_compare, /* tp_compare */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
838 (reprfunc)buffer_repr, /* tp_repr */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
839 0, /* tp_as_number */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
840 &buffer_as_sequence, /* tp_as_sequence */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
841 &buffer_as_mapping, /* tp_as_mapping */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
842 (hashfunc)buffer_hash, /* tp_hash */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
843 0, /* tp_call */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
844 (reprfunc)buffer_str, /* tp_str */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
845 PyObject_GenericGetAttr, /* tp_getattro */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
846 0, /* tp_setattro */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
847 &buffer_as_buffer, /* tp_as_buffer */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
848 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GETCHARBUFFER, /* tp_flags */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
849 buffer_doc, /* tp_doc */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
850 0, /* tp_traverse */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
851 0, /* tp_clear */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
852 0, /* tp_richcompare */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
853 0, /* tp_weaklistoffset */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
854 0, /* tp_iter */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
855 0, /* tp_iternext */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
856 0, /* tp_methods */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
857 0, /* tp_members */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
858 0, /* tp_getset */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
859 0, /* tp_base */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
860 0, /* tp_dict */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
861 0, /* tp_descr_get */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
862 0, /* tp_descr_set */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
863 0, /* tp_dictoffset */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
864 0, /* tp_init */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
865 0, /* tp_alloc */
e38335d4df91 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 48193
diff changeset
866 buffer_new, /* tp_new */
9278
c39218a68df1 Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff changeset
867 };