Mercurial > cpython-lru_cache-weakref
annotate Objects/bufferobject.c @ 42257:c280647c330c
c_char, c_char_p objects and c_char array structure fields return
their value now as str, no longer str8.
| author | Thomas Heller <theller@ctypes.org> |
|---|---|
| date | Fri, 13 Jul 2007 12:52:51 +0000 |
| parents | 229c28cb9afb |
| children | e70cdce0e8b2 |
| 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 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 PyObject_HEAD |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
9 PyObject *b_base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
10 void *b_ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
11 Py_ssize_t b_size; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
12 Py_ssize_t b_offset; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
13 int b_readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
14 long b_hash; |
|
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 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
18 enum buffer_t { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
19 READ_BUFFER, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
20 WRITE_BUFFER, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
21 CHAR_BUFFER, |
|
42084
229c28cb9afb
Merged revisions 55817-55961 via svnmerge from
Guido van Rossum <guido@python.org>
parents:
41769
diff
changeset
|
22 ANY_BUFFER |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
23 }; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
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 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
26 get_buf(PyBufferObject *self, void **ptr, Py_ssize_t *size, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
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 { |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
29 if (self->b_base == NULL) { |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
30 assert (ptr != NULL); |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
31 *ptr = self->b_ptr; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
32 *size = self->b_size; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
33 } |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
34 else { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
35 Py_ssize_t count, offset; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
36 readbufferproc proc = 0; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
37 PyBufferProcs *bp = self->b_base->ob_type->tp_as_buffer; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
38 if ((*bp->bf_getsegcount)(self->b_base, NULL) != 1) { |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
39 PyErr_SetString(PyExc_TypeError, |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
40 "single-segment buffer object expected"); |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
41 return 0; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
42 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
43 if ((buffer_type == READ_BUFFER) || |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
44 ((buffer_type == ANY_BUFFER) && self->b_readonly)) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
45 proc = bp->bf_getreadbuffer; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
46 else if ((buffer_type == WRITE_BUFFER) || |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
47 (buffer_type == ANY_BUFFER)) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
48 proc = (readbufferproc)bp->bf_getwritebuffer; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
49 else if (buffer_type == CHAR_BUFFER) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
50 proc = (readbufferproc)bp->bf_getcharbuffer; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
51 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
52 if (!proc) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
53 char *buffer_type_name; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
54 switch (buffer_type) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
55 case READ_BUFFER: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
56 buffer_type_name = "read"; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
57 break; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
58 case WRITE_BUFFER: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
59 buffer_type_name = "write"; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
60 break; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
61 case CHAR_BUFFER: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
62 buffer_type_name = "char"; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
63 break; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
64 default: |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
65 buffer_type_name = "no"; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
66 break; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
67 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
68 PyErr_Format(PyExc_TypeError, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
69 "%s buffer type not available", |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
70 buffer_type_name); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
71 return 0; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
72 } |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
73 if ((count = (*proc)(self->b_base, 0, ptr)) < 0) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
74 return 0; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
75 /* apply constraints to the start/end */ |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
76 if (self->b_offset > count) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
77 offset = count; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
78 else |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
79 offset = self->b_offset; |
|
31810
7a120400888a
Correct code to advance ptr to be well-formed C.
Martin v. Löwis <martin@v.loewis.de>
parents:
31640
diff
changeset
|
80 *(char **)ptr = *(char **)ptr + offset; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
81 if (self->b_size == Py_END_OF_BUFFER) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
82 *size = count; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
83 else |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
84 *size = self->b_size; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
85 if (offset + *size > count) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
86 *size = count - offset; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
87 } |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
88 return 1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
89 } |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
90 |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
91 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
92 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
93 buffer_from_memory(PyObject *base, Py_ssize_t size, Py_ssize_t offset, void *ptr, |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
94 int readonly) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
95 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
96 PyBufferObject * b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
98 if (size < 0 && size != Py_END_OF_BUFFER) { |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
99 PyErr_SetString(PyExc_ValueError, |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
100 "size must be zero or positive"); |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
101 return NULL; |
|
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
102 } |
|
33559
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
103 if (offset < 0) { |
|
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
104 PyErr_SetString(PyExc_ValueError, |
|
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
105 "offset must be zero or positive"); |
|
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
106 return NULL; |
|
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
107 } |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
108 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 b = PyObject_NEW(PyBufferObject, &PyBuffer_Type); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
110 if ( b == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
111 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
112 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
113 Py_XINCREF(base); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
114 b->b_base = base; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 b->b_ptr = ptr; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 b->b_size = size; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
117 b->b_offset = offset; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 b->b_readonly = readonly; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 b->b_hash = -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
120 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 return (PyObject *) b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
122 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
123 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
125 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
|
126 { |
|
33560
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
127 if (offset < 0) { |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
128 PyErr_SetString(PyExc_ValueError, |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
129 "offset must be zero or positive"); |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
130 return NULL; |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
131 } |
|
33559
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
132 if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) { |
|
be8cff4a1eca
Fix buffer offset calculation (need to compute it before changing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31810
diff
changeset
|
133 /* another buffer, refer to the base object */ |
|
33560
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
134 PyBufferObject *b = (PyBufferObject *)base; |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
135 if (b->b_size != Py_END_OF_BUFFER) { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
136 Py_ssize_t base_size = b->b_size - offset; |
|
33560
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
137 if (base_size < 0) |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
138 base_size = 0; |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
139 if (size == Py_END_OF_BUFFER || size > base_size) |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
140 size = base_size; |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
141 } |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
142 offset += b->b_offset; |
|
97cb9eea212e
Ensure negative offsets cannot be passed to buffer(). When composing
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
33559
diff
changeset
|
143 base = b->b_base; |
|
10427
e6799a855af7
Added check for negative offset for PyBuffer_FromObject and check for
Guido van Rossum <guido@python.org>
parents:
9305
diff
changeset
|
144 } |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
145 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
|
146 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
147 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
148 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
149 PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
150 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
|
151 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
152 PyBufferProcs *pb = base->ob_type->tp_as_buffer; |
|
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 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
155 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
156 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
157 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
158 PyErr_SetString(PyExc_TypeError, "buffer object expected"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
161 |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
162 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
|
163 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
166 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
|
167 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 PyBufferProcs *pb = base->ob_type->tp_as_buffer; |
|
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 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
171 pb->bf_getwritebuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
172 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
173 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
174 PyErr_SetString(PyExc_TypeError, "buffer object expected"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
175 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
176 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
177 |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
178 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
|
179 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
180 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
181 PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
182 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
|
183 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
184 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
|
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_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
|
189 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
190 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
|
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_New(Py_ssize_t size) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 { |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
196 PyObject *o; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
197 PyBufferObject * b; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
198 |
|
11175
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
199 if (size < 0) { |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
200 PyErr_SetString(PyExc_ValueError, |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
201 "size must be zero or positive"); |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
202 return NULL; |
|
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
203 } |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
204 /* XXX: check for overflow in multiply */ |
|
24898
a869d2de536f
Call me anal, but there was a particular phrase that was speading to
Guido van Rossum <guido@python.org>
parents:
23972
diff
changeset
|
205 /* Inline PyObject_New */ |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36533
diff
changeset
|
206 o = (PyObject *)PyObject_MALLOC(sizeof(*b) + size); |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
207 if ( o == NULL ) |
|
11175
fab81df566d0
PyBuffer_New(): Raise ValueError if size is negative (the other
Fred Drake <fdrake@acm.org>
parents:
10460
diff
changeset
|
208 return PyErr_NoMemory(); |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
209 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
|
210 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
211 b->b_base = NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
212 b->b_ptr = (void *)(b + 1); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
213 b->b_size = size; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
214 b->b_offset = 0; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
215 b->b_readonly = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
216 b->b_hash = -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
217 |
|
13861
f3d5f71ccbb4
Removing warnings found by gcc -Wall
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13449
diff
changeset
|
218 return o; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
219 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
220 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
221 /* Methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
222 |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
223 static PyObject * |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
224 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
|
225 { |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
226 PyObject *ob; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
227 Py_ssize_t offset = 0; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
228 Py_ssize_t size = Py_END_OF_BUFFER; |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
229 |
|
35450
97c97194e64b
Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents:
33560
diff
changeset
|
230 if (!_PyArg_NoKeywords("buffer()", kw)) |
|
97c97194e64b
Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents:
33560
diff
changeset
|
231 return NULL; |
|
97c97194e64b
Disallow keyword arguments for type constructors that don't use them
Georg Brandl <georg@python.org>
parents:
33560
diff
changeset
|
232 |
|
36533
ed07c1a5e24c
Use proper PyArg_Parse format char for Py_ssize_t, instead of 'l', in
Thomas Wouters <thomas@python.org>
parents:
36511
diff
changeset
|
233 if (!PyArg_ParseTuple(args, "O|nn:buffer", &ob, &offset, &size)) |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
234 return NULL; |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
235 return PyBuffer_FromObject(ob, offset, size); |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
236 } |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
237 |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
238 PyDoc_STRVAR(buffer_doc, |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
239 "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
|
240 \n\ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
241 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
|
242 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
|
243 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
|
244 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
|
245 |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
246 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 static void |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
248 buffer_dealloc(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
249 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 Py_XDECREF(self->b_base); |
|
12576
1c7c2dd1beb1
Vladimir Marangozov's long-awaited malloc restructuring.
Guido van Rossum <guido@python.org>
parents:
11175
diff
changeset
|
251 PyObject_DEL(self); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
252 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
253 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
254 static int |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
255 get_bufx(PyObject *obj, void **ptr, Py_ssize_t *size) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
256 { |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
257 PyBufferProcs *bp; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
258 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
259 if (PyBuffer_Check(obj)) { |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
260 if (!get_buf((PyBufferObject *)obj, ptr, size, ANY_BUFFER)) { |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
261 PyErr_Clear(); |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
262 return 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
263 } |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
264 else |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
265 return 1; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
266 } |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
267 bp = obj->ob_type->tp_as_buffer; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
268 if (bp == NULL || |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
269 bp->bf_getreadbuffer == NULL || |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
270 bp->bf_getsegcount == NULL) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
271 return 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
272 if ((*bp->bf_getsegcount)(obj, NULL) != 1) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
273 return 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
274 *size = (*bp->bf_getreadbuffer)(obj, 0, ptr); |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
275 if (*size < 0) { |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
276 PyErr_Clear(); |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
277 return 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
278 } |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
279 return 1; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
280 } |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
281 |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
282 static PyObject * |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
283 buffer_richcompare(PyObject *self, PyObject *other, int op) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
284 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
285 void *p1, *p2; |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
286 Py_ssize_t len1, len2, min_len; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
287 int cmp, ok; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
288 |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
289 ok = 1; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
290 if (!get_bufx(self, &p1, &len1)) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
291 ok = 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
292 if (!get_bufx(other, &p2, &len2)) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
293 ok = 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
294 if (!ok) { |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
295 /* If we can't get the buffers, |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
296 == and != are still defined |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
297 (and the objects are unequal) */ |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
298 PyObject *result; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
299 if (op == Py_EQ) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
300 result = Py_False; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
301 else if (op == Py_NE) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
302 result = Py_True; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
303 else |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
304 result = Py_NotImplemented; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
305 Py_INCREF(result); |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
306 return result; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 } |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
308 min_len = (len1 < len2) ? len1 : len2; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
309 cmp = memcmp(p1, p2, min_len); |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
310 if (cmp == 0) |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
311 cmp = (len1 < len2) ? -1 : |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
312 (len1 > len2) ? 1 : 0; |
|
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
313 return Py_CmpToRich(op, cmp); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
315 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
317 buffer_repr(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
319 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
|
320 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
321 if ( self->b_base == NULL ) |
|
41769
b29d71d43c80
Add functions PyUnicode_Append() and PyUnicode_AppendAndDel() that mirror
Walter Dörwald <walter@livinglogic.de>
parents:
41723
diff
changeset
|
322 return PyUnicode_FromFormat("<%s buffer ptr %p, size %zd at %p>", |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
323 status, |
|
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
324 self->b_ptr, |
| 36511 | 325 self->b_size, |
|
19476
0e70df98424e
repr's converted to using PyString_FromFormat() instead of sprintf'ing
Barry Warsaw <barry@python.org>
parents:
18933
diff
changeset
|
326 self); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 else |
|
41769
b29d71d43c80
Add functions PyUnicode_Append() and PyUnicode_AppendAndDel() that mirror
Walter Dörwald <walter@livinglogic.de>
parents:
41723
diff
changeset
|
328 return PyUnicode_FromFormat( |
|
36510
0f3894bb2ada
Support %zd in PyErr_Format and PyString_FromFormat.
Martin v. Löwis <martin@v.loewis.de>
parents:
36509
diff
changeset
|
329 "<%s buffer for %p, size %zd, offset %zd at %p>", |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 status, |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
331 self->b_base, |
| 36511 | 332 self->b_size, |
| 333 self->b_offset, | |
|
13210
ff243b0f16ee
Trent Mick <trentm@activestate.com>:
Fred Drake <fdrake@acm.org>
parents:
12576
diff
changeset
|
334 self); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
337 static long |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
338 buffer_hash(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
339 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
340 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
341 Py_ssize_t size; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
342 register Py_ssize_t len; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 register unsigned char *p; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 register long x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 if ( self->b_hash != -1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
347 return self->b_hash; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 |
|
31639
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
349 /* XXX potential bugs here, a readonly buffer does not imply that the |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
350 * underlying memory is immutable. b_readonly is a necessary but not |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
351 * sufficient condition for a buffer to be hashable. Perhaps it would |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
352 * be better to only allow hashing if the underlying object is known to |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
353 * be immutable (e.g. PyString_Check() is true). Another idea would |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
354 * be to call tp_hash on the underlying object and see if it raises |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
355 * an error. */ |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 if ( !self->b_readonly ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
357 { |
|
31639
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
358 PyErr_SetString(PyExc_TypeError, |
|
047148089c35
Document one of the many problems with the buffer object.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31638
diff
changeset
|
359 "writable buffers are not hashable"); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
361 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
363 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
364 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
365 p = (unsigned char *) ptr; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
366 len = size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 x = *p << 7; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 while (--len >= 0) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
369 x = (1000003*x) ^ *p++; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
370 x ^= size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 if (x == -1) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
372 x = -2; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 self->b_hash = x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 return x; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
378 buffer_str(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
380 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
381 Py_ssize_t size; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
382 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
383 return NULL; |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36533
diff
changeset
|
384 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
|
385 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
386 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 /* Sequence methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
389 static Py_ssize_t |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
390 buffer_length(PyBufferObject *self) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
391 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
392 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
393 Py_ssize_t size; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
394 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
395 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
396 return size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 static PyObject * |
|
13449
0409a98cd582
ANSI-fication of the sources.
Fred Drake <fdrake@acm.org>
parents:
13256
diff
changeset
|
400 buffer_concat(PyBufferObject *self, PyObject *other) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 PyBufferProcs *pb = other->ob_type->tp_as_buffer; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
403 void *ptr1, *ptr2; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
404 char *p; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 PyObject *ob; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
406 Py_ssize_t size, count; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
413 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 /* ### use a different exception type/message? */ |
| 10460 | 418 PyErr_SetString(PyExc_TypeError, |
| 419 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
422 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
423 if (!get_buf(self, &ptr1, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
424 return NULL; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
425 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 /* optimize special case */ |
|
41652
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
427 /* XXX bad idea type-wise */ |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
428 if ( size == 0 ) |
|
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 Py_INCREF(other); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 return other; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
432 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
433 |
|
41652
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
434 if (PyUnicode_Check(other)) { |
|
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
435 /* XXX HACK */ |
|
41723
c9c52b87c30b
Kill two innocuous compiler warnings.
Guido van Rossum <guido@python.org>
parents:
41652
diff
changeset
|
436 if ( (count = (*pb->bf_getcharbuffer)(other, 0, |
|
c9c52b87c30b
Kill two innocuous compiler warnings.
Guido van Rossum <guido@python.org>
parents:
41652
diff
changeset
|
437 (char **)&ptr2)) < 0 ) |
|
41652
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
438 return NULL; |
|
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
439 } |
|
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
440 else { |
|
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
441 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) |
|
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
442 return NULL; |
|
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
443 } |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
444 |
|
41652
050c98cd41c4
Make the StringIO test pass.
Guido van Rossum <guido@python.org>
parents:
39644
diff
changeset
|
445 /* XXX Should return a bytes object, really */ |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
446 ob = PyString_FromStringAndSize(NULL, size + count); |
|
36082
3f358afbb3d3
Check return result for error
Neal Norwitz <nnorwitz@gmail.com>
parents:
35450
diff
changeset
|
447 if ( ob == NULL ) |
|
3f358afbb3d3
Check return result for error
Neal Norwitz <nnorwitz@gmail.com>
parents:
35450
diff
changeset
|
448 return NULL; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
449 p = PyString_AS_STRING(ob); |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
450 memcpy(p, ptr1, size); |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
451 memcpy(p + size, ptr2, count); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 /* there is an extra byte in the string object, so this is safe */ |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
454 p[size + count] = '\0'; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
455 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
456 return ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
457 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
458 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
459 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
460 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
|
461 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
462 PyObject *ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
463 register char *p; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
464 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
465 Py_ssize_t size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
466 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
467 if ( count < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 count = 0; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
469 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
470 return NULL; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 ob = PyString_FromStringAndSize(NULL, size * count); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 if ( ob == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 p = PyString_AS_STRING(ob); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 while ( count-- ) |
|
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 memcpy(p, ptr, size); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 p += size; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 /* there is an extra byte in the string object, so this is safe */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 *p = '\0'; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 return ob; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
489 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
|
490 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
491 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
492 Py_ssize_t size; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
493 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
494 return NULL; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
495 if ( idx < 0 || idx >= size ) { |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
496 PyErr_SetString(PyExc_IndexError, "buffer index out of range"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
497 return NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 } |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
499 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
|
500 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
501 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
502 static PyObject * |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
503 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
|
504 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
505 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
506 Py_ssize_t size; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
507 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
508 return NULL; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
509 if ( left < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 left = 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 if ( right < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 right = 0; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
513 if ( right > size ) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
514 right = size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 if ( right < left ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 right = left; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
517 return PyString_FromStringAndSize((char *)ptr + left, |
| 10460 | 518 right - left); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
522 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
|
523 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 PyBufferProcs *pb; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
525 void *ptr1, *ptr2; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
526 Py_ssize_t size; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
527 Py_ssize_t count; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
528 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 if ( self->b_readonly ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
530 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
531 "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
535 if (!get_buf(self, &ptr1, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
536 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
537 |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
538 if (idx < 0 || idx >= size) { |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
539 PyErr_SetString(PyExc_IndexError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
540 "buffer assignment index out of range"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
541 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
542 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
543 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
544 pb = other ? other->ob_type->tp_as_buffer : NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
545 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
546 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
548 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
549 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 return -1; |
|
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 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 /* ### use a different exception type/message? */ |
| 10460 | 555 PyErr_SetString(PyExc_TypeError, |
| 556 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
557 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
558 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
559 |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
560 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
561 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
562 if ( count != 1 ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 "right operand must be a single byte"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
565 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
566 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
567 |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
568 ((char *)ptr1)[idx] = *(char *)ptr2; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
569 return 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
570 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
572 static int |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
573 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
|
574 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
575 PyBufferProcs *pb; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
576 void *ptr1, *ptr2; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
577 Py_ssize_t size; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
578 Py_ssize_t slice_len; |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
579 Py_ssize_t count; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
580 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
581 if ( self->b_readonly ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 PyErr_SetString(PyExc_TypeError, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
583 "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
584 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
585 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
586 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
587 pb = other ? other->ob_type->tp_as_buffer : NULL; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
588 if ( pb == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
589 pb->bf_getreadbuffer == NULL || |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
590 pb->bf_getsegcount == NULL ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
591 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
592 PyErr_BadArgument(); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
593 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
594 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
595 if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
596 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
597 /* ### use a different exception type/message? */ |
| 10460 | 598 PyErr_SetString(PyExc_TypeError, |
| 599 "single-segment buffer object expected"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
600 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
601 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
602 if (!get_buf(self, &ptr1, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
603 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
604 if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
605 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
606 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
607 if ( left < 0 ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
608 left = 0; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
609 else if ( left > size ) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
610 left = size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
611 if ( right < left ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
612 right = left; |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
613 else if ( right > size ) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
614 right = size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
615 slice_len = right - left; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
616 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
617 if ( count != slice_len ) { |
| 10460 | 618 PyErr_SetString( |
| 619 PyExc_TypeError, | |
| 620 "right operand length must match slice length"); | |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
621 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
622 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
623 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
624 if ( slice_len ) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
625 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
|
626 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
627 return 0; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
628 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
629 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
630 /* Buffer methods */ |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
631 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
632 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
633 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
|
634 { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
635 Py_ssize_t size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
636 if ( idx != 0 ) { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
637 PyErr_SetString(PyExc_SystemError, |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
638 "accessing non-existent buffer segment"); |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
639 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
640 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
641 if (!get_buf(self, pp, &size, READ_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
642 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
643 return size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
644 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
645 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
646 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
647 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
|
648 { |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
649 Py_ssize_t size; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
650 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
651 if ( self->b_readonly ) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
652 { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
653 PyErr_SetString(PyExc_TypeError, "buffer is read-only"); |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
654 return -1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
655 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
656 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
657 if ( idx != 0 ) { |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
658 PyErr_SetString(PyExc_SystemError, |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
659 "accessing non-existent buffer segment"); |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
660 return -1; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
661 } |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
662 if (!get_buf(self, pp, &size, WRITE_BUFFER)) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
663 return -1; |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
664 return size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
665 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
666 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
667 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
668 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
|
669 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
670 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
671 Py_ssize_t size; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
672 if (!get_buf(self, &ptr, &size, ANY_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
673 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
674 if (lenp) |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
675 *lenp = size; |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
676 return 1; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
677 } |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
678 |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
679 static Py_ssize_t |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
680 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
|
681 { |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
682 void *ptr; |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
683 Py_ssize_t size; |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
684 if ( idx != 0 ) { |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
685 PyErr_SetString(PyExc_SystemError, |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
686 "accessing non-existent buffer segment"); |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
687 return -1; |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
688 } |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
689 if (!get_buf(self, &ptr, &size, CHAR_BUFFER)) |
|
31640
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
690 return -1; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
691 *pp = (const char *)ptr; |
|
42f8820686c9
Make buffer objects based on mutable objects (like array) safe.
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents:
31639
diff
changeset
|
692 return size; |
|
9305
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
693 } |
|
083efa076366
Greg Stein: Implement the new bf_getcharbuffer function, indicating
Guido van Rossum <guido@python.org>
parents:
9286
diff
changeset
|
694 |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
695 static PySequenceMethods buffer_as_sequence = { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
696 (lenfunc)buffer_length, /*sq_length*/ |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
697 (binaryfunc)buffer_concat, /*sq_concat*/ |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
698 (ssizeargfunc)buffer_repeat, /*sq_repeat*/ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
699 (ssizeargfunc)buffer_item, /*sq_item*/ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
700 (ssizessizeargfunc)buffer_slice, /*sq_slice*/ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
701 (ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/ |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
702 (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
|
703 }; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
704 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
705 static PyBufferProcs buffer_as_buffer = { |
|
36501
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
706 (readbufferproc)buffer_getreadbuf, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
707 (writebufferproc)buffer_getwritebuf, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
708 (segcountproc)buffer_getsegcount, |
|
7fdc639bc5b4
Merge ssize_t branch.
Martin v. Löwis <martin@v.loewis.de>
parents:
36082
diff
changeset
|
709 (charbufferproc)buffer_getcharbuf, |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
710 }; |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
711 |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
712 PyTypeObject PyBuffer_Type = { |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
713 PyObject_HEAD_INIT(&PyType_Type) |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
714 0, |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
715 "buffer", |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
716 sizeof(PyBufferObject), |
|
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
717 0, |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
718 (destructor)buffer_dealloc, /* tp_dealloc */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
719 0, /* tp_print */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
720 0, /* tp_getattr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
721 0, /* tp_setattr */ |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
722 0, /* tp_compare */ |
|
18933
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
723 (reprfunc)buffer_repr, /* tp_repr */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
724 0, /* tp_as_number */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
725 &buffer_as_sequence, /* tp_as_sequence */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
726 0, /* tp_as_mapping */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
727 (hashfunc)buffer_hash, /* tp_hash */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
728 0, /* tp_call */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
729 (reprfunc)buffer_str, /* tp_str */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
730 PyObject_GenericGetAttr, /* tp_getattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
731 0, /* tp_setattro */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
732 &buffer_as_buffer, /* tp_as_buffer */ |
|
09df3254b49d
Merge of descr-branch back into trunk.
Tim Peters <tim.peters@gmail.com>
parents:
14375
diff
changeset
|
733 Py_TPFLAGS_DEFAULT, /* tp_flags */ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
734 buffer_doc, /* tp_doc */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
735 0, /* tp_traverse */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
736 0, /* tp_clear */ |
|
39644
13d5e5f0e993
Restructure comparison dramatically. There is no longer a default
Guido van Rossum <guido@python.org>
parents:
39442
diff
changeset
|
737 buffer_richcompare, /* tp_richcompare */ |
|
23868
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
738 0, /* tp_weaklistoffset */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
739 0, /* tp_iter */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
740 0, /* tp_iternext */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
741 0, /* tp_methods */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
742 0, /* tp_members */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
743 0, /* tp_getset */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
744 0, /* tp_base */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
745 0, /* tp_dict */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
746 0, /* tp_descr_get */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
747 0, /* tp_descr_set */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
748 0, /* tp_dictoffset */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
749 0, /* tp_init */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
750 0, /* tp_alloc */ |
|
8e6760bf1884
SF patch 568629 by Oren Tirosh: types made callable.
Guido van Rossum <guido@python.org>
parents:
22651
diff
changeset
|
751 buffer_new, /* tp_new */ |
|
9278
c39218a68df1
Add Greg Stein's buffer object API.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
752 }; |
