blob: 3aba9adbeb2c80692a7072df63a0cdc4d4ac77b5 [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 Stinner62bb3942012-08-06 00:46:05 +0200177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
Martin v. Löwis99866332002-03-01 10:27:01 +0000178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
Victor Stinner62bb3942012-08-06 00:46:05 +0200183 Py_UNICODE *p;
184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
Victor Stinner62bb3942012-08-06 00:46:05 +0200186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 return -1;
Victor Stinner62bb3942012-08-06 00:46:05 +0200188 if (len != 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
191 return -1;
192 }
193 if (i >= 0)
Victor Stinner62bb3942012-08-06 00:46:05 +0200194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000196}
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000205
Guido van Rossum778983b1993-02-19 15:55:02 +0000206static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000207h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 short x;
210 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
211 if (!PyArg_Parse(v, "h;array item must be integer", &x))
212 return -1;
213 if (i >= 0)
214 ((short *)ap->ob_item)[i] = x;
215 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000216}
217
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000218static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000219HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000222}
223
Fred Drake541dc3b2000-06-28 17:49:30 +0000224static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000225HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 int x;
228 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
229 must use the next size up and manually do the overflow checking */
230 if (!PyArg_Parse(v, "i;array item must be integer", &x))
231 return -1;
232 else if (x < 0) {
233 PyErr_SetString(PyExc_OverflowError,
234 "unsigned short is less than minimum");
235 return -1;
236 }
237 else if (x > USHRT_MAX) {
238 PyErr_SetString(PyExc_OverflowError,
239 "unsigned short is greater than maximum");
240 return -1;
241 }
242 if (i >= 0)
243 ((short *)ap->ob_item)[i] = (short)x;
244 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000245}
Guido van Rossum549ab711997-01-03 19:09:47 +0000246
247static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000248i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000251}
252
253static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 int x;
257 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
258 if (!PyArg_Parse(v, "i;array item must be integer", &x))
259 return -1;
260 if (i >= 0)
261 ((int *)ap->ob_item)[i] = x;
262 return 0;
Guido van Rossume77a7571993-11-03 15:01:26 +0000263}
264
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000265static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000266II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 return PyLong_FromUnsignedLong(
269 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000270}
271
272static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 unsigned long x;
276 if (PyLong_Check(v)) {
277 x = PyLong_AsUnsignedLong(v);
278 if (x == (unsigned long) -1 && PyErr_Occurred())
279 return -1;
280 }
281 else {
282 long y;
283 if (!PyArg_Parse(v, "l;array item must be integer", &y))
284 return -1;
285 if (y < 0) {
286 PyErr_SetString(PyExc_OverflowError,
287 "unsigned int is less than minimum");
288 return -1;
289 }
290 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 }
293 if (x > UINT_MAX) {
294 PyErr_SetString(PyExc_OverflowError,
295 "unsigned int is greater than maximum");
296 return -1;
297 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 if (i >= 0)
300 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
301 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000302}
303
304static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000308}
309
310static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000311l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 long x;
314 if (!PyArg_Parse(v, "l;array item must be integer", &x))
315 return -1;
316 if (i >= 0)
317 ((long *)ap->ob_item)[i] = x;
318 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000319}
320
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000321static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000322LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000325}
326
327static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000328LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 unsigned long x;
331 if (PyLong_Check(v)) {
332 x = PyLong_AsUnsignedLong(v);
333 if (x == (unsigned long) -1 && PyErr_Occurred())
334 return -1;
335 }
336 else {
337 long y;
338 if (!PyArg_Parse(v, "l;array item must be integer", &y))
339 return -1;
340 if (y < 0) {
341 PyErr_SetString(PyExc_OverflowError,
342 "unsigned long is less than minimum");
343 return -1;
344 }
345 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 }
348 if (x > ULONG_MAX) {
349 PyErr_SetString(PyExc_OverflowError,
350 "unsigned long is greater than maximum");
351 return -1;
352 }
Tim Petersbb307342000-09-10 05:22:54 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (i >= 0)
355 ((unsigned long *)ap->ob_item)[i] = x;
356 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000357}
358
Meador Inge1c9f0c92011-09-20 19:55:51 -0500359#ifdef HAVE_LONG_LONG
360
361static PyObject *
362q_getitem(arrayobject *ap, Py_ssize_t i)
363{
364 return PyLong_FromLongLong(((PY_LONG_LONG *)ap->ob_item)[i]);
365}
366
367static int
368q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
369{
370 PY_LONG_LONG x;
371 if (!PyArg_Parse(v, "L;array item must be integer", &x))
372 return -1;
373 if (i >= 0)
374 ((PY_LONG_LONG *)ap->ob_item)[i] = x;
375 return 0;
376}
377
378static PyObject *
379QQ_getitem(arrayobject *ap, Py_ssize_t i)
380{
381 return PyLong_FromUnsignedLongLong(
382 ((unsigned PY_LONG_LONG *)ap->ob_item)[i]);
383}
384
385static int
386QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
387{
388 unsigned PY_LONG_LONG x;
389 if (PyLong_Check(v)) {
390 x = PyLong_AsUnsignedLongLong(v);
391 if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())
392 return -1;
393 }
394 else {
395 PY_LONG_LONG y;
396 if (!PyArg_Parse(v, "L;array item must be integer", &y))
397 return -1;
398 if (y < 0) {
399 PyErr_SetString(PyExc_OverflowError,
400 "unsigned long long is less than minimum");
401 return -1;
402 }
403 x = (unsigned PY_LONG_LONG)y;
404 }
405
406 if (i >= 0)
407 ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;
408 return 0;
409}
410#endif
411
Guido van Rossum549ab711997-01-03 19:09:47 +0000412static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000413f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000416}
417
418static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 float x;
422 if (!PyArg_Parse(v, "f;array item must be float", &x))
423 return -1;
424 if (i >= 0)
425 ((float *)ap->ob_item)[i] = x;
426 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000427}
428
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000430d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000433}
434
435static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 double x;
439 if (!PyArg_Parse(v, "d;array item must be float", &x))
440 return -1;
441 if (i >= 0)
442 ((double *)ap->ob_item)[i] = x;
443 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000444}
445
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000446
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000447/* Description of types.
448 *
449 * Don't forget to update typecode_to_mformat_code() if you add a new
450 * typecode.
451 */
Guido van Rossum234f9421993-06-17 12:35:49 +0000452static struct arraydescr descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
454 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
Victor Stinner62bb3942012-08-06 00:46:05 +0200455 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
457 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
458 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
459 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
460 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
461 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
Meador Inge1c9f0c92011-09-20 19:55:51 -0500462#ifdef HAVE_LONG_LONG
463 {'q', sizeof(PY_LONG_LONG), q_getitem, q_setitem, "q", 1, 1},
464 {'Q', sizeof(PY_LONG_LONG), QQ_getitem, QQ_setitem, "Q", 1, 0},
465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
467 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
468 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000469};
Tim Petersbb307342000-09-10 05:22:54 +0000470
471/****************************************************************************
472Implementations of array object methods.
473****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000474
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000475static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000476newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 arrayobject *op;
479 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 if (size < 0) {
482 PyErr_BadInternalCall();
483 return NULL;
484 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 /* Check for overflow */
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100487 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 return PyErr_NoMemory();
489 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100490 nbytes = size * descr->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 op = (arrayobject *) type->tp_alloc(type, 0);
492 if (op == NULL) {
493 return NULL;
494 }
495 op->ob_descr = descr;
496 op->allocated = size;
497 op->weakreflist = NULL;
498 Py_SIZE(op) = size;
499 if (size <= 0) {
500 op->ob_item = NULL;
501 }
502 else {
503 op->ob_item = PyMem_NEW(char, nbytes);
504 if (op->ob_item == NULL) {
505 Py_DECREF(op);
506 return PyErr_NoMemory();
507 }
508 }
509 op->ob_exports = 0;
510 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000511}
512
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000513static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000514getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 register arrayobject *ap;
517 assert(array_Check(op));
518 ap = (arrayobject *)op;
519 assert(i>=0 && i<Py_SIZE(ap));
520 return (*ap->ob_descr->getitem)(ap, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000521}
522
523static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000524ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 char *items;
527 Py_ssize_t n = Py_SIZE(self);
528 if (v == NULL) {
529 PyErr_BadInternalCall();
530 return -1;
531 }
532 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
533 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 if (array_resize(self, n+1) == -1)
536 return -1;
537 items = self->ob_item;
538 if (where < 0) {
539 where += n;
540 if (where < 0)
541 where = 0;
542 }
543 if (where > n)
544 where = n;
545 /* appends don't need to call memmove() */
546 if (where != n)
547 memmove(items + (where+1)*self->ob_descr->itemsize,
548 items + where*self->ob_descr->itemsize,
549 (n-where)*self->ob_descr->itemsize);
550 return (*self->ob_descr->setitem)(self, where, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000551}
552
Guido van Rossum778983b1993-02-19 15:55:02 +0000553/* Methods */
554
555static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000556array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (op->weakreflist != NULL)
559 PyObject_ClearWeakRefs((PyObject *) op);
560 if (op->ob_item != NULL)
561 PyMem_DEL(op->ob_item);
562 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000563}
564
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000565static PyObject *
566array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 arrayobject *va, *wa;
569 PyObject *vi = NULL;
570 PyObject *wi = NULL;
571 Py_ssize_t i, k;
572 PyObject *res;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000573
Brian Curtindfc80e32011-08-10 20:28:54 -0500574 if (!array_Check(v) || !array_Check(w))
575 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 va = (arrayobject *)v;
578 wa = (arrayobject *)w;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
581 /* Shortcut: if the lengths differ, the arrays differ */
582 if (op == Py_EQ)
583 res = Py_False;
584 else
585 res = Py_True;
586 Py_INCREF(res);
587 return res;
588 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Search for the first index where items are different */
591 k = 1;
592 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
593 vi = getarrayitem(v, i);
594 wi = getarrayitem(w, i);
595 if (vi == NULL || wi == NULL) {
596 Py_XDECREF(vi);
597 Py_XDECREF(wi);
598 return NULL;
599 }
600 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
601 if (k == 0)
602 break; /* Keeping vi and wi alive! */
603 Py_DECREF(vi);
604 Py_DECREF(wi);
605 if (k < 0)
606 return NULL;
607 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (k) {
610 /* No more items to compare -- compare sizes */
611 Py_ssize_t vs = Py_SIZE(va);
612 Py_ssize_t ws = Py_SIZE(wa);
613 int cmp;
614 switch (op) {
615 case Py_LT: cmp = vs < ws; break;
616 case Py_LE: cmp = vs <= ws; break;
617 case Py_EQ: cmp = vs == ws; break;
618 case Py_NE: cmp = vs != ws; break;
619 case Py_GT: cmp = vs > ws; break;
620 case Py_GE: cmp = vs >= ws; break;
621 default: return NULL; /* cannot happen */
622 }
623 if (cmp)
624 res = Py_True;
625 else
626 res = Py_False;
627 Py_INCREF(res);
628 return res;
629 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* We have an item that differs. First, shortcuts for EQ/NE */
632 if (op == Py_EQ) {
633 Py_INCREF(Py_False);
634 res = Py_False;
635 }
636 else if (op == Py_NE) {
637 Py_INCREF(Py_True);
638 res = Py_True;
639 }
640 else {
641 /* Compare the final item again using the proper operator */
642 res = PyObject_RichCompare(vi, wi, op);
643 }
644 Py_DECREF(vi);
645 Py_DECREF(wi);
646 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000647}
648
Martin v. Löwis18e16552006-02-15 17:27:45 +0000649static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000650array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000653}
654
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000655static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 if (i < 0 || i >= Py_SIZE(a)) {
659 PyErr_SetString(PyExc_IndexError, "array index out of range");
660 return NULL;
661 }
662 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000663}
664
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000665static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000666array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 arrayobject *np;
669 if (ilow < 0)
670 ilow = 0;
671 else if (ilow > Py_SIZE(a))
672 ilow = Py_SIZE(a);
673 if (ihigh < 0)
674 ihigh = 0;
675 if (ihigh < ilow)
676 ihigh = ilow;
677 else if (ihigh > Py_SIZE(a))
678 ihigh = Py_SIZE(a);
679 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
680 if (np == NULL)
681 return NULL;
682 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
683 (ihigh-ilow) * a->ob_descr->itemsize);
684 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000685}
686
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000687static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000688array_copy(arrayobject *a, PyObject *unused)
689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000691}
692
693PyDoc_STRVAR(copy_doc,
694"copy(array)\n\
695\n\
696 Return a copy of the array.");
697
698static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000699array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 Py_ssize_t size;
702 arrayobject *np;
703 if (!array_Check(bb)) {
704 PyErr_Format(PyExc_TypeError,
705 "can only append array (not \"%.200s\") to array",
706 Py_TYPE(bb)->tp_name);
707 return NULL;
708 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000709#define b ((arrayobject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (a->ob_descr != b->ob_descr) {
711 PyErr_BadArgument();
712 return NULL;
713 }
714 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
715 return PyErr_NoMemory();
716 }
717 size = Py_SIZE(a) + Py_SIZE(b);
718 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
719 if (np == NULL) {
720 return NULL;
721 }
722 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
723 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
724 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
725 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000726#undef b
727}
728
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000729static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000730array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 Py_ssize_t size;
733 arrayobject *np;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000734 Py_ssize_t oldbytes, newbytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (n < 0)
736 n = 0;
737 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
738 return PyErr_NoMemory();
739 }
740 size = Py_SIZE(a) * n;
741 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
742 if (np == NULL)
743 return NULL;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000744 if (n == 0)
745 return (PyObject *)np;
746 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
747 newbytes = oldbytes * n;
748 /* this follows the code in unicode_repeat */
749 if (oldbytes == 1) {
750 memset(np->ob_item, a->ob_item[0], newbytes);
751 } else {
752 Py_ssize_t done = oldbytes;
753 Py_MEMCPY(np->ob_item, a->ob_item, oldbytes);
754 while (done < newbytes) {
755 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
756 Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy);
757 done += ncopy;
758 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 }
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000760 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000761}
762
763static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000764array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 char *item;
767 Py_ssize_t n; /* Size of replacement array */
768 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000769#define b ((arrayobject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 if (v == NULL)
771 n = 0;
772 else if (array_Check(v)) {
773 n = Py_SIZE(b);
774 if (a == b) {
775 /* Special case "a[i:j] = a" -- copy b first */
776 int ret;
777 v = array_slice(b, 0, n);
778 if (!v)
779 return -1;
780 ret = array_ass_slice(a, ilow, ihigh, v);
781 Py_DECREF(v);
782 return ret;
783 }
784 if (b->ob_descr != a->ob_descr) {
785 PyErr_BadArgument();
786 return -1;
787 }
788 }
789 else {
790 PyErr_Format(PyExc_TypeError,
791 "can only assign array (not \"%.200s\") to array slice",
792 Py_TYPE(v)->tp_name);
793 return -1;
794 }
795 if (ilow < 0)
796 ilow = 0;
797 else if (ilow > Py_SIZE(a))
798 ilow = Py_SIZE(a);
799 if (ihigh < 0)
800 ihigh = 0;
801 if (ihigh < ilow)
802 ihigh = ilow;
803 else if (ihigh > Py_SIZE(a))
804 ihigh = Py_SIZE(a);
805 item = a->ob_item;
806 d = n - (ihigh-ilow);
807 /* Issue #4509: If the array has exported buffers and the slice
808 assignment would change the size of the array, fail early to make
809 sure we don't modify it. */
810 if (d != 0 && a->ob_exports > 0) {
811 PyErr_SetString(PyExc_BufferError,
812 "cannot resize an array that is exporting buffers");
813 return -1;
814 }
815 if (d < 0) { /* Delete -d items */
816 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
817 item + ihigh*a->ob_descr->itemsize,
818 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
819 if (array_resize(a, Py_SIZE(a) + d) == -1)
820 return -1;
821 }
822 else if (d > 0) { /* Insert d items */
823 if (array_resize(a, Py_SIZE(a) + d))
824 return -1;
825 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
826 item + ihigh*a->ob_descr->itemsize,
827 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
828 }
829 if (n > 0)
830 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
831 n*b->ob_descr->itemsize);
832 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000833#undef b
834}
835
836static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000837array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (i < 0 || i >= Py_SIZE(a)) {
840 PyErr_SetString(PyExc_IndexError,
841 "array assignment index out of range");
842 return -1;
843 }
844 if (v == NULL)
845 return array_ass_slice(a, i, i+1, v);
846 return (*a->ob_descr->setitem)(a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000847}
848
849static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000850setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 assert(array_Check(a));
853 return array_ass_item((arrayobject *)a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000854}
855
Martin v. Löwis99866332002-03-01 10:27:01 +0000856static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000857array_iter_extend(arrayobject *self, PyObject *bb)
858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 PyObject *it, *v;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 it = PyObject_GetIter(bb);
862 if (it == NULL)
863 return -1;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 while ((v = PyIter_Next(it)) != NULL) {
Mark Dickinson346f0af2010-08-06 09:36:57 +0000866 if (ins1(self, Py_SIZE(self), v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 Py_DECREF(v);
868 Py_DECREF(it);
869 return -1;
870 }
871 Py_DECREF(v);
872 }
873 Py_DECREF(it);
874 if (PyErr_Occurred())
875 return -1;
876 return 0;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000877}
878
879static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000880array_do_extend(arrayobject *self, PyObject *bb)
881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 Py_ssize_t size, oldsize, bbsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 if (!array_Check(bb))
885 return array_iter_extend(self, bb);
886#define b ((arrayobject *)bb)
887 if (self->ob_descr != b->ob_descr) {
888 PyErr_SetString(PyExc_TypeError,
889 "can only extend with array of same kind");
890 return -1;
891 }
892 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
893 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
894 PyErr_NoMemory();
895 return -1;
896 }
897 oldsize = Py_SIZE(self);
898 /* Get the size of bb before resizing the array since bb could be self. */
899 bbsize = Py_SIZE(bb);
900 size = oldsize + Py_SIZE(b);
901 if (array_resize(self, size) == -1)
902 return -1;
903 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
904 b->ob_item, bbsize * b->ob_descr->itemsize);
905
906 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000907#undef b
908}
909
910static PyObject *
911array_inplace_concat(arrayobject *self, PyObject *bb)
912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 if (!array_Check(bb)) {
914 PyErr_Format(PyExc_TypeError,
915 "can only extend array with array (not \"%.200s\")",
916 Py_TYPE(bb)->tp_name);
917 return NULL;
918 }
919 if (array_do_extend(self, bb) == -1)
920 return NULL;
921 Py_INCREF(self);
922 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000923}
924
925static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000926array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 char *items, *p;
929 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 if (Py_SIZE(self) > 0) {
932 if (n < 0)
933 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 if ((self->ob_descr->itemsize != 0) &&
935 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
936 return PyErr_NoMemory();
937 }
938 size = Py_SIZE(self) * self->ob_descr->itemsize;
939 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
940 return PyErr_NoMemory();
941 }
942 if (array_resize(self, n * Py_SIZE(self)) == -1)
943 return NULL;
944 items = p = self->ob_item;
945 for (i = 1; i < n; i++) {
946 p += size;
947 memcpy(p, items, size);
948 }
949 }
950 Py_INCREF(self);
951 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000952}
953
954
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000955static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000956ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 if (ins1(self, where, v) != 0)
959 return NULL;
960 Py_INCREF(Py_None);
961 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000962}
963
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000964static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000965array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 Py_ssize_t count = 0;
968 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 for (i = 0; i < Py_SIZE(self); i++) {
971 PyObject *selfi = getarrayitem((PyObject *)self, i);
972 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
973 Py_DECREF(selfi);
974 if (cmp > 0)
975 count++;
976 else if (cmp < 0)
977 return NULL;
978 }
979 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980}
981
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000982PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000983"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000985Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000986
987static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000988array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000989{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 for (i = 0; i < Py_SIZE(self); i++) {
993 PyObject *selfi = getarrayitem((PyObject *)self, i);
994 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
995 Py_DECREF(selfi);
996 if (cmp > 0) {
997 return PyLong_FromLong((long)i);
998 }
999 else if (cmp < 0)
1000 return NULL;
1001 }
1002 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
1003 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001004}
1005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001006PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001007"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001008\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001009Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010
Raymond Hettinger625812f2003-01-07 01:58:52 +00001011static int
1012array_contains(arrayobject *self, PyObject *v)
1013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 Py_ssize_t i;
1015 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1018 PyObject *selfi = getarrayitem((PyObject *)self, i);
1019 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1020 Py_DECREF(selfi);
1021 }
1022 return cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001023}
1024
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001025static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001026array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 for (i = 0; i < Py_SIZE(self); i++) {
1031 PyObject *selfi = getarrayitem((PyObject *)self,i);
1032 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1033 Py_DECREF(selfi);
1034 if (cmp > 0) {
1035 if (array_ass_slice(self, i, i+1,
1036 (PyObject *)NULL) != 0)
1037 return NULL;
1038 Py_INCREF(Py_None);
1039 return Py_None;
1040 }
1041 else if (cmp < 0)
1042 return NULL;
1043 }
1044 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
1045 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001046}
1047
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001048PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001049"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001050\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001051Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001052
1053static PyObject *
1054array_pop(arrayobject *self, PyObject *args)
1055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 Py_ssize_t i = -1;
1057 PyObject *v;
1058 if (!PyArg_ParseTuple(args, "|n:pop", &i))
1059 return NULL;
1060 if (Py_SIZE(self) == 0) {
1061 /* Special-case most common failure cause */
1062 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1063 return NULL;
1064 }
1065 if (i < 0)
1066 i += Py_SIZE(self);
1067 if (i < 0 || i >= Py_SIZE(self)) {
1068 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1069 return NULL;
1070 }
1071 v = getarrayitem((PyObject *)self,i);
1072 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1073 Py_DECREF(v);
1074 return NULL;
1075 }
1076 return v;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001077}
1078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001079PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001080"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001081\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001082Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001083
1084static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001085array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 if (array_do_extend(self, bb) == -1)
1088 return NULL;
1089 Py_INCREF(Py_None);
1090 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001091}
1092
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001093PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001094"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001095\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001096 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001097
1098static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001099array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 Py_ssize_t i;
1102 PyObject *v;
1103 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
1104 return NULL;
1105 return ins(self, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001106}
1107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001108PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001109"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001111Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001112
1113
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001114static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001115array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 PyObject* retval = NULL;
1118 retval = PyTuple_New(2);
1119 if (!retval)
1120 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1123 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001126}
1127
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001128PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001129"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001130\n\
1131Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001132the length in items of the buffer used to hold array's contents\n\
1133The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001134the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001135
1136
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001137static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001138array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001139{
Mark Dickinson346f0af2010-08-06 09:36:57 +00001140 return ins(self, Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001141}
1142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001143PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001144"append(x)\n\
1145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001146Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001147
1148
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001150array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 char *p;
1153 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 switch (self->ob_descr->itemsize) {
1156 case 1:
1157 break;
1158 case 2:
1159 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1160 char p0 = p[0];
1161 p[0] = p[1];
1162 p[1] = p0;
1163 }
1164 break;
1165 case 4:
1166 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1167 char p0 = p[0];
1168 char p1 = p[1];
1169 p[0] = p[3];
1170 p[1] = p[2];
1171 p[2] = p1;
1172 p[3] = p0;
1173 }
1174 break;
1175 case 8:
1176 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1177 char p0 = p[0];
1178 char p1 = p[1];
1179 char p2 = p[2];
1180 char p3 = p[3];
1181 p[0] = p[7];
1182 p[1] = p[6];
1183 p[2] = p[5];
1184 p[3] = p[4];
1185 p[4] = p3;
1186 p[5] = p2;
1187 p[6] = p1;
1188 p[7] = p0;
1189 }
1190 break;
1191 default:
1192 PyErr_SetString(PyExc_RuntimeError,
1193 "don't know how to byteswap this array type");
1194 return NULL;
1195 }
1196 Py_INCREF(Py_None);
1197 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001198}
1199
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001200PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001201"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001202\n\
Fred Drakebf272981999-12-03 17:15:30 +00001203Byteswap 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 +000012044, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001205
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001206static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001207array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001209 register Py_ssize_t itemsize = self->ob_descr->itemsize;
1210 register char *p, *q;
1211 /* little buffer to hold items while swapping */
1212 char tmp[256]; /* 8 is probably enough -- but why skimp */
1213 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 if (Py_SIZE(self) > 1) {
1216 for (p = self->ob_item,
1217 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1218 p < q;
1219 p += itemsize, q -= itemsize) {
1220 /* memory areas guaranteed disjoint, so memcpy
1221 * is safe (& memmove may be slower).
1222 */
1223 memcpy(tmp, p, itemsize);
1224 memcpy(p, q, itemsize);
1225 memcpy(q, tmp, itemsize);
1226 }
1227 }
Tim Petersbb307342000-09-10 05:22:54 +00001228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 Py_INCREF(Py_None);
1230 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001231}
Guido van Rossume77a7571993-11-03 15:01:26 +00001232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001233PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001234"reverse()\n\
1235\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001236Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001237
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001238
1239/* Forward */
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001240static PyObject *array_frombytes(arrayobject *self, PyObject *args);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001241
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001242static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001243array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 PyObject *f, *b, *res;
1246 Py_ssize_t itemsize = self->ob_descr->itemsize;
1247 Py_ssize_t n, nbytes;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001248 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001251 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
1252 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001253
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001254 if (n < 0) {
1255 PyErr_SetString(PyExc_ValueError, "negative count");
1256 return NULL;
1257 }
1258 if (n > PY_SSIZE_T_MAX / itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 PyErr_NoMemory();
1260 return NULL;
1261 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001262 nbytes = n * itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001263
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001264 b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001265 if (b == NULL)
1266 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 if (!PyBytes_Check(b)) {
1269 PyErr_SetString(PyExc_TypeError,
1270 "read() didn't return bytes");
1271 Py_DECREF(b);
1272 return NULL;
1273 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 args = Py_BuildValue("(O)", b);
1278 Py_DECREF(b);
1279 if (args == NULL)
1280 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001281
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001282 res = array_frombytes(self, args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 Py_DECREF(args);
1284 if (res == NULL)
1285 return NULL;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 if (not_enough_bytes) {
1288 PyErr_SetString(PyExc_EOFError,
1289 "read() didn't return enough bytes");
1290 Py_DECREF(res);
1291 return NULL;
1292 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001295}
1296
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001297PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001298"fromfile(f, n)\n\
1299\n\
1300Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001301array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001302
1303
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001304static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001305array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1308 /* Write 64K blocks at a time */
1309 /* XXX Make the block size settable */
1310 int BLOCKSIZE = 64*1024;
1311 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1312 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 if (Py_SIZE(self) == 0)
1315 goto done;
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001317 for (i = 0; i < nblocks; i++) {
1318 char* ptr = self->ob_item + i*BLOCKSIZE;
1319 Py_ssize_t size = BLOCKSIZE;
1320 PyObject *bytes, *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001321 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001323 if (i*BLOCKSIZE + size > nbytes)
1324 size = nbytes - i*BLOCKSIZE;
1325 bytes = PyBytes_FromStringAndSize(ptr, size);
1326 if (bytes == NULL)
1327 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001328 res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001329 Py_DECREF(bytes);
1330 if (res == NULL)
1331 return NULL;
1332 Py_DECREF(res); /* drop write result */
1333 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001334
1335 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 Py_INCREF(Py_None);
1337 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001338}
1339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001340PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001341"tofile(f)\n\
1342\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001343Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001344
1345
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001346static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001347array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001351 if (!PyList_Check(list)) {
1352 PyErr_SetString(PyExc_TypeError, "arg must be list");
1353 return NULL;
1354 }
1355 n = PyList_Size(list);
1356 if (n > 0) {
1357 Py_ssize_t i, old_size;
1358 old_size = Py_SIZE(self);
1359 if (array_resize(self, old_size + n) == -1)
1360 return NULL;
1361 for (i = 0; i < n; i++) {
1362 PyObject *v = PyList_GetItem(list, i);
1363 if ((*self->ob_descr->setitem)(self,
1364 Py_SIZE(self) - n + i, v) != 0) {
1365 array_resize(self, old_size);
1366 return NULL;
1367 }
1368 }
1369 }
1370 Py_INCREF(Py_None);
1371 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001372}
1373
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001374PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001375"fromlist(list)\n\
1376\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001377Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001378
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001379static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001380array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 PyObject *list = PyList_New(Py_SIZE(self));
1383 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001385 if (list == NULL)
1386 return NULL;
1387 for (i = 0; i < Py_SIZE(self); i++) {
1388 PyObject *v = getarrayitem((PyObject *)self, i);
1389 if (v == NULL) {
1390 Py_DECREF(list);
1391 return NULL;
1392 }
1393 PyList_SetItem(list, i, v);
1394 }
1395 return list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001396}
1397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001398PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001399"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001400\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001401Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001402
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001404frombytes(arrayobject *self, Py_buffer *buffer)
Guido van Rossum778983b1993-02-19 15:55:02 +00001405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 int itemsize = self->ob_descr->itemsize;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001407 Py_ssize_t n;
1408 if (buffer->itemsize != 1) {
1409 PyBuffer_Release(buffer);
1410 PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required.");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001412 }
1413 n = buffer->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 if (n % itemsize != 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001415 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001416 PyErr_SetString(PyExc_ValueError,
1417 "string length not a multiple of item size");
1418 return NULL;
1419 }
1420 n = n / itemsize;
1421 if (n > 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001422 Py_ssize_t old_size = Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 if ((n > PY_SSIZE_T_MAX - old_size) ||
1424 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001425 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 return PyErr_NoMemory();
1427 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001428 if (array_resize(self, old_size + n) == -1) {
1429 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001431 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 memcpy(self->ob_item + old_size * itemsize,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001433 buffer->buf, n * itemsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001435 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 Py_INCREF(Py_None);
1437 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001438}
1439
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001440static PyObject *
1441array_fromstring(arrayobject *self, PyObject *args)
1442{
1443 Py_buffer buffer;
1444 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1445 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1446 return NULL;
1447 if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer))
1448 return NULL;
1449 else
1450 return frombytes(self, &buffer);
1451}
1452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001453PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001454"fromstring(string)\n\
1455\n\
1456Appends items from the string, interpreting it as an array of machine\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001457values, as if it had been read from a file using the fromfile() method).\n\
1458\n\
1459This method is deprecated. Use frombytes instead.");
1460
1461
1462static PyObject *
1463array_frombytes(arrayobject *self, PyObject *args)
1464{
1465 Py_buffer buffer;
1466 if (!PyArg_ParseTuple(args, "y*:frombytes", &buffer))
1467 return NULL;
1468 else
1469 return frombytes(self, &buffer);
1470}
1471
1472PyDoc_STRVAR(frombytes_doc,
1473"frombytes(bytestring)\n\
1474\n\
1475Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001476values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001477
1478
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001479static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001480array_tobytes(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001481{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1483 return PyBytes_FromStringAndSize(self->ob_item,
1484 Py_SIZE(self) * self->ob_descr->itemsize);
1485 } else {
1486 return PyErr_NoMemory();
1487 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001488}
1489
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001490PyDoc_STRVAR(tobytes_doc,
1491"tobytes() -> bytes\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001492\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001493Convert the array to an array of machine values and return the bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001494representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001495
Martin v. Löwis99866332002-03-01 10:27:01 +00001496
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001497static PyObject *
1498array_tostring(arrayobject *self, PyObject *unused)
1499{
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001500 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001501 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1502 return NULL;
1503 return array_tobytes(self, unused);
1504}
1505
1506PyDoc_STRVAR(tostring_doc,
1507"tostring() -> bytes\n\
1508\n\
1509Convert the array to an array of machine values and return the bytes\n\
1510representation.\n\
1511\n\
1512This method is deprecated. Use tobytes instead.");
1513
Martin v. Löwis99866332002-03-01 10:27:01 +00001514
Martin v. Löwis99866332002-03-01 10:27:01 +00001515static PyObject *
1516array_fromunicode(arrayobject *self, PyObject *args)
1517{
Victor Stinner62bb3942012-08-06 00:46:05 +02001518 Py_UNICODE *ustr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 Py_ssize_t n;
Victor Stinner62bb3942012-08-06 00:46:05 +02001520 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001521
Victor Stinner62bb3942012-08-06 00:46:05 +02001522 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 return NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02001524 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001525 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 PyErr_SetString(PyExc_ValueError,
1527 "fromunicode() may only be called on "
1528 "unicode type arrays");
1529 return NULL;
1530 }
1531 if (n > 0) {
1532 Py_ssize_t old_size = Py_SIZE(self);
1533 if (array_resize(self, old_size + n) == -1)
1534 return NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02001535 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
1536 ustr, n * sizeof(Py_UNICODE));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 Py_INCREF(Py_None);
1540 return Py_None;
Martin v. Löwis99866332002-03-01 10:27:01 +00001541}
1542
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001543PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001544"fromunicode(ustr)\n\
1545\n\
1546Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001547The array must be a unicode type array; otherwise a ValueError\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02001548is raised. Use array.frombytes(ustr.encode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001549append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001550
1551
1552static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001553array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001554{
Victor Stinner62bb3942012-08-06 00:46:05 +02001555 char typecode;
1556 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001557 if (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 Stinner62bb3942012-08-06 00:46:05 +02001562 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001563}
1564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001566"tounicode() -> unicode\n\
1567\n\
1568Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001569a unicode type array; otherwise a ValueError is raised. Use\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02001570array.tobytes().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001571an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001572
Martin v. Löwis99866332002-03-01 10:27:01 +00001573
Meador Inge03b4d502012-08-10 22:35:45 -05001574static PyObject *
1575array_sizeof(arrayobject *self, PyObject *unused)
1576{
1577 Py_ssize_t res;
1578 res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize;
1579 return PyLong_FromSsize_t(res);
1580}
1581
1582PyDoc_STRVAR(sizeof_doc,
1583"__sizeof__() -> int\n\
1584\n\
1585Size of the array in memory, in bytes.");
1586
Martin v. Löwis99866332002-03-01 10:27:01 +00001587
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001588/*********************** Pickling support ************************/
1589
1590enum machine_format_code {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 UNKNOWN_FORMAT = -1,
1592 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
1593 * array type code cannot be interpreted. When this occurs, a list of
1594 * Python objects is used to represent the content of the array
1595 * instead of using the memory content of the array directly. In that
1596 * case, the array_reconstructor mechanism is bypassed completely, and
1597 * the standard array constructor is used instead.
1598 *
1599 * This is will most likely occur when the machine doesn't use IEEE
1600 * floating-point numbers.
1601 */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 UNSIGNED_INT8 = 0,
1604 SIGNED_INT8 = 1,
1605 UNSIGNED_INT16_LE = 2,
1606 UNSIGNED_INT16_BE = 3,
1607 SIGNED_INT16_LE = 4,
1608 SIGNED_INT16_BE = 5,
1609 UNSIGNED_INT32_LE = 6,
1610 UNSIGNED_INT32_BE = 7,
1611 SIGNED_INT32_LE = 8,
1612 SIGNED_INT32_BE = 9,
1613 UNSIGNED_INT64_LE = 10,
1614 UNSIGNED_INT64_BE = 11,
1615 SIGNED_INT64_LE = 12,
1616 SIGNED_INT64_BE = 13,
1617 IEEE_754_FLOAT_LE = 14,
1618 IEEE_754_FLOAT_BE = 15,
1619 IEEE_754_DOUBLE_LE = 16,
1620 IEEE_754_DOUBLE_BE = 17,
1621 UTF16_LE = 18,
1622 UTF16_BE = 19,
1623 UTF32_LE = 20,
1624 UTF32_BE = 21
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001625};
1626#define MACHINE_FORMAT_CODE_MIN 0
1627#define MACHINE_FORMAT_CODE_MAX 21
1628
1629static const struct mformatdescr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 size_t size;
1631 int is_signed;
1632 int is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001633} mformat_descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1635 {1, 1, 0}, /* 1: SIGNED_INT8 */
1636 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1637 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1638 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1639 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1640 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1641 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1642 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1643 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1644 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1645 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1646 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1647 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1648 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1649 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1650 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1651 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1652 {4, 0, 0}, /* 18: UTF16_LE */
1653 {4, 0, 1}, /* 19: UTF16_BE */
1654 {8, 0, 0}, /* 20: UTF32_LE */
1655 {8, 0, 1} /* 21: UTF32_BE */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001656};
1657
1658
1659/*
1660 * Internal: This function is used to find the machine format of a given
1661 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1662 * be found.
1663 */
1664static enum machine_format_code
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001665typecode_to_mformat_code(char typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001666{
Alexandre Vassalotti7aaa7702009-07-17 03:51:27 +00001667#ifdef WORDS_BIGENDIAN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 const int is_big_endian = 1;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001669#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 const int is_big_endian = 0;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 size_t intsize;
1673 int is_signed;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 switch (typecode) {
1676 case 'b':
1677 return SIGNED_INT8;
1678 case 'B':
1679 return UNSIGNED_INT8;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001681 case 'u':
Victor Stinner62bb3942012-08-06 00:46:05 +02001682 if (sizeof(Py_UNICODE) == 2) {
1683 return UTF16_LE + is_big_endian;
1684 }
1685 if (sizeof(Py_UNICODE) == 4) {
1686 return UTF32_LE + is_big_endian;
1687 }
1688 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001689
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 case 'f':
1691 if (sizeof(float) == 4) {
1692 const float y = 16711938.0;
1693 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1694 return IEEE_754_FLOAT_BE;
1695 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1696 return IEEE_754_FLOAT_LE;
1697 }
1698 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 case 'd':
1701 if (sizeof(double) == 8) {
1702 const double x = 9006104071832581.0;
1703 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1704 return IEEE_754_DOUBLE_BE;
1705 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1706 return IEEE_754_DOUBLE_LE;
1707 }
1708 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 /* Integers */
1711 case 'h':
1712 intsize = sizeof(short);
1713 is_signed = 1;
1714 break;
1715 case 'H':
1716 intsize = sizeof(short);
1717 is_signed = 0;
1718 break;
1719 case 'i':
1720 intsize = sizeof(int);
1721 is_signed = 1;
1722 break;
1723 case 'I':
1724 intsize = sizeof(int);
1725 is_signed = 0;
1726 break;
1727 case 'l':
1728 intsize = sizeof(long);
1729 is_signed = 1;
1730 break;
1731 case 'L':
1732 intsize = sizeof(long);
1733 is_signed = 0;
1734 break;
Meador Inge1c9f0c92011-09-20 19:55:51 -05001735#if HAVE_LONG_LONG
1736 case 'q':
1737 intsize = sizeof(PY_LONG_LONG);
1738 is_signed = 1;
1739 break;
1740 case 'Q':
1741 intsize = sizeof(PY_LONG_LONG);
1742 is_signed = 0;
1743 break;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 default:
1746 return UNKNOWN_FORMAT;
1747 }
1748 switch (intsize) {
1749 case 2:
1750 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1751 case 4:
1752 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1753 case 8:
1754 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1755 default:
1756 return UNKNOWN_FORMAT;
1757 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001758}
1759
1760/* Forward declaration. */
1761static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1762
1763/*
1764 * Internal: This function wraps the array constructor--i.e., array_new()--to
1765 * allow the creation of array objects from C code without having to deal
1766 * directly the tuple argument of array_new(). The typecode argument is a
1767 * Unicode character value, like 'i' or 'f' for example, representing an array
1768 * type code. The items argument is a bytes or a list object from which
1769 * contains the initial value of the array.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 *
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001771 * On success, this functions returns the array object created. Otherwise,
1772 * NULL is returned to indicate a failure.
1773 */
1774static PyObject *
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001775make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001776{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 PyObject *new_args;
1778 PyObject *array_obj;
1779 PyObject *typecode_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 assert(arraytype != NULL);
1782 assert(items != NULL);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001783
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001784 typecode_obj = PyUnicode_FromOrdinal(typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 if (typecode_obj == NULL)
1786 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 new_args = PyTuple_New(2);
1789 if (new_args == NULL)
1790 return NULL;
1791 Py_INCREF(items);
1792 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1793 PyTuple_SET_ITEM(new_args, 1, items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 array_obj = array_new(arraytype, new_args, NULL);
1796 Py_DECREF(new_args);
1797 if (array_obj == NULL)
1798 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return array_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001801}
1802
1803/*
1804 * This functions is a special constructor used when unpickling an array. It
1805 * provides a portable way to rebuild an array from its memory representation.
1806 */
1807static PyObject *
1808array_reconstructor(PyObject *self, PyObject *args)
1809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 PyTypeObject *arraytype;
1811 PyObject *items;
1812 PyObject *converted_items;
1813 PyObject *result;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001814 int typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 enum machine_format_code mformat_code;
1816 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001819 &arraytype, &typecode, &mformat_code, &items))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 if (!PyType_Check(arraytype)) {
1823 PyErr_Format(PyExc_TypeError,
1824 "first argument must a type object, not %.200s",
1825 Py_TYPE(arraytype)->tp_name);
1826 return NULL;
1827 }
1828 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1829 PyErr_Format(PyExc_TypeError,
1830 "%.200s is not a subtype of %.200s",
1831 arraytype->tp_name, Arraytype.tp_name);
1832 return NULL;
1833 }
1834 for (descr = descriptors; descr->typecode != '\0'; descr++) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001835 if ((int)descr->typecode == typecode)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001836 break;
1837 }
1838 if (descr->typecode == '\0') {
1839 PyErr_SetString(PyExc_ValueError,
1840 "second argument must be a valid type code");
1841 return NULL;
1842 }
1843 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
1844 mformat_code > MACHINE_FORMAT_CODE_MAX) {
1845 PyErr_SetString(PyExc_ValueError,
1846 "third argument must be a valid machine format code.");
1847 return NULL;
1848 }
1849 if (!PyBytes_Check(items)) {
1850 PyErr_Format(PyExc_TypeError,
1851 "fourth argument should be bytes, not %.200s",
1852 Py_TYPE(items)->tp_name);
1853 return NULL;
1854 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 /* Fast path: No decoding has to be done. */
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001857 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 mformat_code == UNKNOWN_FORMAT) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001859 return make_array(arraytype, (char)typecode, items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001860 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 /* Slow path: Decode the byte string according to the given machine
1863 * format code. This occurs when the computer unpickling the array
1864 * object is architecturally different from the one that pickled the
1865 * array.
1866 */
1867 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
1868 PyErr_SetString(PyExc_ValueError,
1869 "string length not a multiple of item size");
1870 return NULL;
1871 }
1872 switch (mformat_code) {
1873 case IEEE_754_FLOAT_LE:
1874 case IEEE_754_FLOAT_BE: {
1875 int i;
1876 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
1877 Py_ssize_t itemcount = Py_SIZE(items) / 4;
1878 const unsigned char *memstr =
1879 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 converted_items = PyList_New(itemcount);
1882 if (converted_items == NULL)
1883 return NULL;
1884 for (i = 0; i < itemcount; i++) {
1885 PyObject *pyfloat = PyFloat_FromDouble(
1886 _PyFloat_Unpack4(&memstr[i * 4], le));
1887 if (pyfloat == NULL) {
1888 Py_DECREF(converted_items);
1889 return NULL;
1890 }
1891 PyList_SET_ITEM(converted_items, i, pyfloat);
1892 }
1893 break;
1894 }
1895 case IEEE_754_DOUBLE_LE:
1896 case IEEE_754_DOUBLE_BE: {
1897 int i;
1898 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
1899 Py_ssize_t itemcount = Py_SIZE(items) / 8;
1900 const unsigned char *memstr =
1901 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 converted_items = PyList_New(itemcount);
1904 if (converted_items == NULL)
1905 return NULL;
1906 for (i = 0; i < itemcount; i++) {
1907 PyObject *pyfloat = PyFloat_FromDouble(
1908 _PyFloat_Unpack8(&memstr[i * 8], le));
1909 if (pyfloat == NULL) {
1910 Py_DECREF(converted_items);
1911 return NULL;
1912 }
1913 PyList_SET_ITEM(converted_items, i, pyfloat);
1914 }
1915 break;
1916 }
1917 case UTF16_LE:
1918 case UTF16_BE: {
1919 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
1920 converted_items = PyUnicode_DecodeUTF16(
1921 PyBytes_AS_STRING(items), Py_SIZE(items),
1922 "strict", &byteorder);
1923 if (converted_items == NULL)
1924 return NULL;
1925 break;
1926 }
1927 case UTF32_LE:
1928 case UTF32_BE: {
1929 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
1930 converted_items = PyUnicode_DecodeUTF32(
1931 PyBytes_AS_STRING(items), Py_SIZE(items),
1932 "strict", &byteorder);
1933 if (converted_items == NULL)
1934 return NULL;
1935 break;
1936 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 case UNSIGNED_INT8:
1939 case SIGNED_INT8:
1940 case UNSIGNED_INT16_LE:
1941 case UNSIGNED_INT16_BE:
1942 case SIGNED_INT16_LE:
1943 case SIGNED_INT16_BE:
1944 case UNSIGNED_INT32_LE:
1945 case UNSIGNED_INT32_BE:
1946 case SIGNED_INT32_LE:
1947 case SIGNED_INT32_BE:
1948 case UNSIGNED_INT64_LE:
1949 case UNSIGNED_INT64_BE:
1950 case SIGNED_INT64_LE:
1951 case SIGNED_INT64_BE: {
1952 int i;
1953 const struct mformatdescr mf_descr =
1954 mformat_descriptors[mformat_code];
1955 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
1956 const unsigned char *memstr =
1957 (unsigned char *)PyBytes_AS_STRING(items);
1958 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 /* If possible, try to pack array's items using a data type
1961 * that fits better. This may result in an array with narrower
1962 * or wider elements.
1963 *
1964 * For example, if a 32-bit machine pickles a L-code array of
1965 * unsigned longs, then the array will be unpickled by 64-bit
1966 * machine as an I-code array of unsigned ints.
1967 *
1968 * XXX: Is it possible to write a unit test for this?
1969 */
1970 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1971 if (descr->is_integer_type &&
1972 descr->itemsize == mf_descr.size &&
1973 descr->is_signed == mf_descr.is_signed)
1974 typecode = descr->typecode;
1975 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001977 converted_items = PyList_New(itemcount);
1978 if (converted_items == NULL)
1979 return NULL;
1980 for (i = 0; i < itemcount; i++) {
1981 PyObject *pylong;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 pylong = _PyLong_FromByteArray(
1984 &memstr[i * mf_descr.size],
1985 mf_descr.size,
1986 !mf_descr.is_big_endian,
1987 mf_descr.is_signed);
1988 if (pylong == NULL) {
1989 Py_DECREF(converted_items);
1990 return NULL;
1991 }
1992 PyList_SET_ITEM(converted_items, i, pylong);
1993 }
1994 break;
1995 }
1996 case UNKNOWN_FORMAT:
1997 /* Impossible, but needed to shut up GCC about the unhandled
1998 * enumeration value.
1999 */
2000 default:
2001 PyErr_BadArgument();
2002 return NULL;
2003 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002004
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002005 result = make_array(arraytype, (char)typecode, converted_items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 Py_DECREF(converted_items);
2007 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002008}
2009
2010static PyObject *
2011array_reduce_ex(arrayobject *array, PyObject *value)
2012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 PyObject *dict;
2014 PyObject *result;
2015 PyObject *array_str;
2016 int typecode = array->ob_descr->typecode;
2017 int mformat_code;
2018 static PyObject *array_reconstructor = NULL;
2019 long protocol;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002020 _Py_IDENTIFIER(_array_reconstructor);
2021 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 if (array_reconstructor == NULL) {
2024 PyObject *array_module = PyImport_ImportModule("array");
2025 if (array_module == NULL)
2026 return NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002027 array_reconstructor = _PyObject_GetAttrId(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002028 array_module,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002029 &PyId__array_reconstructor);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 Py_DECREF(array_module);
2031 if (array_reconstructor == NULL)
2032 return NULL;
2033 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 if (!PyLong_Check(value)) {
2036 PyErr_SetString(PyExc_TypeError,
2037 "__reduce_ex__ argument should an integer");
2038 return NULL;
2039 }
2040 protocol = PyLong_AsLong(value);
2041 if (protocol == -1 && PyErr_Occurred())
2042 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002043
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002044 dict = _PyObject_GetAttrId((PyObject *)array, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 if (dict == NULL) {
2046 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2047 return NULL;
2048 PyErr_Clear();
2049 dict = Py_None;
2050 Py_INCREF(dict);
2051 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002053 mformat_code = typecode_to_mformat_code(typecode);
2054 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2055 /* Convert the array to a list if we got something weird
2056 * (e.g., non-IEEE floats), or we are pickling the array using
2057 * a Python 2.x compatible protocol.
2058 *
2059 * It is necessary to use a list representation for Python 2.x
2060 * compatible pickle protocol, since Python 2's str objects
2061 * are unpickled as unicode by Python 3. Thus it is impossible
2062 * to make arrays unpicklable by Python 3 by using their memory
2063 * representation, unless we resort to ugly hacks such as
2064 * coercing unicode objects to bytes in array_reconstructor.
2065 */
2066 PyObject *list;
2067 list = array_tolist(array, NULL);
2068 if (list == NULL) {
2069 Py_DECREF(dict);
2070 return NULL;
2071 }
2072 result = Py_BuildValue(
2073 "O(CO)O", Py_TYPE(array), typecode, list, dict);
2074 Py_DECREF(list);
2075 Py_DECREF(dict);
2076 return result;
2077 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002078
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002079 array_str = array_tobytes(array, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 if (array_str == NULL) {
2081 Py_DECREF(dict);
2082 return NULL;
2083 }
2084 result = Py_BuildValue(
2085 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
2086 mformat_code, array_str, dict);
2087 Py_DECREF(dict);
2088 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002089}
2090
2091PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2092
Martin v. Löwis99866332002-03-01 10:27:01 +00002093static PyObject *
2094array_get_typecode(arrayobject *a, void *closure)
2095{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002096 char typecode = a->ob_descr->typecode;
2097 return PyUnicode_FromOrdinal(typecode);
Martin v. Löwis99866332002-03-01 10:27:01 +00002098}
2099
2100static PyObject *
2101array_get_itemsize(arrayobject *a, void *closure)
2102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002103 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00002104}
2105
2106static PyGetSetDef array_getsets [] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 {"typecode", (getter) array_get_typecode, NULL,
2108 "the typecode character used to create the array"},
2109 {"itemsize", (getter) array_get_itemsize, NULL,
2110 "the size, in bytes, of one array item"},
2111 {NULL}
Martin v. Löwis99866332002-03-01 10:27:01 +00002112};
2113
Martin v. Löwis59683e82008-06-13 07:50:45 +00002114static PyMethodDef array_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 {"append", (PyCFunction)array_append, METH_O,
2116 append_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002117 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 buffer_info_doc},
2119 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
2120 byteswap_doc},
2121 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
2122 copy_doc},
2123 {"count", (PyCFunction)array_count, METH_O,
2124 count_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002125 {"__deepcopy__", (PyCFunction)array_copy, METH_O,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 copy_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002127 {"extend", (PyCFunction)array_extend, METH_O,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 extend_doc},
2129 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
2130 fromfile_doc},
2131 {"fromlist", (PyCFunction)array_fromlist, METH_O,
2132 fromlist_doc},
2133 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
2134 fromstring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002135 {"frombytes", (PyCFunction)array_frombytes, METH_VARARGS,
2136 frombytes_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
2138 fromunicode_doc},
2139 {"index", (PyCFunction)array_index, METH_O,
2140 index_doc},
2141 {"insert", (PyCFunction)array_insert, METH_VARARGS,
2142 insert_doc},
2143 {"pop", (PyCFunction)array_pop, METH_VARARGS,
2144 pop_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002145 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 reduce_doc},
2147 {"remove", (PyCFunction)array_remove, METH_O,
2148 remove_doc},
2149 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
2150 reverse_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 {"tofile", (PyCFunction)array_tofile, METH_O,
2152 tofile_doc},
2153 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
2154 tolist_doc},
2155 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
2156 tostring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002157 {"tobytes", (PyCFunction)array_tobytes, METH_NOARGS,
2158 tobytes_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002159 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 tounicode_doc},
Meador Inge03b4d502012-08-10 22:35:45 -05002161 {"__sizeof__", (PyCFunction)array_sizeof, METH_NOARGS,
2162 sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002163 {NULL, NULL} /* sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +00002164};
2165
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002166static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002167array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002168{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002169 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 PyObject *s, *v = NULL;
2171 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 len = Py_SIZE(a);
2174 typecode = a->ob_descr->typecode;
2175 if (len == 0) {
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002176 return PyUnicode_FromFormat("array('%c')", (int)typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002177 }
Gregory P. Smith9504b132012-12-10 20:20:20 -08002178 if (typecode == 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 v = array_tounicode(a, NULL);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002180 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 v = array_tolist(a, NULL);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002182 }
Victor Stinner29ec5952013-02-26 00:27:38 +01002183 if (v == NULL)
2184 return NULL;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002185
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002186 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002187 Py_DECREF(v);
2188 return s;
Guido van Rossum778983b1993-02-19 15:55:02 +00002189}
2190
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002191static PyObject*
2192array_subscr(arrayobject* self, PyObject* item)
2193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 if (PyIndex_Check(item)) {
2195 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2196 if (i==-1 && PyErr_Occurred()) {
2197 return NULL;
2198 }
2199 if (i < 0)
2200 i += Py_SIZE(self);
2201 return array_item(self, i);
2202 }
2203 else if (PySlice_Check(item)) {
2204 Py_ssize_t start, stop, step, slicelength, cur, i;
2205 PyObject* result;
2206 arrayobject* ar;
2207 int itemsize = self->ob_descr->itemsize;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002208
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002209 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 &start, &stop, &step, &slicelength) < 0) {
2211 return NULL;
2212 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 if (slicelength <= 0) {
2215 return newarrayobject(&Arraytype, 0, self->ob_descr);
2216 }
2217 else if (step == 1) {
2218 PyObject *result = newarrayobject(&Arraytype,
2219 slicelength, self->ob_descr);
2220 if (result == NULL)
2221 return NULL;
2222 memcpy(((arrayobject *)result)->ob_item,
2223 self->ob_item + start * itemsize,
2224 slicelength * itemsize);
2225 return result;
2226 }
2227 else {
2228 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2229 if (!result) return NULL;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 ar = (arrayobject*)result;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 for (cur = start, i = 0; i < slicelength;
2234 cur += step, i++) {
2235 memcpy(ar->ob_item + i*itemsize,
2236 self->ob_item + cur*itemsize,
2237 itemsize);
2238 }
2239
2240 return result;
2241 }
2242 }
2243 else {
2244 PyErr_SetString(PyExc_TypeError,
2245 "array indices must be integers");
2246 return NULL;
2247 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002248}
2249
2250static int
2251array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2252{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 Py_ssize_t start, stop, step, slicelength, needed;
2254 arrayobject* other;
2255 int itemsize;
Thomas Woutersed03b412007-08-28 21:37:11 +00002256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002257 if (PyIndex_Check(item)) {
2258 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002260 if (i == -1 && PyErr_Occurred())
2261 return -1;
2262 if (i < 0)
2263 i += Py_SIZE(self);
2264 if (i < 0 || i >= Py_SIZE(self)) {
2265 PyErr_SetString(PyExc_IndexError,
2266 "array assignment index out of range");
2267 return -1;
2268 }
2269 if (value == NULL) {
2270 /* Fall through to slice assignment */
2271 start = i;
2272 stop = i + 1;
2273 step = 1;
2274 slicelength = 1;
2275 }
2276 else
2277 return (*self->ob_descr->setitem)(self, i, value);
2278 }
2279 else if (PySlice_Check(item)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002280 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 Py_SIZE(self), &start, &stop,
2282 &step, &slicelength) < 0) {
2283 return -1;
2284 }
2285 }
2286 else {
2287 PyErr_SetString(PyExc_TypeError,
2288 "array indices must be integer");
2289 return -1;
2290 }
2291 if (value == NULL) {
2292 other = NULL;
2293 needed = 0;
2294 }
2295 else if (array_Check(value)) {
2296 other = (arrayobject *)value;
2297 needed = Py_SIZE(other);
2298 if (self == other) {
2299 /* Special case "self[i:j] = self" -- copy self first */
2300 int ret;
2301 value = array_slice(other, 0, needed);
2302 if (value == NULL)
2303 return -1;
2304 ret = array_ass_subscr(self, item, value);
2305 Py_DECREF(value);
2306 return ret;
2307 }
2308 if (other->ob_descr != self->ob_descr) {
2309 PyErr_BadArgument();
2310 return -1;
2311 }
2312 }
2313 else {
2314 PyErr_Format(PyExc_TypeError,
2315 "can only assign array (not \"%.200s\") to array slice",
2316 Py_TYPE(value)->tp_name);
2317 return -1;
2318 }
2319 itemsize = self->ob_descr->itemsize;
2320 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2321 if ((step > 0 && stop < start) ||
2322 (step < 0 && stop > start))
2323 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 /* Issue #4509: If the array has exported buffers and the slice
2326 assignment would change the size of the array, fail early to make
2327 sure we don't modify it. */
2328 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2329 PyErr_SetString(PyExc_BufferError,
2330 "cannot resize an array that is exporting buffers");
2331 return -1;
2332 }
Mark Dickinsonbc099642010-01-29 17:27:24 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 if (step == 1) {
2335 if (slicelength > needed) {
2336 memmove(self->ob_item + (start + needed) * itemsize,
2337 self->ob_item + stop * itemsize,
2338 (Py_SIZE(self) - stop) * itemsize);
2339 if (array_resize(self, Py_SIZE(self) +
2340 needed - slicelength) < 0)
2341 return -1;
2342 }
2343 else if (slicelength < needed) {
2344 if (array_resize(self, Py_SIZE(self) +
2345 needed - slicelength) < 0)
2346 return -1;
2347 memmove(self->ob_item + (start + needed) * itemsize,
2348 self->ob_item + stop * itemsize,
2349 (Py_SIZE(self) - start - needed) * itemsize);
2350 }
2351 if (needed > 0)
2352 memcpy(self->ob_item + start * itemsize,
2353 other->ob_item, needed * itemsize);
2354 return 0;
2355 }
2356 else if (needed == 0) {
2357 /* Delete slice */
2358 size_t cur;
2359 Py_ssize_t i;
Thomas Woutersed03b412007-08-28 21:37:11 +00002360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 if (step < 0) {
2362 stop = start + 1;
2363 start = stop + step * (slicelength - 1) - 1;
2364 step = -step;
2365 }
2366 for (cur = start, i = 0; i < slicelength;
2367 cur += step, i++) {
2368 Py_ssize_t lim = step - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 if (cur + step >= (size_t)Py_SIZE(self))
2371 lim = Py_SIZE(self) - cur - 1;
2372 memmove(self->ob_item + (cur - i) * itemsize,
2373 self->ob_item + (cur + 1) * itemsize,
2374 lim * itemsize);
2375 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002376 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002377 if (cur < (size_t)Py_SIZE(self)) {
2378 memmove(self->ob_item + (cur-slicelength) * itemsize,
2379 self->ob_item + cur * itemsize,
2380 (Py_SIZE(self) - cur) * itemsize);
2381 }
2382 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2383 return -1;
2384 return 0;
2385 }
2386 else {
2387 Py_ssize_t cur, i;
2388
2389 if (needed != slicelength) {
2390 PyErr_Format(PyExc_ValueError,
2391 "attempt to assign array of size %zd "
2392 "to extended slice of size %zd",
2393 needed, slicelength);
2394 return -1;
2395 }
2396 for (cur = start, i = 0; i < slicelength;
2397 cur += step, i++) {
2398 memcpy(self->ob_item + cur * itemsize,
2399 other->ob_item + i * itemsize,
2400 itemsize);
2401 }
2402 return 0;
2403 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002404}
2405
2406static PyMappingMethods array_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 (lenfunc)array_length,
2408 (binaryfunc)array_subscr,
2409 (objobjargproc)array_ass_subscr
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002410};
2411
Guido van Rossumd8faa362007-04-27 19:54:29 +00002412static const void *emptybuf = "";
2413
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002414
2415static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002416array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 if (view==NULL) goto finish;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 view->buf = (void *)self->ob_item;
2421 view->obj = (PyObject*)self;
2422 Py_INCREF(self);
2423 if (view->buf == NULL)
2424 view->buf = (void *)emptybuf;
2425 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2426 view->readonly = 0;
2427 view->ndim = 1;
2428 view->itemsize = self->ob_descr->itemsize;
2429 view->suboffsets = NULL;
2430 view->shape = NULL;
2431 if ((flags & PyBUF_ND)==PyBUF_ND) {
2432 view->shape = &((Py_SIZE(self)));
2433 }
2434 view->strides = NULL;
2435 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2436 view->strides = &(view->itemsize);
2437 view->format = NULL;
2438 view->internal = NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02002439 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 view->format = self->ob_descr->formats;
Victor Stinner62bb3942012-08-06 00:46:05 +02002441#ifdef Py_UNICODE_WIDE
2442 if (self->ob_descr->typecode == 'u') {
2443 view->format = "w";
2444 }
2445#endif
2446 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002447
2448 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 self->ob_exports++;
2450 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002451}
2452
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002453static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002454array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002457}
2458
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002459static PySequenceMethods array_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 (lenfunc)array_length, /*sq_length*/
2461 (binaryfunc)array_concat, /*sq_concat*/
2462 (ssizeargfunc)array_repeat, /*sq_repeat*/
2463 (ssizeargfunc)array_item, /*sq_item*/
2464 0, /*sq_slice*/
2465 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2466 0, /*sq_ass_slice*/
2467 (objobjproc)array_contains, /*sq_contains*/
2468 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2469 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002470};
2471
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002472static PyBufferProcs array_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 (getbufferproc)array_buffer_getbuf,
2474 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002475};
2476
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002477static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002478array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 int c;
2481 PyObject *initial = NULL, *it = NULL;
2482 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00002483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
2485 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002487 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2488 return NULL;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 if (!(initial == NULL || PyList_Check(initial)
2491 || PyByteArray_Check(initial)
2492 || PyBytes_Check(initial)
2493 || PyTuple_Check(initial)
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002494 || ((c=='u') && PyUnicode_Check(initial))
2495 || (array_Check(initial)
2496 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002497 it = PyObject_GetIter(initial);
2498 if (it == NULL)
2499 return NULL;
2500 /* We set initial to NULL so that the subsequent code
2501 will create an empty array of the appropriate type
2502 and afterwards we can use array_iter_extend to populate
2503 the array.
2504 */
2505 initial = NULL;
2506 }
2507 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2508 if (descr->typecode == c) {
2509 PyObject *a;
2510 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002511
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002512 if (initial == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 len = 0;
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002514 else if (PyList_Check(initial))
2515 len = PyList_GET_SIZE(initial);
2516 else if (PyTuple_Check(initial) || array_Check(initial))
2517 len = Py_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002518 else
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002519 len = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +00002520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 a = newarrayobject(type, len, descr);
2522 if (a == NULL)
2523 return NULL;
2524
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002525 if (len > 0 && !array_Check(initial)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 Py_ssize_t i;
2527 for (i = 0; i < len; i++) {
2528 PyObject *v =
2529 PySequence_GetItem(initial, i);
2530 if (v == NULL) {
2531 Py_DECREF(a);
2532 return NULL;
2533 }
2534 if (setarrayitem(a, i, v) != 0) {
2535 Py_DECREF(v);
2536 Py_DECREF(a);
2537 return NULL;
2538 }
2539 Py_DECREF(v);
2540 }
2541 }
2542 else if (initial != NULL && (PyByteArray_Check(initial) ||
2543 PyBytes_Check(initial))) {
2544 PyObject *t_initial, *v;
2545 t_initial = PyTuple_Pack(1, initial);
2546 if (t_initial == NULL) {
2547 Py_DECREF(a);
2548 return NULL;
2549 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002550 v = array_frombytes((arrayobject *)a,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002551 t_initial);
2552 Py_DECREF(t_initial);
2553 if (v == NULL) {
2554 Py_DECREF(a);
2555 return NULL;
2556 }
2557 Py_DECREF(v);
2558 }
2559 else if (initial != NULL && PyUnicode_Check(initial)) {
Victor Stinner62bb3942012-08-06 00:46:05 +02002560 Py_UNICODE *ustr;
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002561 Py_ssize_t n;
Victor Stinner62bb3942012-08-06 00:46:05 +02002562
2563 ustr = PyUnicode_AsUnicode(initial);
2564 if (ustr == NULL) {
2565 PyErr_NoMemory();
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002566 Py_DECREF(a);
2567 return NULL;
2568 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002569
2570 n = PyUnicode_GET_DATA_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 if (n > 0) {
2572 arrayobject *self = (arrayobject *)a;
Victor Stinner62bb3942012-08-06 00:46:05 +02002573 char *item = self->ob_item;
2574 item = (char *)PyMem_Realloc(item, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 if (item == NULL) {
2576 PyErr_NoMemory();
2577 Py_DECREF(a);
2578 return NULL;
2579 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002580 self->ob_item = item;
2581 Py_SIZE(self) = n / sizeof(Py_UNICODE);
2582 memcpy(item, ustr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 self->allocated = Py_SIZE(self);
2584 }
2585 }
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002586 else if (initial != NULL && array_Check(initial)) {
2587 arrayobject *self = (arrayobject *)a;
2588 arrayobject *other = (arrayobject *)initial;
2589 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2590 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 if (it != NULL) {
2592 if (array_iter_extend((arrayobject *)a, it) == -1) {
2593 Py_DECREF(it);
2594 Py_DECREF(a);
2595 return NULL;
2596 }
2597 Py_DECREF(it);
2598 }
2599 return a;
2600 }
2601 }
2602 PyErr_SetString(PyExc_ValueError,
Meador Inge1c9f0c92011-09-20 19:55:51 -05002603#ifdef HAVE_LONG_LONG
2604 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
2605#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Meador Inge1c9f0c92011-09-20 19:55:51 -05002607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002609}
2610
Guido van Rossum778983b1993-02-19 15:55:02 +00002611
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002613"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002614an array of basic values: characters, integers, floating point\n\
2615numbers. Arrays are sequence types and behave very much like lists,\n\
2616except that the type of objects stored in them is constrained. The\n\
2617type is specified at object creation time by using a type code, which\n\
2618is a single character. The following type codes are defined:\n\
2619\n\
2620 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002621 'b' signed integer 1 \n\
2622 'B' unsigned integer 1 \n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002623 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002624 'h' signed integer 2 \n\
2625 'H' unsigned integer 2 \n\
2626 'i' signed integer 2 \n\
2627 'I' unsigned integer 2 \n\
2628 'l' signed integer 4 \n\
2629 'L' unsigned integer 4 \n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002630 'q' signed integer 8 (see note) \n\
2631 'Q' unsigned integer 8 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002632 'f' floating point 4 \n\
2633 'd' floating point 8 \n\
2634\n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002635NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2636narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2637\n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002638NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
2639C compiler used to build Python supports 'long long', or, on Windows, \n\
2640'__int64'.\n\
2641\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002642The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002643\n\
2644array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002645");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002646
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002647PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002648"array(typecode [, initializer]) -> array\n\
2649\n\
2650Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002651initialized from the optional initializer value, which must be a list,\n\
Florent Xicluna0e686cb2011-12-09 23:41:19 +01002652string or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002653\n\
2654Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002655the type of objects stored in them is constrained.\n\
2656\n\
2657Methods:\n\
2658\n\
2659append() -- append a new item to the end of the array\n\
2660buffer_info() -- return information giving the current memory info\n\
2661byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002662count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002663extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002664fromfile() -- read items from a file object\n\
2665fromlist() -- append items from the list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002666frombytes() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002667index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002668insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002669pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002670remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002671reverse() -- reverse the order of the items in the array\n\
2672tofile() -- write all items to a file object\n\
2673tolist() -- return the array converted to an ordinary list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002674tobytes() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002675\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002676Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002677\n\
2678typecode -- the typecode character used to create the array\n\
2679itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002680");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002681
Raymond Hettinger625812f2003-01-07 01:58:52 +00002682static PyObject *array_iter(arrayobject *ao);
2683
Tim Peters0c322792002-07-17 16:49:03 +00002684static PyTypeObject Arraytype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 PyVarObject_HEAD_INIT(NULL, 0)
2686 "array.array",
2687 sizeof(arrayobject),
2688 0,
2689 (destructor)array_dealloc, /* tp_dealloc */
2690 0, /* tp_print */
2691 0, /* tp_getattr */
2692 0, /* tp_setattr */
2693 0, /* tp_reserved */
2694 (reprfunc)array_repr, /* tp_repr */
2695 0, /* tp_as_number*/
2696 &array_as_sequence, /* tp_as_sequence*/
2697 &array_as_mapping, /* tp_as_mapping*/
2698 0, /* tp_hash */
2699 0, /* tp_call */
2700 0, /* tp_str */
2701 PyObject_GenericGetAttr, /* tp_getattro */
2702 0, /* tp_setattro */
2703 &array_as_buffer, /* tp_as_buffer*/
2704 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2705 arraytype_doc, /* tp_doc */
2706 0, /* tp_traverse */
2707 0, /* tp_clear */
2708 array_richcompare, /* tp_richcompare */
2709 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2710 (getiterfunc)array_iter, /* tp_iter */
2711 0, /* tp_iternext */
2712 array_methods, /* tp_methods */
2713 0, /* tp_members */
2714 array_getsets, /* tp_getset */
2715 0, /* tp_base */
2716 0, /* tp_dict */
2717 0, /* tp_descr_get */
2718 0, /* tp_descr_set */
2719 0, /* tp_dictoffset */
2720 0, /* tp_init */
2721 PyType_GenericAlloc, /* tp_alloc */
2722 array_new, /* tp_new */
2723 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002724};
2725
Raymond Hettinger625812f2003-01-07 01:58:52 +00002726
2727/*********************** Array Iterator **************************/
2728
2729typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 PyObject_HEAD
2731 Py_ssize_t index;
2732 arrayobject *ao;
2733 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002734} arrayiterobject;
2735
2736static PyTypeObject PyArrayIter_Type;
2737
2738#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2739
2740static PyObject *
2741array_iter(arrayobject *ao)
2742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 arrayiterobject *it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 if (!array_Check(ao)) {
2746 PyErr_BadInternalCall();
2747 return NULL;
2748 }
Raymond Hettinger625812f2003-01-07 01:58:52 +00002749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2751 if (it == NULL)
2752 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 Py_INCREF(ao);
2755 it->ao = ao;
2756 it->index = 0;
2757 it->getitem = ao->ob_descr->getitem;
2758 PyObject_GC_Track(it);
2759 return (PyObject *)it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002760}
2761
2762static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002763arrayiter_next(arrayiterobject *it)
2764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 assert(PyArrayIter_Check(it));
2766 if (it->index < Py_SIZE(it->ao))
2767 return (*it->getitem)(it->ao, it->index++);
2768 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002769}
2770
2771static void
2772arrayiter_dealloc(arrayiterobject *it)
2773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 PyObject_GC_UnTrack(it);
2775 Py_XDECREF(it->ao);
2776 PyObject_GC_Del(it);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002777}
2778
2779static int
2780arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 Py_VISIT(it->ao);
2783 return 0;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002784}
2785
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002786static PyObject *
2787arrayiter_reduce(arrayiterobject *it)
2788{
Antoine Pitroua7013882012-04-05 00:04:20 +02002789 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002790 it->ao, it->index);
2791}
2792
2793static PyObject *
2794arrayiter_setstate(arrayiterobject *it, PyObject *state)
2795{
2796 Py_ssize_t index = PyLong_AsSsize_t(state);
2797 if (index == -1 && PyErr_Occurred())
2798 return NULL;
2799 if (index < 0)
2800 index = 0;
Kristján Valur Jónsson25dded02014-03-05 13:47:57 +00002801 else if (index > Py_SIZE(it->ao))
2802 index = Py_SIZE(it->ao); /* iterator exhausted */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002803 it->index = index;
2804 Py_RETURN_NONE;
2805}
2806
2807PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2808static PyMethodDef arrayiter_methods[] = {
2809 {"__reduce__", (PyCFunction)arrayiter_reduce, METH_NOARGS,
2810 reduce_doc},
2811 {"__setstate__", (PyCFunction)arrayiter_setstate, METH_O,
2812 setstate_doc},
2813 {NULL, NULL} /* sentinel */
2814};
2815
Raymond Hettinger625812f2003-01-07 01:58:52 +00002816static PyTypeObject PyArrayIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 PyVarObject_HEAD_INIT(NULL, 0)
2818 "arrayiterator", /* tp_name */
2819 sizeof(arrayiterobject), /* tp_basicsize */
2820 0, /* tp_itemsize */
2821 /* methods */
2822 (destructor)arrayiter_dealloc, /* tp_dealloc */
2823 0, /* tp_print */
2824 0, /* tp_getattr */
2825 0, /* tp_setattr */
2826 0, /* tp_reserved */
2827 0, /* tp_repr */
2828 0, /* tp_as_number */
2829 0, /* tp_as_sequence */
2830 0, /* tp_as_mapping */
2831 0, /* tp_hash */
2832 0, /* tp_call */
2833 0, /* tp_str */
2834 PyObject_GenericGetAttr, /* tp_getattro */
2835 0, /* tp_setattro */
2836 0, /* tp_as_buffer */
2837 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2838 0, /* tp_doc */
2839 (traverseproc)arrayiter_traverse, /* tp_traverse */
2840 0, /* tp_clear */
2841 0, /* tp_richcompare */
2842 0, /* tp_weaklistoffset */
2843 PyObject_SelfIter, /* tp_iter */
2844 (iternextfunc)arrayiter_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002845 arrayiter_methods, /* tp_methods */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002846};
2847
2848
2849/*********************** Install Module **************************/
2850
Martin v. Löwis99866332002-03-01 10:27:01 +00002851/* No functions in array module. */
2852static PyMethodDef a_methods[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002853 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
2854 PyDoc_STR("Internal. Used for pickling support.")},
Martin v. Löwis99866332002-03-01 10:27:01 +00002855 {NULL, NULL, 0, NULL} /* Sentinel */
2856};
2857
Martin v. Löwis1a214512008-06-11 05:26:20 +00002858static struct PyModuleDef arraymodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyModuleDef_HEAD_INIT,
2860 "array",
2861 module_doc,
2862 -1,
2863 a_methods,
2864 NULL,
2865 NULL,
2866 NULL,
2867 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002868};
2869
Martin v. Löwis99866332002-03-01 10:27:01 +00002870
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002871PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002872PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002873{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 PyObject *m;
Georg Brandl4cb0de22011-09-28 21:49:49 +02002875 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 PyObject *typecodes;
2877 Py_ssize_t size = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 if (PyType_Ready(&Arraytype) < 0)
2881 return NULL;
2882 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
2883 m = PyModule_Create(&arraymodule);
2884 if (m == NULL)
2885 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 Py_INCREF((PyObject *)&Arraytype);
2888 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2889 Py_INCREF((PyObject *)&Arraytype);
2890 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2893 size++;
2894 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002895
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002896 p = buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2898 *p++ = (char)descr->typecode;
2899 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002900 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002902 PyModule_AddObject(m, "typecodes", typecodes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903
2904 if (PyErr_Occurred()) {
2905 Py_DECREF(m);
2906 m = NULL;
2907 }
2908 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002909}