blob: 479189067a92097d2efa588e99c37f41b6bab73c [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
Guido van Rossumb6775db1994-08-01 11:34:53 +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 {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Travis E. Oliphantb803c512007-08-20 07:16:33 +000029 char *formats;
Alexandre Vassalottiad077152009-07-15 17:49:23 +000030 int is_integer_type;
31 int is_signed;
Guido van Rossum778983b1993-02-19 15:55:02 +000032};
33
34typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000035 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000036 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000037 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000038 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000039 PyObject *weakreflist; /* List of weak references */
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000040 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{
51 char *items;
52 size_t _new_size;
53
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +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 }
59
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000060 /* Bypass realloc() when a previous overallocation is large enough
61 to accommodate the newsize. If the newsize is 16 smaller than the
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000062 current size, then proceed with the realloc() to shrink the array.
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000063 */
64
65 if (self->allocated >= newsize &&
Christian Heimes90aa7642007-12-19 02:45:37 +000066 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000067 self->ob_item != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +000068 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000069 return 0;
70 }
71
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +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
Raymond Hettinger6e2ee862004-03-14 04:37:50 +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 */
91
Christian Heimes90aa7642007-12-19 02:45:37 +000092 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000093 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;
Christian Heimes90aa7642007-12-19 02:45:37 +0000105 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000106 self->allocated = _new_size;
107 return 0;
108}
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{
125 long x = ((char *)ap->ob_item)[i];
126 if (x >= 128)
127 x -= 256;
Christian Heimes217cfd12007-12-02 14:31:20 +0000128 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{
Fred Drake541dc3b2000-06-28 17:49:30 +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))
Guido van Rossum778983b1993-02-19 15:55:02 +0000139 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000140 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000141 PyErr_SetString(PyExc_OverflowError,
142 "signed char is less than minimum");
143 return -1;
144 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000145 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000146 PyErr_SetString(PyExc_OverflowError,
147 "signed char is greater than maximum");
148 return -1;
149 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000150 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000151 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000152 return 0;
153}
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{
158 long x = ((unsigned char *)ap->ob_item)[i];
Christian Heimes217cfd12007-12-02 14:31:20 +0000159 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{
165 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)
Martin v. Löwis99866332002-03-01 10:27:01 +0000170 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000171 return 0;
172}
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{
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
178}
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{
183 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
196}
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{
Christian Heimes217cfd12007-12-02 14:31:20 +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{
209 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000210 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000211 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000212 return -1;
213 if (i >= 0)
214 ((short *)ap->ob_item)[i] = x;
215 return 0;
216}
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{
Christian Heimes217cfd12007-12-02 14:31:20 +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{
227 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;
245}
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{
Christian Heimes217cfd12007-12-02 14:31:20 +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{
256 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000257 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000258 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000259 return -1;
260 if (i >= 0)
261 ((int *)ap->ob_item)[i] = x;
262 return 0;
263}
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{
268 return PyLong_FromUnsignedLong(
269 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
270}
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{
275 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 {
Fred Drake541dc3b2000-06-28 17:49:30 +0000282 long y;
283 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000284 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000285 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
Guido van Rossum549ab711997-01-03 19:09:47 +0000292 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000293 if (x > UINT_MAX) {
294 PyErr_SetString(PyExc_OverflowError,
295 "unsigned int is greater than maximum");
296 return -1;
297 }
298
Guido van Rossum549ab711997-01-03 19:09:47 +0000299 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000300 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000301 return 0;
302}
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{
Christian Heimes217cfd12007-12-02 14:31:20 +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{
313 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000314 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000315 return -1;
316 if (i >= 0)
317 ((long *)ap->ob_item)[i] = x;
318 return 0;
319}
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{
324 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
325}
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{
330 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 {
Fred Drake541dc3b2000-06-28 17:49:30 +0000337 long y;
338 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000339 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000340 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
Guido van Rossum549ab711997-01-03 19:09:47 +0000347 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000348 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
Guido van Rossum549ab711997-01-03 19:09:47 +0000354 if (i >= 0)
355 ((unsigned long *)ap->ob_item)[i] = x;
356 return 0;
357}
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{
Roger E. Masse2919eaa1996-12-09 20:10:36 +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{
368 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000369 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000370 return -1;
371 if (i >= 0)
372 ((float *)ap->ob_item)[i] = x;
373 return 0;
374}
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{
Roger E. Masse2919eaa1996-12-09 20:10:36 +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{
385 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000386 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000387 return -1;
388 if (i >= 0)
389 ((double *)ap->ob_item)[i] = x;
390 return 0;
391}
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[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +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{
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000422 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000423
Guido van Rossum778983b1993-02-19 15:55:02 +0000424 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000425 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 return NULL;
427 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000428
Guido van Rossum778983b1993-02-19 15:55:02 +0000429 nbytes = size * descr->itemsize;
430 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000431 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000432 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000434 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000436 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000437 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000438 op->ob_descr = descr;
439 op->allocated = size;
440 op->weakreflist = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000441 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000442 if (size <= 0) {
443 op->ob_item = NULL;
444 }
445 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 if (op->ob_item == NULL) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000448 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000450 }
451 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000452 op->ob_exports = 0;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000453 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{
459 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000460 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000461 ap = (arrayobject *)op;
Christian Heimes90aa7642007-12-19 02:45:37 +0000462 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 return (*ap->ob_descr->getitem)(ap, i);
464}
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{
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 char *items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000470 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000471 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000472 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000473 return -1;
474 }
475 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
476 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000477
478 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000479 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000480 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000481 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000483 if (where < 0)
484 where = 0;
485 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000486 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);
Guido van Rossum778983b1993-02-19 15:55:02 +0000493 return (*self->ob_descr->setitem)(self, where, v);
494}
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{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000501 if (op->weakreflist != NULL)
502 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000503 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000504 PyMem_DEL(op->ob_item);
Christian Heimes90aa7642007-12-19 02:45:37 +0000505 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{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 arrayobject *va, *wa;
512 PyObject *vi = NULL;
513 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000514 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000515 PyObject *res;
516
Martin v. Löwis99866332002-03-01 10:27:01 +0000517 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000518 Py_INCREF(Py_NotImplemented);
519 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000520 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000521
522 va = (arrayobject *)v;
523 wa = (arrayobject *)w;
524
Christian Heimes90aa7642007-12-19 02:45:37 +0000525 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000526 /* 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 }
534
535 /* Search for the first index where items are different */
536 k = 1;
Christian Heimes90aa7642007-12-19 02:45:37 +0000537 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000538 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 }
553
554 if (k) {
555 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +0000556 Py_ssize_t vs = Py_SIZE(va);
557 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 int cmp;
559 switch (op) {
560 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000561 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000562 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 }
575
576 /* 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{
Christian Heimes90aa7642007-12-19 02:45:37 +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{
Christian Heimes90aa7642007-12-19 02:45:37 +0000603 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000604 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000605 return NULL;
606 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000607 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{
613 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 if (ilow < 0)
615 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000616 else if (ilow > Py_SIZE(a))
617 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000618 if (ihigh < 0)
619 ihigh = 0;
620 if (ihigh < ilow)
621 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000622 else if (ihigh > Py_SIZE(a))
623 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000624 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000625 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);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000629 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{
Christian Heimes90aa7642007-12-19 02:45:37 +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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000646 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000647 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000648 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000649 PyErr_Format(PyExc_TypeError,
650 "can only append array (not \"%.200s\") to array",
Christian Heimes90aa7642007-12-19 02:45:37 +0000651 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000652 return NULL;
653 }
654#define b ((arrayobject *)bb)
655 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000656 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000657 return NULL;
658 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000659 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
660 return PyErr_NoMemory();
661 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000662 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000663 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000664 if (np == NULL) {
665 return NULL;
666 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000667 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);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670 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{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000677 Py_ssize_t i;
678 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000679 arrayobject *np;
680 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000681 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000682 if (n < 0)
683 n = 0;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000684 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
685 return PyErr_NoMemory();
686 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000687 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000688 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000689 if (np == NULL)
690 return NULL;
691 p = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000692 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000693 for (i = 0; i < n; i++) {
694 memcpy(p, a->ob_item, nbytes);
695 p += nbytes;
696 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000697 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000698}
699
700static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000701array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000702{
703 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000704 Py_ssize_t n; /* Size of replacement array */
705 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000706#define b ((arrayobject *)v)
707 if (v == NULL)
708 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000709 else if (array_Check(v)) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000710 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000711 if (a == b) {
712 /* Special case "a[i:j] = a" -- copy b first */
713 int ret;
714 v = array_slice(b, 0, n);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000715 if (!v)
716 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000717 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000718 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000719 return ret;
720 }
721 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000722 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000723 return -1;
724 }
725 }
726 else {
Fred Drake137507e2000-06-01 02:02:46 +0000727 PyErr_Format(PyExc_TypeError,
728 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +0000729 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000730 return -1;
731 }
732 if (ilow < 0)
733 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000734 else if (ilow > Py_SIZE(a))
735 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000736 if (ihigh < 0)
737 ihigh = 0;
738 if (ihigh < ilow)
739 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000740 else if (ihigh > Py_SIZE(a))
741 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000742 item = a->ob_item;
743 d = n - (ihigh-ilow);
Alexandre Vassalotti7e4f3212009-07-05 05:38:18 +0000744 /* Issue #4509: If the array has exported buffers and the slice
745 assignment would change the size of the array, fail early to make
746 sure we don't modify it. */
747 if (d != 0 && a->ob_exports > 0) {
748 PyErr_SetString(PyExc_BufferError,
749 "cannot resize an array that is exporting buffers");
750 return -1;
751 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000752 if (d < 0) { /* Delete -d items */
753 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
754 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000755 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000756 if (array_resize(a, Py_SIZE(a) + d) == -1)
757 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000758 }
759 else if (d > 0) { /* Insert d items */
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000760 if (array_resize(a, Py_SIZE(a) + d))
Guido van Rossum778983b1993-02-19 15:55:02 +0000761 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000762 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
763 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000764 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000765 }
766 if (n > 0)
767 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
768 n*b->ob_descr->itemsize);
769 return 0;
770#undef b
771}
772
773static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000774array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000775{
Christian Heimes90aa7642007-12-19 02:45:37 +0000776 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000777 PyErr_SetString(PyExc_IndexError,
778 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000779 return -1;
780 }
781 if (v == NULL)
782 return array_ass_slice(a, i, i+1, v);
783 return (*a->ob_descr->setitem)(a, i, v);
784}
785
786static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000787setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000788{
Martin v. Löwis99866332002-03-01 10:27:01 +0000789 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000790 return array_ass_item((arrayobject *)a, i, v);
791}
792
Martin v. Löwis99866332002-03-01 10:27:01 +0000793static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000794array_iter_extend(arrayobject *self, PyObject *bb)
795{
796 PyObject *it, *v;
797
798 it = PyObject_GetIter(bb);
799 if (it == NULL)
800 return -1;
801
802 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000803 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000804 Py_DECREF(v);
805 Py_DECREF(it);
806 return -1;
807 }
808 Py_DECREF(v);
809 }
810 Py_DECREF(it);
811 if (PyErr_Occurred())
812 return -1;
813 return 0;
814}
815
816static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000817array_do_extend(arrayobject *self, PyObject *bb)
818{
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000819 Py_ssize_t size, oldsize, bbsize;
820
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000821 if (!array_Check(bb))
822 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000823#define b ((arrayobject *)bb)
824 if (self->ob_descr != b->ob_descr) {
825 PyErr_SetString(PyExc_TypeError,
826 "can only extend with array of same kind");
827 return -1;
828 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000829 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
830 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
831 PyErr_NoMemory();
832 return -1;
833 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000834 oldsize = Py_SIZE(self);
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000835 /* Get the size of bb before resizing the array since bb could be self. */
836 bbsize = Py_SIZE(bb);
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000837 size = oldsize + Py_SIZE(b);
838 if (array_resize(self, size) == -1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000839 return -1;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000840 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
Alexandre Vassalottie503cf92009-07-05 06:25:14 +0000841 b->ob_item, bbsize * b->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +0000842
843 return 0;
844#undef b
845}
846
847static PyObject *
848array_inplace_concat(arrayobject *self, PyObject *bb)
849{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000850 if (!array_Check(bb)) {
851 PyErr_Format(PyExc_TypeError,
852 "can only extend array with array (not \"%.200s\")",
Christian Heimes90aa7642007-12-19 02:45:37 +0000853 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000854 return NULL;
855 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000856 if (array_do_extend(self, bb) == -1)
857 return NULL;
858 Py_INCREF(self);
859 return (PyObject *)self;
860}
861
862static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000863array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000864{
865 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000866 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000867
Christian Heimes90aa7642007-12-19 02:45:37 +0000868 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000869 if (n < 0)
870 n = 0;
871 items = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000872 if ((self->ob_descr->itemsize != 0) &&
873 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
874 return PyErr_NoMemory();
875 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000876 size = Py_SIZE(self) * self->ob_descr->itemsize;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000877 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
878 return PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000879 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000880 if (array_resize(self, n * Py_SIZE(self)) == -1)
881 return NULL;
882 items = p = self->ob_item;
883 for (i = 1; i < n; i++) {
884 p += size;
885 memcpy(p, items, size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000886 }
887 }
888 Py_INCREF(self);
889 return (PyObject *)self;
890}
891
892
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000893static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000894ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000895{
896 if (ins1(self, where, v) != 0)
897 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000898 Py_INCREF(Py_None);
899 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000900}
901
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000902static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000903array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000904{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000905 Py_ssize_t count = 0;
906 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000907
Christian Heimes90aa7642007-12-19 02:45:37 +0000908 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000909 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000910 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000912 if (cmp > 0)
913 count++;
914 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000915 return NULL;
916 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000917 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918}
919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000920PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000921"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000923Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924
925static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000926array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000928 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000929
Christian Heimes90aa7642007-12-19 02:45:37 +0000930 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000932 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
933 Py_DECREF(selfi);
934 if (cmp > 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000935 return PyLong_FromLong((long)i);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000936 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000937 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000938 return NULL;
939 }
940 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
941 return NULL;
942}
943
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000944PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000945"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000946\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000947Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000948
Raymond Hettinger625812f2003-01-07 01:58:52 +0000949static int
950array_contains(arrayobject *self, PyObject *v)
951{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000952 Py_ssize_t i;
953 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000954
Christian Heimes90aa7642007-12-19 02:45:37 +0000955 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000956 PyObject *selfi = getarrayitem((PyObject *)self, i);
957 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
958 Py_DECREF(selfi);
959 }
960 return cmp;
961}
962
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000963static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000964array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000965{
966 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000967
Christian Heimes90aa7642007-12-19 02:45:37 +0000968 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000970 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
971 Py_DECREF(selfi);
972 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000973 if (array_ass_slice(self, i, i+1,
974 (PyObject *)NULL) != 0)
975 return NULL;
976 Py_INCREF(Py_None);
977 return Py_None;
978 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000979 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980 return NULL;
981 }
982 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
983 return NULL;
984}
985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000986PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000987"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000989Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000990
991static PyObject *
992array_pop(arrayobject *self, PyObject *args)
993{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000994 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000995 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000996 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000997 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000998 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000999 /* Special-case most common failure cause */
1000 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1001 return NULL;
1002 }
1003 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001004 i += Py_SIZE(self);
1005 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001006 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1007 return NULL;
1008 }
1009 v = getarrayitem((PyObject *)self,i);
1010 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1011 Py_DECREF(v);
1012 return NULL;
1013 }
1014 return v;
1015}
1016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001017PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001018"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001020Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021
1022static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001023array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001024{
Martin v. Löwis99866332002-03-01 10:27:01 +00001025 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001027 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001028 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001029}
1030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001031PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001032"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001033\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001034 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001035
1036static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001037array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001038{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001039 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001040 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001041 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001042 return NULL;
1043 return ins(self, i, v);
1044}
1045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001046PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001047"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001048\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001049Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001050
1051
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001052static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001053array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001054{
Tim Peters077a11d2000-09-16 22:31:29 +00001055 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001056 retval = PyTuple_New(2);
1057 if (!retval)
1058 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001059
1060 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimes90aa7642007-12-19 02:45:37 +00001061 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001062
1063 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001064}
1065
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001066PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001067"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001068\n\
1069Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001070the length in items of the buffer used to hold array's contents\n\
1071The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001072the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001073
1074
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001075static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001076array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001077{
Christian Heimes90aa7642007-12-19 02:45:37 +00001078 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001079}
1080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001081PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001082"append(x)\n\
1083\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001084Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001085
1086
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001087static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001088array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001089{
1090 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001091 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001092
Guido van Rossum778983b1993-02-19 15:55:02 +00001093 switch (self->ob_descr->itemsize) {
1094 case 1:
1095 break;
1096 case 2:
Christian Heimes90aa7642007-12-19 02:45:37 +00001097 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 char p0 = p[0];
1099 p[0] = p[1];
1100 p[1] = p0;
1101 }
1102 break;
1103 case 4:
Christian Heimes90aa7642007-12-19 02:45:37 +00001104 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001105 char p0 = p[0];
1106 char p1 = p[1];
1107 p[0] = p[3];
1108 p[1] = p[2];
1109 p[2] = p1;
1110 p[3] = p0;
1111 }
1112 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001113 case 8:
Christian Heimes90aa7642007-12-19 02:45:37 +00001114 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001115 char p0 = p[0];
1116 char p1 = p[1];
1117 char p2 = p[2];
1118 char p3 = p[3];
1119 p[0] = p[7];
1120 p[1] = p[6];
1121 p[2] = p[5];
1122 p[3] = p[4];
1123 p[4] = p3;
1124 p[5] = p2;
1125 p[6] = p1;
1126 p[7] = p0;
1127 }
1128 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001129 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001130 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001131 "don't know how to byteswap this array type");
1132 return NULL;
1133 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001134 Py_INCREF(Py_None);
1135 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001136}
1137
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001138PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001139"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001140\n\
Fred Drakebf272981999-12-03 17:15:30 +00001141Byteswap 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 +000011424, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001143
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001144static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001145array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001146{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001147 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001148 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001149 /* little buffer to hold items while swapping */
1150 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001151 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001152
Christian Heimes90aa7642007-12-19 02:45:37 +00001153 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001154 for (p = self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001155 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001156 p < q;
1157 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001158 /* memory areas guaranteed disjoint, so memcpy
1159 * is safe (& memmove may be slower).
1160 */
1161 memcpy(tmp, p, itemsize);
1162 memcpy(p, q, itemsize);
1163 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001164 }
1165 }
Tim Petersbb307342000-09-10 05:22:54 +00001166
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 Py_INCREF(Py_None);
1168 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001169}
Guido van Rossume77a7571993-11-03 15:01:26 +00001170
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001171PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001172"reverse()\n\
1173\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001174Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001175
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001176
1177/* Forward */
1178static PyObject *array_fromstring(arrayobject *self, PyObject *args);
1179
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001180static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001181array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001182{
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001183 PyObject *f, *b, *res;
1184 Py_ssize_t itemsize = self->ob_descr->itemsize;
1185 Py_ssize_t n, nbytes;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001186 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001187
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001188 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001189 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001190
1191 nbytes = n * itemsize;
1192 if (nbytes < 0 || nbytes/itemsize != n) {
1193 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001194 return NULL;
1195 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001196
1197 b = PyObject_CallMethod(f, "read", "n", nbytes);
1198 if (b == NULL)
1199 return NULL;
1200
Christian Heimes72b710a2008-05-26 13:28:38 +00001201 if (!PyBytes_Check(b)) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001202 PyErr_SetString(PyExc_TypeError,
1203 "read() didn't return bytes");
1204 Py_DECREF(b);
1205 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001206 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001207
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001208 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001209
1210 args = Py_BuildValue("(O)", b);
1211 Py_DECREF(b);
1212 if (args == NULL)
1213 return NULL;
1214
1215 res = array_fromstring(self, args);
1216 Py_DECREF(args);
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001217 if (res == NULL)
1218 return NULL;
1219
1220 if (not_enough_bytes) {
1221 PyErr_SetString(PyExc_EOFError,
1222 "read() didn't return enough bytes");
1223 Py_DECREF(res);
1224 return NULL;
1225 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001226
1227 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001228}
1229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001230PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001231"fromfile(f, n)\n\
1232\n\
1233Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001234array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001235
1236
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001237static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001238array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001239{
Christian Heimes90aa7642007-12-19 02:45:37 +00001240 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001241 /* Write 64K blocks at a time */
1242 /* XXX Make the block size settable */
1243 int BLOCKSIZE = 64*1024;
1244 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1245 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001246
Christian Heimes90aa7642007-12-19 02:45:37 +00001247 if (Py_SIZE(self) == 0)
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001248 goto done;
1249
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001250 for (i = 0; i < nblocks; i++) {
1251 char* ptr = self->ob_item + i*BLOCKSIZE;
1252 Py_ssize_t size = BLOCKSIZE;
1253 PyObject *bytes, *res;
1254 if (i*BLOCKSIZE + size > nbytes)
1255 size = nbytes - i*BLOCKSIZE;
Christian Heimes72b710a2008-05-26 13:28:38 +00001256 bytes = PyBytes_FromStringAndSize(ptr, size);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001257 if (bytes == NULL)
Guido van Rossum778983b1993-02-19 15:55:02 +00001258 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001259 res = PyObject_CallMethod(f, "write", "O", bytes);
1260 Py_DECREF(bytes);
1261 if (res == NULL)
1262 return NULL;
Martin v. Löwisa291c8f2007-08-11 14:25:27 +00001263 Py_DECREF(res); /* drop write result */
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001264 }
1265
1266 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001267 Py_INCREF(Py_None);
1268 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001269}
1270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001271PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001272"tofile(f)\n\
1273\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001274Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001275
1276
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001277static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001278array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001279{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001280 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001281
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001282 if (!PyList_Check(list)) {
1283 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001284 return NULL;
1285 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001286 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001287 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001288 Py_ssize_t i, old_size;
1289 old_size = Py_SIZE(self);
1290 if (array_resize(self, old_size + n) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001292 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001294 if ((*self->ob_descr->setitem)(self,
Christian Heimes90aa7642007-12-19 02:45:37 +00001295 Py_SIZE(self) - n + i, v) != 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001296 array_resize(self, old_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 return NULL;
1298 }
1299 }
1300 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001301 Py_INCREF(Py_None);
1302 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001303}
1304
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001305PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001306"fromlist(list)\n\
1307\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001308Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001309
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001310static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001311array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001312{
Christian Heimes90aa7642007-12-19 02:45:37 +00001313 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001314 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001315
Guido van Rossum778983b1993-02-19 15:55:02 +00001316 if (list == NULL)
1317 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001318 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001319 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001320 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001321 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 return NULL;
1323 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001324 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001325 }
1326 return list;
1327}
1328
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001329PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001330"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001331\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001332Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001333
1334
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001336array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001337{
1338 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001339 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001340 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001341 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001342 return NULL;
1343 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001344 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001345 "string length not a multiple of item size");
1346 return NULL;
1347 }
1348 n = n / itemsize;
1349 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001350 Py_ssize_t old_size = Py_SIZE(self);
1351 if ((n > PY_SSIZE_T_MAX - old_size) ||
1352 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001353 return PyErr_NoMemory();
1354 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001355 if (array_resize(self, old_size + n) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +00001356 return NULL;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001357 memcpy(self->ob_item + old_size * itemsize,
1358 str, n * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001359 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360 Py_INCREF(Py_None);
1361 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001362}
1363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001364PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001365"fromstring(string)\n\
1366\n\
1367Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001368values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001369
1370
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001371static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001372array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001373{
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001374 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1375 return PyBytes_FromStringAndSize(self->ob_item,
1376 Py_SIZE(self) * self->ob_descr->itemsize);
1377 } else {
1378 return PyErr_NoMemory();
1379 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001380}
1381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001382PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001383"tostring() -> string\n\
1384\n\
1385Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001386representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001387
Martin v. Löwis99866332002-03-01 10:27:01 +00001388
1389
Martin v. Löwis99866332002-03-01 10:27:01 +00001390static PyObject *
1391array_fromunicode(arrayobject *self, PyObject *args)
1392{
1393 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001394 Py_ssize_t n;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001395 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001396
1397 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1398 return NULL;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001399 typecode = self->ob_descr->typecode;
1400 if ((typecode != 'u')) {
1401 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001402 "fromunicode() may only be called on "
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001403 "unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001404 return NULL;
1405 }
1406 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001407 Py_ssize_t old_size = Py_SIZE(self);
1408 if (array_resize(self, old_size + n) == -1)
Martin v. Löwis99866332002-03-01 10:27:01 +00001409 return NULL;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001410 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
Martin v. Löwis99866332002-03-01 10:27:01 +00001411 ustr, n * sizeof(Py_UNICODE));
1412 }
1413
1414 Py_INCREF(Py_None);
1415 return Py_None;
1416}
1417
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001418PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001419"fromunicode(ustr)\n\
1420\n\
1421Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001422The array must be a unicode type array; otherwise a ValueError\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001423is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001424append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001425
1426
1427static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001428array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001429{
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001430 char typecode;
1431 typecode = self->ob_descr->typecode;
1432 if ((typecode != 'u')) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001433 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001434 "tounicode() may only be called on unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001435 return NULL;
1436 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001437 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001438}
1439
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001440PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001441"tounicode() -> unicode\n\
1442\n\
1443Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001444a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001445array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001447
Martin v. Löwis99866332002-03-01 10:27:01 +00001448
1449
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001450/*********************** Pickling support ************************/
1451
1452enum machine_format_code {
1453 UNKNOWN_FORMAT = -1,
1454 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
1455 * array type code cannot be interpreted. When this occurs, a list of
1456 * Python objects is used to represent the content of the array
1457 * instead of using the memory content of the array directly. In that
1458 * case, the array_reconstructor mechanism is bypassed completely, and
1459 * the standard array constructor is used instead.
1460 *
1461 * This is will most likely occur when the machine doesn't use IEEE
1462 * floating-point numbers.
1463 */
1464
1465 UNSIGNED_INT8 = 0,
1466 SIGNED_INT8 = 1,
1467 UNSIGNED_INT16_LE = 2,
1468 UNSIGNED_INT16_BE = 3,
1469 SIGNED_INT16_LE = 4,
1470 SIGNED_INT16_BE = 5,
1471 UNSIGNED_INT32_LE = 6,
1472 UNSIGNED_INT32_BE = 7,
1473 SIGNED_INT32_LE = 8,
1474 SIGNED_INT32_BE = 9,
1475 UNSIGNED_INT64_LE = 10,
1476 UNSIGNED_INT64_BE = 11,
1477 SIGNED_INT64_LE = 12,
1478 SIGNED_INT64_BE = 13,
1479 IEEE_754_FLOAT_LE = 14,
1480 IEEE_754_FLOAT_BE = 15,
1481 IEEE_754_DOUBLE_LE = 16,
1482 IEEE_754_DOUBLE_BE = 17,
1483 UTF16_LE = 18,
1484 UTF16_BE = 19,
1485 UTF32_LE = 20,
1486 UTF32_BE = 21
1487};
1488#define MACHINE_FORMAT_CODE_MIN 0
1489#define MACHINE_FORMAT_CODE_MAX 21
1490
1491static const struct mformatdescr {
1492 size_t size;
1493 int is_signed;
1494 int is_big_endian;
1495} mformat_descriptors[] = {
1496 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1497 {1, 1, 0}, /* 1: SIGNED_INT8 */
1498 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1499 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1500 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1501 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1502 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1503 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1504 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1505 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1506 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1507 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1508 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1509 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1510 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1511 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1512 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1513 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1514 {4, 0, 0}, /* 18: UTF16_LE */
1515 {4, 0, 1}, /* 19: UTF16_BE */
1516 {8, 0, 0}, /* 20: UTF32_LE */
1517 {8, 0, 1} /* 21: UTF32_BE */
1518};
1519
1520
1521/*
1522 * Internal: This function is used to find the machine format of a given
1523 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1524 * be found.
1525 */
1526static enum machine_format_code
1527typecode_to_mformat_code(int typecode)
1528{
Alexandre Vassalotti7aaa7702009-07-17 03:51:27 +00001529#ifdef WORDS_BIGENDIAN
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001530 const int is_big_endian = 1;
1531#else
1532 const int is_big_endian = 0;
1533#endif
1534 size_t intsize;
1535 int is_signed;
1536
1537 switch (typecode) {
1538 case 'b':
1539 return SIGNED_INT8;
1540 case 'B':
1541 return UNSIGNED_INT8;
1542
1543 case 'u':
1544 if (sizeof(Py_UNICODE) == 2) {
1545 return UTF16_LE + is_big_endian;
1546 }
1547 if (sizeof(Py_UNICODE) == 4) {
1548 return UTF32_LE + is_big_endian;
1549 }
1550 return UNKNOWN_FORMAT;
1551
1552 case 'f':
1553 if (sizeof(float) == 4) {
1554 const float y = 16711938.0;
1555 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1556 return IEEE_754_FLOAT_BE;
1557 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1558 return IEEE_754_FLOAT_LE;
1559 }
1560 return UNKNOWN_FORMAT;
1561
1562 case 'd':
1563 if (sizeof(double) == 8) {
1564 const double x = 9006104071832581.0;
1565 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1566 return IEEE_754_DOUBLE_BE;
1567 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1568 return IEEE_754_DOUBLE_LE;
1569 }
1570 return UNKNOWN_FORMAT;
1571
1572 /* Integers */
1573 case 'h':
1574 intsize = sizeof(short);
1575 is_signed = 1;
1576 break;
1577 case 'H':
1578 intsize = sizeof(short);
1579 is_signed = 0;
1580 break;
1581 case 'i':
1582 intsize = sizeof(int);
1583 is_signed = 1;
1584 break;
1585 case 'I':
1586 intsize = sizeof(int);
1587 is_signed = 0;
1588 break;
1589 case 'l':
1590 intsize = sizeof(long);
1591 is_signed = 1;
1592 break;
1593 case 'L':
1594 intsize = sizeof(long);
1595 is_signed = 0;
1596 break;
1597 default:
1598 return UNKNOWN_FORMAT;
1599 }
1600 switch (intsize) {
1601 case 2:
1602 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1603 case 4:
1604 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1605 case 8:
1606 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1607 default:
1608 return UNKNOWN_FORMAT;
1609 }
1610}
1611
1612/* Forward declaration. */
1613static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1614
1615/*
1616 * Internal: This function wraps the array constructor--i.e., array_new()--to
1617 * allow the creation of array objects from C code without having to deal
1618 * directly the tuple argument of array_new(). The typecode argument is a
1619 * Unicode character value, like 'i' or 'f' for example, representing an array
1620 * type code. The items argument is a bytes or a list object from which
1621 * contains the initial value of the array.
1622 *
1623 * On success, this functions returns the array object created. Otherwise,
1624 * NULL is returned to indicate a failure.
1625 */
1626static PyObject *
1627make_array(PyTypeObject *arraytype, int typecode, PyObject *items)
1628{
1629 PyObject *new_args;
1630 PyObject *array_obj;
1631 PyObject *typecode_obj;
1632 Py_UNICODE typecode_str[1] = {typecode};
1633
1634 assert(arraytype != NULL);
1635 assert(items != NULL);
1636
1637 typecode_obj = PyUnicode_FromUnicode(typecode_str, 1);
1638 if (typecode_obj == NULL)
1639 return NULL;
1640
1641 new_args = PyTuple_New(2);
1642 if (new_args == NULL)
1643 return NULL;
1644 Py_INCREF(items);
1645 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1646 PyTuple_SET_ITEM(new_args, 1, items);
1647
1648 array_obj = array_new(arraytype, new_args, NULL);
1649 Py_DECREF(new_args);
1650 if (array_obj == NULL)
1651 return NULL;
1652
1653 return array_obj;
1654}
1655
1656/*
1657 * This functions is a special constructor used when unpickling an array. It
1658 * provides a portable way to rebuild an array from its memory representation.
1659 */
1660static PyObject *
1661array_reconstructor(PyObject *self, PyObject *args)
1662{
1663 PyTypeObject *arraytype;
1664 PyObject *items;
1665 PyObject *converted_items;
1666 PyObject *result;
1667 int typecode;
1668 enum machine_format_code mformat_code;
1669 struct arraydescr *descr;
1670
1671 if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
1672 &arraytype, &typecode, &mformat_code, &items))
1673 return NULL;
1674
1675 if (!PyType_Check(arraytype)) {
1676 PyErr_Format(PyExc_TypeError,
1677 "first argument must a type object, not %.200s",
1678 Py_TYPE(arraytype)->tp_name);
1679 return NULL;
1680 }
1681 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1682 PyErr_Format(PyExc_TypeError,
1683 "%.200s is not a subtype of %.200s",
1684 arraytype->tp_name, Arraytype.tp_name);
1685 return NULL;
1686 }
1687 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1688 if (descr->typecode == typecode)
1689 break;
1690 }
1691 if (descr->typecode == '\0') {
1692 PyErr_SetString(PyExc_ValueError,
1693 "second argument must be a valid type code");
1694 return NULL;
1695 }
1696 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
1697 mformat_code > MACHINE_FORMAT_CODE_MAX) {
1698 PyErr_SetString(PyExc_ValueError,
1699 "third argument must be a valid machine format code.");
1700 return NULL;
1701 }
1702 if (!PyBytes_Check(items)) {
1703 PyErr_Format(PyExc_TypeError,
1704 "fourth argument should be bytes, not %.200s",
1705 Py_TYPE(items)->tp_name);
1706 return NULL;
1707 }
1708
1709 /* Fast path: No decoding has to be done. */
1710 if (mformat_code == typecode_to_mformat_code(typecode) ||
1711 mformat_code == UNKNOWN_FORMAT) {
1712 return make_array(arraytype, typecode, items);
1713 }
1714
1715 /* Slow path: Decode the byte string according to the given machine
1716 * format code. This occurs when the computer unpickling the array
1717 * object is architecturally different from the one that pickled the
1718 * array.
1719 */
1720 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
1721 PyErr_SetString(PyExc_ValueError,
1722 "string length not a multiple of item size");
1723 return NULL;
1724 }
1725 switch (mformat_code) {
1726 case IEEE_754_FLOAT_LE:
1727 case IEEE_754_FLOAT_BE: {
1728 int i;
1729 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
1730 Py_ssize_t itemcount = Py_SIZE(items) / 4;
1731 const unsigned char *memstr =
1732 (unsigned char *)PyBytes_AS_STRING(items);
1733
1734 converted_items = PyList_New(itemcount);
1735 if (converted_items == NULL)
1736 return NULL;
1737 for (i = 0; i < itemcount; i++) {
1738 PyObject *pyfloat = PyFloat_FromDouble(
1739 _PyFloat_Unpack4(&memstr[i * 4], le));
1740 if (pyfloat == NULL) {
1741 Py_DECREF(converted_items);
1742 return NULL;
1743 }
1744 PyList_SET_ITEM(converted_items, i, pyfloat);
1745 }
1746 break;
1747 }
1748 case IEEE_754_DOUBLE_LE:
1749 case IEEE_754_DOUBLE_BE: {
1750 int i;
1751 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
1752 Py_ssize_t itemcount = Py_SIZE(items) / 8;
1753 const unsigned char *memstr =
1754 (unsigned char *)PyBytes_AS_STRING(items);
1755
1756 converted_items = PyList_New(itemcount);
1757 if (converted_items == NULL)
1758 return NULL;
1759 for (i = 0; i < itemcount; i++) {
1760 PyObject *pyfloat = PyFloat_FromDouble(
1761 _PyFloat_Unpack8(&memstr[i * 8], le));
1762 if (pyfloat == NULL) {
1763 Py_DECREF(converted_items);
1764 return NULL;
1765 }
1766 PyList_SET_ITEM(converted_items, i, pyfloat);
1767 }
1768 break;
1769 }
1770 case UTF16_LE:
1771 case UTF16_BE: {
1772 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
1773 converted_items = PyUnicode_DecodeUTF16(
1774 PyBytes_AS_STRING(items), Py_SIZE(items),
1775 "strict", &byteorder);
1776 if (converted_items == NULL)
1777 return NULL;
1778 break;
1779 }
1780 case UTF32_LE:
1781 case UTF32_BE: {
1782 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
1783 converted_items = PyUnicode_DecodeUTF32(
1784 PyBytes_AS_STRING(items), Py_SIZE(items),
1785 "strict", &byteorder);
1786 if (converted_items == NULL)
1787 return NULL;
1788 break;
1789 }
1790
1791 case UNSIGNED_INT8:
1792 case SIGNED_INT8:
1793 case UNSIGNED_INT16_LE:
1794 case UNSIGNED_INT16_BE:
1795 case SIGNED_INT16_LE:
1796 case SIGNED_INT16_BE:
1797 case UNSIGNED_INT32_LE:
1798 case UNSIGNED_INT32_BE:
1799 case SIGNED_INT32_LE:
1800 case SIGNED_INT32_BE:
1801 case UNSIGNED_INT64_LE:
1802 case UNSIGNED_INT64_BE:
1803 case SIGNED_INT64_LE:
1804 case SIGNED_INT64_BE: {
1805 int i;
1806 const struct mformatdescr mf_descr =
1807 mformat_descriptors[mformat_code];
1808 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
1809 const unsigned char *memstr =
1810 (unsigned char *)PyBytes_AS_STRING(items);
1811 struct arraydescr *descr;
1812
1813 /* If possible, try to pack array's items using a data type
1814 * that fits better. This may result in an array with narrower
1815 * or wider elements.
1816 *
1817 * For example, if a 32-bit machine pickles a L-code array of
1818 * unsigned longs, then the array will be unpickled by 64-bit
1819 * machine as an I-code array of unsigned ints.
1820 *
1821 * XXX: Is it possible to write a unit test for this?
1822 */
1823 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1824 if (descr->is_integer_type &&
1825 descr->itemsize == mf_descr.size &&
1826 descr->is_signed == mf_descr.is_signed)
1827 typecode = descr->typecode;
1828 }
1829
1830 converted_items = PyList_New(itemcount);
1831 if (converted_items == NULL)
1832 return NULL;
1833 for (i = 0; i < itemcount; i++) {
1834 PyObject *pylong;
1835
1836 pylong = _PyLong_FromByteArray(
1837 &memstr[i * mf_descr.size],
1838 mf_descr.size,
1839 !mf_descr.is_big_endian,
1840 mf_descr.is_signed);
1841 if (pylong == NULL) {
1842 Py_DECREF(converted_items);
1843 return NULL;
1844 }
1845 PyList_SET_ITEM(converted_items, i, pylong);
1846 }
1847 break;
1848 }
1849 case UNKNOWN_FORMAT:
1850 /* Impossible, but needed to shut up GCC about the unhandled
1851 * enumeration value.
1852 */
Mark Dickinsoncc16d162009-10-26 07:58:04 +00001853 default:
1854 PyErr_BadArgument();
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001855 return NULL;
1856 }
1857
1858 result = make_array(arraytype, typecode, converted_items);
1859 Py_DECREF(converted_items);
1860 return result;
1861}
1862
1863static PyObject *
1864array_reduce_ex(arrayobject *array, PyObject *value)
1865{
1866 PyObject *dict;
1867 PyObject *result;
1868 PyObject *array_str;
1869 int typecode = array->ob_descr->typecode;
1870 int mformat_code;
1871 static PyObject *array_reconstructor = NULL;
1872 long protocol;
1873
1874 if (array_reconstructor == NULL) {
1875 PyObject *array_module = PyImport_ImportModule("array");
1876 if (array_module == NULL)
1877 return NULL;
1878 array_reconstructor = PyObject_GetAttrString(
1879 array_module,
1880 "_array_reconstructor");
1881 Py_DECREF(array_module);
1882 if (array_reconstructor == NULL)
1883 return NULL;
1884 }
1885
1886 if (!PyLong_Check(value)) {
1887 PyErr_SetString(PyExc_TypeError,
1888 "__reduce_ex__ argument should an integer");
1889 return NULL;
1890 }
1891 protocol = PyLong_AsLong(value);
1892 if (protocol == -1 && PyErr_Occurred())
1893 return NULL;
1894
1895 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1896 if (dict == NULL) {
1897 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1898 return NULL;
1899 PyErr_Clear();
1900 dict = Py_None;
1901 Py_INCREF(dict);
1902 }
1903
1904 mformat_code = typecode_to_mformat_code(typecode);
1905 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
1906 /* Convert the array to a list if we got something weird
1907 * (e.g., non-IEEE floats), or we are pickling the array using
1908 * a Python 2.x compatible protocol.
1909 *
Alexandre Vassalotti5f8ed372009-07-15 18:31:06 +00001910 * It is necessary to use a list representation for Python 2.x
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001911 * compatible pickle protocol, since Python 2's str objects
1912 * are unpickled as unicode by Python 3. Thus it is impossible
1913 * to make arrays unpicklable by Python 3 by using their memory
1914 * representation, unless we resort to ugly hacks such as
1915 * coercing unicode objects to bytes in array_reconstructor.
1916 */
1917 PyObject *list;
1918 list = array_tolist(array, NULL);
1919 if (list == NULL) {
1920 Py_DECREF(dict);
1921 return NULL;
1922 }
1923 result = Py_BuildValue(
1924 "O(CO)O", Py_TYPE(array), typecode, list, dict);
1925 Py_DECREF(list);
1926 Py_DECREF(dict);
1927 return result;
1928 }
1929
1930 array_str = array_tostring(array, NULL);
1931 if (array_str == NULL) {
1932 Py_DECREF(dict);
1933 return NULL;
1934 }
1935 result = Py_BuildValue(
1936 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
1937 mformat_code, array_str, dict);
1938 Py_DECREF(dict);
1939 return result;
1940}
1941
1942PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1943
Martin v. Löwis99866332002-03-01 10:27:01 +00001944static PyObject *
1945array_get_typecode(arrayobject *a, void *closure)
1946{
1947 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001948 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001949}
1950
1951static PyObject *
1952array_get_itemsize(arrayobject *a, void *closure)
1953{
Christian Heimes217cfd12007-12-02 14:31:20 +00001954 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001955}
1956
1957static PyGetSetDef array_getsets [] = {
1958 {"typecode", (getter) array_get_typecode, NULL,
1959 "the typecode character used to create the array"},
1960 {"itemsize", (getter) array_get_itemsize, NULL,
1961 "the size, in bytes, of one array item"},
1962 {NULL}
1963};
1964
Martin v. Löwis59683e82008-06-13 07:50:45 +00001965static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001966 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001967 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001968 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001969 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001970 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001971 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001972 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1973 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001974 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001975 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001976 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001977 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001978 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001979 extend_doc},
1980 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1981 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001982 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001983 fromlist_doc},
1984 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1985 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001986 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1987 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001988 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001989 index_doc},
1990 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1991 insert_doc},
1992 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1993 pop_doc},
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001994 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
1995 reduce_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001996 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001997 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001998 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001999 reverse_doc},
2000/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
2001 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002002 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002003 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002004 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002005 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002006 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002007 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002008 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00002009 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00002010 {NULL, NULL} /* sentinel */
2011};
2012
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002013static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002014array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002015{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00002016 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002017 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002018 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002019
Christian Heimes90aa7642007-12-19 02:45:37 +00002020 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00002021 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00002022 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002023 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00002024 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002025 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002026 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002027 else
2028 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002029
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002030 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
2031 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00002032 return s;
2033}
2034
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002035static PyObject*
2036array_subscr(arrayobject* self, PyObject* item)
2037{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002038 if (PyIndex_Check(item)) {
2039 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002040 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002041 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002042 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002043 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00002044 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002045 return array_item(self, i);
2046 }
2047 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002048 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002049 PyObject* result;
2050 arrayobject* ar;
2051 int itemsize = self->ob_descr->itemsize;
2052
Christian Heimes90aa7642007-12-19 02:45:37 +00002053 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002054 &start, &stop, &step, &slicelength) < 0) {
2055 return NULL;
2056 }
2057
2058 if (slicelength <= 0) {
2059 return newarrayobject(&Arraytype, 0, self->ob_descr);
2060 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002061 else if (step == 1) {
2062 PyObject *result = newarrayobject(&Arraytype,
2063 slicelength, self->ob_descr);
2064 if (result == NULL)
2065 return NULL;
2066 memcpy(((arrayobject *)result)->ob_item,
2067 self->ob_item + start * itemsize,
2068 slicelength * itemsize);
2069 return result;
2070 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002071 else {
2072 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2073 if (!result) return NULL;
2074
2075 ar = (arrayobject*)result;
2076
2077 for (cur = start, i = 0; i < slicelength;
2078 cur += step, i++) {
2079 memcpy(ar->ob_item + i*itemsize,
2080 self->ob_item + cur*itemsize,
2081 itemsize);
2082 }
2083
2084 return result;
2085 }
2086 }
2087 else {
2088 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002089 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002090 return NULL;
2091 }
2092}
2093
2094static int
2095array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2096{
Thomas Woutersed03b412007-08-28 21:37:11 +00002097 Py_ssize_t start, stop, step, slicelength, needed;
2098 arrayobject* other;
2099 int itemsize;
2100
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002101 if (PyIndex_Check(item)) {
2102 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00002103
2104 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002105 return -1;
2106 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00002107 i += Py_SIZE(self);
2108 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002109 PyErr_SetString(PyExc_IndexError,
2110 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002111 return -1;
2112 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002113 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002114 /* Fall through to slice assignment */
2115 start = i;
2116 stop = i + 1;
2117 step = 1;
2118 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002119 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002120 else
2121 return (*self->ob_descr->setitem)(self, i, value);
2122 }
2123 else if (PySlice_Check(item)) {
2124 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00002125 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00002126 &step, &slicelength) < 0) {
2127 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002128 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002129 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002130 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00002131 PyErr_SetString(PyExc_TypeError,
2132 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002133 return -1;
2134 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002135 if (value == NULL) {
2136 other = NULL;
2137 needed = 0;
2138 }
2139 else if (array_Check(value)) {
2140 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00002141 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00002142 if (self == other) {
2143 /* Special case "self[i:j] = self" -- copy self first */
2144 int ret;
2145 value = array_slice(other, 0, needed);
2146 if (value == NULL)
2147 return -1;
2148 ret = array_ass_subscr(self, item, value);
2149 Py_DECREF(value);
2150 return ret;
2151 }
2152 if (other->ob_descr != self->ob_descr) {
2153 PyErr_BadArgument();
2154 return -1;
2155 }
2156 }
2157 else {
2158 PyErr_Format(PyExc_TypeError,
2159 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00002160 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00002161 return -1;
2162 }
2163 itemsize = self->ob_descr->itemsize;
2164 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2165 if ((step > 0 && stop < start) ||
2166 (step < 0 && stop > start))
2167 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002168
2169 /* Issue #4509: If the array has exported buffers and the slice
2170 assignment would change the size of the array, fail early to make
2171 sure we don't modify it. */
2172 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2173 PyErr_SetString(PyExc_BufferError,
2174 "cannot resize an array that is exporting buffers");
2175 return -1;
2176 }
2177
Thomas Woutersed03b412007-08-28 21:37:11 +00002178 if (step == 1) {
2179 if (slicelength > needed) {
2180 memmove(self->ob_item + (start + needed) * itemsize,
2181 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00002182 (Py_SIZE(self) - stop) * itemsize);
2183 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00002184 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00002185 return -1;
2186 }
2187 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002188 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00002189 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00002190 return -1;
2191 memmove(self->ob_item + (start + needed) * itemsize,
2192 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00002193 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00002194 }
2195 if (needed > 0)
2196 memcpy(self->ob_item + start * itemsize,
2197 other->ob_item, needed * itemsize);
2198 return 0;
2199 }
2200 else if (needed == 0) {
2201 /* Delete slice */
2202 Py_ssize_t cur, i;
2203
2204 if (step < 0) {
2205 stop = start + 1;
2206 start = stop + step * (slicelength - 1) - 1;
2207 step = -step;
2208 }
2209 for (cur = start, i = 0; i < slicelength;
2210 cur += step, i++) {
2211 Py_ssize_t lim = step - 1;
2212
Christian Heimes90aa7642007-12-19 02:45:37 +00002213 if (cur + step >= Py_SIZE(self))
2214 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002215 memmove(self->ob_item + (cur - i) * itemsize,
2216 self->ob_item + (cur + 1) * itemsize,
2217 lim * itemsize);
2218 }
2219 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00002220 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002221 memmove(self->ob_item + (cur-slicelength) * itemsize,
2222 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00002223 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00002224 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002225 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00002226 return -1;
2227 return 0;
2228 }
2229 else {
2230 Py_ssize_t cur, i;
2231
2232 if (needed != slicelength) {
2233 PyErr_Format(PyExc_ValueError,
2234 "attempt to assign array of size %zd "
2235 "to extended slice of size %zd",
2236 needed, slicelength);
2237 return -1;
2238 }
2239 for (cur = start, i = 0; i < slicelength;
2240 cur += step, i++) {
2241 memcpy(self->ob_item + cur * itemsize,
2242 other->ob_item + i * itemsize,
2243 itemsize);
2244 }
2245 return 0;
2246 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002247}
2248
2249static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002250 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002251 (binaryfunc)array_subscr,
2252 (objobjargproc)array_ass_subscr
2253};
2254
Guido van Rossumd8faa362007-04-27 19:54:29 +00002255static const void *emptybuf = "";
2256
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002257
2258static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002259array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002260{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002261 if (view==NULL) goto finish;
2262
2263 view->buf = (void *)self->ob_item;
Martin v. Löwis423be952008-08-13 15:53:07 +00002264 view->obj = (PyObject*)self;
2265 Py_INCREF(self);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002266 if (view->buf == NULL)
2267 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00002268 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002269 view->readonly = 0;
2270 view->ndim = 1;
2271 view->itemsize = self->ob_descr->itemsize;
2272 view->suboffsets = NULL;
2273 view->shape = NULL;
2274 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002275 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002276 }
2277 view->strides = NULL;
2278 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2279 view->strides = &(view->itemsize);
2280 view->format = NULL;
2281 view->internal = NULL;
2282 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00002283 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00002284#ifdef Py_UNICODE_WIDE
2285 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00002286 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00002287 }
2288#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002289 }
2290
2291 finish:
2292 self->ob_exports++;
2293 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002294}
2295
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002296static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002297array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002298{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002299 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002300}
2301
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002302static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002303 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002304 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00002305 (ssizeargfunc)array_repeat, /*sq_repeat*/
2306 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002307 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00002308 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002309 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00002310 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00002311 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00002312 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002313};
2314
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002315static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002316 (getbufferproc)array_buffer_getbuf,
2317 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002318};
2319
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002320static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002321array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002322{
Guido van Rossum8934fc22007-06-30 23:44:36 +00002323 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002324 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002325 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00002326
Thomas Woutersb2137042007-02-01 18:02:27 +00002327 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00002328 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002329
Walter Dörwaldd0941302007-07-01 21:58:22 +00002330 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00002331 return NULL;
2332
2333 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00002334 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00002335 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00002336 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002337 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002338 it = PyObject_GetIter(initial);
2339 if (it == NULL)
2340 return NULL;
2341 /* We set initial to NULL so that the subsequent code
2342 will create an empty array of the appropriate type
2343 and afterwards we can use array_iter_extend to populate
2344 the array.
2345 */
2346 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002347 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002348 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2349 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002350 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002351 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002352
2353 if (initial == NULL || !(PyList_Check(initial)
2354 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00002355 len = 0;
2356 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002357 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00002358
2359 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00002360 if (a == NULL)
2361 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002362
Guido van Rossum778983b1993-02-19 15:55:02 +00002363 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002364 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00002365 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002366 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002367 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00002368 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002369 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00002370 return NULL;
2371 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00002372 if (setarrayitem(a, i, v) != 0) {
2373 Py_DECREF(v);
2374 Py_DECREF(a);
2375 return NULL;
2376 }
2377 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00002378 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002379 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00002380 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00002381 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002382 PyObject *t_initial, *v;
2383 t_initial = PyTuple_Pack(1, initial);
2384 if (t_initial == NULL) {
2385 Py_DECREF(a);
2386 return NULL;
2387 }
2388 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002389 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00002390 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00002391 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002392 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00002393 return NULL;
2394 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002395 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002396 }
2397 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002398 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00002399 if (n > 0) {
2400 arrayobject *self = (arrayobject *)a;
2401 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002402 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00002403 if (item == NULL) {
2404 PyErr_NoMemory();
2405 Py_DECREF(a);
2406 return NULL;
2407 }
2408 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00002409 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00002410 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00002411 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00002412 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002413 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002414 if (it != NULL) {
2415 if (array_iter_extend((arrayobject *)a, it) == -1) {
2416 Py_DECREF(it);
2417 Py_DECREF(a);
2418 return NULL;
2419 }
2420 Py_DECREF(it);
2421 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002422 return a;
2423 }
2424 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002425 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00002426 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00002427 return NULL;
2428}
2429
Guido van Rossum778983b1993-02-19 15:55:02 +00002430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002431PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002432"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002433an array of basic values: characters, integers, floating point\n\
2434numbers. Arrays are sequence types and behave very much like lists,\n\
2435except that the type of objects stored in them is constrained. The\n\
2436type is specified at object creation time by using a type code, which\n\
2437is a single character. The following type codes are defined:\n\
2438\n\
2439 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002440 'b' signed integer 1 \n\
2441 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002442 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002443 'h' signed integer 2 \n\
2444 'H' unsigned integer 2 \n\
2445 'i' signed integer 2 \n\
2446 'I' unsigned integer 2 \n\
2447 'l' signed integer 4 \n\
2448 'L' unsigned integer 4 \n\
2449 'f' floating point 4 \n\
2450 'd' floating point 8 \n\
2451\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002452NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2453narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2454\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002455The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002456\n\
2457array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002460PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002461"array(typecode [, initializer]) -> array\n\
2462\n\
2463Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002464initialized from the optional initializer value, which must be a list,\n\
2465string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002466\n\
2467Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002468the type of objects stored in them is constrained.\n\
2469\n\
2470Methods:\n\
2471\n\
2472append() -- append a new item to the end of the array\n\
2473buffer_info() -- return information giving the current memory info\n\
2474byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002475count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002476extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002477fromfile() -- read items from a file object\n\
2478fromlist() -- append items from the list\n\
2479fromstring() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002480index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002481insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002482pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002483remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002484reverse() -- reverse the order of the items in the array\n\
2485tofile() -- write all items to a file object\n\
2486tolist() -- return the array converted to an ordinary list\n\
2487tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002488\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002489Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002490\n\
2491typecode -- the typecode character used to create the array\n\
2492itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002494
Raymond Hettinger625812f2003-01-07 01:58:52 +00002495static PyObject *array_iter(arrayobject *ao);
2496
Tim Peters0c322792002-07-17 16:49:03 +00002497static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002498 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002499 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002500 sizeof(arrayobject),
2501 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002502 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002503 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002504 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002505 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002506 0, /* tp_reserved */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002507 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002508 0, /* tp_as_number*/
2509 &array_as_sequence, /* tp_as_sequence*/
2510 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002511 0, /* tp_hash */
2512 0, /* tp_call */
2513 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002514 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002515 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002516 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002517 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002518 arraytype_doc, /* tp_doc */
2519 0, /* tp_traverse */
2520 0, /* tp_clear */
2521 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002522 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002523 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002524 0, /* tp_iternext */
2525 array_methods, /* tp_methods */
2526 0, /* tp_members */
2527 array_getsets, /* tp_getset */
2528 0, /* tp_base */
2529 0, /* tp_dict */
2530 0, /* tp_descr_get */
2531 0, /* tp_descr_set */
2532 0, /* tp_dictoffset */
2533 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002534 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002535 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002536 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002537};
2538
Raymond Hettinger625812f2003-01-07 01:58:52 +00002539
2540/*********************** Array Iterator **************************/
2541
2542typedef struct {
2543 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002544 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002545 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002546 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002547} arrayiterobject;
2548
2549static PyTypeObject PyArrayIter_Type;
2550
2551#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2552
2553static PyObject *
2554array_iter(arrayobject *ao)
2555{
2556 arrayiterobject *it;
2557
2558 if (!array_Check(ao)) {
2559 PyErr_BadInternalCall();
2560 return NULL;
2561 }
2562
2563 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2564 if (it == NULL)
2565 return NULL;
2566
2567 Py_INCREF(ao);
2568 it->ao = ao;
2569 it->index = 0;
2570 it->getitem = ao->ob_descr->getitem;
2571 PyObject_GC_Track(it);
2572 return (PyObject *)it;
2573}
2574
2575static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002576arrayiter_next(arrayiterobject *it)
2577{
2578 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002579 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002580 return (*it->getitem)(it->ao, it->index++);
2581 return NULL;
2582}
2583
2584static void
2585arrayiter_dealloc(arrayiterobject *it)
2586{
2587 PyObject_GC_UnTrack(it);
2588 Py_XDECREF(it->ao);
2589 PyObject_GC_Del(it);
2590}
2591
2592static int
2593arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2594{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002595 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002596 return 0;
2597}
2598
2599static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002600 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002601 "arrayiterator", /* tp_name */
2602 sizeof(arrayiterobject), /* tp_basicsize */
2603 0, /* tp_itemsize */
2604 /* methods */
2605 (destructor)arrayiter_dealloc, /* tp_dealloc */
2606 0, /* tp_print */
2607 0, /* tp_getattr */
2608 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002609 0, /* tp_reserved */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002610 0, /* tp_repr */
2611 0, /* tp_as_number */
2612 0, /* tp_as_sequence */
2613 0, /* tp_as_mapping */
2614 0, /* tp_hash */
2615 0, /* tp_call */
2616 0, /* tp_str */
2617 PyObject_GenericGetAttr, /* tp_getattro */
2618 0, /* tp_setattro */
2619 0, /* tp_as_buffer */
2620 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2621 0, /* tp_doc */
2622 (traverseproc)arrayiter_traverse, /* tp_traverse */
2623 0, /* tp_clear */
2624 0, /* tp_richcompare */
2625 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002626 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002627 (iternextfunc)arrayiter_next, /* tp_iternext */
2628 0, /* tp_methods */
2629};
2630
2631
2632/*********************** Install Module **************************/
2633
Martin v. Löwis99866332002-03-01 10:27:01 +00002634/* No functions in array module. */
2635static PyMethodDef a_methods[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002636 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
2637 PyDoc_STR("Internal. Used for pickling support.")},
Martin v. Löwis99866332002-03-01 10:27:01 +00002638 {NULL, NULL, 0, NULL} /* Sentinel */
2639};
2640
Martin v. Löwis1a214512008-06-11 05:26:20 +00002641static struct PyModuleDef arraymodule = {
2642 PyModuleDef_HEAD_INIT,
2643 "array",
2644 module_doc,
2645 -1,
2646 a_methods,
2647 NULL,
2648 NULL,
2649 NULL,
2650 NULL
2651};
2652
Martin v. Löwis99866332002-03-01 10:27:01 +00002653
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002654PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002655PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002656{
Fred Drakef4e34842002-04-01 03:45:06 +00002657 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002658 PyObject *typecodes;
2659 Py_ssize_t size = 0;
2660 register Py_UNICODE *p;
2661 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002662
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002663 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002664 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002665 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002666 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002667 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002668 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002669
2670 Py_INCREF((PyObject *)&Arraytype);
2671 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2672 Py_INCREF((PyObject *)&Arraytype);
2673 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002674
2675 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2676 size++;
2677 }
2678
2679 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2680 p = PyUnicode_AS_UNICODE(typecodes);
2681 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2682 *p++ = (char)descr->typecode;
2683 }
2684
2685 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2686
Martin v. Löwis1a214512008-06-11 05:26:20 +00002687 if (PyErr_Occurred()) {
2688 Py_DECREF(m);
2689 m = NULL;
2690 }
2691 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002692}