blob: 533f404f91ad7c28c6bdccd9e0df08d7a1d9f0b5 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
Victor Stinner9f0b51e2010-11-09 09:38:30 +000025 Py_UNICODE typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 int itemsize;
27 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
29 char *formats;
30 int is_integer_type;
31 int is_signed;
Guido van Rossum778983b1993-02-19 15:55:02 +000032};
33
34typedef struct arrayobject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 PyObject_VAR_HEAD
36 char *ob_item;
37 Py_ssize_t allocated;
38 struct arraydescr *ob_descr;
39 PyObject *weakreflist; /* List of weak references */
40 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000041} arrayobject;
42
Jeremy Hylton938ace62002-07-17 16:30:39 +000043static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000044
Martin v. Löwis99866332002-03-01 10:27:01 +000045#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +000046#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000047
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000048static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000049array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 char *items;
52 size_t _new_size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
55 PyErr_SetString(PyExc_BufferError,
56 "cannot resize an array that is exporting buffers");
57 return -1;
58 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 /* Bypass realloc() when a previous overallocation is large enough
61 to accommodate the newsize. If the newsize is 16 smaller than the
62 current size, then proceed with the realloc() to shrink the array.
63 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 if (self->allocated >= newsize &&
66 Py_SIZE(self) < newsize + 16 &&
67 self->ob_item != NULL) {
68 Py_SIZE(self) = newsize;
69 return 0;
70 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 if (newsize == 0) {
73 PyMem_FREE(self->ob_item);
74 self->ob_item = NULL;
75 Py_SIZE(self) = 0;
76 self->allocated = 0;
77 return 0;
78 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 /* This over-allocates proportional to the array size, making room
81 * for additional growth. The over-allocation is mild, but is
82 * enough to give linear-time amortized behavior over a long
83 * sequence of appends() in the presence of a poorly-performing
84 * system realloc().
85 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
86 * Note, the pattern starts out the same as for lists but then
87 * grows at a smaller rate so that larger arrays only overallocate
88 * by about 1/16th -- this is done because arrays are presumed to be more
89 * memory critical.
90 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
93 items = self->ob_item;
94 /* XXX The following multiplication and division does not optimize away
95 like it does for lists since the size is not known at compile time */
96 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
97 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
98 else
99 items = NULL;
100 if (items == NULL) {
101 PyErr_NoMemory();
102 return -1;
103 }
104 self->ob_item = items;
105 Py_SIZE(self) = newsize;
106 self->allocated = _new_size;
107 return 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000108}
109
Tim Petersbb307342000-09-10 05:22:54 +0000110/****************************************************************************
111Get and Set functions for each type.
112A Get function takes an arrayobject* and an integer index, returning the
113array value at that index wrapped in an appropriate PyObject*.
114A Set function takes an arrayobject, integer index, and PyObject*; sets
115the array value at that index to the raw C data extracted from the PyObject*,
116and returns 0 if successful, else nonzero on failure (PyObject* not of an
117appropriate type or value).
118Note that the basic Get and Set functions do NOT check that the index is
119in bounds; that's the responsibility of the caller.
120****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000121
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000122static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 long x = ((char *)ap->ob_item)[i];
126 if (x >= 128)
127 x -= 256;
128 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000129}
130
131static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000132b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 short x;
135 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
136 must use the next size up that is signed ('h') and manually do
137 the overflow checking */
138 if (!PyArg_Parse(v, "h;array item must be integer", &x))
139 return -1;
140 else if (x < -128) {
141 PyErr_SetString(PyExc_OverflowError,
142 "signed char is less than minimum");
143 return -1;
144 }
145 else if (x > 127) {
146 PyErr_SetString(PyExc_OverflowError,
147 "signed char is greater than maximum");
148 return -1;
149 }
150 if (i >= 0)
151 ((char *)ap->ob_item)[i] = (char)x;
152 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000153}
154
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000155static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 long x = ((unsigned char *)ap->ob_item)[i];
159 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000160}
161
Fred Drake541dc3b2000-06-28 17:49:30 +0000162static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000163BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 unsigned char x;
166 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
167 if (!PyArg_Parse(v, "b;array item must be integer", &x))
168 return -1;
169 if (i >= 0)
170 ((char *)ap->ob_item)[i] = x;
171 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000172}
Guido van Rossum549ab711997-01-03 19:09:47 +0000173
Martin v. Löwis99866332002-03-01 10:27:01 +0000174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
Martin v. Löwis99866332002-03-01 10:27:01 +0000178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 Py_UNICODE *p;
184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000196}
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000205
Guido van Rossum778983b1993-02-19 15:55:02 +0000206static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000207h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 short x;
210 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
211 if (!PyArg_Parse(v, "h;array item must be integer", &x))
212 return -1;
213 if (i >= 0)
214 ((short *)ap->ob_item)[i] = x;
215 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000216}
217
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000218static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000219HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000222}
223
Fred Drake541dc3b2000-06-28 17:49:30 +0000224static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000225HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 int x;
228 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
229 must use the next size up and manually do the overflow checking */
230 if (!PyArg_Parse(v, "i;array item must be integer", &x))
231 return -1;
232 else if (x < 0) {
233 PyErr_SetString(PyExc_OverflowError,
234 "unsigned short is less than minimum");
235 return -1;
236 }
237 else if (x > USHRT_MAX) {
238 PyErr_SetString(PyExc_OverflowError,
239 "unsigned short is greater than maximum");
240 return -1;
241 }
242 if (i >= 0)
243 ((short *)ap->ob_item)[i] = (short)x;
244 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000245}
Guido van Rossum549ab711997-01-03 19:09:47 +0000246
247static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000248i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000251}
252
253static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 int x;
257 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
258 if (!PyArg_Parse(v, "i;array item must be integer", &x))
259 return -1;
260 if (i >= 0)
261 ((int *)ap->ob_item)[i] = x;
262 return 0;
Guido van Rossume77a7571993-11-03 15:01:26 +0000263}
264
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000265static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000266II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 return PyLong_FromUnsignedLong(
269 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000270}
271
272static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 unsigned long x;
276 if (PyLong_Check(v)) {
277 x = PyLong_AsUnsignedLong(v);
278 if (x == (unsigned long) -1 && PyErr_Occurred())
279 return -1;
280 }
281 else {
282 long y;
283 if (!PyArg_Parse(v, "l;array item must be integer", &y))
284 return -1;
285 if (y < 0) {
286 PyErr_SetString(PyExc_OverflowError,
287 "unsigned int is less than minimum");
288 return -1;
289 }
290 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 }
293 if (x > UINT_MAX) {
294 PyErr_SetString(PyExc_OverflowError,
295 "unsigned int is greater than maximum");
296 return -1;
297 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 if (i >= 0)
300 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
301 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000302}
303
304static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000308}
309
310static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000311l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 long x;
314 if (!PyArg_Parse(v, "l;array item must be integer", &x))
315 return -1;
316 if (i >= 0)
317 ((long *)ap->ob_item)[i] = x;
318 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000319}
320
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000321static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000322LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000325}
326
327static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000328LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 unsigned long x;
331 if (PyLong_Check(v)) {
332 x = PyLong_AsUnsignedLong(v);
333 if (x == (unsigned long) -1 && PyErr_Occurred())
334 return -1;
335 }
336 else {
337 long y;
338 if (!PyArg_Parse(v, "l;array item must be integer", &y))
339 return -1;
340 if (y < 0) {
341 PyErr_SetString(PyExc_OverflowError,
342 "unsigned long is less than minimum");
343 return -1;
344 }
345 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 }
348 if (x > ULONG_MAX) {
349 PyErr_SetString(PyExc_OverflowError,
350 "unsigned long is greater than maximum");
351 return -1;
352 }
Tim Petersbb307342000-09-10 05:22:54 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (i >= 0)
355 ((unsigned long *)ap->ob_item)[i] = x;
356 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000357}
358
359static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000360f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000361{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000363}
364
365static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000366f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 float x;
369 if (!PyArg_Parse(v, "f;array item must be float", &x))
370 return -1;
371 if (i >= 0)
372 ((float *)ap->ob_item)[i] = x;
373 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000374}
375
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000376static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000377d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000380}
381
382static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000383d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000385 double x;
386 if (!PyArg_Parse(v, "d;array item must be float", &x))
387 return -1;
388 if (i >= 0)
389 ((double *)ap->ob_item)[i] = x;
390 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000391}
392
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000393
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000394/* Description of types.
395 *
396 * Don't forget to update typecode_to_mformat_code() if you add a new
397 * typecode.
398 */
Guido van Rossum234f9421993-06-17 12:35:49 +0000399static struct arraydescr descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
401 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
402 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0},
403 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
404 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
405 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
406 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
407 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
408 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
409 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
410 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
411 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000412};
Tim Petersbb307342000-09-10 05:22:54 +0000413
414/****************************************************************************
415Implementations of array object methods.
416****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000417
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000418static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 arrayobject *op;
422 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 if (size < 0) {
425 PyErr_BadInternalCall();
426 return NULL;
427 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 nbytes = size * descr->itemsize;
430 /* Check for overflow */
431 if (nbytes / descr->itemsize != (size_t)size) {
432 return PyErr_NoMemory();
433 }
434 op = (arrayobject *) type->tp_alloc(type, 0);
435 if (op == NULL) {
436 return NULL;
437 }
438 op->ob_descr = descr;
439 op->allocated = size;
440 op->weakreflist = NULL;
441 Py_SIZE(op) = size;
442 if (size <= 0) {
443 op->ob_item = NULL;
444 }
445 else {
446 op->ob_item = PyMem_NEW(char, nbytes);
447 if (op->ob_item == NULL) {
448 Py_DECREF(op);
449 return PyErr_NoMemory();
450 }
451 }
452 op->ob_exports = 0;
453 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000454}
455
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000456static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000457getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 register arrayobject *ap;
460 assert(array_Check(op));
461 ap = (arrayobject *)op;
462 assert(i>=0 && i<Py_SIZE(ap));
463 return (*ap->ob_descr->getitem)(ap, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000464}
465
466static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000467ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 char *items;
470 Py_ssize_t n = Py_SIZE(self);
471 if (v == NULL) {
472 PyErr_BadInternalCall();
473 return -1;
474 }
475 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
476 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 if (array_resize(self, n+1) == -1)
479 return -1;
480 items = self->ob_item;
481 if (where < 0) {
482 where += n;
483 if (where < 0)
484 where = 0;
485 }
486 if (where > n)
487 where = n;
488 /* appends don't need to call memmove() */
489 if (where != n)
490 memmove(items + (where+1)*self->ob_descr->itemsize,
491 items + where*self->ob_descr->itemsize,
492 (n-where)*self->ob_descr->itemsize);
493 return (*self->ob_descr->setitem)(self, where, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000494}
495
Guido van Rossum778983b1993-02-19 15:55:02 +0000496/* Methods */
497
498static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000499array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 if (op->weakreflist != NULL)
502 PyObject_ClearWeakRefs((PyObject *) op);
503 if (op->ob_item != NULL)
504 PyMem_DEL(op->ob_item);
505 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000506}
507
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000508static PyObject *
509array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 arrayobject *va, *wa;
512 PyObject *vi = NULL;
513 PyObject *wi = NULL;
514 Py_ssize_t i, k;
515 PyObject *res;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (!array_Check(v) || !array_Check(w)) {
518 Py_INCREF(Py_NotImplemented);
519 return Py_NotImplemented;
520 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 va = (arrayobject *)v;
523 wa = (arrayobject *)w;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
526 /* Shortcut: if the lengths differ, the arrays differ */
527 if (op == Py_EQ)
528 res = Py_False;
529 else
530 res = Py_True;
531 Py_INCREF(res);
532 return res;
533 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 /* Search for the first index where items are different */
536 k = 1;
537 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
538 vi = getarrayitem(v, i);
539 wi = getarrayitem(w, i);
540 if (vi == NULL || wi == NULL) {
541 Py_XDECREF(vi);
542 Py_XDECREF(wi);
543 return NULL;
544 }
545 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
546 if (k == 0)
547 break; /* Keeping vi and wi alive! */
548 Py_DECREF(vi);
549 Py_DECREF(wi);
550 if (k < 0)
551 return NULL;
552 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (k) {
555 /* No more items to compare -- compare sizes */
556 Py_ssize_t vs = Py_SIZE(va);
557 Py_ssize_t ws = Py_SIZE(wa);
558 int cmp;
559 switch (op) {
560 case Py_LT: cmp = vs < ws; break;
561 case Py_LE: cmp = vs <= ws; break;
562 case Py_EQ: cmp = vs == ws; break;
563 case Py_NE: cmp = vs != ws; break;
564 case Py_GT: cmp = vs > ws; break;
565 case Py_GE: cmp = vs >= ws; break;
566 default: return NULL; /* cannot happen */
567 }
568 if (cmp)
569 res = Py_True;
570 else
571 res = Py_False;
572 Py_INCREF(res);
573 return res;
574 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 /* We have an item that differs. First, shortcuts for EQ/NE */
577 if (op == Py_EQ) {
578 Py_INCREF(Py_False);
579 res = Py_False;
580 }
581 else if (op == Py_NE) {
582 Py_INCREF(Py_True);
583 res = Py_True;
584 }
585 else {
586 /* Compare the final item again using the proper operator */
587 res = PyObject_RichCompare(vi, wi, op);
588 }
589 Py_DECREF(vi);
590 Py_DECREF(wi);
591 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000592}
593
Martin v. Löwis18e16552006-02-15 17:27:45 +0000594static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000595array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000598}
599
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000601array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000602{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 if (i < 0 || i >= Py_SIZE(a)) {
604 PyErr_SetString(PyExc_IndexError, "array index out of range");
605 return NULL;
606 }
607 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000608}
609
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000610static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000611array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 arrayobject *np;
614 if (ilow < 0)
615 ilow = 0;
616 else if (ilow > Py_SIZE(a))
617 ilow = Py_SIZE(a);
618 if (ihigh < 0)
619 ihigh = 0;
620 if (ihigh < ilow)
621 ihigh = ilow;
622 else if (ihigh > Py_SIZE(a))
623 ihigh = Py_SIZE(a);
624 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
625 if (np == NULL)
626 return NULL;
627 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
628 (ihigh-ilow) * a->ob_descr->itemsize);
629 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000630}
631
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000632static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000633array_copy(arrayobject *a, PyObject *unused)
634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000636}
637
638PyDoc_STRVAR(copy_doc,
639"copy(array)\n\
640\n\
641 Return a copy of the array.");
642
643static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000644array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 Py_ssize_t size;
647 arrayobject *np;
648 if (!array_Check(bb)) {
649 PyErr_Format(PyExc_TypeError,
650 "can only append array (not \"%.200s\") to array",
651 Py_TYPE(bb)->tp_name);
652 return NULL;
653 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000654#define b ((arrayobject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 if (a->ob_descr != b->ob_descr) {
656 PyErr_BadArgument();
657 return NULL;
658 }
659 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
660 return PyErr_NoMemory();
661 }
662 size = Py_SIZE(a) + Py_SIZE(b);
663 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
664 if (np == NULL) {
665 return NULL;
666 }
667 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
668 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
669 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
670 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000671#undef b
672}
673
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000674static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000675array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000676{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 Py_ssize_t size;
678 arrayobject *np;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000679 Py_ssize_t oldbytes, newbytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 if (n < 0)
681 n = 0;
682 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
683 return PyErr_NoMemory();
684 }
685 size = Py_SIZE(a) * n;
686 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
687 if (np == NULL)
688 return NULL;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000689 if (n == 0)
690 return (PyObject *)np;
691 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
692 newbytes = oldbytes * n;
693 /* this follows the code in unicode_repeat */
694 if (oldbytes == 1) {
695 memset(np->ob_item, a->ob_item[0], newbytes);
696 } else {
697 Py_ssize_t done = oldbytes;
698 Py_MEMCPY(np->ob_item, a->ob_item, oldbytes);
699 while (done < newbytes) {
700 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
701 Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy);
702 done += ncopy;
703 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 }
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000705 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000706}
707
708static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000709array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000711 char *item;
712 Py_ssize_t n; /* Size of replacement array */
713 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000714#define b ((arrayobject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 if (v == NULL)
716 n = 0;
717 else if (array_Check(v)) {
718 n = Py_SIZE(b);
719 if (a == b) {
720 /* Special case "a[i:j] = a" -- copy b first */
721 int ret;
722 v = array_slice(b, 0, n);
723 if (!v)
724 return -1;
725 ret = array_ass_slice(a, ilow, ihigh, v);
726 Py_DECREF(v);
727 return ret;
728 }
729 if (b->ob_descr != a->ob_descr) {
730 PyErr_BadArgument();
731 return -1;
732 }
733 }
734 else {
735 PyErr_Format(PyExc_TypeError,
736 "can only assign array (not \"%.200s\") to array slice",
737 Py_TYPE(v)->tp_name);
738 return -1;
739 }
740 if (ilow < 0)
741 ilow = 0;
742 else if (ilow > Py_SIZE(a))
743 ilow = Py_SIZE(a);
744 if (ihigh < 0)
745 ihigh = 0;
746 if (ihigh < ilow)
747 ihigh = ilow;
748 else if (ihigh > Py_SIZE(a))
749 ihigh = Py_SIZE(a);
750 item = a->ob_item;
751 d = n - (ihigh-ilow);
752 /* Issue #4509: If the array has exported buffers and the slice
753 assignment would change the size of the array, fail early to make
754 sure we don't modify it. */
755 if (d != 0 && a->ob_exports > 0) {
756 PyErr_SetString(PyExc_BufferError,
757 "cannot resize an array that is exporting buffers");
758 return -1;
759 }
760 if (d < 0) { /* Delete -d items */
761 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
762 item + ihigh*a->ob_descr->itemsize,
763 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
764 if (array_resize(a, Py_SIZE(a) + d) == -1)
765 return -1;
766 }
767 else if (d > 0) { /* Insert d items */
768 if (array_resize(a, Py_SIZE(a) + d))
769 return -1;
770 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
771 item + ihigh*a->ob_descr->itemsize,
772 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
773 }
774 if (n > 0)
775 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
776 n*b->ob_descr->itemsize);
777 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000778#undef b
779}
780
781static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000782array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 if (i < 0 || i >= Py_SIZE(a)) {
785 PyErr_SetString(PyExc_IndexError,
786 "array assignment index out of range");
787 return -1;
788 }
789 if (v == NULL)
790 return array_ass_slice(a, i, i+1, v);
791 return (*a->ob_descr->setitem)(a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000792}
793
794static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000795setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000796{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 assert(array_Check(a));
798 return array_ass_item((arrayobject *)a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000799}
800
Martin v. Löwis99866332002-03-01 10:27:01 +0000801static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000802array_iter_extend(arrayobject *self, PyObject *bb)
803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 PyObject *it, *v;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 it = PyObject_GetIter(bb);
807 if (it == NULL)
808 return -1;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 while ((v = PyIter_Next(it)) != NULL) {
Mark Dickinson346f0af2010-08-06 09:36:57 +0000811 if (ins1(self, Py_SIZE(self), v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 Py_DECREF(v);
813 Py_DECREF(it);
814 return -1;
815 }
816 Py_DECREF(v);
817 }
818 Py_DECREF(it);
819 if (PyErr_Occurred())
820 return -1;
821 return 0;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000822}
823
824static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000825array_do_extend(arrayobject *self, PyObject *bb)
826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 Py_ssize_t size, oldsize, bbsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 if (!array_Check(bb))
830 return array_iter_extend(self, bb);
831#define b ((arrayobject *)bb)
832 if (self->ob_descr != b->ob_descr) {
833 PyErr_SetString(PyExc_TypeError,
834 "can only extend with array of same kind");
835 return -1;
836 }
837 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
838 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
839 PyErr_NoMemory();
840 return -1;
841 }
842 oldsize = Py_SIZE(self);
843 /* Get the size of bb before resizing the array since bb could be self. */
844 bbsize = Py_SIZE(bb);
845 size = oldsize + Py_SIZE(b);
846 if (array_resize(self, size) == -1)
847 return -1;
848 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
849 b->ob_item, bbsize * b->ob_descr->itemsize);
850
851 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000852#undef b
853}
854
855static PyObject *
856array_inplace_concat(arrayobject *self, PyObject *bb)
857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 if (!array_Check(bb)) {
859 PyErr_Format(PyExc_TypeError,
860 "can only extend array with array (not \"%.200s\")",
861 Py_TYPE(bb)->tp_name);
862 return NULL;
863 }
864 if (array_do_extend(self, bb) == -1)
865 return NULL;
866 Py_INCREF(self);
867 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000868}
869
870static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000871array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 char *items, *p;
874 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 if (Py_SIZE(self) > 0) {
877 if (n < 0)
878 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 if ((self->ob_descr->itemsize != 0) &&
880 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
881 return PyErr_NoMemory();
882 }
883 size = Py_SIZE(self) * self->ob_descr->itemsize;
884 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
885 return PyErr_NoMemory();
886 }
887 if (array_resize(self, n * Py_SIZE(self)) == -1)
888 return NULL;
889 items = p = self->ob_item;
890 for (i = 1; i < n; i++) {
891 p += size;
892 memcpy(p, items, size);
893 }
894 }
895 Py_INCREF(self);
896 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000897}
898
899
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000900static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000901ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 if (ins1(self, where, v) != 0)
904 return NULL;
905 Py_INCREF(Py_None);
906 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000907}
908
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000909static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000910array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 Py_ssize_t count = 0;
913 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000915 for (i = 0; i < Py_SIZE(self); i++) {
916 PyObject *selfi = getarrayitem((PyObject *)self, i);
917 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
918 Py_DECREF(selfi);
919 if (cmp > 0)
920 count++;
921 else if (cmp < 0)
922 return NULL;
923 }
924 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925}
926
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000927PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000928"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000929\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000930Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931
932static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000933array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 for (i = 0; i < Py_SIZE(self); i++) {
938 PyObject *selfi = getarrayitem((PyObject *)self, i);
939 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
940 Py_DECREF(selfi);
941 if (cmp > 0) {
942 return PyLong_FromLong((long)i);
943 }
944 else if (cmp < 0)
945 return NULL;
946 }
947 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
948 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000949}
950
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000951PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000952"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000953\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000954Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000955
Raymond Hettinger625812f2003-01-07 01:58:52 +0000956static int
957array_contains(arrayobject *self, PyObject *v)
958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 Py_ssize_t i;
960 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
963 PyObject *selfi = getarrayitem((PyObject *)self, i);
964 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
965 Py_DECREF(selfi);
966 }
967 return cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000968}
969
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000970static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000971array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 for (i = 0; i < Py_SIZE(self); i++) {
976 PyObject *selfi = getarrayitem((PyObject *)self,i);
977 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
978 Py_DECREF(selfi);
979 if (cmp > 0) {
980 if (array_ass_slice(self, i, i+1,
981 (PyObject *)NULL) != 0)
982 return NULL;
983 Py_INCREF(Py_None);
984 return Py_None;
985 }
986 else if (cmp < 0)
987 return NULL;
988 }
989 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
990 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000991}
992
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000993PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000994"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000995\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000996Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000997
998static PyObject *
999array_pop(arrayobject *self, PyObject *args)
1000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 Py_ssize_t i = -1;
1002 PyObject *v;
1003 if (!PyArg_ParseTuple(args, "|n:pop", &i))
1004 return NULL;
1005 if (Py_SIZE(self) == 0) {
1006 /* Special-case most common failure cause */
1007 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1008 return NULL;
1009 }
1010 if (i < 0)
1011 i += Py_SIZE(self);
1012 if (i < 0 || i >= Py_SIZE(self)) {
1013 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1014 return NULL;
1015 }
1016 v = getarrayitem((PyObject *)self,i);
1017 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1018 Py_DECREF(v);
1019 return NULL;
1020 }
1021 return v;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001022}
1023
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001024PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001025"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001027Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001028
1029static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001030array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 if (array_do_extend(self, bb) == -1)
1033 return NULL;
1034 Py_INCREF(Py_None);
1035 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001036}
1037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001038PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001039"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001040\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001041 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001042
1043static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001044array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 Py_ssize_t i;
1047 PyObject *v;
1048 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
1049 return NULL;
1050 return ins(self, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001051}
1052
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001053PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001054"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001055\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001056Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001057
1058
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001060array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 PyObject* retval = NULL;
1063 retval = PyTuple_New(2);
1064 if (!retval)
1065 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1068 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001071}
1072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001073PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001074"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001075\n\
1076Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001077the length in items of the buffer used to hold array's contents\n\
1078The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001079the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001080
1081
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001082static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001083array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001084{
Mark Dickinson346f0af2010-08-06 09:36:57 +00001085 return ins(self, Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001086}
1087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001088PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001089"append(x)\n\
1090\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001091Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001092
1093
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001094static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001095array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 char *p;
1098 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 switch (self->ob_descr->itemsize) {
1101 case 1:
1102 break;
1103 case 2:
1104 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1105 char p0 = p[0];
1106 p[0] = p[1];
1107 p[1] = p0;
1108 }
1109 break;
1110 case 4:
1111 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1112 char p0 = p[0];
1113 char p1 = p[1];
1114 p[0] = p[3];
1115 p[1] = p[2];
1116 p[2] = p1;
1117 p[3] = p0;
1118 }
1119 break;
1120 case 8:
1121 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1122 char p0 = p[0];
1123 char p1 = p[1];
1124 char p2 = p[2];
1125 char p3 = p[3];
1126 p[0] = p[7];
1127 p[1] = p[6];
1128 p[2] = p[5];
1129 p[3] = p[4];
1130 p[4] = p3;
1131 p[5] = p2;
1132 p[6] = p1;
1133 p[7] = p0;
1134 }
1135 break;
1136 default:
1137 PyErr_SetString(PyExc_RuntimeError,
1138 "don't know how to byteswap this array type");
1139 return NULL;
1140 }
1141 Py_INCREF(Py_None);
1142 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001143}
1144
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001145PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001146"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001147\n\
Fred Drakebf272981999-12-03 17:15:30 +00001148Byteswap all items of the array. If the items in the array are not 1, 2,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000011494, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001150
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001151static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001152array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 register Py_ssize_t itemsize = self->ob_descr->itemsize;
1155 register char *p, *q;
1156 /* little buffer to hold items while swapping */
1157 char tmp[256]; /* 8 is probably enough -- but why skimp */
1158 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (Py_SIZE(self) > 1) {
1161 for (p = self->ob_item,
1162 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1163 p < q;
1164 p += itemsize, q -= itemsize) {
1165 /* memory areas guaranteed disjoint, so memcpy
1166 * is safe (& memmove may be slower).
1167 */
1168 memcpy(tmp, p, itemsize);
1169 memcpy(p, q, itemsize);
1170 memcpy(q, tmp, itemsize);
1171 }
1172 }
Tim Petersbb307342000-09-10 05:22:54 +00001173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 Py_INCREF(Py_None);
1175 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001176}
Guido van Rossume77a7571993-11-03 15:01:26 +00001177
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001178PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001179"reverse()\n\
1180\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001181Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001182
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001183
1184/* Forward */
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001185static PyObject *array_frombytes(arrayobject *self, PyObject *args);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001186
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001187static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001188array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001189{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 PyObject *f, *b, *res;
1191 Py_ssize_t itemsize = self->ob_descr->itemsize;
1192 Py_ssize_t n, nbytes;
1193 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
1196 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 nbytes = n * itemsize;
1199 if (nbytes < 0 || nbytes/itemsize != n) {
1200 PyErr_NoMemory();
1201 return NULL;
1202 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 b = PyObject_CallMethod(f, "read", "n", nbytes);
1205 if (b == NULL)
1206 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 if (!PyBytes_Check(b)) {
1209 PyErr_SetString(PyExc_TypeError,
1210 "read() didn't return bytes");
1211 Py_DECREF(b);
1212 return NULL;
1213 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 args = Py_BuildValue("(O)", b);
1218 Py_DECREF(b);
1219 if (args == NULL)
1220 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001221
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001222 res = array_frombytes(self, args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 Py_DECREF(args);
1224 if (res == NULL)
1225 return NULL;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 if (not_enough_bytes) {
1228 PyErr_SetString(PyExc_EOFError,
1229 "read() didn't return enough bytes");
1230 Py_DECREF(res);
1231 return NULL;
1232 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001235}
1236
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001237PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001238"fromfile(f, n)\n\
1239\n\
1240Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001241array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001242
1243
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001244static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001245array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1248 /* Write 64K blocks at a time */
1249 /* XXX Make the block size settable */
1250 int BLOCKSIZE = 64*1024;
1251 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1252 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 if (Py_SIZE(self) == 0)
1255 goto done;
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 for (i = 0; i < nblocks; i++) {
1258 char* ptr = self->ob_item + i*BLOCKSIZE;
1259 Py_ssize_t size = BLOCKSIZE;
1260 PyObject *bytes, *res;
1261 if (i*BLOCKSIZE + size > nbytes)
1262 size = nbytes - i*BLOCKSIZE;
1263 bytes = PyBytes_FromStringAndSize(ptr, size);
1264 if (bytes == NULL)
1265 return NULL;
1266 res = PyObject_CallMethod(f, "write", "O", bytes);
1267 Py_DECREF(bytes);
1268 if (res == NULL)
1269 return NULL;
1270 Py_DECREF(res); /* drop write result */
1271 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001272
1273 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001274 Py_INCREF(Py_None);
1275 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001276}
1277
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001278PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001279"tofile(f)\n\
1280\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001281Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001282
1283
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001284static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001285array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001286{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 if (!PyList_Check(list)) {
1290 PyErr_SetString(PyExc_TypeError, "arg must be list");
1291 return NULL;
1292 }
1293 n = PyList_Size(list);
1294 if (n > 0) {
1295 Py_ssize_t i, old_size;
1296 old_size = Py_SIZE(self);
1297 if (array_resize(self, old_size + n) == -1)
1298 return NULL;
1299 for (i = 0; i < n; i++) {
1300 PyObject *v = PyList_GetItem(list, i);
1301 if ((*self->ob_descr->setitem)(self,
1302 Py_SIZE(self) - n + i, v) != 0) {
1303 array_resize(self, old_size);
1304 return NULL;
1305 }
1306 }
1307 }
1308 Py_INCREF(Py_None);
1309 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001310}
1311
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001312PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001313"fromlist(list)\n\
1314\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001315Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001316
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001318array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 PyObject *list = PyList_New(Py_SIZE(self));
1321 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 if (list == NULL)
1324 return NULL;
1325 for (i = 0; i < Py_SIZE(self); i++) {
1326 PyObject *v = getarrayitem((PyObject *)self, i);
1327 if (v == NULL) {
1328 Py_DECREF(list);
1329 return NULL;
1330 }
1331 PyList_SetItem(list, i, v);
1332 }
1333 return list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001334}
1335
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001336PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001337"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001338\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001339Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001340
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001341static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001342frombytes(arrayobject *self, Py_buffer *buffer)
Guido van Rossum778983b1993-02-19 15:55:02 +00001343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 int itemsize = self->ob_descr->itemsize;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001345 Py_ssize_t n;
1346 if (buffer->itemsize != 1) {
1347 PyBuffer_Release(buffer);
1348 PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required.");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001350 }
1351 n = buffer->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 if (n % itemsize != 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001353 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 PyErr_SetString(PyExc_ValueError,
1355 "string length not a multiple of item size");
1356 return NULL;
1357 }
1358 n = n / itemsize;
1359 if (n > 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001360 Py_ssize_t old_size = Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 if ((n > PY_SSIZE_T_MAX - old_size) ||
1362 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001363 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001364 return PyErr_NoMemory();
1365 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001366 if (array_resize(self, old_size + n) == -1) {
1367 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001369 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 memcpy(self->ob_item + old_size * itemsize,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001371 buffer->buf, n * itemsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001373 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 Py_INCREF(Py_None);
1375 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001376}
1377
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001378static PyObject *
1379array_fromstring(arrayobject *self, PyObject *args)
1380{
1381 Py_buffer buffer;
1382 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1383 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1384 return NULL;
1385 if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer))
1386 return NULL;
1387 else
1388 return frombytes(self, &buffer);
1389}
1390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001391PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001392"fromstring(string)\n\
1393\n\
1394Appends items from the string, interpreting it as an array of machine\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001395values, as if it had been read from a file using the fromfile() method).\n\
1396\n\
1397This method is deprecated. Use frombytes instead.");
1398
1399
1400static PyObject *
1401array_frombytes(arrayobject *self, PyObject *args)
1402{
1403 Py_buffer buffer;
1404 if (!PyArg_ParseTuple(args, "y*:frombytes", &buffer))
1405 return NULL;
1406 else
1407 return frombytes(self, &buffer);
1408}
1409
1410PyDoc_STRVAR(frombytes_doc,
1411"frombytes(bytestring)\n\
1412\n\
1413Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001414values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001415
1416
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001417static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001418array_tobytes(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1421 return PyBytes_FromStringAndSize(self->ob_item,
1422 Py_SIZE(self) * self->ob_descr->itemsize);
1423 } else {
1424 return PyErr_NoMemory();
1425 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001426}
1427
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001428PyDoc_STRVAR(tobytes_doc,
1429"tobytes() -> bytes\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001430\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001431Convert the array to an array of machine values and return the bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001432representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001433
Martin v. Löwis99866332002-03-01 10:27:01 +00001434
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001435static PyObject *
1436array_tostring(arrayobject *self, PyObject *unused)
1437{
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001438 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001439 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1440 return NULL;
1441 return array_tobytes(self, unused);
1442}
1443
1444PyDoc_STRVAR(tostring_doc,
1445"tostring() -> bytes\n\
1446\n\
1447Convert the array to an array of machine values and return the bytes\n\
1448representation.\n\
1449\n\
1450This method is deprecated. Use tobytes instead.");
1451
Martin v. Löwis99866332002-03-01 10:27:01 +00001452
Martin v. Löwis99866332002-03-01 10:27:01 +00001453static PyObject *
1454array_fromunicode(arrayobject *self, PyObject *args)
1455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 Py_UNICODE *ustr;
1457 Py_ssize_t n;
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00001458 Py_UNICODE typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1461 return NULL;
1462 typecode = self->ob_descr->typecode;
1463 if ((typecode != 'u')) {
1464 PyErr_SetString(PyExc_ValueError,
1465 "fromunicode() may only be called on "
1466 "unicode type arrays");
1467 return NULL;
1468 }
1469 if (n > 0) {
1470 Py_ssize_t old_size = Py_SIZE(self);
1471 if (array_resize(self, old_size + n) == -1)
1472 return NULL;
1473 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
1474 ustr, n * sizeof(Py_UNICODE));
1475 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 Py_INCREF(Py_None);
1478 return Py_None;
Martin v. Löwis99866332002-03-01 10:27:01 +00001479}
1480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001481PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001482"fromunicode(ustr)\n\
1483\n\
1484Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001485The array must be a unicode type array; otherwise a ValueError\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001486is raised. Use array.frombytes(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001488
1489
1490static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001491array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001492{
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00001493 Py_UNICODE typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 typecode = self->ob_descr->typecode;
1495 if ((typecode != 'u')) {
1496 PyErr_SetString(PyExc_ValueError,
1497 "tounicode() may only be called on unicode type arrays");
1498 return NULL;
1499 }
1500 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001501}
1502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001504"tounicode() -> unicode\n\
1505\n\
1506Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001507a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001508array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001510
Martin v. Löwis99866332002-03-01 10:27:01 +00001511
1512
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001513/*********************** Pickling support ************************/
1514
1515enum machine_format_code {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 UNKNOWN_FORMAT = -1,
1517 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
1518 * array type code cannot be interpreted. When this occurs, a list of
1519 * Python objects is used to represent the content of the array
1520 * instead of using the memory content of the array directly. In that
1521 * case, the array_reconstructor mechanism is bypassed completely, and
1522 * the standard array constructor is used instead.
1523 *
1524 * This is will most likely occur when the machine doesn't use IEEE
1525 * floating-point numbers.
1526 */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 UNSIGNED_INT8 = 0,
1529 SIGNED_INT8 = 1,
1530 UNSIGNED_INT16_LE = 2,
1531 UNSIGNED_INT16_BE = 3,
1532 SIGNED_INT16_LE = 4,
1533 SIGNED_INT16_BE = 5,
1534 UNSIGNED_INT32_LE = 6,
1535 UNSIGNED_INT32_BE = 7,
1536 SIGNED_INT32_LE = 8,
1537 SIGNED_INT32_BE = 9,
1538 UNSIGNED_INT64_LE = 10,
1539 UNSIGNED_INT64_BE = 11,
1540 SIGNED_INT64_LE = 12,
1541 SIGNED_INT64_BE = 13,
1542 IEEE_754_FLOAT_LE = 14,
1543 IEEE_754_FLOAT_BE = 15,
1544 IEEE_754_DOUBLE_LE = 16,
1545 IEEE_754_DOUBLE_BE = 17,
1546 UTF16_LE = 18,
1547 UTF16_BE = 19,
1548 UTF32_LE = 20,
1549 UTF32_BE = 21
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001550};
1551#define MACHINE_FORMAT_CODE_MIN 0
1552#define MACHINE_FORMAT_CODE_MAX 21
1553
1554static const struct mformatdescr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 size_t size;
1556 int is_signed;
1557 int is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001558} mformat_descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1560 {1, 1, 0}, /* 1: SIGNED_INT8 */
1561 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1562 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1563 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1564 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1565 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1566 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1567 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1568 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1569 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1570 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1571 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1572 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1573 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1574 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1575 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1576 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1577 {4, 0, 0}, /* 18: UTF16_LE */
1578 {4, 0, 1}, /* 19: UTF16_BE */
1579 {8, 0, 0}, /* 20: UTF32_LE */
1580 {8, 0, 1} /* 21: UTF32_BE */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001581};
1582
1583
1584/*
1585 * Internal: This function is used to find the machine format of a given
1586 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1587 * be found.
1588 */
1589static enum machine_format_code
1590typecode_to_mformat_code(int typecode)
1591{
Alexandre Vassalotti7aaa7702009-07-17 03:51:27 +00001592#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 const int is_big_endian = 1;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001594#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 const int is_big_endian = 0;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001596#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 size_t intsize;
1598 int is_signed;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 switch (typecode) {
1601 case 'b':
1602 return SIGNED_INT8;
1603 case 'B':
1604 return UNSIGNED_INT8;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 case 'u':
1607 if (sizeof(Py_UNICODE) == 2) {
1608 return UTF16_LE + is_big_endian;
1609 }
1610 if (sizeof(Py_UNICODE) == 4) {
1611 return UTF32_LE + is_big_endian;
1612 }
1613 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 case 'f':
1616 if (sizeof(float) == 4) {
1617 const float y = 16711938.0;
1618 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1619 return IEEE_754_FLOAT_BE;
1620 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1621 return IEEE_754_FLOAT_LE;
1622 }
1623 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 case 'd':
1626 if (sizeof(double) == 8) {
1627 const double x = 9006104071832581.0;
1628 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1629 return IEEE_754_DOUBLE_BE;
1630 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1631 return IEEE_754_DOUBLE_LE;
1632 }
1633 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 /* Integers */
1636 case 'h':
1637 intsize = sizeof(short);
1638 is_signed = 1;
1639 break;
1640 case 'H':
1641 intsize = sizeof(short);
1642 is_signed = 0;
1643 break;
1644 case 'i':
1645 intsize = sizeof(int);
1646 is_signed = 1;
1647 break;
1648 case 'I':
1649 intsize = sizeof(int);
1650 is_signed = 0;
1651 break;
1652 case 'l':
1653 intsize = sizeof(long);
1654 is_signed = 1;
1655 break;
1656 case 'L':
1657 intsize = sizeof(long);
1658 is_signed = 0;
1659 break;
1660 default:
1661 return UNKNOWN_FORMAT;
1662 }
1663 switch (intsize) {
1664 case 2:
1665 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1666 case 4:
1667 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1668 case 8:
1669 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1670 default:
1671 return UNKNOWN_FORMAT;
1672 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001673}
1674
1675/* Forward declaration. */
1676static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1677
1678/*
1679 * Internal: This function wraps the array constructor--i.e., array_new()--to
1680 * allow the creation of array objects from C code without having to deal
1681 * directly the tuple argument of array_new(). The typecode argument is a
1682 * Unicode character value, like 'i' or 'f' for example, representing an array
1683 * type code. The items argument is a bytes or a list object from which
1684 * contains the initial value of the array.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 *
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001686 * On success, this functions returns the array object created. Otherwise,
1687 * NULL is returned to indicate a failure.
1688 */
1689static PyObject *
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001690make_array(PyTypeObject *arraytype, Py_UNICODE typecode, PyObject *items)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 PyObject *new_args;
1693 PyObject *array_obj;
1694 PyObject *typecode_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 assert(arraytype != NULL);
1697 assert(items != NULL);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001698
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001699 typecode_obj = PyUnicode_FromUnicode(&typecode, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 if (typecode_obj == NULL)
1701 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 new_args = PyTuple_New(2);
1704 if (new_args == NULL)
1705 return NULL;
1706 Py_INCREF(items);
1707 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1708 PyTuple_SET_ITEM(new_args, 1, items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 array_obj = array_new(arraytype, new_args, NULL);
1711 Py_DECREF(new_args);
1712 if (array_obj == NULL)
1713 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 return array_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001716}
1717
1718/*
1719 * This functions is a special constructor used when unpickling an array. It
1720 * provides a portable way to rebuild an array from its memory representation.
1721 */
1722static PyObject *
1723array_reconstructor(PyObject *self, PyObject *args)
1724{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 PyTypeObject *arraytype;
1726 PyObject *items;
1727 PyObject *converted_items;
1728 PyObject *result;
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001729 int typecode_int;
1730 Py_UNICODE typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 enum machine_format_code mformat_code;
1732 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001735 &arraytype, &typecode_int, &mformat_code, &items))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001737
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001738 typecode = (Py_UNICODE)typecode_int;
1739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 if (!PyType_Check(arraytype)) {
1741 PyErr_Format(PyExc_TypeError,
1742 "first argument must a type object, not %.200s",
1743 Py_TYPE(arraytype)->tp_name);
1744 return NULL;
1745 }
1746 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1747 PyErr_Format(PyExc_TypeError,
1748 "%.200s is not a subtype of %.200s",
1749 arraytype->tp_name, Arraytype.tp_name);
1750 return NULL;
1751 }
1752 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1753 if (descr->typecode == typecode)
1754 break;
1755 }
1756 if (descr->typecode == '\0') {
1757 PyErr_SetString(PyExc_ValueError,
1758 "second argument must be a valid type code");
1759 return NULL;
1760 }
1761 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
1762 mformat_code > MACHINE_FORMAT_CODE_MAX) {
1763 PyErr_SetString(PyExc_ValueError,
1764 "third argument must be a valid machine format code.");
1765 return NULL;
1766 }
1767 if (!PyBytes_Check(items)) {
1768 PyErr_Format(PyExc_TypeError,
1769 "fourth argument should be bytes, not %.200s",
1770 Py_TYPE(items)->tp_name);
1771 return NULL;
1772 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 /* Fast path: No decoding has to be done. */
1775 if (mformat_code == typecode_to_mformat_code(typecode) ||
1776 mformat_code == UNKNOWN_FORMAT) {
1777 return make_array(arraytype, typecode, items);
1778 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 /* Slow path: Decode the byte string according to the given machine
1781 * format code. This occurs when the computer unpickling the array
1782 * object is architecturally different from the one that pickled the
1783 * array.
1784 */
1785 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
1786 PyErr_SetString(PyExc_ValueError,
1787 "string length not a multiple of item size");
1788 return NULL;
1789 }
1790 switch (mformat_code) {
1791 case IEEE_754_FLOAT_LE:
1792 case IEEE_754_FLOAT_BE: {
1793 int i;
1794 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
1795 Py_ssize_t itemcount = Py_SIZE(items) / 4;
1796 const unsigned char *memstr =
1797 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 converted_items = PyList_New(itemcount);
1800 if (converted_items == NULL)
1801 return NULL;
1802 for (i = 0; i < itemcount; i++) {
1803 PyObject *pyfloat = PyFloat_FromDouble(
1804 _PyFloat_Unpack4(&memstr[i * 4], le));
1805 if (pyfloat == NULL) {
1806 Py_DECREF(converted_items);
1807 return NULL;
1808 }
1809 PyList_SET_ITEM(converted_items, i, pyfloat);
1810 }
1811 break;
1812 }
1813 case IEEE_754_DOUBLE_LE:
1814 case IEEE_754_DOUBLE_BE: {
1815 int i;
1816 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
1817 Py_ssize_t itemcount = Py_SIZE(items) / 8;
1818 const unsigned char *memstr =
1819 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 converted_items = PyList_New(itemcount);
1822 if (converted_items == NULL)
1823 return NULL;
1824 for (i = 0; i < itemcount; i++) {
1825 PyObject *pyfloat = PyFloat_FromDouble(
1826 _PyFloat_Unpack8(&memstr[i * 8], le));
1827 if (pyfloat == NULL) {
1828 Py_DECREF(converted_items);
1829 return NULL;
1830 }
1831 PyList_SET_ITEM(converted_items, i, pyfloat);
1832 }
1833 break;
1834 }
1835 case UTF16_LE:
1836 case UTF16_BE: {
1837 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
1838 converted_items = PyUnicode_DecodeUTF16(
1839 PyBytes_AS_STRING(items), Py_SIZE(items),
1840 "strict", &byteorder);
1841 if (converted_items == NULL)
1842 return NULL;
1843 break;
1844 }
1845 case UTF32_LE:
1846 case UTF32_BE: {
1847 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
1848 converted_items = PyUnicode_DecodeUTF32(
1849 PyBytes_AS_STRING(items), Py_SIZE(items),
1850 "strict", &byteorder);
1851 if (converted_items == NULL)
1852 return NULL;
1853 break;
1854 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 case UNSIGNED_INT8:
1857 case SIGNED_INT8:
1858 case UNSIGNED_INT16_LE:
1859 case UNSIGNED_INT16_BE:
1860 case SIGNED_INT16_LE:
1861 case SIGNED_INT16_BE:
1862 case UNSIGNED_INT32_LE:
1863 case UNSIGNED_INT32_BE:
1864 case SIGNED_INT32_LE:
1865 case SIGNED_INT32_BE:
1866 case UNSIGNED_INT64_LE:
1867 case UNSIGNED_INT64_BE:
1868 case SIGNED_INT64_LE:
1869 case SIGNED_INT64_BE: {
1870 int i;
1871 const struct mformatdescr mf_descr =
1872 mformat_descriptors[mformat_code];
1873 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
1874 const unsigned char *memstr =
1875 (unsigned char *)PyBytes_AS_STRING(items);
1876 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 /* If possible, try to pack array's items using a data type
1879 * that fits better. This may result in an array with narrower
1880 * or wider elements.
1881 *
1882 * For example, if a 32-bit machine pickles a L-code array of
1883 * unsigned longs, then the array will be unpickled by 64-bit
1884 * machine as an I-code array of unsigned ints.
1885 *
1886 * XXX: Is it possible to write a unit test for this?
1887 */
1888 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1889 if (descr->is_integer_type &&
1890 descr->itemsize == mf_descr.size &&
1891 descr->is_signed == mf_descr.is_signed)
1892 typecode = descr->typecode;
1893 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001895 converted_items = PyList_New(itemcount);
1896 if (converted_items == NULL)
1897 return NULL;
1898 for (i = 0; i < itemcount; i++) {
1899 PyObject *pylong;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 pylong = _PyLong_FromByteArray(
1902 &memstr[i * mf_descr.size],
1903 mf_descr.size,
1904 !mf_descr.is_big_endian,
1905 mf_descr.is_signed);
1906 if (pylong == NULL) {
1907 Py_DECREF(converted_items);
1908 return NULL;
1909 }
1910 PyList_SET_ITEM(converted_items, i, pylong);
1911 }
1912 break;
1913 }
1914 case UNKNOWN_FORMAT:
1915 /* Impossible, but needed to shut up GCC about the unhandled
1916 * enumeration value.
1917 */
1918 default:
1919 PyErr_BadArgument();
1920 return NULL;
1921 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 result = make_array(arraytype, typecode, converted_items);
1924 Py_DECREF(converted_items);
1925 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001926}
1927
1928static PyObject *
1929array_reduce_ex(arrayobject *array, PyObject *value)
1930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 PyObject *dict;
1932 PyObject *result;
1933 PyObject *array_str;
1934 int typecode = array->ob_descr->typecode;
1935 int mformat_code;
1936 static PyObject *array_reconstructor = NULL;
1937 long protocol;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 if (array_reconstructor == NULL) {
1940 PyObject *array_module = PyImport_ImportModule("array");
1941 if (array_module == NULL)
1942 return NULL;
1943 array_reconstructor = PyObject_GetAttrString(
1944 array_module,
1945 "_array_reconstructor");
1946 Py_DECREF(array_module);
1947 if (array_reconstructor == NULL)
1948 return NULL;
1949 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 if (!PyLong_Check(value)) {
1952 PyErr_SetString(PyExc_TypeError,
1953 "__reduce_ex__ argument should an integer");
1954 return NULL;
1955 }
1956 protocol = PyLong_AsLong(value);
1957 if (protocol == -1 && PyErr_Occurred())
1958 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1961 if (dict == NULL) {
1962 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1963 return NULL;
1964 PyErr_Clear();
1965 dict = Py_None;
1966 Py_INCREF(dict);
1967 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001969 mformat_code = typecode_to_mformat_code(typecode);
1970 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
1971 /* Convert the array to a list if we got something weird
1972 * (e.g., non-IEEE floats), or we are pickling the array using
1973 * a Python 2.x compatible protocol.
1974 *
1975 * It is necessary to use a list representation for Python 2.x
1976 * compatible pickle protocol, since Python 2's str objects
1977 * are unpickled as unicode by Python 3. Thus it is impossible
1978 * to make arrays unpicklable by Python 3 by using their memory
1979 * representation, unless we resort to ugly hacks such as
1980 * coercing unicode objects to bytes in array_reconstructor.
1981 */
1982 PyObject *list;
1983 list = array_tolist(array, NULL);
1984 if (list == NULL) {
1985 Py_DECREF(dict);
1986 return NULL;
1987 }
1988 result = Py_BuildValue(
1989 "O(CO)O", Py_TYPE(array), typecode, list, dict);
1990 Py_DECREF(list);
1991 Py_DECREF(dict);
1992 return result;
1993 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001994
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001995 array_str = array_tobytes(array, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 if (array_str == NULL) {
1997 Py_DECREF(dict);
1998 return NULL;
1999 }
2000 result = Py_BuildValue(
2001 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
2002 mformat_code, array_str, dict);
2003 Py_DECREF(dict);
2004 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002005}
2006
2007PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2008
Martin v. Löwis99866332002-03-01 10:27:01 +00002009static PyObject *
2010array_get_typecode(arrayobject *a, void *closure)
2011{
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002012 Py_UNICODE tc = a->ob_descr->typecode;
2013 return PyUnicode_FromUnicode(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00002014}
2015
2016static PyObject *
2017array_get_itemsize(arrayobject *a, void *closure)
2018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00002020}
2021
2022static PyGetSetDef array_getsets [] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 {"typecode", (getter) array_get_typecode, NULL,
2024 "the typecode character used to create the array"},
2025 {"itemsize", (getter) array_get_itemsize, NULL,
2026 "the size, in bytes, of one array item"},
2027 {NULL}
Martin v. Löwis99866332002-03-01 10:27:01 +00002028};
2029
Martin v. Löwis59683e82008-06-13 07:50:45 +00002030static PyMethodDef array_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 {"append", (PyCFunction)array_append, METH_O,
2032 append_doc},
2033 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
2034 buffer_info_doc},
2035 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
2036 byteswap_doc},
2037 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
2038 copy_doc},
2039 {"count", (PyCFunction)array_count, METH_O,
2040 count_doc},
2041 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
2042 copy_doc},
2043 {"extend", (PyCFunction)array_extend, METH_O,
2044 extend_doc},
2045 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
2046 fromfile_doc},
2047 {"fromlist", (PyCFunction)array_fromlist, METH_O,
2048 fromlist_doc},
2049 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
2050 fromstring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002051 {"frombytes", (PyCFunction)array_frombytes, METH_VARARGS,
2052 frombytes_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
2054 fromunicode_doc},
2055 {"index", (PyCFunction)array_index, METH_O,
2056 index_doc},
2057 {"insert", (PyCFunction)array_insert, METH_VARARGS,
2058 insert_doc},
2059 {"pop", (PyCFunction)array_pop, METH_VARARGS,
2060 pop_doc},
2061 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
2062 reduce_doc},
2063 {"remove", (PyCFunction)array_remove, METH_O,
2064 remove_doc},
2065 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
2066 reverse_doc},
2067/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
2068 sort_doc},*/
2069 {"tofile", (PyCFunction)array_tofile, METH_O,
2070 tofile_doc},
2071 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
2072 tolist_doc},
2073 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
2074 tostring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002075 {"tobytes", (PyCFunction)array_tobytes, METH_NOARGS,
2076 tobytes_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
2078 tounicode_doc},
2079 {NULL, NULL} /* sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +00002080};
2081
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002082static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002083array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002084{
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002085 Py_UNICODE typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 PyObject *s, *v = NULL;
2087 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 len = Py_SIZE(a);
2090 typecode = a->ob_descr->typecode;
2091 if (len == 0) {
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002092 return PyUnicode_FromFormat("array('%c')", (int)typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 }
2094 if ((typecode == 'u'))
2095 v = array_tounicode(a, NULL);
2096 else
2097 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002098
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002099 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 Py_DECREF(v);
2101 return s;
Guido van Rossum778983b1993-02-19 15:55:02 +00002102}
2103
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002104static PyObject*
2105array_subscr(arrayobject* self, PyObject* item)
2106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 if (PyIndex_Check(item)) {
2108 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2109 if (i==-1 && PyErr_Occurred()) {
2110 return NULL;
2111 }
2112 if (i < 0)
2113 i += Py_SIZE(self);
2114 return array_item(self, i);
2115 }
2116 else if (PySlice_Check(item)) {
2117 Py_ssize_t start, stop, step, slicelength, cur, i;
2118 PyObject* result;
2119 arrayobject* ar;
2120 int itemsize = self->ob_descr->itemsize;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002121
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002122 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 &start, &stop, &step, &slicelength) < 0) {
2124 return NULL;
2125 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002127 if (slicelength <= 0) {
2128 return newarrayobject(&Arraytype, 0, self->ob_descr);
2129 }
2130 else if (step == 1) {
2131 PyObject *result = newarrayobject(&Arraytype,
2132 slicelength, self->ob_descr);
2133 if (result == NULL)
2134 return NULL;
2135 memcpy(((arrayobject *)result)->ob_item,
2136 self->ob_item + start * itemsize,
2137 slicelength * itemsize);
2138 return result;
2139 }
2140 else {
2141 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2142 if (!result) return NULL;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002144 ar = (arrayobject*)result;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 for (cur = start, i = 0; i < slicelength;
2147 cur += step, i++) {
2148 memcpy(ar->ob_item + i*itemsize,
2149 self->ob_item + cur*itemsize,
2150 itemsize);
2151 }
2152
2153 return result;
2154 }
2155 }
2156 else {
2157 PyErr_SetString(PyExc_TypeError,
2158 "array indices must be integers");
2159 return NULL;
2160 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002161}
2162
2163static int
2164array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2165{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 Py_ssize_t start, stop, step, slicelength, needed;
2167 arrayobject* other;
2168 int itemsize;
Thomas Woutersed03b412007-08-28 21:37:11 +00002169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 if (PyIndex_Check(item)) {
2171 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 if (i == -1 && PyErr_Occurred())
2174 return -1;
2175 if (i < 0)
2176 i += Py_SIZE(self);
2177 if (i < 0 || i >= Py_SIZE(self)) {
2178 PyErr_SetString(PyExc_IndexError,
2179 "array assignment index out of range");
2180 return -1;
2181 }
2182 if (value == NULL) {
2183 /* Fall through to slice assignment */
2184 start = i;
2185 stop = i + 1;
2186 step = 1;
2187 slicelength = 1;
2188 }
2189 else
2190 return (*self->ob_descr->setitem)(self, i, value);
2191 }
2192 else if (PySlice_Check(item)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002193 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 Py_SIZE(self), &start, &stop,
2195 &step, &slicelength) < 0) {
2196 return -1;
2197 }
2198 }
2199 else {
2200 PyErr_SetString(PyExc_TypeError,
2201 "array indices must be integer");
2202 return -1;
2203 }
2204 if (value == NULL) {
2205 other = NULL;
2206 needed = 0;
2207 }
2208 else if (array_Check(value)) {
2209 other = (arrayobject *)value;
2210 needed = Py_SIZE(other);
2211 if (self == other) {
2212 /* Special case "self[i:j] = self" -- copy self first */
2213 int ret;
2214 value = array_slice(other, 0, needed);
2215 if (value == NULL)
2216 return -1;
2217 ret = array_ass_subscr(self, item, value);
2218 Py_DECREF(value);
2219 return ret;
2220 }
2221 if (other->ob_descr != self->ob_descr) {
2222 PyErr_BadArgument();
2223 return -1;
2224 }
2225 }
2226 else {
2227 PyErr_Format(PyExc_TypeError,
2228 "can only assign array (not \"%.200s\") to array slice",
2229 Py_TYPE(value)->tp_name);
2230 return -1;
2231 }
2232 itemsize = self->ob_descr->itemsize;
2233 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2234 if ((step > 0 && stop < start) ||
2235 (step < 0 && stop > start))
2236 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 /* Issue #4509: If the array has exported buffers and the slice
2239 assignment would change the size of the array, fail early to make
2240 sure we don't modify it. */
2241 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2242 PyErr_SetString(PyExc_BufferError,
2243 "cannot resize an array that is exporting buffers");
2244 return -1;
2245 }
Mark Dickinsonbc099642010-01-29 17:27:24 +00002246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 if (step == 1) {
2248 if (slicelength > needed) {
2249 memmove(self->ob_item + (start + needed) * itemsize,
2250 self->ob_item + stop * itemsize,
2251 (Py_SIZE(self) - stop) * itemsize);
2252 if (array_resize(self, Py_SIZE(self) +
2253 needed - slicelength) < 0)
2254 return -1;
2255 }
2256 else if (slicelength < needed) {
2257 if (array_resize(self, Py_SIZE(self) +
2258 needed - slicelength) < 0)
2259 return -1;
2260 memmove(self->ob_item + (start + needed) * itemsize,
2261 self->ob_item + stop * itemsize,
2262 (Py_SIZE(self) - start - needed) * itemsize);
2263 }
2264 if (needed > 0)
2265 memcpy(self->ob_item + start * itemsize,
2266 other->ob_item, needed * itemsize);
2267 return 0;
2268 }
2269 else if (needed == 0) {
2270 /* Delete slice */
2271 size_t cur;
2272 Py_ssize_t i;
Thomas Woutersed03b412007-08-28 21:37:11 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 if (step < 0) {
2275 stop = start + 1;
2276 start = stop + step * (slicelength - 1) - 1;
2277 step = -step;
2278 }
2279 for (cur = start, i = 0; i < slicelength;
2280 cur += step, i++) {
2281 Py_ssize_t lim = step - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 if (cur + step >= (size_t)Py_SIZE(self))
2284 lim = Py_SIZE(self) - cur - 1;
2285 memmove(self->ob_item + (cur - i) * itemsize,
2286 self->ob_item + (cur + 1) * itemsize,
2287 lim * itemsize);
2288 }
2289 cur = start + slicelength * step;
2290 if (cur < (size_t)Py_SIZE(self)) {
2291 memmove(self->ob_item + (cur-slicelength) * itemsize,
2292 self->ob_item + cur * itemsize,
2293 (Py_SIZE(self) - cur) * itemsize);
2294 }
2295 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2296 return -1;
2297 return 0;
2298 }
2299 else {
2300 Py_ssize_t cur, i;
2301
2302 if (needed != slicelength) {
2303 PyErr_Format(PyExc_ValueError,
2304 "attempt to assign array of size %zd "
2305 "to extended slice of size %zd",
2306 needed, slicelength);
2307 return -1;
2308 }
2309 for (cur = start, i = 0; i < slicelength;
2310 cur += step, i++) {
2311 memcpy(self->ob_item + cur * itemsize,
2312 other->ob_item + i * itemsize,
2313 itemsize);
2314 }
2315 return 0;
2316 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002317}
2318
2319static PyMappingMethods array_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002320 (lenfunc)array_length,
2321 (binaryfunc)array_subscr,
2322 (objobjargproc)array_ass_subscr
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002323};
2324
Guido van Rossumd8faa362007-04-27 19:54:29 +00002325static const void *emptybuf = "";
2326
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002327
2328static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002329array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 if (view==NULL) goto finish;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 view->buf = (void *)self->ob_item;
2334 view->obj = (PyObject*)self;
2335 Py_INCREF(self);
2336 if (view->buf == NULL)
2337 view->buf = (void *)emptybuf;
2338 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2339 view->readonly = 0;
2340 view->ndim = 1;
2341 view->itemsize = self->ob_descr->itemsize;
2342 view->suboffsets = NULL;
2343 view->shape = NULL;
2344 if ((flags & PyBUF_ND)==PyBUF_ND) {
2345 view->shape = &((Py_SIZE(self)));
2346 }
2347 view->strides = NULL;
2348 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2349 view->strides = &(view->itemsize);
2350 view->format = NULL;
2351 view->internal = NULL;
2352 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
2353 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00002354#ifdef Py_UNICODE_WIDE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 if (self->ob_descr->typecode == 'u') {
2356 view->format = "w";
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002357 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002358#endif
2359 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002360
2361 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 self->ob_exports++;
2363 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002364}
2365
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002366static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002367array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002368{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002370}
2371
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002372static PySequenceMethods array_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 (lenfunc)array_length, /*sq_length*/
2374 (binaryfunc)array_concat, /*sq_concat*/
2375 (ssizeargfunc)array_repeat, /*sq_repeat*/
2376 (ssizeargfunc)array_item, /*sq_item*/
2377 0, /*sq_slice*/
2378 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2379 0, /*sq_ass_slice*/
2380 (objobjproc)array_contains, /*sq_contains*/
2381 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2382 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002383};
2384
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002385static PyBufferProcs array_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 (getbufferproc)array_buffer_getbuf,
2387 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002388};
2389
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002390static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002391array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002392{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 int c;
2394 PyObject *initial = NULL, *it = NULL;
2395 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00002396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
2398 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2401 return NULL;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 if (!(initial == NULL || PyList_Check(initial)
2404 || PyByteArray_Check(initial)
2405 || PyBytes_Check(initial)
2406 || PyTuple_Check(initial)
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002407 || ((c=='u') && PyUnicode_Check(initial))
2408 || (array_Check(initial)
2409 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 it = PyObject_GetIter(initial);
2411 if (it == NULL)
2412 return NULL;
2413 /* We set initial to NULL so that the subsequent code
2414 will create an empty array of the appropriate type
2415 and afterwards we can use array_iter_extend to populate
2416 the array.
2417 */
2418 initial = NULL;
2419 }
2420 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2421 if (descr->typecode == c) {
2422 PyObject *a;
2423 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002424
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002425 if (initial == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 len = 0;
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002427 else if (PyList_Check(initial))
2428 len = PyList_GET_SIZE(initial);
2429 else if (PyTuple_Check(initial) || array_Check(initial))
2430 len = Py_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 else
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002432 len = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +00002433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 a = newarrayobject(type, len, descr);
2435 if (a == NULL)
2436 return NULL;
2437
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002438 if (len > 0 && !array_Check(initial)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 Py_ssize_t i;
2440 for (i = 0; i < len; i++) {
2441 PyObject *v =
2442 PySequence_GetItem(initial, i);
2443 if (v == NULL) {
2444 Py_DECREF(a);
2445 return NULL;
2446 }
2447 if (setarrayitem(a, i, v) != 0) {
2448 Py_DECREF(v);
2449 Py_DECREF(a);
2450 return NULL;
2451 }
2452 Py_DECREF(v);
2453 }
2454 }
2455 else if (initial != NULL && (PyByteArray_Check(initial) ||
2456 PyBytes_Check(initial))) {
2457 PyObject *t_initial, *v;
2458 t_initial = PyTuple_Pack(1, initial);
2459 if (t_initial == NULL) {
2460 Py_DECREF(a);
2461 return NULL;
2462 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002463 v = array_frombytes((arrayobject *)a,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002464 t_initial);
2465 Py_DECREF(t_initial);
2466 if (v == NULL) {
2467 Py_DECREF(a);
2468 return NULL;
2469 }
2470 Py_DECREF(v);
2471 }
2472 else if (initial != NULL && PyUnicode_Check(initial)) {
2473 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
2474 if (n > 0) {
2475 arrayobject *self = (arrayobject *)a;
2476 char *item = self->ob_item;
2477 item = (char *)PyMem_Realloc(item, n);
2478 if (item == NULL) {
2479 PyErr_NoMemory();
2480 Py_DECREF(a);
2481 return NULL;
2482 }
2483 self->ob_item = item;
2484 Py_SIZE(self) = n / sizeof(Py_UNICODE);
2485 memcpy(item, PyUnicode_AS_DATA(initial), n);
2486 self->allocated = Py_SIZE(self);
2487 }
2488 }
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002489 else if (initial != NULL && array_Check(initial)) {
2490 arrayobject *self = (arrayobject *)a;
2491 arrayobject *other = (arrayobject *)initial;
2492 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2493 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (it != NULL) {
2495 if (array_iter_extend((arrayobject *)a, it) == -1) {
2496 Py_DECREF(it);
2497 Py_DECREF(a);
2498 return NULL;
2499 }
2500 Py_DECREF(it);
2501 }
2502 return a;
2503 }
2504 }
2505 PyErr_SetString(PyExc_ValueError,
2506 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
2507 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002508}
2509
Guido van Rossum778983b1993-02-19 15:55:02 +00002510
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002511PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002512"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002513an array of basic values: characters, integers, floating point\n\
2514numbers. Arrays are sequence types and behave very much like lists,\n\
2515except that the type of objects stored in them is constrained. The\n\
2516type is specified at object creation time by using a type code, which\n\
2517is a single character. The following type codes are defined:\n\
2518\n\
2519 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002520 'b' signed integer 1 \n\
2521 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002522 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002523 'h' signed integer 2 \n\
2524 'H' unsigned integer 2 \n\
2525 'i' signed integer 2 \n\
2526 'I' unsigned integer 2 \n\
2527 'l' signed integer 4 \n\
2528 'L' unsigned integer 4 \n\
2529 'f' floating point 4 \n\
2530 'd' floating point 8 \n\
2531\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002532NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2533narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2534\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002535The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002536\n\
2537array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002538");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002541"array(typecode [, initializer]) -> array\n\
2542\n\
2543Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002544initialized from the optional initializer value, which must be a list,\n\
2545string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002546\n\
2547Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002548the type of objects stored in them is constrained.\n\
2549\n\
2550Methods:\n\
2551\n\
2552append() -- append a new item to the end of the array\n\
2553buffer_info() -- return information giving the current memory info\n\
2554byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002555count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002556extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002557fromfile() -- read items from a file object\n\
2558fromlist() -- append items from the list\n\
2559fromstring() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002560index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002561insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002562pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002563remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002564reverse() -- reverse the order of the items in the array\n\
2565tofile() -- write all items to a file object\n\
2566tolist() -- return the array converted to an ordinary list\n\
2567tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002568\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002569Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002570\n\
2571typecode -- the typecode character used to create the array\n\
2572itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002573");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002574
Raymond Hettinger625812f2003-01-07 01:58:52 +00002575static PyObject *array_iter(arrayobject *ao);
2576
Tim Peters0c322792002-07-17 16:49:03 +00002577static PyTypeObject Arraytype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 PyVarObject_HEAD_INIT(NULL, 0)
2579 "array.array",
2580 sizeof(arrayobject),
2581 0,
2582 (destructor)array_dealloc, /* tp_dealloc */
2583 0, /* tp_print */
2584 0, /* tp_getattr */
2585 0, /* tp_setattr */
2586 0, /* tp_reserved */
2587 (reprfunc)array_repr, /* tp_repr */
2588 0, /* tp_as_number*/
2589 &array_as_sequence, /* tp_as_sequence*/
2590 &array_as_mapping, /* tp_as_mapping*/
2591 0, /* tp_hash */
2592 0, /* tp_call */
2593 0, /* tp_str */
2594 PyObject_GenericGetAttr, /* tp_getattro */
2595 0, /* tp_setattro */
2596 &array_as_buffer, /* tp_as_buffer*/
2597 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2598 arraytype_doc, /* tp_doc */
2599 0, /* tp_traverse */
2600 0, /* tp_clear */
2601 array_richcompare, /* tp_richcompare */
2602 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2603 (getiterfunc)array_iter, /* tp_iter */
2604 0, /* tp_iternext */
2605 array_methods, /* tp_methods */
2606 0, /* tp_members */
2607 array_getsets, /* tp_getset */
2608 0, /* tp_base */
2609 0, /* tp_dict */
2610 0, /* tp_descr_get */
2611 0, /* tp_descr_set */
2612 0, /* tp_dictoffset */
2613 0, /* tp_init */
2614 PyType_GenericAlloc, /* tp_alloc */
2615 array_new, /* tp_new */
2616 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002617};
2618
Raymond Hettinger625812f2003-01-07 01:58:52 +00002619
2620/*********************** Array Iterator **************************/
2621
2622typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 PyObject_HEAD
2624 Py_ssize_t index;
2625 arrayobject *ao;
2626 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002627} arrayiterobject;
2628
2629static PyTypeObject PyArrayIter_Type;
2630
2631#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2632
2633static PyObject *
2634array_iter(arrayobject *ao)
2635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002636 arrayiterobject *it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 if (!array_Check(ao)) {
2639 PyErr_BadInternalCall();
2640 return NULL;
2641 }
Raymond Hettinger625812f2003-01-07 01:58:52 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2644 if (it == NULL)
2645 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 Py_INCREF(ao);
2648 it->ao = ao;
2649 it->index = 0;
2650 it->getitem = ao->ob_descr->getitem;
2651 PyObject_GC_Track(it);
2652 return (PyObject *)it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002653}
2654
2655static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002656arrayiter_next(arrayiterobject *it)
2657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 assert(PyArrayIter_Check(it));
2659 if (it->index < Py_SIZE(it->ao))
2660 return (*it->getitem)(it->ao, it->index++);
2661 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002662}
2663
2664static void
2665arrayiter_dealloc(arrayiterobject *it)
2666{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 PyObject_GC_UnTrack(it);
2668 Py_XDECREF(it->ao);
2669 PyObject_GC_Del(it);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002670}
2671
2672static int
2673arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 Py_VISIT(it->ao);
2676 return 0;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002677}
2678
2679static PyTypeObject PyArrayIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 PyVarObject_HEAD_INIT(NULL, 0)
2681 "arrayiterator", /* tp_name */
2682 sizeof(arrayiterobject), /* tp_basicsize */
2683 0, /* tp_itemsize */
2684 /* methods */
2685 (destructor)arrayiter_dealloc, /* tp_dealloc */
2686 0, /* tp_print */
2687 0, /* tp_getattr */
2688 0, /* tp_setattr */
2689 0, /* tp_reserved */
2690 0, /* tp_repr */
2691 0, /* tp_as_number */
2692 0, /* tp_as_sequence */
2693 0, /* tp_as_mapping */
2694 0, /* tp_hash */
2695 0, /* tp_call */
2696 0, /* tp_str */
2697 PyObject_GenericGetAttr, /* tp_getattro */
2698 0, /* tp_setattro */
2699 0, /* tp_as_buffer */
2700 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2701 0, /* tp_doc */
2702 (traverseproc)arrayiter_traverse, /* tp_traverse */
2703 0, /* tp_clear */
2704 0, /* tp_richcompare */
2705 0, /* tp_weaklistoffset */
2706 PyObject_SelfIter, /* tp_iter */
2707 (iternextfunc)arrayiter_next, /* tp_iternext */
2708 0, /* tp_methods */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002709};
2710
2711
2712/*********************** Install Module **************************/
2713
Martin v. Löwis99866332002-03-01 10:27:01 +00002714/* No functions in array module. */
2715static PyMethodDef a_methods[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002716 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
2717 PyDoc_STR("Internal. Used for pickling support.")},
Martin v. Löwis99866332002-03-01 10:27:01 +00002718 {NULL, NULL, 0, NULL} /* Sentinel */
2719};
2720
Martin v. Löwis1a214512008-06-11 05:26:20 +00002721static struct PyModuleDef arraymodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 PyModuleDef_HEAD_INIT,
2723 "array",
2724 module_doc,
2725 -1,
2726 a_methods,
2727 NULL,
2728 NULL,
2729 NULL,
2730 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002731};
2732
Martin v. Löwis99866332002-03-01 10:27:01 +00002733
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002734PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002735PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 PyObject *m;
2738 PyObject *typecodes;
2739 Py_ssize_t size = 0;
2740 register Py_UNICODE *p;
2741 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 if (PyType_Ready(&Arraytype) < 0)
2744 return NULL;
2745 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
2746 m = PyModule_Create(&arraymodule);
2747 if (m == NULL)
2748 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 Py_INCREF((PyObject *)&Arraytype);
2751 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2752 Py_INCREF((PyObject *)&Arraytype);
2753 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2756 size++;
2757 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2760 p = PyUnicode_AS_UNICODE(typecodes);
2761 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2762 *p++ = (char)descr->typecode;
2763 }
2764
2765 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2766
2767 if (PyErr_Occurred()) {
2768 Py_DECREF(m);
2769 m = NULL;
2770 }
2771 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002772}