blob: 00325940b7e7ae9205fd332e7e4f77af0fdee85f [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +020025 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 int itemsize;
27 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
29 char *formats;
30 int is_integer_type;
31 int is_signed;
Guido van Rossum778983b1993-02-19 15:55:02 +000032};
33
34typedef struct arrayobject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 PyObject_VAR_HEAD
36 char *ob_item;
37 Py_ssize_t allocated;
38 struct arraydescr *ob_descr;
39 PyObject *weakreflist; /* List of weak references */
40 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000041} arrayobject;
42
Jeremy Hylton938ace62002-07-17 16:30:39 +000043static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000044
Martin v. Löwis99866332002-03-01 10:27:01 +000045#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +000046#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000047
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000048static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000049array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 char *items;
52 size_t _new_size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
55 PyErr_SetString(PyExc_BufferError,
56 "cannot resize an array that is exporting buffers");
57 return -1;
58 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 /* Bypass realloc() when a previous overallocation is large enough
61 to accommodate the newsize. If the newsize is 16 smaller than the
62 current size, then proceed with the realloc() to shrink the array.
63 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 if (self->allocated >= newsize &&
66 Py_SIZE(self) < newsize + 16 &&
67 self->ob_item != NULL) {
68 Py_SIZE(self) = newsize;
69 return 0;
70 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 if (newsize == 0) {
73 PyMem_FREE(self->ob_item);
74 self->ob_item = NULL;
75 Py_SIZE(self) = 0;
76 self->allocated = 0;
77 return 0;
78 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 /* This over-allocates proportional to the array size, making room
81 * for additional growth. The over-allocation is mild, but is
82 * enough to give linear-time amortized behavior over a long
83 * sequence of appends() in the presence of a poorly-performing
84 * system realloc().
85 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
86 * Note, the pattern starts out the same as for lists but then
87 * grows at a smaller rate so that larger arrays only overallocate
88 * by about 1/16th -- this is done because arrays are presumed to be more
89 * memory critical.
90 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
93 items = self->ob_item;
94 /* XXX The following multiplication and division does not optimize away
95 like it does for lists since the size is not known at compile time */
96 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
97 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
98 else
99 items = NULL;
100 if (items == NULL) {
101 PyErr_NoMemory();
102 return -1;
103 }
104 self->ob_item = items;
105 Py_SIZE(self) = newsize;
106 self->allocated = _new_size;
107 return 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000108}
109
Tim Petersbb307342000-09-10 05:22:54 +0000110/****************************************************************************
111Get and Set functions for each type.
112A Get function takes an arrayobject* and an integer index, returning the
113array value at that index wrapped in an appropriate PyObject*.
114A Set function takes an arrayobject, integer index, and PyObject*; sets
115the array value at that index to the raw C data extracted from the PyObject*,
116and returns 0 if successful, else nonzero on failure (PyObject* not of an
117appropriate type or value).
118Note that the basic Get and Set functions do NOT check that the index is
119in bounds; that's the responsibility of the caller.
120****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000121
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000122static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 long x = ((char *)ap->ob_item)[i];
126 if (x >= 128)
127 x -= 256;
128 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000129}
130
131static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000132b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 short x;
135 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
136 must use the next size up that is signed ('h') and manually do
137 the overflow checking */
138 if (!PyArg_Parse(v, "h;array item must be integer", &x))
139 return -1;
140 else if (x < -128) {
141 PyErr_SetString(PyExc_OverflowError,
142 "signed char is less than minimum");
143 return -1;
144 }
145 else if (x > 127) {
146 PyErr_SetString(PyExc_OverflowError,
147 "signed char is greater than maximum");
148 return -1;
149 }
150 if (i >= 0)
151 ((char *)ap->ob_item)[i] = (char)x;
152 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000153}
154
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000155static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 long x = ((unsigned char *)ap->ob_item)[i];
159 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000160}
161
Fred Drake541dc3b2000-06-28 17:49:30 +0000162static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000163BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 unsigned char x;
166 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
167 if (!PyArg_Parse(v, "b;array item must be integer", &x))
168 return -1;
169 if (i >= 0)
170 ((char *)ap->ob_item)[i] = x;
171 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000172}
Guido van Rossum549ab711997-01-03 19:09:47 +0000173
Martin v. Löwis99866332002-03-01 10:27:01 +0000174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
Victor Stinner8dba4e02011-09-30 00:51:10 +0200177 return PyUnicode_FromOrdinal(((Py_UCS4 *) ap->ob_item)[i]);
Martin v. Löwis99866332002-03-01 10:27:01 +0000178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
Victor Stinner8dba4e02011-09-30 00:51:10 +0200183 PyObject *p;
Martin v. Löwis99866332002-03-01 10:27:01 +0000184
Victor Stinner8dba4e02011-09-30 00:51:10 +0200185 if (!PyArg_Parse(v, "U;array item must be unicode character", &p))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 return -1;
Victor Stinner8dba4e02011-09-30 00:51:10 +0200187 if (PyUnicode_READY(p))
188 return -1;
189 if (PyUnicode_GET_LENGTH(p) != 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 PyErr_SetString(PyExc_TypeError,
191 "array item must be unicode character");
192 return -1;
193 }
194 if (i >= 0)
Victor Stinner8dba4e02011-09-30 00:51:10 +0200195 ((Py_UCS4 *)ap->ob_item)[i] = PyUnicode_READ_CHAR(p, 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000197}
Martin v. Löwis99866332002-03-01 10:27:01 +0000198
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000199
Guido van Rossum549ab711997-01-03 19:09:47 +0000200static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000201h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000204}
205
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000206
Guido van Rossum778983b1993-02-19 15:55:02 +0000207static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000208h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 short x;
211 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
212 if (!PyArg_Parse(v, "h;array item must be integer", &x))
213 return -1;
214 if (i >= 0)
215 ((short *)ap->ob_item)[i] = x;
216 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000217}
218
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000219static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000220HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000223}
224
Fred Drake541dc3b2000-06-28 17:49:30 +0000225static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000226HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 int x;
229 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
230 must use the next size up and manually do the overflow checking */
231 if (!PyArg_Parse(v, "i;array item must be integer", &x))
232 return -1;
233 else if (x < 0) {
234 PyErr_SetString(PyExc_OverflowError,
235 "unsigned short is less than minimum");
236 return -1;
237 }
238 else if (x > USHRT_MAX) {
239 PyErr_SetString(PyExc_OverflowError,
240 "unsigned short is greater than maximum");
241 return -1;
242 }
243 if (i >= 0)
244 ((short *)ap->ob_item)[i] = (short)x;
245 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000246}
Guido van Rossum549ab711997-01-03 19:09:47 +0000247
248static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000249i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000252}
253
254static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000255i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000256{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 int x;
258 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
259 if (!PyArg_Parse(v, "i;array item must be integer", &x))
260 return -1;
261 if (i >= 0)
262 ((int *)ap->ob_item)[i] = x;
263 return 0;
Guido van Rossume77a7571993-11-03 15:01:26 +0000264}
265
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000266static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000267II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 return PyLong_FromUnsignedLong(
270 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000271}
272
273static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000274II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 unsigned long x;
277 if (PyLong_Check(v)) {
278 x = PyLong_AsUnsignedLong(v);
279 if (x == (unsigned long) -1 && PyErr_Occurred())
280 return -1;
281 }
282 else {
283 long y;
284 if (!PyArg_Parse(v, "l;array item must be integer", &y))
285 return -1;
286 if (y < 0) {
287 PyErr_SetString(PyExc_OverflowError,
288 "unsigned int is less than minimum");
289 return -1;
290 }
291 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000293 }
294 if (x > UINT_MAX) {
295 PyErr_SetString(PyExc_OverflowError,
296 "unsigned int is greater than maximum");
297 return -1;
298 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000300 if (i >= 0)
301 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
302 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000303}
304
305static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000306l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000309}
310
311static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000312l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 long x;
315 if (!PyArg_Parse(v, "l;array item must be integer", &x))
316 return -1;
317 if (i >= 0)
318 ((long *)ap->ob_item)[i] = x;
319 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000320}
321
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000322static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000323LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000326}
327
328static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000329LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 unsigned long x;
332 if (PyLong_Check(v)) {
333 x = PyLong_AsUnsignedLong(v);
334 if (x == (unsigned long) -1 && PyErr_Occurred())
335 return -1;
336 }
337 else {
338 long y;
339 if (!PyArg_Parse(v, "l;array item must be integer", &y))
340 return -1;
341 if (y < 0) {
342 PyErr_SetString(PyExc_OverflowError,
343 "unsigned long is less than minimum");
344 return -1;
345 }
346 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 }
349 if (x > ULONG_MAX) {
350 PyErr_SetString(PyExc_OverflowError,
351 "unsigned long is greater than maximum");
352 return -1;
353 }
Tim Petersbb307342000-09-10 05:22:54 +0000354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 if (i >= 0)
356 ((unsigned long *)ap->ob_item)[i] = x;
357 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000358}
359
Meador Inge1c9f0c92011-09-20 19:55:51 -0500360#ifdef HAVE_LONG_LONG
361
362static PyObject *
363q_getitem(arrayobject *ap, Py_ssize_t i)
364{
365 return PyLong_FromLongLong(((PY_LONG_LONG *)ap->ob_item)[i]);
366}
367
368static int
369q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
370{
371 PY_LONG_LONG x;
372 if (!PyArg_Parse(v, "L;array item must be integer", &x))
373 return -1;
374 if (i >= 0)
375 ((PY_LONG_LONG *)ap->ob_item)[i] = x;
376 return 0;
377}
378
379static PyObject *
380QQ_getitem(arrayobject *ap, Py_ssize_t i)
381{
382 return PyLong_FromUnsignedLongLong(
383 ((unsigned PY_LONG_LONG *)ap->ob_item)[i]);
384}
385
386static int
387QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
388{
389 unsigned PY_LONG_LONG x;
390 if (PyLong_Check(v)) {
391 x = PyLong_AsUnsignedLongLong(v);
392 if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())
393 return -1;
394 }
395 else {
396 PY_LONG_LONG y;
397 if (!PyArg_Parse(v, "L;array item must be integer", &y))
398 return -1;
399 if (y < 0) {
400 PyErr_SetString(PyExc_OverflowError,
401 "unsigned long long is less than minimum");
402 return -1;
403 }
404 x = (unsigned PY_LONG_LONG)y;
405 }
406
407 if (i >= 0)
408 ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;
409 return 0;
410}
411#endif
412
Guido van Rossum549ab711997-01-03 19:09:47 +0000413static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000414f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000417}
418
419static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000420f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 float x;
423 if (!PyArg_Parse(v, "f;array item must be float", &x))
424 return -1;
425 if (i >= 0)
426 ((float *)ap->ob_item)[i] = x;
427 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000428}
429
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000430static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000431d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000432{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000434}
435
436static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000437d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 double x;
440 if (!PyArg_Parse(v, "d;array item must be float", &x))
441 return -1;
442 if (i >= 0)
443 ((double *)ap->ob_item)[i] = x;
444 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000445}
446
Victor Stinner8dba4e02011-09-30 00:51:10 +0200447#if SIZEOF_INT == 4
448# define STRUCT_LONG_FORMAT "I"
449#elif SIZEOF_LONG == 4
450# define STRUCT_LONG_FORMAT "L"
451#else
452# error "Unable to get struct format for Py_UCS4"
453#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000454
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000455/* Description of types.
456 *
457 * Don't forget to update typecode_to_mformat_code() if you add a new
458 * typecode.
459 */
Guido van Rossum234f9421993-06-17 12:35:49 +0000460static struct arraydescr descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
462 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
Victor Stinner8dba4e02011-09-30 00:51:10 +0200463 {'u', sizeof(Py_UCS4), u_getitem, u_setitem, STRUCT_LONG_FORMAT, 0, 0},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
465 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
466 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
467 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
468 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
469 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
Meador Inge1c9f0c92011-09-20 19:55:51 -0500470#ifdef HAVE_LONG_LONG
471 {'q', sizeof(PY_LONG_LONG), q_getitem, q_setitem, "q", 1, 1},
472 {'Q', sizeof(PY_LONG_LONG), QQ_getitem, QQ_setitem, "Q", 1, 0},
473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
475 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
476 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000477};
Tim Petersbb307342000-09-10 05:22:54 +0000478
479/****************************************************************************
480Implementations of array object methods.
481****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000482
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000483static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000484newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 arrayobject *op;
487 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 if (size < 0) {
490 PyErr_BadInternalCall();
491 return NULL;
492 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 nbytes = size * descr->itemsize;
495 /* Check for overflow */
496 if (nbytes / descr->itemsize != (size_t)size) {
497 return PyErr_NoMemory();
498 }
499 op = (arrayobject *) type->tp_alloc(type, 0);
500 if (op == NULL) {
501 return NULL;
502 }
503 op->ob_descr = descr;
504 op->allocated = size;
505 op->weakreflist = NULL;
506 Py_SIZE(op) = size;
507 if (size <= 0) {
508 op->ob_item = NULL;
509 }
510 else {
511 op->ob_item = PyMem_NEW(char, nbytes);
512 if (op->ob_item == NULL) {
513 Py_DECREF(op);
514 return PyErr_NoMemory();
515 }
516 }
517 op->ob_exports = 0;
518 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000519}
520
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000521static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000522getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 register arrayobject *ap;
525 assert(array_Check(op));
526 ap = (arrayobject *)op;
527 assert(i>=0 && i<Py_SIZE(ap));
528 return (*ap->ob_descr->getitem)(ap, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000529}
530
531static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000532ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 char *items;
535 Py_ssize_t n = Py_SIZE(self);
536 if (v == NULL) {
537 PyErr_BadInternalCall();
538 return -1;
539 }
540 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
541 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 if (array_resize(self, n+1) == -1)
544 return -1;
545 items = self->ob_item;
546 if (where < 0) {
547 where += n;
548 if (where < 0)
549 where = 0;
550 }
551 if (where > n)
552 where = n;
553 /* appends don't need to call memmove() */
554 if (where != n)
555 memmove(items + (where+1)*self->ob_descr->itemsize,
556 items + where*self->ob_descr->itemsize,
557 (n-where)*self->ob_descr->itemsize);
558 return (*self->ob_descr->setitem)(self, where, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000559}
560
Guido van Rossum778983b1993-02-19 15:55:02 +0000561/* Methods */
562
563static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000564array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 if (op->weakreflist != NULL)
567 PyObject_ClearWeakRefs((PyObject *) op);
568 if (op->ob_item != NULL)
569 PyMem_DEL(op->ob_item);
570 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000571}
572
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000573static PyObject *
574array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 arrayobject *va, *wa;
577 PyObject *vi = NULL;
578 PyObject *wi = NULL;
579 Py_ssize_t i, k;
580 PyObject *res;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000581
Brian Curtindfc80e32011-08-10 20:28:54 -0500582 if (!array_Check(v) || !array_Check(w))
583 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 va = (arrayobject *)v;
586 wa = (arrayobject *)w;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
589 /* Shortcut: if the lengths differ, the arrays differ */
590 if (op == Py_EQ)
591 res = Py_False;
592 else
593 res = Py_True;
594 Py_INCREF(res);
595 return res;
596 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 /* Search for the first index where items are different */
599 k = 1;
600 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
601 vi = getarrayitem(v, i);
602 wi = getarrayitem(w, i);
603 if (vi == NULL || wi == NULL) {
604 Py_XDECREF(vi);
605 Py_XDECREF(wi);
606 return NULL;
607 }
608 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
609 if (k == 0)
610 break; /* Keeping vi and wi alive! */
611 Py_DECREF(vi);
612 Py_DECREF(wi);
613 if (k < 0)
614 return NULL;
615 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 if (k) {
618 /* No more items to compare -- compare sizes */
619 Py_ssize_t vs = Py_SIZE(va);
620 Py_ssize_t ws = Py_SIZE(wa);
621 int cmp;
622 switch (op) {
623 case Py_LT: cmp = vs < ws; break;
624 case Py_LE: cmp = vs <= ws; break;
625 case Py_EQ: cmp = vs == ws; break;
626 case Py_NE: cmp = vs != ws; break;
627 case Py_GT: cmp = vs > ws; break;
628 case Py_GE: cmp = vs >= ws; break;
629 default: return NULL; /* cannot happen */
630 }
631 if (cmp)
632 res = Py_True;
633 else
634 res = Py_False;
635 Py_INCREF(res);
636 return res;
637 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* We have an item that differs. First, shortcuts for EQ/NE */
640 if (op == Py_EQ) {
641 Py_INCREF(Py_False);
642 res = Py_False;
643 }
644 else if (op == Py_NE) {
645 Py_INCREF(Py_True);
646 res = Py_True;
647 }
648 else {
649 /* Compare the final item again using the proper operator */
650 res = PyObject_RichCompare(vi, wi, op);
651 }
652 Py_DECREF(vi);
653 Py_DECREF(wi);
654 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000655}
656
Martin v. Löwis18e16552006-02-15 17:27:45 +0000657static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000658array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000661}
662
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000663static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000664array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000665{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 if (i < 0 || i >= Py_SIZE(a)) {
667 PyErr_SetString(PyExc_IndexError, "array index out of range");
668 return NULL;
669 }
670 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000671}
672
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000673static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 arrayobject *np;
677 if (ilow < 0)
678 ilow = 0;
679 else if (ilow > Py_SIZE(a))
680 ilow = Py_SIZE(a);
681 if (ihigh < 0)
682 ihigh = 0;
683 if (ihigh < ilow)
684 ihigh = ilow;
685 else if (ihigh > Py_SIZE(a))
686 ihigh = Py_SIZE(a);
687 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
688 if (np == NULL)
689 return NULL;
690 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
691 (ihigh-ilow) * a->ob_descr->itemsize);
692 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000693}
694
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000695static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000696array_copy(arrayobject *a, PyObject *unused)
697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000699}
700
701PyDoc_STRVAR(copy_doc,
702"copy(array)\n\
703\n\
704 Return a copy of the array.");
705
706static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000707array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000708{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 Py_ssize_t size;
710 arrayobject *np;
711 if (!array_Check(bb)) {
712 PyErr_Format(PyExc_TypeError,
713 "can only append array (not \"%.200s\") to array",
714 Py_TYPE(bb)->tp_name);
715 return NULL;
716 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000717#define b ((arrayobject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 if (a->ob_descr != b->ob_descr) {
719 PyErr_BadArgument();
720 return NULL;
721 }
722 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
723 return PyErr_NoMemory();
724 }
725 size = Py_SIZE(a) + Py_SIZE(b);
726 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
727 if (np == NULL) {
728 return NULL;
729 }
730 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
731 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
732 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
733 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000734#undef b
735}
736
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000737static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000738array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 Py_ssize_t size;
741 arrayobject *np;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000742 Py_ssize_t oldbytes, newbytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 if (n < 0)
744 n = 0;
745 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
746 return PyErr_NoMemory();
747 }
748 size = Py_SIZE(a) * n;
749 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
750 if (np == NULL)
751 return NULL;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000752 if (n == 0)
753 return (PyObject *)np;
754 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
755 newbytes = oldbytes * n;
756 /* this follows the code in unicode_repeat */
757 if (oldbytes == 1) {
758 memset(np->ob_item, a->ob_item[0], newbytes);
759 } else {
760 Py_ssize_t done = oldbytes;
761 Py_MEMCPY(np->ob_item, a->ob_item, oldbytes);
762 while (done < newbytes) {
763 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
764 Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy);
765 done += ncopy;
766 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 }
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000768 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000769}
770
771static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000772array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 char *item;
775 Py_ssize_t n; /* Size of replacement array */
776 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000777#define b ((arrayobject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 if (v == NULL)
779 n = 0;
780 else if (array_Check(v)) {
781 n = Py_SIZE(b);
782 if (a == b) {
783 /* Special case "a[i:j] = a" -- copy b first */
784 int ret;
785 v = array_slice(b, 0, n);
786 if (!v)
787 return -1;
788 ret = array_ass_slice(a, ilow, ihigh, v);
789 Py_DECREF(v);
790 return ret;
791 }
792 if (b->ob_descr != a->ob_descr) {
793 PyErr_BadArgument();
794 return -1;
795 }
796 }
797 else {
798 PyErr_Format(PyExc_TypeError,
799 "can only assign array (not \"%.200s\") to array slice",
800 Py_TYPE(v)->tp_name);
801 return -1;
802 }
803 if (ilow < 0)
804 ilow = 0;
805 else if (ilow > Py_SIZE(a))
806 ilow = Py_SIZE(a);
807 if (ihigh < 0)
808 ihigh = 0;
809 if (ihigh < ilow)
810 ihigh = ilow;
811 else if (ihigh > Py_SIZE(a))
812 ihigh = Py_SIZE(a);
813 item = a->ob_item;
814 d = n - (ihigh-ilow);
815 /* Issue #4509: If the array has exported buffers and the slice
816 assignment would change the size of the array, fail early to make
817 sure we don't modify it. */
818 if (d != 0 && a->ob_exports > 0) {
819 PyErr_SetString(PyExc_BufferError,
820 "cannot resize an array that is exporting buffers");
821 return -1;
822 }
823 if (d < 0) { /* Delete -d items */
824 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
825 item + ihigh*a->ob_descr->itemsize,
826 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
827 if (array_resize(a, Py_SIZE(a) + d) == -1)
828 return -1;
829 }
830 else if (d > 0) { /* Insert d items */
831 if (array_resize(a, Py_SIZE(a) + d))
832 return -1;
833 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
834 item + ihigh*a->ob_descr->itemsize,
835 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
836 }
837 if (n > 0)
838 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
839 n*b->ob_descr->itemsize);
840 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000841#undef b
842}
843
844static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000845array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 if (i < 0 || i >= Py_SIZE(a)) {
848 PyErr_SetString(PyExc_IndexError,
849 "array assignment index out of range");
850 return -1;
851 }
852 if (v == NULL)
853 return array_ass_slice(a, i, i+1, v);
854 return (*a->ob_descr->setitem)(a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000855}
856
857static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000858setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000859{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 assert(array_Check(a));
861 return array_ass_item((arrayobject *)a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000862}
863
Martin v. Löwis99866332002-03-01 10:27:01 +0000864static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000865array_iter_extend(arrayobject *self, PyObject *bb)
866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 PyObject *it, *v;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 it = PyObject_GetIter(bb);
870 if (it == NULL)
871 return -1;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 while ((v = PyIter_Next(it)) != NULL) {
Mark Dickinson346f0af2010-08-06 09:36:57 +0000874 if (ins1(self, Py_SIZE(self), v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 Py_DECREF(v);
876 Py_DECREF(it);
877 return -1;
878 }
879 Py_DECREF(v);
880 }
881 Py_DECREF(it);
882 if (PyErr_Occurred())
883 return -1;
884 return 0;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000885}
886
887static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000888array_do_extend(arrayobject *self, PyObject *bb)
889{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 Py_ssize_t size, oldsize, bbsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 if (!array_Check(bb))
893 return array_iter_extend(self, bb);
894#define b ((arrayobject *)bb)
895 if (self->ob_descr != b->ob_descr) {
896 PyErr_SetString(PyExc_TypeError,
897 "can only extend with array of same kind");
898 return -1;
899 }
900 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
901 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
902 PyErr_NoMemory();
903 return -1;
904 }
905 oldsize = Py_SIZE(self);
906 /* Get the size of bb before resizing the array since bb could be self. */
907 bbsize = Py_SIZE(bb);
908 size = oldsize + Py_SIZE(b);
909 if (array_resize(self, size) == -1)
910 return -1;
911 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
912 b->ob_item, bbsize * b->ob_descr->itemsize);
913
914 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000915#undef b
916}
917
918static PyObject *
919array_inplace_concat(arrayobject *self, PyObject *bb)
920{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 if (!array_Check(bb)) {
922 PyErr_Format(PyExc_TypeError,
923 "can only extend array with array (not \"%.200s\")",
924 Py_TYPE(bb)->tp_name);
925 return NULL;
926 }
927 if (array_do_extend(self, bb) == -1)
928 return NULL;
929 Py_INCREF(self);
930 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000931}
932
933static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000934array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 char *items, *p;
937 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 if (Py_SIZE(self) > 0) {
940 if (n < 0)
941 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 if ((self->ob_descr->itemsize != 0) &&
943 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
944 return PyErr_NoMemory();
945 }
946 size = Py_SIZE(self) * self->ob_descr->itemsize;
947 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
948 return PyErr_NoMemory();
949 }
950 if (array_resize(self, n * Py_SIZE(self)) == -1)
951 return NULL;
952 items = p = self->ob_item;
953 for (i = 1; i < n; i++) {
954 p += size;
955 memcpy(p, items, size);
956 }
957 }
958 Py_INCREF(self);
959 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000960}
961
962
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000963static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000964ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000965{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 if (ins1(self, where, v) != 0)
967 return NULL;
968 Py_INCREF(Py_None);
969 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000970}
971
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000972static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000973array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 Py_ssize_t count = 0;
976 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 for (i = 0; i < Py_SIZE(self); i++) {
979 PyObject *selfi = getarrayitem((PyObject *)self, i);
980 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
981 Py_DECREF(selfi);
982 if (cmp > 0)
983 count++;
984 else if (cmp < 0)
985 return NULL;
986 }
987 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988}
989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000990PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000991"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000992\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000993Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000994
995static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000996array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 for (i = 0; i < Py_SIZE(self); i++) {
1001 PyObject *selfi = getarrayitem((PyObject *)self, i);
1002 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1003 Py_DECREF(selfi);
1004 if (cmp > 0) {
1005 return PyLong_FromLong((long)i);
1006 }
1007 else if (cmp < 0)
1008 return NULL;
1009 }
1010 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
1011 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012}
1013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001014PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001015"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001016\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001017Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001018
Raymond Hettinger625812f2003-01-07 01:58:52 +00001019static int
1020array_contains(arrayobject *self, PyObject *v)
1021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 Py_ssize_t i;
1023 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1026 PyObject *selfi = getarrayitem((PyObject *)self, i);
1027 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1028 Py_DECREF(selfi);
1029 }
1030 return cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001031}
1032
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001033static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001034array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 for (i = 0; i < Py_SIZE(self); i++) {
1039 PyObject *selfi = getarrayitem((PyObject *)self,i);
1040 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1041 Py_DECREF(selfi);
1042 if (cmp > 0) {
1043 if (array_ass_slice(self, i, i+1,
1044 (PyObject *)NULL) != 0)
1045 return NULL;
1046 Py_INCREF(Py_None);
1047 return Py_None;
1048 }
1049 else if (cmp < 0)
1050 return NULL;
1051 }
1052 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
1053 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001054}
1055
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001056PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001057"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001058\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001059Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001060
1061static PyObject *
1062array_pop(arrayobject *self, PyObject *args)
1063{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 Py_ssize_t i = -1;
1065 PyObject *v;
1066 if (!PyArg_ParseTuple(args, "|n:pop", &i))
1067 return NULL;
1068 if (Py_SIZE(self) == 0) {
1069 /* Special-case most common failure cause */
1070 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1071 return NULL;
1072 }
1073 if (i < 0)
1074 i += Py_SIZE(self);
1075 if (i < 0 || i >= Py_SIZE(self)) {
1076 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1077 return NULL;
1078 }
1079 v = getarrayitem((PyObject *)self,i);
1080 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1081 Py_DECREF(v);
1082 return NULL;
1083 }
1084 return v;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001085}
1086
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001087PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001088"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001089\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001090Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001091
1092static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001093array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 if (array_do_extend(self, bb) == -1)
1096 return NULL;
1097 Py_INCREF(Py_None);
1098 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001099}
1100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001101PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001102"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001103\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001104 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001105
1106static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001107array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 Py_ssize_t i;
1110 PyObject *v;
1111 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
1112 return NULL;
1113 return ins(self, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001114}
1115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001116PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001117"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001118\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001119Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001120
1121
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001122static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001123array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 PyObject* retval = NULL;
1126 retval = PyTuple_New(2);
1127 if (!retval)
1128 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1131 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001134}
1135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001136PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001137"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001138\n\
1139Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001140the length in items of the buffer used to hold array's contents\n\
1141The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001142the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001143
1144
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001145static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001146array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001147{
Mark Dickinson346f0af2010-08-06 09:36:57 +00001148 return ins(self, Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001149}
1150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001151PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001152"append(x)\n\
1153\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001154Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001155
1156
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001158array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 char *p;
1161 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 switch (self->ob_descr->itemsize) {
1164 case 1:
1165 break;
1166 case 2:
1167 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1168 char p0 = p[0];
1169 p[0] = p[1];
1170 p[1] = p0;
1171 }
1172 break;
1173 case 4:
1174 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1175 char p0 = p[0];
1176 char p1 = p[1];
1177 p[0] = p[3];
1178 p[1] = p[2];
1179 p[2] = p1;
1180 p[3] = p0;
1181 }
1182 break;
1183 case 8:
1184 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1185 char p0 = p[0];
1186 char p1 = p[1];
1187 char p2 = p[2];
1188 char p3 = p[3];
1189 p[0] = p[7];
1190 p[1] = p[6];
1191 p[2] = p[5];
1192 p[3] = p[4];
1193 p[4] = p3;
1194 p[5] = p2;
1195 p[6] = p1;
1196 p[7] = p0;
1197 }
1198 break;
1199 default:
1200 PyErr_SetString(PyExc_RuntimeError,
1201 "don't know how to byteswap this array type");
1202 return NULL;
1203 }
1204 Py_INCREF(Py_None);
1205 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001206}
1207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001208PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001209"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001210\n\
Fred Drakebf272981999-12-03 17:15:30 +00001211Byteswap 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 +000012124, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001213
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001214static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001215array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 register Py_ssize_t itemsize = self->ob_descr->itemsize;
1218 register char *p, *q;
1219 /* little buffer to hold items while swapping */
1220 char tmp[256]; /* 8 is probably enough -- but why skimp */
1221 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 if (Py_SIZE(self) > 1) {
1224 for (p = self->ob_item,
1225 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1226 p < q;
1227 p += itemsize, q -= itemsize) {
1228 /* memory areas guaranteed disjoint, so memcpy
1229 * is safe (& memmove may be slower).
1230 */
1231 memcpy(tmp, p, itemsize);
1232 memcpy(p, q, itemsize);
1233 memcpy(q, tmp, itemsize);
1234 }
1235 }
Tim Petersbb307342000-09-10 05:22:54 +00001236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 Py_INCREF(Py_None);
1238 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001239}
Guido van Rossume77a7571993-11-03 15:01:26 +00001240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001242"reverse()\n\
1243\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001245
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001246
1247/* Forward */
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001248static PyObject *array_frombytes(arrayobject *self, PyObject *args);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001249
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001251array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 PyObject *f, *b, *res;
1254 Py_ssize_t itemsize = self->ob_descr->itemsize;
1255 Py_ssize_t n, nbytes;
1256 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
1259 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 nbytes = n * itemsize;
1262 if (nbytes < 0 || nbytes/itemsize != n) {
1263 PyErr_NoMemory();
1264 return NULL;
1265 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 b = PyObject_CallMethod(f, "read", "n", nbytes);
1268 if (b == NULL)
1269 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 if (!PyBytes_Check(b)) {
1272 PyErr_SetString(PyExc_TypeError,
1273 "read() didn't return bytes");
1274 Py_DECREF(b);
1275 return NULL;
1276 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 args = Py_BuildValue("(O)", b);
1281 Py_DECREF(b);
1282 if (args == NULL)
1283 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001284
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001285 res = array_frombytes(self, args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 Py_DECREF(args);
1287 if (res == NULL)
1288 return NULL;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 if (not_enough_bytes) {
1291 PyErr_SetString(PyExc_EOFError,
1292 "read() didn't return enough bytes");
1293 Py_DECREF(res);
1294 return NULL;
1295 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001298}
1299
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001300PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001301"fromfile(f, n)\n\
1302\n\
1303Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001304array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001305
1306
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001307static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001308array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1311 /* Write 64K blocks at a time */
1312 /* XXX Make the block size settable */
1313 int BLOCKSIZE = 64*1024;
1314 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1315 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 if (Py_SIZE(self) == 0)
1318 goto done;
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 for (i = 0; i < nblocks; i++) {
1321 char* ptr = self->ob_item + i*BLOCKSIZE;
1322 Py_ssize_t size = BLOCKSIZE;
1323 PyObject *bytes, *res;
1324 if (i*BLOCKSIZE + size > nbytes)
1325 size = nbytes - i*BLOCKSIZE;
1326 bytes = PyBytes_FromStringAndSize(ptr, size);
1327 if (bytes == NULL)
1328 return NULL;
1329 res = PyObject_CallMethod(f, "write", "O", bytes);
1330 Py_DECREF(bytes);
1331 if (res == NULL)
1332 return NULL;
1333 Py_DECREF(res); /* drop write result */
1334 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001335
1336 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 Py_INCREF(Py_None);
1338 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001339}
1340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001341PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001342"tofile(f)\n\
1343\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001344Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001345
1346
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001348array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 if (!PyList_Check(list)) {
1353 PyErr_SetString(PyExc_TypeError, "arg must be list");
1354 return NULL;
1355 }
1356 n = PyList_Size(list);
1357 if (n > 0) {
1358 Py_ssize_t i, old_size;
1359 old_size = Py_SIZE(self);
1360 if (array_resize(self, old_size + n) == -1)
1361 return NULL;
1362 for (i = 0; i < n; i++) {
1363 PyObject *v = PyList_GetItem(list, i);
1364 if ((*self->ob_descr->setitem)(self,
1365 Py_SIZE(self) - n + i, v) != 0) {
1366 array_resize(self, old_size);
1367 return NULL;
1368 }
1369 }
1370 }
1371 Py_INCREF(Py_None);
1372 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001373}
1374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001375PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001376"fromlist(list)\n\
1377\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001379
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001380static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001381array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001383 PyObject *list = PyList_New(Py_SIZE(self));
1384 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 if (list == NULL)
1387 return NULL;
1388 for (i = 0; i < Py_SIZE(self); i++) {
1389 PyObject *v = getarrayitem((PyObject *)self, i);
1390 if (v == NULL) {
1391 Py_DECREF(list);
1392 return NULL;
1393 }
1394 PyList_SetItem(list, i, v);
1395 }
1396 return list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001397}
1398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001399PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001400"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001401\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001402Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001403
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001404static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001405frombytes(arrayobject *self, Py_buffer *buffer)
Guido van Rossum778983b1993-02-19 15:55:02 +00001406{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 int itemsize = self->ob_descr->itemsize;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001408 Py_ssize_t n;
1409 if (buffer->itemsize != 1) {
1410 PyBuffer_Release(buffer);
1411 PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required.");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001413 }
1414 n = buffer->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 if (n % itemsize != 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001416 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 PyErr_SetString(PyExc_ValueError,
1418 "string length not a multiple of item size");
1419 return NULL;
1420 }
1421 n = n / itemsize;
1422 if (n > 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001423 Py_ssize_t old_size = Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 if ((n > PY_SSIZE_T_MAX - old_size) ||
1425 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001426 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 return PyErr_NoMemory();
1428 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001429 if (array_resize(self, old_size + n) == -1) {
1430 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001432 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 memcpy(self->ob_item + old_size * itemsize,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001434 buffer->buf, n * itemsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001436 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 Py_INCREF(Py_None);
1438 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001439}
1440
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001441static PyObject *
1442array_fromstring(arrayobject *self, PyObject *args)
1443{
1444 Py_buffer buffer;
1445 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1446 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1447 return NULL;
1448 if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer))
1449 return NULL;
1450 else
1451 return frombytes(self, &buffer);
1452}
1453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001455"fromstring(string)\n\
1456\n\
1457Appends items from the string, interpreting it as an array of machine\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001458values, as if it had been read from a file using the fromfile() method).\n\
1459\n\
1460This method is deprecated. Use frombytes instead.");
1461
1462
1463static PyObject *
1464array_frombytes(arrayobject *self, PyObject *args)
1465{
1466 Py_buffer buffer;
1467 if (!PyArg_ParseTuple(args, "y*:frombytes", &buffer))
1468 return NULL;
1469 else
1470 return frombytes(self, &buffer);
1471}
1472
1473PyDoc_STRVAR(frombytes_doc,
1474"frombytes(bytestring)\n\
1475\n\
1476Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001477values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001478
1479
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001480static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001481array_tobytes(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001482{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1484 return PyBytes_FromStringAndSize(self->ob_item,
1485 Py_SIZE(self) * self->ob_descr->itemsize);
1486 } else {
1487 return PyErr_NoMemory();
1488 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001489}
1490
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001491PyDoc_STRVAR(tobytes_doc,
1492"tobytes() -> bytes\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001493\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001494Convert the array to an array of machine values and return the bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001495representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001496
Martin v. Löwis99866332002-03-01 10:27:01 +00001497
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001498static PyObject *
1499array_tostring(arrayobject *self, PyObject *unused)
1500{
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001501 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001502 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1503 return NULL;
1504 return array_tobytes(self, unused);
1505}
1506
1507PyDoc_STRVAR(tostring_doc,
1508"tostring() -> bytes\n\
1509\n\
1510Convert the array to an array of machine values and return the bytes\n\
1511representation.\n\
1512\n\
1513This method is deprecated. Use tobytes instead.");
1514
Martin v. Löwis99866332002-03-01 10:27:01 +00001515
Martin v. Löwis99866332002-03-01 10:27:01 +00001516static PyObject *
1517array_fromunicode(arrayobject *self, PyObject *args)
1518{
Victor Stinner8dba4e02011-09-30 00:51:10 +02001519 PyObject *ustr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001521
Victor Stinner8dba4e02011-09-30 00:51:10 +02001522 if (!PyArg_ParseTuple(args, "U:fromunicode", &ustr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 return NULL;
Victor Stinner8dba4e02011-09-30 00:51:10 +02001524 if (self->ob_descr->typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 PyErr_SetString(PyExc_ValueError,
1526 "fromunicode() may only be called on "
1527 "unicode type arrays");
1528 return NULL;
1529 }
Victor Stinner8dba4e02011-09-30 00:51:10 +02001530 if (PyUnicode_READY(ustr))
1531 return NULL;
1532 n = PyUnicode_GET_LENGTH(ustr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 if (n > 0) {
1534 Py_ssize_t old_size = Py_SIZE(self);
1535 if (array_resize(self, old_size + n) == -1)
1536 return NULL;
Victor Stinner8dba4e02011-09-30 00:51:10 +02001537 if (!PyUnicode_AsUCS4(ustr, (Py_UCS4 *)self->ob_item + old_size, n, 0))
1538 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 Py_INCREF(Py_None);
1542 return Py_None;
Martin v. Löwis99866332002-03-01 10:27:01 +00001543}
1544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001545PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001546"fromunicode(ustr)\n\
1547\n\
1548Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001549The array must be a unicode type array; otherwise a ValueError\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001550is raised. Use array.frombytes(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001551append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001552
1553
1554static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001556{
Victor Stinner8dba4e02011-09-30 00:51:10 +02001557 if (self->ob_descr->typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 PyErr_SetString(PyExc_ValueError,
1559 "tounicode() may only be called on unicode type arrays");
1560 return NULL;
1561 }
Victor Stinner8dba4e02011-09-30 00:51:10 +02001562 return PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND,
1563 (Py_UCS4 *) self->ob_item,
1564 Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001565}
1566
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001567PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001568"tounicode() -> unicode\n\
1569\n\
1570Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001571a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001572array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001573an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001574
Martin v. Löwis99866332002-03-01 10:27:01 +00001575
1576
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001577/*********************** Pickling support ************************/
1578
1579enum machine_format_code {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 UNKNOWN_FORMAT = -1,
1581 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
1582 * array type code cannot be interpreted. When this occurs, a list of
1583 * Python objects is used to represent the content of the array
1584 * instead of using the memory content of the array directly. In that
1585 * case, the array_reconstructor mechanism is bypassed completely, and
1586 * the standard array constructor is used instead.
1587 *
1588 * This is will most likely occur when the machine doesn't use IEEE
1589 * floating-point numbers.
1590 */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 UNSIGNED_INT8 = 0,
1593 SIGNED_INT8 = 1,
1594 UNSIGNED_INT16_LE = 2,
1595 UNSIGNED_INT16_BE = 3,
1596 SIGNED_INT16_LE = 4,
1597 SIGNED_INT16_BE = 5,
1598 UNSIGNED_INT32_LE = 6,
1599 UNSIGNED_INT32_BE = 7,
1600 SIGNED_INT32_LE = 8,
1601 SIGNED_INT32_BE = 9,
1602 UNSIGNED_INT64_LE = 10,
1603 UNSIGNED_INT64_BE = 11,
1604 SIGNED_INT64_LE = 12,
1605 SIGNED_INT64_BE = 13,
1606 IEEE_754_FLOAT_LE = 14,
1607 IEEE_754_FLOAT_BE = 15,
1608 IEEE_754_DOUBLE_LE = 16,
1609 IEEE_754_DOUBLE_BE = 17,
1610 UTF16_LE = 18,
1611 UTF16_BE = 19,
1612 UTF32_LE = 20,
1613 UTF32_BE = 21
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001614};
1615#define MACHINE_FORMAT_CODE_MIN 0
1616#define MACHINE_FORMAT_CODE_MAX 21
1617
1618static const struct mformatdescr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 size_t size;
1620 int is_signed;
1621 int is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001622} mformat_descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1624 {1, 1, 0}, /* 1: SIGNED_INT8 */
1625 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1626 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1627 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1628 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1629 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1630 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1631 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1632 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1633 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1634 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1635 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1636 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1637 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1638 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1639 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1640 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1641 {4, 0, 0}, /* 18: UTF16_LE */
1642 {4, 0, 1}, /* 19: UTF16_BE */
1643 {8, 0, 0}, /* 20: UTF32_LE */
1644 {8, 0, 1} /* 21: UTF32_BE */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001645};
1646
1647
1648/*
1649 * Internal: This function is used to find the machine format of a given
1650 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1651 * be found.
1652 */
1653static enum machine_format_code
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001654typecode_to_mformat_code(char typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001655{
Alexandre Vassalotti7aaa7702009-07-17 03:51:27 +00001656#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 const int is_big_endian = 1;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001658#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 const int is_big_endian = 0;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 size_t intsize;
1662 int is_signed;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 switch (typecode) {
1665 case 'b':
1666 return SIGNED_INT8;
1667 case 'B':
1668 return UNSIGNED_INT8;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 case 'u':
Victor Stinner8dba4e02011-09-30 00:51:10 +02001671 return UTF32_LE + is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 case 'f':
1674 if (sizeof(float) == 4) {
1675 const float y = 16711938.0;
1676 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1677 return IEEE_754_FLOAT_BE;
1678 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1679 return IEEE_754_FLOAT_LE;
1680 }
1681 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 case 'd':
1684 if (sizeof(double) == 8) {
1685 const double x = 9006104071832581.0;
1686 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1687 return IEEE_754_DOUBLE_BE;
1688 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1689 return IEEE_754_DOUBLE_LE;
1690 }
1691 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 /* Integers */
1694 case 'h':
1695 intsize = sizeof(short);
1696 is_signed = 1;
1697 break;
1698 case 'H':
1699 intsize = sizeof(short);
1700 is_signed = 0;
1701 break;
1702 case 'i':
1703 intsize = sizeof(int);
1704 is_signed = 1;
1705 break;
1706 case 'I':
1707 intsize = sizeof(int);
1708 is_signed = 0;
1709 break;
1710 case 'l':
1711 intsize = sizeof(long);
1712 is_signed = 1;
1713 break;
1714 case 'L':
1715 intsize = sizeof(long);
1716 is_signed = 0;
1717 break;
Meador Inge1c9f0c92011-09-20 19:55:51 -05001718#if HAVE_LONG_LONG
1719 case 'q':
1720 intsize = sizeof(PY_LONG_LONG);
1721 is_signed = 1;
1722 break;
1723 case 'Q':
1724 intsize = sizeof(PY_LONG_LONG);
1725 is_signed = 0;
1726 break;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 default:
1729 return UNKNOWN_FORMAT;
1730 }
1731 switch (intsize) {
1732 case 2:
1733 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1734 case 4:
1735 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1736 case 8:
1737 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1738 default:
1739 return UNKNOWN_FORMAT;
1740 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001741}
1742
1743/* Forward declaration. */
1744static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1745
1746/*
1747 * Internal: This function wraps the array constructor--i.e., array_new()--to
1748 * allow the creation of array objects from C code without having to deal
1749 * directly the tuple argument of array_new(). The typecode argument is a
1750 * Unicode character value, like 'i' or 'f' for example, representing an array
1751 * type code. The items argument is a bytes or a list object from which
1752 * contains the initial value of the array.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 *
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001754 * On success, this functions returns the array object created. Otherwise,
1755 * NULL is returned to indicate a failure.
1756 */
1757static PyObject *
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001758make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 PyObject *new_args;
1761 PyObject *array_obj;
1762 PyObject *typecode_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 assert(arraytype != NULL);
1765 assert(items != NULL);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001766
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001767 typecode_obj = PyUnicode_FromOrdinal(typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 if (typecode_obj == NULL)
1769 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 new_args = PyTuple_New(2);
1772 if (new_args == NULL)
1773 return NULL;
1774 Py_INCREF(items);
1775 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1776 PyTuple_SET_ITEM(new_args, 1, items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 array_obj = array_new(arraytype, new_args, NULL);
1779 Py_DECREF(new_args);
1780 if (array_obj == NULL)
1781 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return array_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001784}
1785
1786/*
1787 * This functions is a special constructor used when unpickling an array. It
1788 * provides a portable way to rebuild an array from its memory representation.
1789 */
1790static PyObject *
1791array_reconstructor(PyObject *self, PyObject *args)
1792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 PyTypeObject *arraytype;
1794 PyObject *items;
1795 PyObject *converted_items;
1796 PyObject *result;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001797 int typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 enum machine_format_code mformat_code;
1799 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001802 &arraytype, &typecode, &mformat_code, &items))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 if (!PyType_Check(arraytype)) {
1806 PyErr_Format(PyExc_TypeError,
1807 "first argument must a type object, not %.200s",
1808 Py_TYPE(arraytype)->tp_name);
1809 return NULL;
1810 }
1811 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1812 PyErr_Format(PyExc_TypeError,
1813 "%.200s is not a subtype of %.200s",
1814 arraytype->tp_name, Arraytype.tp_name);
1815 return NULL;
1816 }
1817 for (descr = descriptors; descr->typecode != '\0'; descr++) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001818 if ((int)descr->typecode == typecode)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 break;
1820 }
1821 if (descr->typecode == '\0') {
1822 PyErr_SetString(PyExc_ValueError,
1823 "second argument must be a valid type code");
1824 return NULL;
1825 }
1826 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
1827 mformat_code > MACHINE_FORMAT_CODE_MAX) {
1828 PyErr_SetString(PyExc_ValueError,
1829 "third argument must be a valid machine format code.");
1830 return NULL;
1831 }
1832 if (!PyBytes_Check(items)) {
1833 PyErr_Format(PyExc_TypeError,
1834 "fourth argument should be bytes, not %.200s",
1835 Py_TYPE(items)->tp_name);
1836 return NULL;
1837 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 /* Fast path: No decoding has to be done. */
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001840 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 mformat_code == UNKNOWN_FORMAT) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001842 return make_array(arraytype, (char)typecode, items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001845 /* Slow path: Decode the byte string according to the given machine
1846 * format code. This occurs when the computer unpickling the array
1847 * object is architecturally different from the one that pickled the
1848 * array.
1849 */
1850 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
1851 PyErr_SetString(PyExc_ValueError,
1852 "string length not a multiple of item size");
1853 return NULL;
1854 }
1855 switch (mformat_code) {
1856 case IEEE_754_FLOAT_LE:
1857 case IEEE_754_FLOAT_BE: {
1858 int i;
1859 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
1860 Py_ssize_t itemcount = Py_SIZE(items) / 4;
1861 const unsigned char *memstr =
1862 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 converted_items = PyList_New(itemcount);
1865 if (converted_items == NULL)
1866 return NULL;
1867 for (i = 0; i < itemcount; i++) {
1868 PyObject *pyfloat = PyFloat_FromDouble(
1869 _PyFloat_Unpack4(&memstr[i * 4], le));
1870 if (pyfloat == NULL) {
1871 Py_DECREF(converted_items);
1872 return NULL;
1873 }
1874 PyList_SET_ITEM(converted_items, i, pyfloat);
1875 }
1876 break;
1877 }
1878 case IEEE_754_DOUBLE_LE:
1879 case IEEE_754_DOUBLE_BE: {
1880 int i;
1881 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
1882 Py_ssize_t itemcount = Py_SIZE(items) / 8;
1883 const unsigned char *memstr =
1884 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 converted_items = PyList_New(itemcount);
1887 if (converted_items == NULL)
1888 return NULL;
1889 for (i = 0; i < itemcount; i++) {
1890 PyObject *pyfloat = PyFloat_FromDouble(
1891 _PyFloat_Unpack8(&memstr[i * 8], le));
1892 if (pyfloat == NULL) {
1893 Py_DECREF(converted_items);
1894 return NULL;
1895 }
1896 PyList_SET_ITEM(converted_items, i, pyfloat);
1897 }
1898 break;
1899 }
1900 case UTF16_LE:
1901 case UTF16_BE: {
1902 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
1903 converted_items = PyUnicode_DecodeUTF16(
1904 PyBytes_AS_STRING(items), Py_SIZE(items),
1905 "strict", &byteorder);
1906 if (converted_items == NULL)
1907 return NULL;
1908 break;
1909 }
1910 case UTF32_LE:
1911 case UTF32_BE: {
1912 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
1913 converted_items = PyUnicode_DecodeUTF32(
1914 PyBytes_AS_STRING(items), Py_SIZE(items),
1915 "strict", &byteorder);
1916 if (converted_items == NULL)
1917 return NULL;
1918 break;
1919 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 case UNSIGNED_INT8:
1922 case SIGNED_INT8:
1923 case UNSIGNED_INT16_LE:
1924 case UNSIGNED_INT16_BE:
1925 case SIGNED_INT16_LE:
1926 case SIGNED_INT16_BE:
1927 case UNSIGNED_INT32_LE:
1928 case UNSIGNED_INT32_BE:
1929 case SIGNED_INT32_LE:
1930 case SIGNED_INT32_BE:
1931 case UNSIGNED_INT64_LE:
1932 case UNSIGNED_INT64_BE:
1933 case SIGNED_INT64_LE:
1934 case SIGNED_INT64_BE: {
1935 int i;
1936 const struct mformatdescr mf_descr =
1937 mformat_descriptors[mformat_code];
1938 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
1939 const unsigned char *memstr =
1940 (unsigned char *)PyBytes_AS_STRING(items);
1941 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 /* If possible, try to pack array's items using a data type
1944 * that fits better. This may result in an array with narrower
1945 * or wider elements.
1946 *
1947 * For example, if a 32-bit machine pickles a L-code array of
1948 * unsigned longs, then the array will be unpickled by 64-bit
1949 * machine as an I-code array of unsigned ints.
1950 *
1951 * XXX: Is it possible to write a unit test for this?
1952 */
1953 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1954 if (descr->is_integer_type &&
1955 descr->itemsize == mf_descr.size &&
1956 descr->is_signed == mf_descr.is_signed)
1957 typecode = descr->typecode;
1958 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 converted_items = PyList_New(itemcount);
1961 if (converted_items == NULL)
1962 return NULL;
1963 for (i = 0; i < itemcount; i++) {
1964 PyObject *pylong;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 pylong = _PyLong_FromByteArray(
1967 &memstr[i * mf_descr.size],
1968 mf_descr.size,
1969 !mf_descr.is_big_endian,
1970 mf_descr.is_signed);
1971 if (pylong == NULL) {
1972 Py_DECREF(converted_items);
1973 return NULL;
1974 }
1975 PyList_SET_ITEM(converted_items, i, pylong);
1976 }
1977 break;
1978 }
1979 case UNKNOWN_FORMAT:
1980 /* Impossible, but needed to shut up GCC about the unhandled
1981 * enumeration value.
1982 */
1983 default:
1984 PyErr_BadArgument();
1985 return NULL;
1986 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001987
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001988 result = make_array(arraytype, (char)typecode, converted_items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 Py_DECREF(converted_items);
1990 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001991}
1992
1993static PyObject *
1994array_reduce_ex(arrayobject *array, PyObject *value)
1995{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 PyObject *dict;
1997 PyObject *result;
1998 PyObject *array_str;
1999 int typecode = array->ob_descr->typecode;
2000 int mformat_code;
2001 static PyObject *array_reconstructor = NULL;
2002 long protocol;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 if (array_reconstructor == NULL) {
2005 PyObject *array_module = PyImport_ImportModule("array");
2006 if (array_module == NULL)
2007 return NULL;
2008 array_reconstructor = PyObject_GetAttrString(
2009 array_module,
2010 "_array_reconstructor");
2011 Py_DECREF(array_module);
2012 if (array_reconstructor == NULL)
2013 return NULL;
2014 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 if (!PyLong_Check(value)) {
2017 PyErr_SetString(PyExc_TypeError,
2018 "__reduce_ex__ argument should an integer");
2019 return NULL;
2020 }
2021 protocol = PyLong_AsLong(value);
2022 if (protocol == -1 && PyErr_Occurred())
2023 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
2026 if (dict == NULL) {
2027 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2028 return NULL;
2029 PyErr_Clear();
2030 dict = Py_None;
2031 Py_INCREF(dict);
2032 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 mformat_code = typecode_to_mformat_code(typecode);
2035 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2036 /* Convert the array to a list if we got something weird
2037 * (e.g., non-IEEE floats), or we are pickling the array using
2038 * a Python 2.x compatible protocol.
2039 *
2040 * It is necessary to use a list representation for Python 2.x
2041 * compatible pickle protocol, since Python 2's str objects
2042 * are unpickled as unicode by Python 3. Thus it is impossible
2043 * to make arrays unpicklable by Python 3 by using their memory
2044 * representation, unless we resort to ugly hacks such as
2045 * coercing unicode objects to bytes in array_reconstructor.
2046 */
2047 PyObject *list;
2048 list = array_tolist(array, NULL);
2049 if (list == NULL) {
2050 Py_DECREF(dict);
2051 return NULL;
2052 }
2053 result = Py_BuildValue(
2054 "O(CO)O", Py_TYPE(array), typecode, list, dict);
2055 Py_DECREF(list);
2056 Py_DECREF(dict);
2057 return result;
2058 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002059
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002060 array_str = array_tobytes(array, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 if (array_str == NULL) {
2062 Py_DECREF(dict);
2063 return NULL;
2064 }
2065 result = Py_BuildValue(
2066 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
2067 mformat_code, array_str, dict);
2068 Py_DECREF(dict);
2069 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002070}
2071
2072PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2073
Martin v. Löwis99866332002-03-01 10:27:01 +00002074static PyObject *
2075array_get_typecode(arrayobject *a, void *closure)
2076{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002077 char typecode = a->ob_descr->typecode;
2078 return PyUnicode_FromOrdinal(typecode);
Martin v. Löwis99866332002-03-01 10:27:01 +00002079}
2080
2081static PyObject *
2082array_get_itemsize(arrayobject *a, void *closure)
2083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002084 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00002085}
2086
2087static PyGetSetDef array_getsets [] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 {"typecode", (getter) array_get_typecode, NULL,
2089 "the typecode character used to create the array"},
2090 {"itemsize", (getter) array_get_itemsize, NULL,
2091 "the size, in bytes, of one array item"},
2092 {NULL}
Martin v. Löwis99866332002-03-01 10:27:01 +00002093};
2094
Martin v. Löwis59683e82008-06-13 07:50:45 +00002095static PyMethodDef array_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 {"append", (PyCFunction)array_append, METH_O,
2097 append_doc},
2098 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
2099 buffer_info_doc},
2100 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
2101 byteswap_doc},
2102 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
2103 copy_doc},
2104 {"count", (PyCFunction)array_count, METH_O,
2105 count_doc},
2106 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
2107 copy_doc},
2108 {"extend", (PyCFunction)array_extend, METH_O,
2109 extend_doc},
2110 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
2111 fromfile_doc},
2112 {"fromlist", (PyCFunction)array_fromlist, METH_O,
2113 fromlist_doc},
2114 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
2115 fromstring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002116 {"frombytes", (PyCFunction)array_frombytes, METH_VARARGS,
2117 frombytes_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
2119 fromunicode_doc},
2120 {"index", (PyCFunction)array_index, METH_O,
2121 index_doc},
2122 {"insert", (PyCFunction)array_insert, METH_VARARGS,
2123 insert_doc},
2124 {"pop", (PyCFunction)array_pop, METH_VARARGS,
2125 pop_doc},
2126 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
2127 reduce_doc},
2128 {"remove", (PyCFunction)array_remove, METH_O,
2129 remove_doc},
2130 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
2131 reverse_doc},
2132/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
2133 sort_doc},*/
2134 {"tofile", (PyCFunction)array_tofile, METH_O,
2135 tofile_doc},
2136 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
2137 tolist_doc},
2138 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
2139 tostring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002140 {"tobytes", (PyCFunction)array_tobytes, METH_NOARGS,
2141 tobytes_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
2143 tounicode_doc},
2144 {NULL, NULL} /* sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +00002145};
2146
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002147static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002148array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002149{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002150 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 PyObject *s, *v = NULL;
2152 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 len = Py_SIZE(a);
2155 typecode = a->ob_descr->typecode;
2156 if (len == 0) {
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002157 return PyUnicode_FromFormat("array('%c')", (int)typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002158 }
Brett Cannon4a5e5de2011-06-07 20:09:32 -07002159 if (typecode == 'u')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 v = array_tounicode(a, NULL);
2161 else
2162 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002163
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002164 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 Py_DECREF(v);
2166 return s;
Guido van Rossum778983b1993-02-19 15:55:02 +00002167}
2168
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002169static PyObject*
2170array_subscr(arrayobject* self, PyObject* item)
2171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 if (PyIndex_Check(item)) {
2173 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2174 if (i==-1 && PyErr_Occurred()) {
2175 return NULL;
2176 }
2177 if (i < 0)
2178 i += Py_SIZE(self);
2179 return array_item(self, i);
2180 }
2181 else if (PySlice_Check(item)) {
2182 Py_ssize_t start, stop, step, slicelength, cur, i;
2183 PyObject* result;
2184 arrayobject* ar;
2185 int itemsize = self->ob_descr->itemsize;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002186
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002187 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 &start, &stop, &step, &slicelength) < 0) {
2189 return NULL;
2190 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 if (slicelength <= 0) {
2193 return newarrayobject(&Arraytype, 0, self->ob_descr);
2194 }
2195 else if (step == 1) {
2196 PyObject *result = newarrayobject(&Arraytype,
2197 slicelength, self->ob_descr);
2198 if (result == NULL)
2199 return NULL;
2200 memcpy(((arrayobject *)result)->ob_item,
2201 self->ob_item + start * itemsize,
2202 slicelength * itemsize);
2203 return result;
2204 }
2205 else {
2206 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2207 if (!result) return NULL;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 ar = (arrayobject*)result;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 for (cur = start, i = 0; i < slicelength;
2212 cur += step, i++) {
2213 memcpy(ar->ob_item + i*itemsize,
2214 self->ob_item + cur*itemsize,
2215 itemsize);
2216 }
2217
2218 return result;
2219 }
2220 }
2221 else {
2222 PyErr_SetString(PyExc_TypeError,
2223 "array indices must be integers");
2224 return NULL;
2225 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002226}
2227
2228static int
2229array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2230{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 Py_ssize_t start, stop, step, slicelength, needed;
2232 arrayobject* other;
2233 int itemsize;
Thomas Woutersed03b412007-08-28 21:37:11 +00002234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 if (PyIndex_Check(item)) {
2236 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 if (i == -1 && PyErr_Occurred())
2239 return -1;
2240 if (i < 0)
2241 i += Py_SIZE(self);
2242 if (i < 0 || i >= Py_SIZE(self)) {
2243 PyErr_SetString(PyExc_IndexError,
2244 "array assignment index out of range");
2245 return -1;
2246 }
2247 if (value == NULL) {
2248 /* Fall through to slice assignment */
2249 start = i;
2250 stop = i + 1;
2251 step = 1;
2252 slicelength = 1;
2253 }
2254 else
2255 return (*self->ob_descr->setitem)(self, i, value);
2256 }
2257 else if (PySlice_Check(item)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002258 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 Py_SIZE(self), &start, &stop,
2260 &step, &slicelength) < 0) {
2261 return -1;
2262 }
2263 }
2264 else {
2265 PyErr_SetString(PyExc_TypeError,
2266 "array indices must be integer");
2267 return -1;
2268 }
2269 if (value == NULL) {
2270 other = NULL;
2271 needed = 0;
2272 }
2273 else if (array_Check(value)) {
2274 other = (arrayobject *)value;
2275 needed = Py_SIZE(other);
2276 if (self == other) {
2277 /* Special case "self[i:j] = self" -- copy self first */
2278 int ret;
2279 value = array_slice(other, 0, needed);
2280 if (value == NULL)
2281 return -1;
2282 ret = array_ass_subscr(self, item, value);
2283 Py_DECREF(value);
2284 return ret;
2285 }
2286 if (other->ob_descr != self->ob_descr) {
2287 PyErr_BadArgument();
2288 return -1;
2289 }
2290 }
2291 else {
2292 PyErr_Format(PyExc_TypeError,
2293 "can only assign array (not \"%.200s\") to array slice",
2294 Py_TYPE(value)->tp_name);
2295 return -1;
2296 }
2297 itemsize = self->ob_descr->itemsize;
2298 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2299 if ((step > 0 && stop < start) ||
2300 (step < 0 && stop > start))
2301 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 /* Issue #4509: If the array has exported buffers and the slice
2304 assignment would change the size of the array, fail early to make
2305 sure we don't modify it. */
2306 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2307 PyErr_SetString(PyExc_BufferError,
2308 "cannot resize an array that is exporting buffers");
2309 return -1;
2310 }
Mark Dickinsonbc099642010-01-29 17:27:24 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 if (step == 1) {
2313 if (slicelength > needed) {
2314 memmove(self->ob_item + (start + needed) * itemsize,
2315 self->ob_item + stop * itemsize,
2316 (Py_SIZE(self) - stop) * itemsize);
2317 if (array_resize(self, Py_SIZE(self) +
2318 needed - slicelength) < 0)
2319 return -1;
2320 }
2321 else if (slicelength < needed) {
2322 if (array_resize(self, Py_SIZE(self) +
2323 needed - slicelength) < 0)
2324 return -1;
2325 memmove(self->ob_item + (start + needed) * itemsize,
2326 self->ob_item + stop * itemsize,
2327 (Py_SIZE(self) - start - needed) * itemsize);
2328 }
2329 if (needed > 0)
2330 memcpy(self->ob_item + start * itemsize,
2331 other->ob_item, needed * itemsize);
2332 return 0;
2333 }
2334 else if (needed == 0) {
2335 /* Delete slice */
2336 size_t cur;
2337 Py_ssize_t i;
Thomas Woutersed03b412007-08-28 21:37:11 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 if (step < 0) {
2340 stop = start + 1;
2341 start = stop + step * (slicelength - 1) - 1;
2342 step = -step;
2343 }
2344 for (cur = start, i = 0; i < slicelength;
2345 cur += step, i++) {
2346 Py_ssize_t lim = step - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002348 if (cur + step >= (size_t)Py_SIZE(self))
2349 lim = Py_SIZE(self) - cur - 1;
2350 memmove(self->ob_item + (cur - i) * itemsize,
2351 self->ob_item + (cur + 1) * itemsize,
2352 lim * itemsize);
2353 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002354 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 if (cur < (size_t)Py_SIZE(self)) {
2356 memmove(self->ob_item + (cur-slicelength) * itemsize,
2357 self->ob_item + cur * itemsize,
2358 (Py_SIZE(self) - cur) * itemsize);
2359 }
2360 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2361 return -1;
2362 return 0;
2363 }
2364 else {
2365 Py_ssize_t cur, i;
2366
2367 if (needed != slicelength) {
2368 PyErr_Format(PyExc_ValueError,
2369 "attempt to assign array of size %zd "
2370 "to extended slice of size %zd",
2371 needed, slicelength);
2372 return -1;
2373 }
2374 for (cur = start, i = 0; i < slicelength;
2375 cur += step, i++) {
2376 memcpy(self->ob_item + cur * itemsize,
2377 other->ob_item + i * itemsize,
2378 itemsize);
2379 }
2380 return 0;
2381 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002382}
2383
2384static PyMappingMethods array_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 (lenfunc)array_length,
2386 (binaryfunc)array_subscr,
2387 (objobjargproc)array_ass_subscr
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002388};
2389
Guido van Rossumd8faa362007-04-27 19:54:29 +00002390static const void *emptybuf = "";
2391
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002392
2393static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002394array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 if (view==NULL) goto finish;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 view->buf = (void *)self->ob_item;
2399 view->obj = (PyObject*)self;
2400 Py_INCREF(self);
2401 if (view->buf == NULL)
2402 view->buf = (void *)emptybuf;
2403 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2404 view->readonly = 0;
2405 view->ndim = 1;
2406 view->itemsize = self->ob_descr->itemsize;
2407 view->suboffsets = NULL;
2408 view->shape = NULL;
2409 if ((flags & PyBUF_ND)==PyBUF_ND) {
2410 view->shape = &((Py_SIZE(self)));
2411 }
2412 view->strides = NULL;
2413 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2414 view->strides = &(view->itemsize);
2415 view->format = NULL;
2416 view->internal = NULL;
Victor Stinner8dba4e02011-09-30 00:51:10 +02002417 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 view->format = self->ob_descr->formats;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002419
2420 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 self->ob_exports++;
2422 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002423}
2424
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002425static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002426array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002429}
2430
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002431static PySequenceMethods array_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 (lenfunc)array_length, /*sq_length*/
2433 (binaryfunc)array_concat, /*sq_concat*/
2434 (ssizeargfunc)array_repeat, /*sq_repeat*/
2435 (ssizeargfunc)array_item, /*sq_item*/
2436 0, /*sq_slice*/
2437 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2438 0, /*sq_ass_slice*/
2439 (objobjproc)array_contains, /*sq_contains*/
2440 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2441 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002442};
2443
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002444static PyBufferProcs array_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 (getbufferproc)array_buffer_getbuf,
2446 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002447};
2448
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002449static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002450array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 int c;
2453 PyObject *initial = NULL, *it = NULL;
2454 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00002455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
2457 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2460 return NULL;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 if (!(initial == NULL || PyList_Check(initial)
2463 || PyByteArray_Check(initial)
2464 || PyBytes_Check(initial)
2465 || PyTuple_Check(initial)
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002466 || ((c=='u') && PyUnicode_Check(initial))
2467 || (array_Check(initial)
2468 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 it = PyObject_GetIter(initial);
2470 if (it == NULL)
2471 return NULL;
2472 /* We set initial to NULL so that the subsequent code
2473 will create an empty array of the appropriate type
2474 and afterwards we can use array_iter_extend to populate
2475 the array.
2476 */
2477 initial = NULL;
2478 }
2479 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2480 if (descr->typecode == c) {
2481 PyObject *a;
2482 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002483
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002484 if (initial == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002485 len = 0;
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002486 else if (PyList_Check(initial))
2487 len = PyList_GET_SIZE(initial);
2488 else if (PyTuple_Check(initial) || array_Check(initial))
2489 len = Py_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 else
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002491 len = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +00002492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002493 a = newarrayobject(type, len, descr);
2494 if (a == NULL)
2495 return NULL;
2496
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002497 if (len > 0 && !array_Check(initial)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 Py_ssize_t i;
2499 for (i = 0; i < len; i++) {
2500 PyObject *v =
2501 PySequence_GetItem(initial, i);
2502 if (v == NULL) {
2503 Py_DECREF(a);
2504 return NULL;
2505 }
2506 if (setarrayitem(a, i, v) != 0) {
2507 Py_DECREF(v);
2508 Py_DECREF(a);
2509 return NULL;
2510 }
2511 Py_DECREF(v);
2512 }
2513 }
2514 else if (initial != NULL && (PyByteArray_Check(initial) ||
2515 PyBytes_Check(initial))) {
2516 PyObject *t_initial, *v;
2517 t_initial = PyTuple_Pack(1, initial);
2518 if (t_initial == NULL) {
2519 Py_DECREF(a);
2520 return NULL;
2521 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002522 v = array_frombytes((arrayobject *)a,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002523 t_initial);
2524 Py_DECREF(t_initial);
2525 if (v == NULL) {
2526 Py_DECREF(a);
2527 return NULL;
2528 }
2529 Py_DECREF(v);
2530 }
2531 else if (initial != NULL && PyUnicode_Check(initial)) {
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002532 Py_ssize_t n;
2533 if (PyUnicode_READY(initial)) {
2534 Py_DECREF(a);
2535 return NULL;
2536 }
2537 n = PyUnicode_GET_LENGTH(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 if (n > 0) {
2539 arrayobject *self = (arrayobject *)a;
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002540 Py_UCS4 *item = (Py_UCS4 *)self->ob_item;
Victor Stinner1fe99a22011-09-30 01:55:49 +02002541 item = (Py_UCS4 *)PyMem_Realloc(item, n * sizeof(Py_UCS4));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (item == NULL) {
2543 PyErr_NoMemory();
2544 Py_DECREF(a);
2545 return NULL;
2546 }
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002547 self->ob_item = (char*)item;
2548 Py_SIZE(self) = n;
2549 if (!PyUnicode_AsUCS4(initial, item, n, 0))
2550 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 self->allocated = Py_SIZE(self);
2552 }
2553 }
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002554 else if (initial != NULL && array_Check(initial)) {
2555 arrayobject *self = (arrayobject *)a;
2556 arrayobject *other = (arrayobject *)initial;
2557 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2558 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (it != NULL) {
2560 if (array_iter_extend((arrayobject *)a, it) == -1) {
2561 Py_DECREF(it);
2562 Py_DECREF(a);
2563 return NULL;
2564 }
2565 Py_DECREF(it);
2566 }
2567 return a;
2568 }
2569 }
2570 PyErr_SetString(PyExc_ValueError,
Meador Inge1c9f0c92011-09-20 19:55:51 -05002571#ifdef HAVE_LONG_LONG
2572 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
2573#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Meador Inge1c9f0c92011-09-20 19:55:51 -05002575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002576 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002577}
2578
Guido van Rossum778983b1993-02-19 15:55:02 +00002579
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002580PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002581"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002582an array of basic values: characters, integers, floating point\n\
2583numbers. Arrays are sequence types and behave very much like lists,\n\
2584except that the type of objects stored in them is constrained. The\n\
2585type is specified at object creation time by using a type code, which\n\
2586is a single character. The following type codes are defined:\n\
2587\n\
2588 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002589 'b' signed integer 1 \n\
2590 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002591 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002592 'h' signed integer 2 \n\
2593 'H' unsigned integer 2 \n\
2594 'i' signed integer 2 \n\
2595 'I' unsigned integer 2 \n\
2596 'l' signed integer 4 \n\
2597 'L' unsigned integer 4 \n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002598 'q' signed integer 8 (see note) \n\
2599 'Q' unsigned integer 8 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002600 'f' floating point 4 \n\
2601 'd' floating point 8 \n\
2602\n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002603NOTE: The 'u' type code corresponds to Python's unicode character. On \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002604narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2605\n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002606NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
2607C compiler used to build Python supports 'long long', or, on Windows, \n\
2608'__int64'.\n\
2609\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002610The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002611\n\
2612array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002613");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002614
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002615PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002616"array(typecode [, initializer]) -> array\n\
2617\n\
2618Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002619initialized from the optional initializer value, which must be a list,\n\
2620string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002621\n\
2622Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002623the type of objects stored in them is constrained.\n\
2624\n\
2625Methods:\n\
2626\n\
2627append() -- append a new item to the end of the array\n\
2628buffer_info() -- return information giving the current memory info\n\
2629byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002630count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002631extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002632fromfile() -- read items from a file object\n\
2633fromlist() -- append items from the list\n\
2634fromstring() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002635index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002636insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002637pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002638remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002639reverse() -- reverse the order of the items in the array\n\
2640tofile() -- write all items to a file object\n\
2641tolist() -- return the array converted to an ordinary list\n\
2642tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002643\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002644Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002645\n\
2646typecode -- the typecode character used to create the array\n\
2647itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002649
Raymond Hettinger625812f2003-01-07 01:58:52 +00002650static PyObject *array_iter(arrayobject *ao);
2651
Tim Peters0c322792002-07-17 16:49:03 +00002652static PyTypeObject Arraytype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 PyVarObject_HEAD_INIT(NULL, 0)
2654 "array.array",
2655 sizeof(arrayobject),
2656 0,
2657 (destructor)array_dealloc, /* tp_dealloc */
2658 0, /* tp_print */
2659 0, /* tp_getattr */
2660 0, /* tp_setattr */
2661 0, /* tp_reserved */
2662 (reprfunc)array_repr, /* tp_repr */
2663 0, /* tp_as_number*/
2664 &array_as_sequence, /* tp_as_sequence*/
2665 &array_as_mapping, /* tp_as_mapping*/
2666 0, /* tp_hash */
2667 0, /* tp_call */
2668 0, /* tp_str */
2669 PyObject_GenericGetAttr, /* tp_getattro */
2670 0, /* tp_setattro */
2671 &array_as_buffer, /* tp_as_buffer*/
2672 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2673 arraytype_doc, /* tp_doc */
2674 0, /* tp_traverse */
2675 0, /* tp_clear */
2676 array_richcompare, /* tp_richcompare */
2677 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2678 (getiterfunc)array_iter, /* tp_iter */
2679 0, /* tp_iternext */
2680 array_methods, /* tp_methods */
2681 0, /* tp_members */
2682 array_getsets, /* tp_getset */
2683 0, /* tp_base */
2684 0, /* tp_dict */
2685 0, /* tp_descr_get */
2686 0, /* tp_descr_set */
2687 0, /* tp_dictoffset */
2688 0, /* tp_init */
2689 PyType_GenericAlloc, /* tp_alloc */
2690 array_new, /* tp_new */
2691 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002692};
2693
Raymond Hettinger625812f2003-01-07 01:58:52 +00002694
2695/*********************** Array Iterator **************************/
2696
2697typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 PyObject_HEAD
2699 Py_ssize_t index;
2700 arrayobject *ao;
2701 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002702} arrayiterobject;
2703
2704static PyTypeObject PyArrayIter_Type;
2705
2706#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2707
2708static PyObject *
2709array_iter(arrayobject *ao)
2710{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002711 arrayiterobject *it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 if (!array_Check(ao)) {
2714 PyErr_BadInternalCall();
2715 return NULL;
2716 }
Raymond Hettinger625812f2003-01-07 01:58:52 +00002717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002718 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2719 if (it == NULL)
2720 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 Py_INCREF(ao);
2723 it->ao = ao;
2724 it->index = 0;
2725 it->getitem = ao->ob_descr->getitem;
2726 PyObject_GC_Track(it);
2727 return (PyObject *)it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002728}
2729
2730static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002731arrayiter_next(arrayiterobject *it)
2732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 assert(PyArrayIter_Check(it));
2734 if (it->index < Py_SIZE(it->ao))
2735 return (*it->getitem)(it->ao, it->index++);
2736 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002737}
2738
2739static void
2740arrayiter_dealloc(arrayiterobject *it)
2741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 PyObject_GC_UnTrack(it);
2743 Py_XDECREF(it->ao);
2744 PyObject_GC_Del(it);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002745}
2746
2747static int
2748arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 Py_VISIT(it->ao);
2751 return 0;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002752}
2753
2754static PyTypeObject PyArrayIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 PyVarObject_HEAD_INIT(NULL, 0)
2756 "arrayiterator", /* tp_name */
2757 sizeof(arrayiterobject), /* tp_basicsize */
2758 0, /* tp_itemsize */
2759 /* methods */
2760 (destructor)arrayiter_dealloc, /* tp_dealloc */
2761 0, /* tp_print */
2762 0, /* tp_getattr */
2763 0, /* tp_setattr */
2764 0, /* tp_reserved */
2765 0, /* tp_repr */
2766 0, /* tp_as_number */
2767 0, /* tp_as_sequence */
2768 0, /* tp_as_mapping */
2769 0, /* tp_hash */
2770 0, /* tp_call */
2771 0, /* tp_str */
2772 PyObject_GenericGetAttr, /* tp_getattro */
2773 0, /* tp_setattro */
2774 0, /* tp_as_buffer */
2775 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2776 0, /* tp_doc */
2777 (traverseproc)arrayiter_traverse, /* tp_traverse */
2778 0, /* tp_clear */
2779 0, /* tp_richcompare */
2780 0, /* tp_weaklistoffset */
2781 PyObject_SelfIter, /* tp_iter */
2782 (iternextfunc)arrayiter_next, /* tp_iternext */
2783 0, /* tp_methods */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002784};
2785
2786
2787/*********************** Install Module **************************/
2788
Martin v. Löwis99866332002-03-01 10:27:01 +00002789/* No functions in array module. */
2790static PyMethodDef a_methods[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002791 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
2792 PyDoc_STR("Internal. Used for pickling support.")},
Martin v. Löwis99866332002-03-01 10:27:01 +00002793 {NULL, NULL, 0, NULL} /* Sentinel */
2794};
2795
Martin v. Löwis1a214512008-06-11 05:26:20 +00002796static struct PyModuleDef arraymodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 PyModuleDef_HEAD_INIT,
2798 "array",
2799 module_doc,
2800 -1,
2801 a_methods,
2802 NULL,
2803 NULL,
2804 NULL,
2805 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002806};
2807
Martin v. Löwis99866332002-03-01 10:27:01 +00002808
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002809PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002810PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 PyObject *m;
Georg Brandl4cb0de22011-09-28 21:49:49 +02002813 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PyObject *typecodes;
2815 Py_ssize_t size = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 if (PyType_Ready(&Arraytype) < 0)
2819 return NULL;
2820 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
2821 m = PyModule_Create(&arraymodule);
2822 if (m == NULL)
2823 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 Py_INCREF((PyObject *)&Arraytype);
2826 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2827 Py_INCREF((PyObject *)&Arraytype);
2828 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2831 size++;
2832 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002833
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002834 p = buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2836 *p++ = (char)descr->typecode;
2837 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002838 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002840 PyModule_AddObject(m, "typecodes", typecodes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841
2842 if (PyErr_Occurred()) {
2843 Py_DECREF(m);
2844 m = NULL;
2845 }
2846 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002847}