blob: 72b2043f0837c8792fa6feb9423534bd2e51c43c [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{
1529#ifdef BYTEORDER_IS_BIG_ENDIAN
1530 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 */
1853 return NULL;
1854 }
1855
1856 result = make_array(arraytype, typecode, converted_items);
1857 Py_DECREF(converted_items);
1858 return result;
1859}
1860
1861static PyObject *
1862array_reduce_ex(arrayobject *array, PyObject *value)
1863{
1864 PyObject *dict;
1865 PyObject *result;
1866 PyObject *array_str;
1867 int typecode = array->ob_descr->typecode;
1868 int mformat_code;
1869 static PyObject *array_reconstructor = NULL;
1870 long protocol;
1871
1872 if (array_reconstructor == NULL) {
1873 PyObject *array_module = PyImport_ImportModule("array");
1874 if (array_module == NULL)
1875 return NULL;
1876 array_reconstructor = PyObject_GetAttrString(
1877 array_module,
1878 "_array_reconstructor");
1879 Py_DECREF(array_module);
1880 if (array_reconstructor == NULL)
1881 return NULL;
1882 }
1883
1884 if (!PyLong_Check(value)) {
1885 PyErr_SetString(PyExc_TypeError,
1886 "__reduce_ex__ argument should an integer");
1887 return NULL;
1888 }
1889 protocol = PyLong_AsLong(value);
1890 if (protocol == -1 && PyErr_Occurred())
1891 return NULL;
1892
1893 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1894 if (dict == NULL) {
1895 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1896 return NULL;
1897 PyErr_Clear();
1898 dict = Py_None;
1899 Py_INCREF(dict);
1900 }
1901
1902 mformat_code = typecode_to_mformat_code(typecode);
1903 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
1904 /* Convert the array to a list if we got something weird
1905 * (e.g., non-IEEE floats), or we are pickling the array using
1906 * a Python 2.x compatible protocol.
1907 *
1908 * It is necessary to a list representation for Python 2.x
1909 * compatible pickle protocol, since Python 2's str objects
1910 * are unpickled as unicode by Python 3. Thus it is impossible
1911 * to make arrays unpicklable by Python 3 by using their memory
1912 * representation, unless we resort to ugly hacks such as
1913 * coercing unicode objects to bytes in array_reconstructor.
1914 */
1915 PyObject *list;
1916 list = array_tolist(array, NULL);
1917 if (list == NULL) {
1918 Py_DECREF(dict);
1919 return NULL;
1920 }
1921 result = Py_BuildValue(
1922 "O(CO)O", Py_TYPE(array), typecode, list, dict);
1923 Py_DECREF(list);
1924 Py_DECREF(dict);
1925 return result;
1926 }
1927
1928 array_str = array_tostring(array, NULL);
1929 if (array_str == NULL) {
1930 Py_DECREF(dict);
1931 return NULL;
1932 }
1933 result = Py_BuildValue(
1934 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
1935 mformat_code, array_str, dict);
1936 Py_DECREF(dict);
1937 return result;
1938}
1939
1940PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
1941
Martin v. Löwis99866332002-03-01 10:27:01 +00001942static PyObject *
1943array_get_typecode(arrayobject *a, void *closure)
1944{
1945 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001946 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001947}
1948
1949static PyObject *
1950array_get_itemsize(arrayobject *a, void *closure)
1951{
Christian Heimes217cfd12007-12-02 14:31:20 +00001952 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001953}
1954
1955static PyGetSetDef array_getsets [] = {
1956 {"typecode", (getter) array_get_typecode, NULL,
1957 "the typecode character used to create the array"},
1958 {"itemsize", (getter) array_get_itemsize, NULL,
1959 "the size, in bytes, of one array item"},
1960 {NULL}
1961};
1962
Martin v. Löwis59683e82008-06-13 07:50:45 +00001963static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001964 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001965 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001966 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001967 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001968 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001969 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001970 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1971 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001972 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001973 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001974 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001975 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001976 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001977 extend_doc},
1978 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1979 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001980 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001981 fromlist_doc},
1982 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1983 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001984 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1985 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001986 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001987 index_doc},
1988 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1989 insert_doc},
1990 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1991 pop_doc},
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001992 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
1993 reduce_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001994 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001995 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001996 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001997 reverse_doc},
1998/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1999 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002000 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002001 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002002 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002003 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002004 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002005 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00002006 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00002007 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00002008 {NULL, NULL} /* sentinel */
2009};
2010
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002011static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002012array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002013{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00002014 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002015 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002016 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002017
Christian Heimes90aa7642007-12-19 02:45:37 +00002018 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00002019 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00002020 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002021 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00002022 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002023 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002024 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002025 else
2026 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002027
Walter Dörwald7569dfe2007-05-19 21:49:49 +00002028 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
2029 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00002030 return s;
2031}
2032
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002033static PyObject*
2034array_subscr(arrayobject* self, PyObject* item)
2035{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002036 if (PyIndex_Check(item)) {
2037 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002038 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002039 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00002040 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002041 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00002042 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002043 return array_item(self, i);
2044 }
2045 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002046 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002047 PyObject* result;
2048 arrayobject* ar;
2049 int itemsize = self->ob_descr->itemsize;
2050
Christian Heimes90aa7642007-12-19 02:45:37 +00002051 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002052 &start, &stop, &step, &slicelength) < 0) {
2053 return NULL;
2054 }
2055
2056 if (slicelength <= 0) {
2057 return newarrayobject(&Arraytype, 0, self->ob_descr);
2058 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002059 else if (step == 1) {
2060 PyObject *result = newarrayobject(&Arraytype,
2061 slicelength, self->ob_descr);
2062 if (result == NULL)
2063 return NULL;
2064 memcpy(((arrayobject *)result)->ob_item,
2065 self->ob_item + start * itemsize,
2066 slicelength * itemsize);
2067 return result;
2068 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002069 else {
2070 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2071 if (!result) return NULL;
2072
2073 ar = (arrayobject*)result;
2074
2075 for (cur = start, i = 0; i < slicelength;
2076 cur += step, i++) {
2077 memcpy(ar->ob_item + i*itemsize,
2078 self->ob_item + cur*itemsize,
2079 itemsize);
2080 }
2081
2082 return result;
2083 }
2084 }
2085 else {
2086 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00002087 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002088 return NULL;
2089 }
2090}
2091
2092static int
2093array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2094{
Thomas Woutersed03b412007-08-28 21:37:11 +00002095 Py_ssize_t start, stop, step, slicelength, needed;
2096 arrayobject* other;
2097 int itemsize;
2098
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00002099 if (PyIndex_Check(item)) {
2100 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00002101
2102 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002103 return -1;
2104 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00002105 i += Py_SIZE(self);
2106 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002107 PyErr_SetString(PyExc_IndexError,
2108 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002109 return -1;
2110 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002111 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002112 /* Fall through to slice assignment */
2113 start = i;
2114 stop = i + 1;
2115 step = 1;
2116 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002117 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002118 else
2119 return (*self->ob_descr->setitem)(self, i, value);
2120 }
2121 else if (PySlice_Check(item)) {
2122 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00002123 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00002124 &step, &slicelength) < 0) {
2125 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002126 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002127 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002128 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00002129 PyErr_SetString(PyExc_TypeError,
2130 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002131 return -1;
2132 }
Thomas Woutersed03b412007-08-28 21:37:11 +00002133 if (value == NULL) {
2134 other = NULL;
2135 needed = 0;
2136 }
2137 else if (array_Check(value)) {
2138 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00002139 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00002140 if (self == other) {
2141 /* Special case "self[i:j] = self" -- copy self first */
2142 int ret;
2143 value = array_slice(other, 0, needed);
2144 if (value == NULL)
2145 return -1;
2146 ret = array_ass_subscr(self, item, value);
2147 Py_DECREF(value);
2148 return ret;
2149 }
2150 if (other->ob_descr != self->ob_descr) {
2151 PyErr_BadArgument();
2152 return -1;
2153 }
2154 }
2155 else {
2156 PyErr_Format(PyExc_TypeError,
2157 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00002158 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00002159 return -1;
2160 }
2161 itemsize = self->ob_descr->itemsize;
2162 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2163 if ((step > 0 && stop < start) ||
2164 (step < 0 && stop > start))
2165 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002166
2167 /* Issue #4509: If the array has exported buffers and the slice
2168 assignment would change the size of the array, fail early to make
2169 sure we don't modify it. */
2170 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2171 PyErr_SetString(PyExc_BufferError,
2172 "cannot resize an array that is exporting buffers");
2173 return -1;
2174 }
2175
Thomas Woutersed03b412007-08-28 21:37:11 +00002176 if (step == 1) {
2177 if (slicelength > needed) {
2178 memmove(self->ob_item + (start + needed) * itemsize,
2179 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00002180 (Py_SIZE(self) - stop) * itemsize);
2181 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00002182 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00002183 return -1;
2184 }
2185 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002186 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00002187 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00002188 return -1;
2189 memmove(self->ob_item + (start + needed) * itemsize,
2190 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00002191 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00002192 }
2193 if (needed > 0)
2194 memcpy(self->ob_item + start * itemsize,
2195 other->ob_item, needed * itemsize);
2196 return 0;
2197 }
2198 else if (needed == 0) {
2199 /* Delete slice */
2200 Py_ssize_t cur, i;
2201
2202 if (step < 0) {
2203 stop = start + 1;
2204 start = stop + step * (slicelength - 1) - 1;
2205 step = -step;
2206 }
2207 for (cur = start, i = 0; i < slicelength;
2208 cur += step, i++) {
2209 Py_ssize_t lim = step - 1;
2210
Christian Heimes90aa7642007-12-19 02:45:37 +00002211 if (cur + step >= Py_SIZE(self))
2212 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002213 memmove(self->ob_item + (cur - i) * itemsize,
2214 self->ob_item + (cur + 1) * itemsize,
2215 lim * itemsize);
2216 }
2217 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00002218 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00002219 memmove(self->ob_item + (cur-slicelength) * itemsize,
2220 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00002221 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00002222 }
Christian Heimes90aa7642007-12-19 02:45:37 +00002223 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00002224 return -1;
2225 return 0;
2226 }
2227 else {
2228 Py_ssize_t cur, i;
2229
2230 if (needed != slicelength) {
2231 PyErr_Format(PyExc_ValueError,
2232 "attempt to assign array of size %zd "
2233 "to extended slice of size %zd",
2234 needed, slicelength);
2235 return -1;
2236 }
2237 for (cur = start, i = 0; i < slicelength;
2238 cur += step, i++) {
2239 memcpy(self->ob_item + cur * itemsize,
2240 other->ob_item + i * itemsize,
2241 itemsize);
2242 }
2243 return 0;
2244 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002245}
2246
2247static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002248 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002249 (binaryfunc)array_subscr,
2250 (objobjargproc)array_ass_subscr
2251};
2252
Guido van Rossumd8faa362007-04-27 19:54:29 +00002253static const void *emptybuf = "";
2254
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002255
2256static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002257array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002258{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002259 if (view==NULL) goto finish;
2260
2261 view->buf = (void *)self->ob_item;
Martin v. Löwis423be952008-08-13 15:53:07 +00002262 view->obj = (PyObject*)self;
2263 Py_INCREF(self);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002264 if (view->buf == NULL)
2265 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00002266 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002267 view->readonly = 0;
2268 view->ndim = 1;
2269 view->itemsize = self->ob_descr->itemsize;
2270 view->suboffsets = NULL;
2271 view->shape = NULL;
2272 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00002273 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002274 }
2275 view->strides = NULL;
2276 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2277 view->strides = &(view->itemsize);
2278 view->format = NULL;
2279 view->internal = NULL;
2280 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00002281 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00002282#ifdef Py_UNICODE_WIDE
2283 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00002284 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00002285 }
2286#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002287 }
2288
2289 finish:
2290 self->ob_exports++;
2291 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002292}
2293
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002294static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002295array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002296{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002297 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002298}
2299
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002300static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002301 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002302 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00002303 (ssizeargfunc)array_repeat, /*sq_repeat*/
2304 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002305 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00002306 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00002307 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00002308 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00002309 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00002310 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002311};
2312
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002313static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002314 (getbufferproc)array_buffer_getbuf,
2315 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002316};
2317
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002318static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002319array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002320{
Guido van Rossum8934fc22007-06-30 23:44:36 +00002321 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002322 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002323 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00002324
Thomas Woutersb2137042007-02-01 18:02:27 +00002325 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00002326 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002327
Walter Dörwaldd0941302007-07-01 21:58:22 +00002328 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00002329 return NULL;
2330
2331 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00002332 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00002333 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00002334 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002335 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002336 it = PyObject_GetIter(initial);
2337 if (it == NULL)
2338 return NULL;
2339 /* We set initial to NULL so that the subsequent code
2340 will create an empty array of the appropriate type
2341 and afterwards we can use array_iter_extend to populate
2342 the array.
2343 */
2344 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002345 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002346 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2347 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002348 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002349 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002350
2351 if (initial == NULL || !(PyList_Check(initial)
2352 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00002353 len = 0;
2354 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002355 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00002356
2357 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00002358 if (a == NULL)
2359 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002360
Guido van Rossum778983b1993-02-19 15:55:02 +00002361 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002362 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00002363 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002364 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002365 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00002366 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002367 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00002368 return NULL;
2369 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00002370 if (setarrayitem(a, i, v) != 0) {
2371 Py_DECREF(v);
2372 Py_DECREF(a);
2373 return NULL;
2374 }
2375 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00002376 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00002377 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00002378 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00002379 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00002380 PyObject *t_initial, *v;
2381 t_initial = PyTuple_Pack(1, initial);
2382 if (t_initial == NULL) {
2383 Py_DECREF(a);
2384 return NULL;
2385 }
2386 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002387 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00002388 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00002389 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002390 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00002391 return NULL;
2392 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002393 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00002394 }
2395 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00002396 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00002397 if (n > 0) {
2398 arrayobject *self = (arrayobject *)a;
2399 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002400 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00002401 if (item == NULL) {
2402 PyErr_NoMemory();
2403 Py_DECREF(a);
2404 return NULL;
2405 }
2406 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00002407 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00002408 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00002409 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00002410 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002411 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002412 if (it != NULL) {
2413 if (array_iter_extend((arrayobject *)a, it) == -1) {
2414 Py_DECREF(it);
2415 Py_DECREF(a);
2416 return NULL;
2417 }
2418 Py_DECREF(it);
2419 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002420 return a;
2421 }
2422 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002423 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00002424 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00002425 return NULL;
2426}
2427
Guido van Rossum778983b1993-02-19 15:55:02 +00002428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002430"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002431an array of basic values: characters, integers, floating point\n\
2432numbers. Arrays are sequence types and behave very much like lists,\n\
2433except that the type of objects stored in them is constrained. The\n\
2434type is specified at object creation time by using a type code, which\n\
2435is a single character. The following type codes are defined:\n\
2436\n\
2437 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002438 'b' signed integer 1 \n\
2439 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002440 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002441 'h' signed integer 2 \n\
2442 'H' unsigned integer 2 \n\
2443 'i' signed integer 2 \n\
2444 'I' unsigned integer 2 \n\
2445 'l' signed integer 4 \n\
2446 'L' unsigned integer 4 \n\
2447 'f' floating point 4 \n\
2448 'd' floating point 8 \n\
2449\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002450NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2451narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2452\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002453The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002454\n\
2455array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002456");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002459"array(typecode [, initializer]) -> array\n\
2460\n\
2461Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002462initialized from the optional initializer value, which must be a list,\n\
2463string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002464\n\
2465Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002466the type of objects stored in them is constrained.\n\
2467\n\
2468Methods:\n\
2469\n\
2470append() -- append a new item to the end of the array\n\
2471buffer_info() -- return information giving the current memory info\n\
2472byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002473count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002474extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002475fromfile() -- read items from a file object\n\
2476fromlist() -- append items from the list\n\
2477fromstring() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002478index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002479insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002480pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002481remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002482reverse() -- reverse the order of the items in the array\n\
2483tofile() -- write all items to a file object\n\
2484tolist() -- return the array converted to an ordinary list\n\
2485tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002486\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002487Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002488\n\
2489typecode -- the typecode character used to create the array\n\
2490itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002491");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002492
Raymond Hettinger625812f2003-01-07 01:58:52 +00002493static PyObject *array_iter(arrayobject *ao);
2494
Tim Peters0c322792002-07-17 16:49:03 +00002495static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002496 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002497 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002498 sizeof(arrayobject),
2499 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002500 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002501 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002502 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002503 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002504 0, /* tp_reserved */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002505 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002506 0, /* tp_as_number*/
2507 &array_as_sequence, /* tp_as_sequence*/
2508 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002509 0, /* tp_hash */
2510 0, /* tp_call */
2511 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002512 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002513 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002514 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002515 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002516 arraytype_doc, /* tp_doc */
2517 0, /* tp_traverse */
2518 0, /* tp_clear */
2519 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002520 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002521 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002522 0, /* tp_iternext */
2523 array_methods, /* tp_methods */
2524 0, /* tp_members */
2525 array_getsets, /* tp_getset */
2526 0, /* tp_base */
2527 0, /* tp_dict */
2528 0, /* tp_descr_get */
2529 0, /* tp_descr_set */
2530 0, /* tp_dictoffset */
2531 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002532 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002533 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002534 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002535};
2536
Raymond Hettinger625812f2003-01-07 01:58:52 +00002537
2538/*********************** Array Iterator **************************/
2539
2540typedef struct {
2541 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002542 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002543 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002544 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002545} arrayiterobject;
2546
2547static PyTypeObject PyArrayIter_Type;
2548
2549#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2550
2551static PyObject *
2552array_iter(arrayobject *ao)
2553{
2554 arrayiterobject *it;
2555
2556 if (!array_Check(ao)) {
2557 PyErr_BadInternalCall();
2558 return NULL;
2559 }
2560
2561 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2562 if (it == NULL)
2563 return NULL;
2564
2565 Py_INCREF(ao);
2566 it->ao = ao;
2567 it->index = 0;
2568 it->getitem = ao->ob_descr->getitem;
2569 PyObject_GC_Track(it);
2570 return (PyObject *)it;
2571}
2572
2573static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002574arrayiter_next(arrayiterobject *it)
2575{
2576 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002577 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002578 return (*it->getitem)(it->ao, it->index++);
2579 return NULL;
2580}
2581
2582static void
2583arrayiter_dealloc(arrayiterobject *it)
2584{
2585 PyObject_GC_UnTrack(it);
2586 Py_XDECREF(it->ao);
2587 PyObject_GC_Del(it);
2588}
2589
2590static int
2591arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2592{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002593 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002594 return 0;
2595}
2596
2597static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002598 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002599 "arrayiterator", /* tp_name */
2600 sizeof(arrayiterobject), /* tp_basicsize */
2601 0, /* tp_itemsize */
2602 /* methods */
2603 (destructor)arrayiter_dealloc, /* tp_dealloc */
2604 0, /* tp_print */
2605 0, /* tp_getattr */
2606 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002607 0, /* tp_reserved */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002608 0, /* tp_repr */
2609 0, /* tp_as_number */
2610 0, /* tp_as_sequence */
2611 0, /* tp_as_mapping */
2612 0, /* tp_hash */
2613 0, /* tp_call */
2614 0, /* tp_str */
2615 PyObject_GenericGetAttr, /* tp_getattro */
2616 0, /* tp_setattro */
2617 0, /* tp_as_buffer */
2618 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2619 0, /* tp_doc */
2620 (traverseproc)arrayiter_traverse, /* tp_traverse */
2621 0, /* tp_clear */
2622 0, /* tp_richcompare */
2623 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002624 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002625 (iternextfunc)arrayiter_next, /* tp_iternext */
2626 0, /* tp_methods */
2627};
2628
2629
2630/*********************** Install Module **************************/
2631
Martin v. Löwis99866332002-03-01 10:27:01 +00002632/* No functions in array module. */
2633static PyMethodDef a_methods[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002634 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
2635 PyDoc_STR("Internal. Used for pickling support.")},
Martin v. Löwis99866332002-03-01 10:27:01 +00002636 {NULL, NULL, 0, NULL} /* Sentinel */
2637};
2638
Martin v. Löwis1a214512008-06-11 05:26:20 +00002639static struct PyModuleDef arraymodule = {
2640 PyModuleDef_HEAD_INIT,
2641 "array",
2642 module_doc,
2643 -1,
2644 a_methods,
2645 NULL,
2646 NULL,
2647 NULL,
2648 NULL
2649};
2650
Martin v. Löwis99866332002-03-01 10:27:01 +00002651
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002652PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002653PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002654{
Fred Drakef4e34842002-04-01 03:45:06 +00002655 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002656 PyObject *typecodes;
2657 Py_ssize_t size = 0;
2658 register Py_UNICODE *p;
2659 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002660
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002661 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002662 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002663 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002664 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002665 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002666 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002667
2668 Py_INCREF((PyObject *)&Arraytype);
2669 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2670 Py_INCREF((PyObject *)&Arraytype);
2671 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002672
2673 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2674 size++;
2675 }
2676
2677 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2678 p = PyUnicode_AS_UNICODE(typecodes);
2679 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2680 *p++ = (char)descr->typecode;
2681 }
2682
2683 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2684
Martin v. Löwis1a214512008-06-11 05:26:20 +00002685 if (PyErr_Occurred()) {
2686 Py_DECREF(m);
2687 m = NULL;
2688 }
2689 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002690}