blob: a7bd6d858fdeb796041069a8693b5265f0a5d74c [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
Brett Cannon1eb32c22014-10-10 16:26:45 -040018/*[clinic input]
19output preset file
20module array
21[clinic start generated code]*/
22/*[clinic end generated code: output=da39a3ee5e6b4b0d input=0909c1a148c69931]*/
23
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arrayobject; /* Forward */
25
Tim Petersbb307342000-09-10 05:22:54 +000026/* All possible arraydescr values are defined in the vector "descriptors"
27 * below. That's defined later because the appropriate get and set
28 * functions aren't visible yet.
29 */
Guido van Rossum778983b1993-02-19 15:55:02 +000030struct arraydescr {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +020031 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000032 int itemsize;
33 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
34 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
35 char *formats;
36 int is_integer_type;
37 int is_signed;
Guido van Rossum778983b1993-02-19 15:55:02 +000038};
39
40typedef struct arrayobject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000041 PyObject_VAR_HEAD
42 char *ob_item;
43 Py_ssize_t allocated;
44 struct arraydescr *ob_descr;
45 PyObject *weakreflist; /* List of weak references */
46 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000047} arrayobject;
48
Jeremy Hylton938ace62002-07-17 16:30:39 +000049static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000050
Brett Cannon1eb32c22014-10-10 16:26:45 -040051typedef struct {
52 PyObject_HEAD
53 Py_ssize_t index;
54 arrayobject *ao;
55 PyObject* (*getitem)(struct arrayobject *, Py_ssize_t);
56} arrayiterobject;
57
58static PyTypeObject PyArrayIter_Type;
59
60#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
61
62/* Must come after arrayobject and arrayiterobject definitions. */
63#include "clinic/arraymodule.c.h"
64
Martin v. Löwis99866332002-03-01 10:27:01 +000065#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +000066#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000067
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000068static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000069array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 char *items;
72 size_t _new_size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
75 PyErr_SetString(PyExc_BufferError,
76 "cannot resize an array that is exporting buffers");
77 return -1;
78 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 /* Bypass realloc() when a previous overallocation is large enough
81 to accommodate the newsize. If the newsize is 16 smaller than the
82 current size, then proceed with the realloc() to shrink the array.
83 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 if (self->allocated >= newsize &&
86 Py_SIZE(self) < newsize + 16 &&
87 self->ob_item != NULL) {
88 Py_SIZE(self) = newsize;
89 return 0;
90 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 if (newsize == 0) {
93 PyMem_FREE(self->ob_item);
94 self->ob_item = NULL;
95 Py_SIZE(self) = 0;
96 self->allocated = 0;
97 return 0;
98 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 /* This over-allocates proportional to the array size, making room
101 * for additional growth. The over-allocation is mild, but is
102 * enough to give linear-time amortized behavior over a long
103 * sequence of appends() in the presence of a poorly-performing
104 * system realloc().
105 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
106 * Note, the pattern starts out the same as for lists but then
107 * grows at a smaller rate so that larger arrays only overallocate
108 * by about 1/16th -- this is done because arrays are presumed to be more
109 * memory critical.
110 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
113 items = self->ob_item;
114 /* XXX The following multiplication and division does not optimize away
115 like it does for lists since the size is not known at compile time */
116 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
117 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
118 else
119 items = NULL;
120 if (items == NULL) {
121 PyErr_NoMemory();
122 return -1;
123 }
124 self->ob_item = items;
125 Py_SIZE(self) = newsize;
126 self->allocated = _new_size;
127 return 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000128}
129
Tim Petersbb307342000-09-10 05:22:54 +0000130/****************************************************************************
131Get and Set functions for each type.
132A Get function takes an arrayobject* and an integer index, returning the
133array value at that index wrapped in an appropriate PyObject*.
134A Set function takes an arrayobject, integer index, and PyObject*; sets
135the array value at that index to the raw C data extracted from the PyObject*,
136and returns 0 if successful, else nonzero on failure (PyObject* not of an
137appropriate type or value).
138Note that the basic Get and Set functions do NOT check that the index is
139in bounds; that's the responsibility of the caller.
140****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000141
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000142static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000143b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 long x = ((char *)ap->ob_item)[i];
146 if (x >= 128)
147 x -= 256;
148 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000149}
150
151static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000152b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000154 short x;
155 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
156 must use the next size up that is signed ('h') and manually do
157 the overflow checking */
158 if (!PyArg_Parse(v, "h;array item must be integer", &x))
159 return -1;
160 else if (x < -128) {
161 PyErr_SetString(PyExc_OverflowError,
162 "signed char is less than minimum");
163 return -1;
164 }
165 else if (x > 127) {
166 PyErr_SetString(PyExc_OverflowError,
167 "signed char is greater than maximum");
168 return -1;
169 }
170 if (i >= 0)
171 ((char *)ap->ob_item)[i] = (char)x;
172 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000173}
174
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000175static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000176BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000178 long x = ((unsigned char *)ap->ob_item)[i];
179 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000180}
181
Fred Drake541dc3b2000-06-28 17:49:30 +0000182static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000183BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000185 unsigned char x;
186 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
187 if (!PyArg_Parse(v, "b;array item must be integer", &x))
188 return -1;
189 if (i >= 0)
190 ((char *)ap->ob_item)[i] = x;
191 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000192}
Guido van Rossum549ab711997-01-03 19:09:47 +0000193
Martin v. Löwis99866332002-03-01 10:27:01 +0000194static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000195u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000196{
Victor Stinner62bb3942012-08-06 00:46:05 +0200197 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
Martin v. Löwis99866332002-03-01 10:27:01 +0000198}
199
200static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000201u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000202{
Victor Stinner62bb3942012-08-06 00:46:05 +0200203 Py_UNICODE *p;
204 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000205
Victor Stinner62bb3942012-08-06 00:46:05 +0200206 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 return -1;
Victor Stinner62bb3942012-08-06 00:46:05 +0200208 if (len != 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 PyErr_SetString(PyExc_TypeError,
210 "array item must be unicode character");
211 return -1;
212 }
213 if (i >= 0)
Victor Stinner62bb3942012-08-06 00:46:05 +0200214 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000216}
Martin v. Löwis99866332002-03-01 10:27:01 +0000217
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000218
Guido van Rossum549ab711997-01-03 19:09:47 +0000219static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000220h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000223}
224
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000225
Guido van Rossum778983b1993-02-19 15:55:02 +0000226static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000227h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 short x;
230 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
231 if (!PyArg_Parse(v, "h;array item must be integer", &x))
232 return -1;
233 if (i >= 0)
234 ((short *)ap->ob_item)[i] = x;
235 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000236}
237
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000238static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000239HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000241 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000242}
243
Fred Drake541dc3b2000-06-28 17:49:30 +0000244static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000245HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000246{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 int x;
248 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
249 must use the next size up and manually do the overflow checking */
250 if (!PyArg_Parse(v, "i;array item must be integer", &x))
251 return -1;
252 else if (x < 0) {
253 PyErr_SetString(PyExc_OverflowError,
254 "unsigned short is less than minimum");
255 return -1;
256 }
257 else if (x > USHRT_MAX) {
258 PyErr_SetString(PyExc_OverflowError,
259 "unsigned short is greater than maximum");
260 return -1;
261 }
262 if (i >= 0)
263 ((short *)ap->ob_item)[i] = (short)x;
264 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000265}
Guido van Rossum549ab711997-01-03 19:09:47 +0000266
267static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000268i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000271}
272
273static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000274i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 int x;
277 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
278 if (!PyArg_Parse(v, "i;array item must be integer", &x))
279 return -1;
280 if (i >= 0)
281 ((int *)ap->ob_item)[i] = x;
282 return 0;
Guido van Rossume77a7571993-11-03 15:01:26 +0000283}
284
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000285static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000286II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000288 return PyLong_FromUnsignedLong(
289 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000290}
291
292static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000293II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 unsigned long x;
296 if (PyLong_Check(v)) {
297 x = PyLong_AsUnsignedLong(v);
298 if (x == (unsigned long) -1 && PyErr_Occurred())
299 return -1;
300 }
301 else {
302 long y;
303 if (!PyArg_Parse(v, "l;array item must be integer", &y))
304 return -1;
305 if (y < 0) {
306 PyErr_SetString(PyExc_OverflowError,
307 "unsigned int is less than minimum");
308 return -1;
309 }
310 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 }
313 if (x > UINT_MAX) {
314 PyErr_SetString(PyExc_OverflowError,
315 "unsigned int is greater than maximum");
316 return -1;
317 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 if (i >= 0)
320 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
321 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000322}
323
324static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000325l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000326{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000327 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000328}
329
330static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000331l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 long x;
334 if (!PyArg_Parse(v, "l;array item must be integer", &x))
335 return -1;
336 if (i >= 0)
337 ((long *)ap->ob_item)[i] = x;
338 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000339}
340
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000341static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000342LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000345}
346
347static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000348LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 unsigned long x;
351 if (PyLong_Check(v)) {
352 x = PyLong_AsUnsignedLong(v);
353 if (x == (unsigned long) -1 && PyErr_Occurred())
354 return -1;
355 }
356 else {
357 long y;
358 if (!PyArg_Parse(v, "l;array item must be integer", &y))
359 return -1;
360 if (y < 0) {
361 PyErr_SetString(PyExc_OverflowError,
362 "unsigned long is less than minimum");
363 return -1;
364 }
365 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 }
368 if (x > ULONG_MAX) {
369 PyErr_SetString(PyExc_OverflowError,
370 "unsigned long is greater than maximum");
371 return -1;
372 }
Tim Petersbb307342000-09-10 05:22:54 +0000373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 if (i >= 0)
375 ((unsigned long *)ap->ob_item)[i] = x;
376 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000377}
378
Meador Inge1c9f0c92011-09-20 19:55:51 -0500379#ifdef HAVE_LONG_LONG
380
381static PyObject *
382q_getitem(arrayobject *ap, Py_ssize_t i)
383{
384 return PyLong_FromLongLong(((PY_LONG_LONG *)ap->ob_item)[i]);
385}
386
387static int
388q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
389{
390 PY_LONG_LONG x;
391 if (!PyArg_Parse(v, "L;array item must be integer", &x))
392 return -1;
393 if (i >= 0)
394 ((PY_LONG_LONG *)ap->ob_item)[i] = x;
395 return 0;
396}
397
398static PyObject *
399QQ_getitem(arrayobject *ap, Py_ssize_t i)
400{
401 return PyLong_FromUnsignedLongLong(
402 ((unsigned PY_LONG_LONG *)ap->ob_item)[i]);
403}
404
405static int
406QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
407{
408 unsigned PY_LONG_LONG x;
409 if (PyLong_Check(v)) {
410 x = PyLong_AsUnsignedLongLong(v);
411 if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())
412 return -1;
413 }
414 else {
415 PY_LONG_LONG y;
416 if (!PyArg_Parse(v, "L;array item must be integer", &y))
417 return -1;
418 if (y < 0) {
419 PyErr_SetString(PyExc_OverflowError,
420 "unsigned long long is less than minimum");
421 return -1;
422 }
423 x = (unsigned PY_LONG_LONG)y;
424 }
425
426 if (i >= 0)
427 ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;
428 return 0;
429}
430#endif
431
Guido van Rossum549ab711997-01-03 19:09:47 +0000432static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000433f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000436}
437
438static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000439f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000440{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 float x;
442 if (!PyArg_Parse(v, "f;array item must be float", &x))
443 return -1;
444 if (i >= 0)
445 ((float *)ap->ob_item)[i] = x;
446 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000447}
448
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000450d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000453}
454
455static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000456d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000457{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000458 double x;
459 if (!PyArg_Parse(v, "d;array item must be float", &x))
460 return -1;
461 if (i >= 0)
462 ((double *)ap->ob_item)[i] = x;
463 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000464}
465
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000466
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000467/* Description of types.
468 *
469 * Don't forget to update typecode_to_mformat_code() if you add a new
470 * typecode.
471 */
Guido van Rossum234f9421993-06-17 12:35:49 +0000472static struct arraydescr descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
474 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
Victor Stinner62bb3942012-08-06 00:46:05 +0200475 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
477 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
478 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
479 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
480 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
481 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
Meador Inge1c9f0c92011-09-20 19:55:51 -0500482#ifdef HAVE_LONG_LONG
483 {'q', sizeof(PY_LONG_LONG), q_getitem, q_setitem, "q", 1, 1},
484 {'Q', sizeof(PY_LONG_LONG), QQ_getitem, QQ_setitem, "Q", 1, 0},
485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
487 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
488 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000489};
Tim Petersbb307342000-09-10 05:22:54 +0000490
491/****************************************************************************
492Implementations of array object methods.
493****************************************************************************/
Brett Cannon1eb32c22014-10-10 16:26:45 -0400494/*[clinic input]
495class array.array "arrayobject *" "&Arraytype"
496[clinic start generated code]*/
497/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ad43d37e942a8854]*/
Guido van Rossum778983b1993-02-19 15:55:02 +0000498
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000499static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000500newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 arrayobject *op;
503 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 if (size < 0) {
506 PyErr_BadInternalCall();
507 return NULL;
508 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* Check for overflow */
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100511 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 return PyErr_NoMemory();
513 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100514 nbytes = size * descr->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 op = (arrayobject *) type->tp_alloc(type, 0);
516 if (op == NULL) {
517 return NULL;
518 }
519 op->ob_descr = descr;
520 op->allocated = size;
521 op->weakreflist = NULL;
522 Py_SIZE(op) = size;
523 if (size <= 0) {
524 op->ob_item = NULL;
525 }
526 else {
527 op->ob_item = PyMem_NEW(char, nbytes);
528 if (op->ob_item == NULL) {
529 Py_DECREF(op);
530 return PyErr_NoMemory();
531 }
532 }
533 op->ob_exports = 0;
534 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000535}
536
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000537static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000538getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000539{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +0200540 arrayobject *ap;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 assert(array_Check(op));
542 ap = (arrayobject *)op;
543 assert(i>=0 && i<Py_SIZE(ap));
544 return (*ap->ob_descr->getitem)(ap, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000545}
546
547static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000548ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 char *items;
551 Py_ssize_t n = Py_SIZE(self);
552 if (v == NULL) {
553 PyErr_BadInternalCall();
554 return -1;
555 }
556 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
557 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (array_resize(self, n+1) == -1)
560 return -1;
561 items = self->ob_item;
562 if (where < 0) {
563 where += n;
564 if (where < 0)
565 where = 0;
566 }
567 if (where > n)
568 where = n;
569 /* appends don't need to call memmove() */
570 if (where != n)
571 memmove(items + (where+1)*self->ob_descr->itemsize,
572 items + where*self->ob_descr->itemsize,
573 (n-where)*self->ob_descr->itemsize);
574 return (*self->ob_descr->setitem)(self, where, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000575}
576
Guido van Rossum778983b1993-02-19 15:55:02 +0000577/* Methods */
578
579static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000580array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000581{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 if (op->weakreflist != NULL)
583 PyObject_ClearWeakRefs((PyObject *) op);
584 if (op->ob_item != NULL)
585 PyMem_DEL(op->ob_item);
586 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000587}
588
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000589static PyObject *
590array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 arrayobject *va, *wa;
593 PyObject *vi = NULL;
594 PyObject *wi = NULL;
595 Py_ssize_t i, k;
596 PyObject *res;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000597
Brian Curtindfc80e32011-08-10 20:28:54 -0500598 if (!array_Check(v) || !array_Check(w))
599 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 va = (arrayobject *)v;
602 wa = (arrayobject *)w;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
605 /* Shortcut: if the lengths differ, the arrays differ */
606 if (op == Py_EQ)
607 res = Py_False;
608 else
609 res = Py_True;
610 Py_INCREF(res);
611 return res;
612 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 /* Search for the first index where items are different */
615 k = 1;
616 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
617 vi = getarrayitem(v, i);
618 wi = getarrayitem(w, i);
619 if (vi == NULL || wi == NULL) {
620 Py_XDECREF(vi);
621 Py_XDECREF(wi);
622 return NULL;
623 }
624 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
625 if (k == 0)
626 break; /* Keeping vi and wi alive! */
627 Py_DECREF(vi);
628 Py_DECREF(wi);
629 if (k < 0)
630 return NULL;
631 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 if (k) {
634 /* No more items to compare -- compare sizes */
635 Py_ssize_t vs = Py_SIZE(va);
636 Py_ssize_t ws = Py_SIZE(wa);
637 int cmp;
638 switch (op) {
639 case Py_LT: cmp = vs < ws; break;
640 case Py_LE: cmp = vs <= ws; break;
641 case Py_EQ: cmp = vs == ws; break;
642 case Py_NE: cmp = vs != ws; break;
643 case Py_GT: cmp = vs > ws; break;
644 case Py_GE: cmp = vs >= ws; break;
645 default: return NULL; /* cannot happen */
646 }
647 if (cmp)
648 res = Py_True;
649 else
650 res = Py_False;
651 Py_INCREF(res);
652 return res;
653 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 /* We have an item that differs. First, shortcuts for EQ/NE */
656 if (op == Py_EQ) {
657 Py_INCREF(Py_False);
658 res = Py_False;
659 }
660 else if (op == Py_NE) {
661 Py_INCREF(Py_True);
662 res = Py_True;
663 }
664 else {
665 /* Compare the final item again using the proper operator */
666 res = PyObject_RichCompare(vi, wi, op);
667 }
668 Py_DECREF(vi);
669 Py_DECREF(wi);
670 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000671}
672
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000674array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000677}
678
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000679static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000680array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (i < 0 || i >= Py_SIZE(a)) {
683 PyErr_SetString(PyExc_IndexError, "array index out of range");
684 return NULL;
685 }
686 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000687}
688
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000689static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000690array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 arrayobject *np;
693 if (ilow < 0)
694 ilow = 0;
695 else if (ilow > Py_SIZE(a))
696 ilow = Py_SIZE(a);
697 if (ihigh < 0)
698 ihigh = 0;
699 if (ihigh < ilow)
700 ihigh = ilow;
701 else if (ihigh > Py_SIZE(a))
702 ihigh = Py_SIZE(a);
703 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
704 if (np == NULL)
705 return NULL;
706 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
707 (ihigh-ilow) * a->ob_descr->itemsize);
708 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000709}
710
Brett Cannon1eb32c22014-10-10 16:26:45 -0400711
712/*[clinic input]
713array.array.__copy__
714
715Return a copy of the array.
716[clinic start generated code]*/
717
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000718static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -0400719array_array___copy___impl(arrayobject *self)
720/*[clinic end generated code: output=dec7c3f925d9619e input=ad1ee5b086965f09]*/
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000721{
Brett Cannon1eb32c22014-10-10 16:26:45 -0400722 return array_slice(self, 0, Py_SIZE(self));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000723}
724
Brett Cannon1eb32c22014-10-10 16:26:45 -0400725/*[clinic input]
726array.array.__deepcopy__
727
728 unused: object
729 /
730
731Return a copy of the array.
732[clinic start generated code]*/
733
734static PyObject *
735array_array___deepcopy__(arrayobject *self, PyObject *unused)
736/*[clinic end generated code: output=1ec748d8e14a9faa input=2405ecb4933748c4]*/
737{
738 return array_array___copy___impl(self);
739}
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000740
741static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000742array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 Py_ssize_t size;
745 arrayobject *np;
746 if (!array_Check(bb)) {
747 PyErr_Format(PyExc_TypeError,
748 "can only append array (not \"%.200s\") to array",
749 Py_TYPE(bb)->tp_name);
750 return NULL;
751 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000752#define b ((arrayobject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 if (a->ob_descr != b->ob_descr) {
754 PyErr_BadArgument();
755 return NULL;
756 }
757 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
758 return PyErr_NoMemory();
759 }
760 size = Py_SIZE(a) + Py_SIZE(b);
761 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
762 if (np == NULL) {
763 return NULL;
764 }
765 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
766 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
767 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
768 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000769#undef b
770}
771
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000772static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000773array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000774{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 Py_ssize_t size;
776 arrayobject *np;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000777 Py_ssize_t oldbytes, newbytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 if (n < 0)
779 n = 0;
780 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
781 return PyErr_NoMemory();
782 }
783 size = Py_SIZE(a) * n;
784 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
785 if (np == NULL)
786 return NULL;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000787 if (n == 0)
788 return (PyObject *)np;
789 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
790 newbytes = oldbytes * n;
791 /* this follows the code in unicode_repeat */
792 if (oldbytes == 1) {
793 memset(np->ob_item, a->ob_item[0], newbytes);
794 } else {
795 Py_ssize_t done = oldbytes;
796 Py_MEMCPY(np->ob_item, a->ob_item, oldbytes);
797 while (done < newbytes) {
798 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
799 Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy);
800 done += ncopy;
801 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 }
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000803 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000804}
805
806static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000807array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000808{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 char *item;
810 Py_ssize_t n; /* Size of replacement array */
811 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000812#define b ((arrayobject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000813 if (v == NULL)
814 n = 0;
815 else if (array_Check(v)) {
816 n = Py_SIZE(b);
817 if (a == b) {
818 /* Special case "a[i:j] = a" -- copy b first */
819 int ret;
820 v = array_slice(b, 0, n);
821 if (!v)
822 return -1;
823 ret = array_ass_slice(a, ilow, ihigh, v);
824 Py_DECREF(v);
825 return ret;
826 }
827 if (b->ob_descr != a->ob_descr) {
828 PyErr_BadArgument();
829 return -1;
830 }
831 }
832 else {
833 PyErr_Format(PyExc_TypeError,
834 "can only assign array (not \"%.200s\") to array slice",
835 Py_TYPE(v)->tp_name);
836 return -1;
837 }
838 if (ilow < 0)
839 ilow = 0;
840 else if (ilow > Py_SIZE(a))
841 ilow = Py_SIZE(a);
842 if (ihigh < 0)
843 ihigh = 0;
844 if (ihigh < ilow)
845 ihigh = ilow;
846 else if (ihigh > Py_SIZE(a))
847 ihigh = Py_SIZE(a);
848 item = a->ob_item;
849 d = n - (ihigh-ilow);
850 /* Issue #4509: If the array has exported buffers and the slice
851 assignment would change the size of the array, fail early to make
852 sure we don't modify it. */
853 if (d != 0 && a->ob_exports > 0) {
854 PyErr_SetString(PyExc_BufferError,
855 "cannot resize an array that is exporting buffers");
856 return -1;
857 }
858 if (d < 0) { /* Delete -d items */
859 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
860 item + ihigh*a->ob_descr->itemsize,
861 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
862 if (array_resize(a, Py_SIZE(a) + d) == -1)
863 return -1;
864 }
865 else if (d > 0) { /* Insert d items */
866 if (array_resize(a, Py_SIZE(a) + d))
867 return -1;
868 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
869 item + ihigh*a->ob_descr->itemsize,
870 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
871 }
872 if (n > 0)
873 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
874 n*b->ob_descr->itemsize);
875 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000876#undef b
877}
878
879static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000880array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 if (i < 0 || i >= Py_SIZE(a)) {
883 PyErr_SetString(PyExc_IndexError,
884 "array assignment index out of range");
885 return -1;
886 }
887 if (v == NULL)
888 return array_ass_slice(a, i, i+1, v);
889 return (*a->ob_descr->setitem)(a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000890}
891
892static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000893setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000894{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 assert(array_Check(a));
896 return array_ass_item((arrayobject *)a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000897}
898
Martin v. Löwis99866332002-03-01 10:27:01 +0000899static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000900array_iter_extend(arrayobject *self, PyObject *bb)
901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 PyObject *it, *v;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 it = PyObject_GetIter(bb);
905 if (it == NULL)
906 return -1;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 while ((v = PyIter_Next(it)) != NULL) {
Mark Dickinson346f0af2010-08-06 09:36:57 +0000909 if (ins1(self, Py_SIZE(self), v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 Py_DECREF(v);
911 Py_DECREF(it);
912 return -1;
913 }
914 Py_DECREF(v);
915 }
916 Py_DECREF(it);
917 if (PyErr_Occurred())
918 return -1;
919 return 0;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000920}
921
922static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000923array_do_extend(arrayobject *self, PyObject *bb)
924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 Py_ssize_t size, oldsize, bbsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000927 if (!array_Check(bb))
928 return array_iter_extend(self, bb);
929#define b ((arrayobject *)bb)
930 if (self->ob_descr != b->ob_descr) {
931 PyErr_SetString(PyExc_TypeError,
932 "can only extend with array of same kind");
933 return -1;
934 }
935 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
936 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
937 PyErr_NoMemory();
938 return -1;
939 }
940 oldsize = Py_SIZE(self);
941 /* Get the size of bb before resizing the array since bb could be self. */
942 bbsize = Py_SIZE(bb);
943 size = oldsize + Py_SIZE(b);
944 if (array_resize(self, size) == -1)
945 return -1;
946 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
947 b->ob_item, bbsize * b->ob_descr->itemsize);
948
949 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000950#undef b
951}
952
953static PyObject *
954array_inplace_concat(arrayobject *self, PyObject *bb)
955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 if (!array_Check(bb)) {
957 PyErr_Format(PyExc_TypeError,
958 "can only extend array with array (not \"%.200s\")",
959 Py_TYPE(bb)->tp_name);
960 return NULL;
961 }
962 if (array_do_extend(self, bb) == -1)
963 return NULL;
964 Py_INCREF(self);
965 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000966}
967
968static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000969array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000970{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 char *items, *p;
972 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 if (Py_SIZE(self) > 0) {
975 if (n < 0)
976 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 if ((self->ob_descr->itemsize != 0) &&
978 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
979 return PyErr_NoMemory();
980 }
981 size = Py_SIZE(self) * self->ob_descr->itemsize;
982 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
983 return PyErr_NoMemory();
984 }
985 if (array_resize(self, n * Py_SIZE(self)) == -1)
986 return NULL;
987 items = p = self->ob_item;
988 for (i = 1; i < n; i++) {
989 p += size;
990 memcpy(p, items, size);
991 }
992 }
993 Py_INCREF(self);
994 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000995}
996
997
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000998static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000999ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 if (ins1(self, where, v) != 0)
1002 return NULL;
1003 Py_INCREF(Py_None);
1004 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001005}
1006
Brett Cannon1eb32c22014-10-10 16:26:45 -04001007/*[clinic input]
1008array.array.count
1009
1010 v: object
1011 /
1012
1013Return number of occurrences of v in the array.
1014[clinic start generated code]*/
1015
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001017array_array_count(arrayobject *self, PyObject *v)
1018/*[clinic end generated code: output=3dd3624bf7135a3a input=d9bce9d65e39d1f5]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 Py_ssize_t count = 0;
1021 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001024 PyObject *selfi;
1025 int cmp;
1026
1027 selfi = getarrayitem((PyObject *)self, i);
1028 if (selfi == NULL)
1029 return NULL;
1030 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 Py_DECREF(selfi);
1032 if (cmp > 0)
1033 count++;
1034 else if (cmp < 0)
1035 return NULL;
1036 }
1037 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001038}
1039
Brett Cannon1eb32c22014-10-10 16:26:45 -04001040
1041/*[clinic input]
1042array.array.index
1043
1044 v: object
1045 /
1046
1047Return index of first occurrence of v in the array.
1048[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001049
1050static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001051array_array_index(arrayobject *self, PyObject *v)
1052/*[clinic end generated code: output=d48498d325602167 input=cf619898c6649d08]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001057 PyObject *selfi;
1058 int cmp;
1059
1060 selfi = getarrayitem((PyObject *)self, i);
1061 if (selfi == NULL)
1062 return NULL;
1063 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 Py_DECREF(selfi);
1065 if (cmp > 0) {
1066 return PyLong_FromLong((long)i);
1067 }
1068 else if (cmp < 0)
1069 return NULL;
1070 }
1071 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
1072 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001073}
1074
Raymond Hettinger625812f2003-01-07 01:58:52 +00001075static int
1076array_contains(arrayobject *self, PyObject *v)
1077{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 Py_ssize_t i;
1079 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1082 PyObject *selfi = getarrayitem((PyObject *)self, i);
Victor Stinner0b142e22013-07-17 23:01:30 +02001083 if (selfi == NULL)
Victor Stinner4755bea2013-07-18 01:12:35 +02001084 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1086 Py_DECREF(selfi);
1087 }
1088 return cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001089}
1090
Brett Cannon1eb32c22014-10-10 16:26:45 -04001091/*[clinic input]
1092array.array.remove
1093
1094 v: object
1095 /
1096
1097Remove the first occurrence of v in the array.
1098[clinic start generated code]*/
1099
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001100static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001101array_array_remove(arrayobject *self, PyObject *v)
1102/*[clinic end generated code: output=bef06be9fdf9dceb input=0b1e5aed25590027]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001107 PyObject *selfi;
1108 int cmp;
1109
1110 selfi = getarrayitem((PyObject *)self,i);
1111 if (selfi == NULL)
1112 return NULL;
1113 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 Py_DECREF(selfi);
1115 if (cmp > 0) {
1116 if (array_ass_slice(self, i, i+1,
1117 (PyObject *)NULL) != 0)
1118 return NULL;
1119 Py_INCREF(Py_None);
1120 return Py_None;
1121 }
1122 else if (cmp < 0)
1123 return NULL;
1124 }
1125 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
1126 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001127}
1128
Brett Cannon1eb32c22014-10-10 16:26:45 -04001129/*[clinic input]
1130array.array.pop
1131
1132 i: Py_ssize_t = -1
1133 /
1134
1135Return the i-th element and delete it from the array.
1136
1137i defaults to -1.
1138[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001139
1140static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001141array_array_pop_impl(arrayobject *self, Py_ssize_t i)
1142/*[clinic end generated code: output=bc1f0c54fe5308e4 input=8e5feb4c1a11cd44]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 PyObject *v;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001146 if (Py_SIZE(self) == 0) {
1147 /* Special-case most common failure cause */
1148 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1149 return NULL;
1150 }
1151 if (i < 0)
1152 i += Py_SIZE(self);
1153 if (i < 0 || i >= Py_SIZE(self)) {
1154 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1155 return NULL;
1156 }
Victor Stinner0b142e22013-07-17 23:01:30 +02001157 v = getarrayitem((PyObject *)self, i);
1158 if (v == NULL)
1159 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1161 Py_DECREF(v);
1162 return NULL;
1163 }
1164 return v;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001165}
1166
Brett Cannon1eb32c22014-10-10 16:26:45 -04001167/*[clinic input]
1168array.array.extend
1169
1170 bb: object
1171 /
1172
1173Append items to the end of the array.
1174[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001175
1176static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001177array_array_extend(arrayobject *self, PyObject *bb)
1178/*[clinic end generated code: output=bbddbc8e8bef871d input=43be86aba5c31e44]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 if (array_do_extend(self, bb) == -1)
1181 return NULL;
1182 Py_INCREF(Py_None);
1183 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001184}
1185
Brett Cannon1eb32c22014-10-10 16:26:45 -04001186/*[clinic input]
1187array.array.insert
1188
1189 i: Py_ssize_t
1190 v: object
1191 /
1192
1193Insert a new item v into the array before position i.
1194[clinic start generated code]*/
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001195
1196static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001197array_array_insert_impl(arrayobject *self, Py_ssize_t i, PyObject *v)
1198/*[clinic end generated code: output=5a3648e278348564 input=5577d1b4383e9313]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001199{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 return ins(self, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001201}
1202
Brett Cannon1eb32c22014-10-10 16:26:45 -04001203/*[clinic input]
1204array.array.buffer_info
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001205
Brett Cannon1eb32c22014-10-10 16:26:45 -04001206Return a tuple (address, length) giving the current memory address and the length in items of the buffer used to hold array's contents.
1207
1208The length should be multiplied by the itemsize attribute to calculate
1209the buffer length in bytes.
1210[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001211
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001212static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001213array_array_buffer_info_impl(arrayobject *self)
1214/*[clinic end generated code: output=9b2a4ec3ae7e98e7 input=a58bae5c6e1ac6a6]*/
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001215{
Victor Stinner541067a2013-11-14 01:27:12 +01001216 PyObject *retval = NULL, *v;
1217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 retval = PyTuple_New(2);
1219 if (!retval)
1220 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001221
Victor Stinner541067a2013-11-14 01:27:12 +01001222 v = PyLong_FromVoidPtr(self->ob_item);
1223 if (v == NULL) {
1224 Py_DECREF(retval);
1225 return NULL;
1226 }
1227 PyTuple_SET_ITEM(retval, 0, v);
1228
1229 v = PyLong_FromLong((long)(Py_SIZE(self)));
1230 if (v == NULL) {
1231 Py_DECREF(retval);
1232 return NULL;
1233 }
1234 PyTuple_SET_ITEM(retval, 1, v);
Fred Drake541dc3b2000-06-28 17:49:30 +00001235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001237}
1238
Brett Cannon1eb32c22014-10-10 16:26:45 -04001239/*[clinic input]
1240array.array.append
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001241
Brett Cannon1eb32c22014-10-10 16:26:45 -04001242 v: object
1243 /
1244
1245Append new value v to the end of the array.
1246[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001247
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001248static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001249array_array_append(arrayobject *self, PyObject *v)
1250/*[clinic end generated code: output=745a0669bf8db0e2 input=0b98d9d78e78f0fa]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001251{
Mark Dickinson346f0af2010-08-06 09:36:57 +00001252 return ins(self, Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001253}
1254
Brett Cannon1eb32c22014-10-10 16:26:45 -04001255/*[clinic input]
1256array.array.byteswap
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001257
Brett Cannon1eb32c22014-10-10 16:26:45 -04001258Byteswap all items of the array.
1259
1260If the items in the array are not 1, 2, 4, or 8 bytes in size, RuntimeError is
1261raised.
1262[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001263
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001265array_array_byteswap_impl(arrayobject *self)
1266/*[clinic end generated code: output=5f8236cbdf0d90b5 input=6a85591b950a0186]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 char *p;
1269 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 switch (self->ob_descr->itemsize) {
1272 case 1:
1273 break;
1274 case 2:
1275 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1276 char p0 = p[0];
1277 p[0] = p[1];
1278 p[1] = p0;
1279 }
1280 break;
1281 case 4:
1282 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1283 char p0 = p[0];
1284 char p1 = p[1];
1285 p[0] = p[3];
1286 p[1] = p[2];
1287 p[2] = p1;
1288 p[3] = p0;
1289 }
1290 break;
1291 case 8:
1292 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1293 char p0 = p[0];
1294 char p1 = p[1];
1295 char p2 = p[2];
1296 char p3 = p[3];
1297 p[0] = p[7];
1298 p[1] = p[6];
1299 p[2] = p[5];
1300 p[3] = p[4];
1301 p[4] = p3;
1302 p[5] = p2;
1303 p[6] = p1;
1304 p[7] = p0;
1305 }
1306 break;
1307 default:
1308 PyErr_SetString(PyExc_RuntimeError,
1309 "don't know how to byteswap this array type");
1310 return NULL;
1311 }
1312 Py_INCREF(Py_None);
1313 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001314}
1315
Brett Cannon1eb32c22014-10-10 16:26:45 -04001316/*[clinic input]
1317array.array.reverse
1318
1319Reverse the order of the items in the array.
1320[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001321
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001322static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001323array_array_reverse_impl(arrayobject *self)
1324/*[clinic end generated code: output=c04868b36f6f4089 input=cd904f01b27d966a]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001325{
Antoine Pitrou9ed5f272013-08-13 20:18:52 +02001326 Py_ssize_t itemsize = self->ob_descr->itemsize;
1327 char *p, *q;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 /* little buffer to hold items while swapping */
1329 char tmp[256]; /* 8 is probably enough -- but why skimp */
1330 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 if (Py_SIZE(self) > 1) {
1333 for (p = self->ob_item,
1334 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1335 p < q;
1336 p += itemsize, q -= itemsize) {
1337 /* memory areas guaranteed disjoint, so memcpy
1338 * is safe (& memmove may be slower).
1339 */
1340 memcpy(tmp, p, itemsize);
1341 memcpy(p, q, itemsize);
1342 memcpy(q, tmp, itemsize);
1343 }
1344 }
Tim Petersbb307342000-09-10 05:22:54 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 Py_INCREF(Py_None);
1347 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001348}
Guido van Rossume77a7571993-11-03 15:01:26 +00001349
Brett Cannon1eb32c22014-10-10 16:26:45 -04001350/*[clinic input]
1351array.array.fromfile
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001352
Brett Cannon1eb32c22014-10-10 16:26:45 -04001353 f: object
1354 n: Py_ssize_t
1355 /
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001356
Brett Cannon1eb32c22014-10-10 16:26:45 -04001357Read n objects from the file object f and append them to the end of the array.
1358[clinic start generated code]*/
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001359
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001361array_array_fromfile_impl(arrayobject *self, PyObject *f, Py_ssize_t n)
1362/*[clinic end generated code: output=ec9f600e10f53510 input=e188afe8e58adf40]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001363{
Brett Cannon1eb32c22014-10-10 16:26:45 -04001364 PyObject *args, *b, *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001365 Py_ssize_t itemsize = self->ob_descr->itemsize;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001366 Py_ssize_t nbytes;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001367 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001369
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001370 if (n < 0) {
1371 PyErr_SetString(PyExc_ValueError, "negative count");
1372 return NULL;
1373 }
1374 if (n > PY_SSIZE_T_MAX / itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001375 PyErr_NoMemory();
1376 return NULL;
1377 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001378 nbytes = n * itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001379
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001380 b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 if (b == NULL)
1382 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 if (!PyBytes_Check(b)) {
1385 PyErr_SetString(PyExc_TypeError,
1386 "read() didn't return bytes");
1387 Py_DECREF(b);
1388 return NULL;
1389 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 args = Py_BuildValue("(O)", b);
1394 Py_DECREF(b);
1395 if (args == NULL)
1396 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001397
Brett Cannon1eb32c22014-10-10 16:26:45 -04001398 res = array_array_frombytes(self, args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 Py_DECREF(args);
1400 if (res == NULL)
1401 return NULL;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001403 if (not_enough_bytes) {
1404 PyErr_SetString(PyExc_EOFError,
1405 "read() didn't return enough bytes");
1406 Py_DECREF(res);
1407 return NULL;
1408 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001410 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001411}
1412
Brett Cannon1eb32c22014-10-10 16:26:45 -04001413/*[clinic input]
1414array.array.tofile
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001415
Brett Cannon1eb32c22014-10-10 16:26:45 -04001416 f: object
1417 /
1418
1419Write all items (as machine values) to the file object f.
1420[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001421
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001422static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001423array_array_tofile(arrayobject *self, PyObject *f)
1424/*[clinic end generated code: output=3a2cfa8128df0777 input=b0669a484aab0831]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001425{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1427 /* Write 64K blocks at a time */
1428 /* XXX Make the block size settable */
1429 int BLOCKSIZE = 64*1024;
1430 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1431 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 if (Py_SIZE(self) == 0)
1434 goto done;
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 for (i = 0; i < nblocks; i++) {
1437 char* ptr = self->ob_item + i*BLOCKSIZE;
1438 Py_ssize_t size = BLOCKSIZE;
1439 PyObject *bytes, *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001440 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 if (i*BLOCKSIZE + size > nbytes)
1443 size = nbytes - i*BLOCKSIZE;
1444 bytes = PyBytes_FromStringAndSize(ptr, size);
1445 if (bytes == NULL)
1446 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001447 res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 Py_DECREF(bytes);
1449 if (res == NULL)
1450 return NULL;
1451 Py_DECREF(res); /* drop write result */
1452 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001453
1454 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 Py_INCREF(Py_None);
1456 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001457}
1458
Brett Cannon1eb32c22014-10-10 16:26:45 -04001459/*[clinic input]
1460array.array.fromlist
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001461
Brett Cannon1eb32c22014-10-10 16:26:45 -04001462 list: object
1463 /
1464
1465Append items to array from list.
1466[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001467
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001468static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001469array_array_fromlist(arrayobject *self, PyObject *list)
1470/*[clinic end generated code: output=26411c2d228a3e3f input=be2605a96c49680f]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001471{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 if (!PyList_Check(list)) {
1475 PyErr_SetString(PyExc_TypeError, "arg must be list");
1476 return NULL;
1477 }
1478 n = PyList_Size(list);
1479 if (n > 0) {
1480 Py_ssize_t i, old_size;
1481 old_size = Py_SIZE(self);
1482 if (array_resize(self, old_size + n) == -1)
1483 return NULL;
1484 for (i = 0; i < n; i++) {
1485 PyObject *v = PyList_GetItem(list, i);
1486 if ((*self->ob_descr->setitem)(self,
1487 Py_SIZE(self) - n + i, v) != 0) {
1488 array_resize(self, old_size);
1489 return NULL;
1490 }
1491 }
1492 }
1493 Py_INCREF(Py_None);
1494 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001495}
1496
Brett Cannon1eb32c22014-10-10 16:26:45 -04001497/*[clinic input]
1498array.array.tolist
1499
1500Convert array to an ordinary list with the same items.
1501[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001502
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001503static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001504array_array_tolist_impl(arrayobject *self)
1505/*[clinic end generated code: output=00b60cc9eab8ef89 input=a8d7784a94f86b53]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001506{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 PyObject *list = PyList_New(Py_SIZE(self));
1508 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 if (list == NULL)
1511 return NULL;
1512 for (i = 0; i < Py_SIZE(self); i++) {
1513 PyObject *v = getarrayitem((PyObject *)self, i);
Victor Stinner4755bea2013-07-18 01:12:35 +02001514 if (v == NULL)
1515 goto error;
1516 if (PyList_SetItem(list, i, v) < 0)
1517 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 }
1519 return list;
Victor Stinner4755bea2013-07-18 01:12:35 +02001520
1521error:
1522 Py_DECREF(list);
1523 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001524}
1525
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001526static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001527frombytes(arrayobject *self, Py_buffer *buffer)
Guido van Rossum778983b1993-02-19 15:55:02 +00001528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 int itemsize = self->ob_descr->itemsize;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001530 Py_ssize_t n;
1531 if (buffer->itemsize != 1) {
1532 PyBuffer_Release(buffer);
1533 PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required.");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001535 }
1536 n = buffer->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 if (n % itemsize != 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001538 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 PyErr_SetString(PyExc_ValueError,
1540 "string length not a multiple of item size");
1541 return NULL;
1542 }
1543 n = n / itemsize;
1544 if (n > 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001545 Py_ssize_t old_size = Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 if ((n > PY_SSIZE_T_MAX - old_size) ||
1547 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001548 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 return PyErr_NoMemory();
1550 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001551 if (array_resize(self, old_size + n) == -1) {
1552 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001554 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001555 memcpy(self->ob_item + old_size * itemsize,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001556 buffer->buf, n * itemsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001558 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 Py_INCREF(Py_None);
1560 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001561}
1562
Brett Cannon1eb32c22014-10-10 16:26:45 -04001563/*[clinic input]
1564array.array.fromstring
1565
1566 buffer: Py_buffer(types='str bytes bytearray buffer')
1567 /
1568
1569Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).
1570
1571This method is deprecated. Use frombytes instead.
1572[clinic start generated code]*/
1573
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001574static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001575array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer)
1576/*[clinic end generated code: output=31c4baa779df84ce input=1302d94c97696b84]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001577{
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001578 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1579 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1580 return NULL;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001581 return frombytes(self, buffer);
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001582}
1583
Brett Cannon1eb32c22014-10-10 16:26:45 -04001584/*[clinic input]
1585array.array.frombytes
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001586
Brett Cannon1eb32c22014-10-10 16:26:45 -04001587 buffer: Py_buffer
1588 /
1589
1590Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).
1591[clinic start generated code]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001592
1593static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001594array_array_frombytes_impl(arrayobject *self, Py_buffer *buffer)
1595/*[clinic end generated code: output=d9842c8f7510a516 input=2bbf2b53ebfcc988]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001596{
Brett Cannon1eb32c22014-10-10 16:26:45 -04001597 return frombytes(self, buffer);
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001598}
1599
Brett Cannon1eb32c22014-10-10 16:26:45 -04001600/*[clinic input]
1601array.array.tobytes
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001602
Brett Cannon1eb32c22014-10-10 16:26:45 -04001603Convert the array to an array of machine values and return the bytes representation.
1604[clinic start generated code]*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001605
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001606static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001607array_array_tobytes_impl(arrayobject *self)
1608/*[clinic end generated code: output=87318e4edcdc2bb6 input=90ee495f96de34f5]*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1611 return PyBytes_FromStringAndSize(self->ob_item,
1612 Py_SIZE(self) * self->ob_descr->itemsize);
1613 } else {
1614 return PyErr_NoMemory();
1615 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001616}
1617
Brett Cannon1eb32c22014-10-10 16:26:45 -04001618/*[clinic input]
1619array.array.tostring
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001620
Brett Cannon1eb32c22014-10-10 16:26:45 -04001621Convert the array to an array of machine values and return the bytes representation.
1622
1623This method is deprecated. Use tobytes instead.
1624[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001625
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001626static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001627array_array_tostring_impl(arrayobject *self)
1628/*[clinic end generated code: output=7d6bd92745a2c8f3 input=b6c0ddee7b30457e]*/
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001629{
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001630 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001631 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1632 return NULL;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001633 return array_array_tobytes_impl(self);
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001634}
1635
Brett Cannon1eb32c22014-10-10 16:26:45 -04001636/*[clinic input]
1637array.array.fromunicode
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001638
Brett Cannon1eb32c22014-10-10 16:26:45 -04001639 ustr: Py_UNICODE(length=True)
1640 /
1641
1642Extends this array with data from the unicode string ustr.
1643
1644The array must be a unicode type array; otherwise a ValueError is raised.
1645Use array.frombytes(ustr.encode(...)) to append Unicode data to an array of
1646some other type.
1647[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001648
Martin v. Löwis99866332002-03-01 10:27:01 +00001649static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001650array_array_fromunicode_impl(arrayobject *self, Py_UNICODE *ustr, Py_ssize_clean_t ustr_length)
1651/*[clinic end generated code: output=3b3f4f133bac725e input=56bcedb5ef70139f]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001652{
Victor Stinner62bb3942012-08-06 00:46:05 +02001653 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001654
Victor Stinner62bb3942012-08-06 00:46:05 +02001655 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001656 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 PyErr_SetString(PyExc_ValueError,
1658 "fromunicode() may only be called on "
1659 "unicode type arrays");
1660 return NULL;
1661 }
Brett Cannon1eb32c22014-10-10 16:26:45 -04001662 if (ustr_length > 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 Py_ssize_t old_size = Py_SIZE(self);
Brett Cannon1eb32c22014-10-10 16:26:45 -04001664 if (array_resize(self, old_size + ustr_length) == -1)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 return NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02001666 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
Brett Cannon1eb32c22014-10-10 16:26:45 -04001667 ustr, ustr_length * sizeof(Py_UNICODE));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001669
Brett Cannon1eb32c22014-10-10 16:26:45 -04001670 Py_RETURN_NONE;
Martin v. Löwis99866332002-03-01 10:27:01 +00001671}
1672
Brett Cannon1eb32c22014-10-10 16:26:45 -04001673/*[clinic input]
1674array.array.tounicode
Martin v. Löwis99866332002-03-01 10:27:01 +00001675
Brett Cannon1eb32c22014-10-10 16:26:45 -04001676Extends this array with data from the unicode string ustr.
1677
1678Convert the array to a unicode string. The array must be a unicode type array;
1679otherwise a ValueError is raised. Use array.tobytes().decode() to obtain a
1680unicode string from an array of some other type.
1681[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001682
1683static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001684array_array_tounicode_impl(arrayobject *self)
1685/*[clinic end generated code: output=08e442378336e1ef input=127242eebe70b66d]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001686{
Victor Stinner62bb3942012-08-06 00:46:05 +02001687 char typecode;
1688 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001689 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001690 PyErr_SetString(PyExc_ValueError,
1691 "tounicode() may only be called on unicode type arrays");
1692 return NULL;
1693 }
Victor Stinner62bb3942012-08-06 00:46:05 +02001694 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001695}
1696
Brett Cannon1eb32c22014-10-10 16:26:45 -04001697/*[clinic input]
1698array.array.__sizeof__
Martin v. Löwis99866332002-03-01 10:27:01 +00001699
Brett Cannon1eb32c22014-10-10 16:26:45 -04001700Size of the array in memory, in bytes.
1701[clinic start generated code]*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001702
Meador Inge03b4d502012-08-10 22:35:45 -05001703static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001704array_array___sizeof___impl(arrayobject *self)
1705/*[clinic end generated code: output=d8e1c61ebbe3eaed input=805586565bf2b3c6]*/
Meador Inge03b4d502012-08-10 22:35:45 -05001706{
1707 Py_ssize_t res;
1708 res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize;
1709 return PyLong_FromSsize_t(res);
1710}
1711
Martin v. Löwis99866332002-03-01 10:27:01 +00001712
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001713/*********************** Pickling support ************************/
1714
1715enum machine_format_code {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 UNKNOWN_FORMAT = -1,
1717 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
1718 * array type code cannot be interpreted. When this occurs, a list of
1719 * Python objects is used to represent the content of the array
1720 * instead of using the memory content of the array directly. In that
1721 * case, the array_reconstructor mechanism is bypassed completely, and
1722 * the standard array constructor is used instead.
1723 *
1724 * This is will most likely occur when the machine doesn't use IEEE
1725 * floating-point numbers.
1726 */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 UNSIGNED_INT8 = 0,
1729 SIGNED_INT8 = 1,
1730 UNSIGNED_INT16_LE = 2,
1731 UNSIGNED_INT16_BE = 3,
1732 SIGNED_INT16_LE = 4,
1733 SIGNED_INT16_BE = 5,
1734 UNSIGNED_INT32_LE = 6,
1735 UNSIGNED_INT32_BE = 7,
1736 SIGNED_INT32_LE = 8,
1737 SIGNED_INT32_BE = 9,
1738 UNSIGNED_INT64_LE = 10,
1739 UNSIGNED_INT64_BE = 11,
1740 SIGNED_INT64_LE = 12,
1741 SIGNED_INT64_BE = 13,
1742 IEEE_754_FLOAT_LE = 14,
1743 IEEE_754_FLOAT_BE = 15,
1744 IEEE_754_DOUBLE_LE = 16,
1745 IEEE_754_DOUBLE_BE = 17,
1746 UTF16_LE = 18,
1747 UTF16_BE = 19,
1748 UTF32_LE = 20,
1749 UTF32_BE = 21
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001750};
1751#define MACHINE_FORMAT_CODE_MIN 0
1752#define MACHINE_FORMAT_CODE_MAX 21
1753
1754static const struct mformatdescr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 size_t size;
1756 int is_signed;
1757 int is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001758} mformat_descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1760 {1, 1, 0}, /* 1: SIGNED_INT8 */
1761 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1762 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1763 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1764 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1765 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1766 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1767 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1768 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1769 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1770 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1771 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1772 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1773 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1774 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1775 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1776 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1777 {4, 0, 0}, /* 18: UTF16_LE */
1778 {4, 0, 1}, /* 19: UTF16_BE */
1779 {8, 0, 0}, /* 20: UTF32_LE */
1780 {8, 0, 1} /* 21: UTF32_BE */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001781};
1782
1783
1784/*
1785 * Internal: This function is used to find the machine format of a given
1786 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1787 * be found.
1788 */
1789static enum machine_format_code
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001790typecode_to_mformat_code(char typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001791{
Christian Heimes743e0cd2012-10-17 23:52:17 +02001792 const int is_big_endian = PY_BIG_ENDIAN;
1793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 size_t intsize;
1795 int is_signed;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001797 switch (typecode) {
1798 case 'b':
1799 return SIGNED_INT8;
1800 case 'B':
1801 return UNSIGNED_INT8;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 case 'u':
Victor Stinner62bb3942012-08-06 00:46:05 +02001804 if (sizeof(Py_UNICODE) == 2) {
1805 return UTF16_LE + is_big_endian;
1806 }
1807 if (sizeof(Py_UNICODE) == 4) {
1808 return UTF32_LE + is_big_endian;
1809 }
1810 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 case 'f':
1813 if (sizeof(float) == 4) {
1814 const float y = 16711938.0;
1815 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1816 return IEEE_754_FLOAT_BE;
1817 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1818 return IEEE_754_FLOAT_LE;
1819 }
1820 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 case 'd':
1823 if (sizeof(double) == 8) {
1824 const double x = 9006104071832581.0;
1825 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1826 return IEEE_754_DOUBLE_BE;
1827 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1828 return IEEE_754_DOUBLE_LE;
1829 }
1830 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 /* Integers */
1833 case 'h':
1834 intsize = sizeof(short);
1835 is_signed = 1;
1836 break;
1837 case 'H':
1838 intsize = sizeof(short);
1839 is_signed = 0;
1840 break;
1841 case 'i':
1842 intsize = sizeof(int);
1843 is_signed = 1;
1844 break;
1845 case 'I':
1846 intsize = sizeof(int);
1847 is_signed = 0;
1848 break;
1849 case 'l':
1850 intsize = sizeof(long);
1851 is_signed = 1;
1852 break;
1853 case 'L':
1854 intsize = sizeof(long);
1855 is_signed = 0;
1856 break;
Meador Inge1c9f0c92011-09-20 19:55:51 -05001857#if HAVE_LONG_LONG
1858 case 'q':
1859 intsize = sizeof(PY_LONG_LONG);
1860 is_signed = 1;
1861 break;
1862 case 'Q':
1863 intsize = sizeof(PY_LONG_LONG);
1864 is_signed = 0;
1865 break;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 default:
1868 return UNKNOWN_FORMAT;
1869 }
1870 switch (intsize) {
1871 case 2:
1872 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1873 case 4:
1874 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1875 case 8:
1876 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1877 default:
1878 return UNKNOWN_FORMAT;
1879 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001880}
1881
1882/* Forward declaration. */
1883static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1884
1885/*
1886 * Internal: This function wraps the array constructor--i.e., array_new()--to
1887 * allow the creation of array objects from C code without having to deal
1888 * directly the tuple argument of array_new(). The typecode argument is a
1889 * Unicode character value, like 'i' or 'f' for example, representing an array
1890 * type code. The items argument is a bytes or a list object from which
1891 * contains the initial value of the array.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 *
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001893 * On success, this functions returns the array object created. Otherwise,
1894 * NULL is returned to indicate a failure.
1895 */
1896static PyObject *
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001897make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 PyObject *new_args;
1900 PyObject *array_obj;
1901 PyObject *typecode_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 assert(arraytype != NULL);
1904 assert(items != NULL);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001905
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001906 typecode_obj = PyUnicode_FromOrdinal(typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 if (typecode_obj == NULL)
1908 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 new_args = PyTuple_New(2);
1911 if (new_args == NULL)
1912 return NULL;
1913 Py_INCREF(items);
1914 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1915 PyTuple_SET_ITEM(new_args, 1, items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 array_obj = array_new(arraytype, new_args, NULL);
1918 Py_DECREF(new_args);
1919 if (array_obj == NULL)
1920 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 return array_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001923}
1924
1925/*
1926 * This functions is a special constructor used when unpickling an array. It
1927 * provides a portable way to rebuild an array from its memory representation.
1928 */
Brett Cannon1eb32c22014-10-10 16:26:45 -04001929/*[clinic input]
1930array._array_reconstructor
1931
1932 arraytype: object(type="PyTypeObject *")
1933 typecode: int(types='str')
1934 mformat_code: int(type="enum machine_format_code")
1935 items: object
1936 /
1937
1938Internal. Used for pickling support.
1939[clinic start generated code]*/
1940
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001941static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04001942array__array_reconstructor_impl(PyModuleDef *module, PyTypeObject *arraytype, int typecode, int mformat_code, PyObject *items)
1943/*[clinic end generated code: output=a0a4ab61c2fbc17a input=450d59a5373c4eea]*/
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001945 PyObject *converted_items;
1946 PyObject *result;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 struct arraydescr *descr;
Brett Cannon1eb32c22014-10-10 16:26:45 -04001948 enum machine_format_code mformat_code_enum = mformat_code;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 if (!PyType_Check(arraytype)) {
1951 PyErr_Format(PyExc_TypeError,
1952 "first argument must a type object, not %.200s",
1953 Py_TYPE(arraytype)->tp_name);
1954 return NULL;
1955 }
1956 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1957 PyErr_Format(PyExc_TypeError,
1958 "%.200s is not a subtype of %.200s",
1959 arraytype->tp_name, Arraytype.tp_name);
1960 return NULL;
1961 }
1962 for (descr = descriptors; descr->typecode != '\0'; descr++) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001963 if ((int)descr->typecode == typecode)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 break;
1965 }
1966 if (descr->typecode == '\0') {
1967 PyErr_SetString(PyExc_ValueError,
1968 "second argument must be a valid type code");
1969 return NULL;
1970 }
Brett Cannon1eb32c22014-10-10 16:26:45 -04001971 if (mformat_code_enum < MACHINE_FORMAT_CODE_MIN ||
1972 mformat_code_enum > MACHINE_FORMAT_CODE_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 PyErr_SetString(PyExc_ValueError,
1974 "third argument must be a valid machine format code.");
1975 return NULL;
1976 }
1977 if (!PyBytes_Check(items)) {
1978 PyErr_Format(PyExc_TypeError,
1979 "fourth argument should be bytes, not %.200s",
1980 Py_TYPE(items)->tp_name);
1981 return NULL;
1982 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 /* Fast path: No decoding has to be done. */
Brett Cannon1eb32c22014-10-10 16:26:45 -04001985 if (mformat_code_enum == typecode_to_mformat_code((char)typecode) ||
1986 mformat_code_enum == UNKNOWN_FORMAT) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001987 return make_array(arraytype, (char)typecode, items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 /* Slow path: Decode the byte string according to the given machine
1991 * format code. This occurs when the computer unpickling the array
1992 * object is architecturally different from the one that pickled the
1993 * array.
1994 */
Brett Cannon1eb32c22014-10-10 16:26:45 -04001995 if (Py_SIZE(items) % mformat_descriptors[mformat_code_enum].size != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 PyErr_SetString(PyExc_ValueError,
1997 "string length not a multiple of item size");
1998 return NULL;
1999 }
Brett Cannon1eb32c22014-10-10 16:26:45 -04002000 switch (mformat_code_enum) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 case IEEE_754_FLOAT_LE:
2002 case IEEE_754_FLOAT_BE: {
2003 int i;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002004 int le = (mformat_code_enum == IEEE_754_FLOAT_LE) ? 1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 Py_ssize_t itemcount = Py_SIZE(items) / 4;
2006 const unsigned char *memstr =
2007 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002009 converted_items = PyList_New(itemcount);
2010 if (converted_items == NULL)
2011 return NULL;
2012 for (i = 0; i < itemcount; i++) {
2013 PyObject *pyfloat = PyFloat_FromDouble(
2014 _PyFloat_Unpack4(&memstr[i * 4], le));
2015 if (pyfloat == NULL) {
2016 Py_DECREF(converted_items);
2017 return NULL;
2018 }
2019 PyList_SET_ITEM(converted_items, i, pyfloat);
2020 }
2021 break;
2022 }
2023 case IEEE_754_DOUBLE_LE:
2024 case IEEE_754_DOUBLE_BE: {
2025 int i;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002026 int le = (mformat_code_enum == IEEE_754_DOUBLE_LE) ? 1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 Py_ssize_t itemcount = Py_SIZE(items) / 8;
2028 const unsigned char *memstr =
2029 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002031 converted_items = PyList_New(itemcount);
2032 if (converted_items == NULL)
2033 return NULL;
2034 for (i = 0; i < itemcount; i++) {
2035 PyObject *pyfloat = PyFloat_FromDouble(
2036 _PyFloat_Unpack8(&memstr[i * 8], le));
2037 if (pyfloat == NULL) {
2038 Py_DECREF(converted_items);
2039 return NULL;
2040 }
2041 PyList_SET_ITEM(converted_items, i, pyfloat);
2042 }
2043 break;
2044 }
2045 case UTF16_LE:
2046 case UTF16_BE: {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002047 int byteorder = (mformat_code_enum == UTF16_LE) ? -1 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 converted_items = PyUnicode_DecodeUTF16(
2049 PyBytes_AS_STRING(items), Py_SIZE(items),
2050 "strict", &byteorder);
2051 if (converted_items == NULL)
2052 return NULL;
2053 break;
2054 }
2055 case UTF32_LE:
2056 case UTF32_BE: {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002057 int byteorder = (mformat_code_enum == UTF32_LE) ? -1 : 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 converted_items = PyUnicode_DecodeUTF32(
2059 PyBytes_AS_STRING(items), Py_SIZE(items),
2060 "strict", &byteorder);
2061 if (converted_items == NULL)
2062 return NULL;
2063 break;
2064 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 case UNSIGNED_INT8:
2067 case SIGNED_INT8:
2068 case UNSIGNED_INT16_LE:
2069 case UNSIGNED_INT16_BE:
2070 case SIGNED_INT16_LE:
2071 case SIGNED_INT16_BE:
2072 case UNSIGNED_INT32_LE:
2073 case UNSIGNED_INT32_BE:
2074 case SIGNED_INT32_LE:
2075 case SIGNED_INT32_BE:
2076 case UNSIGNED_INT64_LE:
2077 case UNSIGNED_INT64_BE:
2078 case SIGNED_INT64_LE:
2079 case SIGNED_INT64_BE: {
2080 int i;
2081 const struct mformatdescr mf_descr =
Brett Cannon1eb32c22014-10-10 16:26:45 -04002082 mformat_descriptors[mformat_code_enum];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002083 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
2084 const unsigned char *memstr =
2085 (unsigned char *)PyBytes_AS_STRING(items);
2086 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002088 /* If possible, try to pack array's items using a data type
2089 * that fits better. This may result in an array with narrower
2090 * or wider elements.
2091 *
2092 * For example, if a 32-bit machine pickles a L-code array of
2093 * unsigned longs, then the array will be unpickled by 64-bit
2094 * machine as an I-code array of unsigned ints.
2095 *
2096 * XXX: Is it possible to write a unit test for this?
2097 */
2098 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2099 if (descr->is_integer_type &&
Victor Stinner706768c2014-08-16 01:03:39 +02002100 (size_t)descr->itemsize == mf_descr.size &&
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 descr->is_signed == mf_descr.is_signed)
2102 typecode = descr->typecode;
2103 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002105 converted_items = PyList_New(itemcount);
2106 if (converted_items == NULL)
2107 return NULL;
2108 for (i = 0; i < itemcount; i++) {
2109 PyObject *pylong;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002111 pylong = _PyLong_FromByteArray(
2112 &memstr[i * mf_descr.size],
2113 mf_descr.size,
2114 !mf_descr.is_big_endian,
2115 mf_descr.is_signed);
2116 if (pylong == NULL) {
2117 Py_DECREF(converted_items);
2118 return NULL;
2119 }
2120 PyList_SET_ITEM(converted_items, i, pylong);
2121 }
2122 break;
2123 }
2124 case UNKNOWN_FORMAT:
2125 /* Impossible, but needed to shut up GCC about the unhandled
2126 * enumeration value.
2127 */
2128 default:
2129 PyErr_BadArgument();
2130 return NULL;
2131 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002132
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002133 result = make_array(arraytype, (char)typecode, converted_items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 Py_DECREF(converted_items);
2135 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002136}
2137
Brett Cannon1eb32c22014-10-10 16:26:45 -04002138/*[clinic input]
2139array.array.__reduce_ex__
2140
2141 value: object
2142 /
2143
2144Return state information for pickling.
2145[clinic start generated code]*/
2146
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002147static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04002148array_array___reduce_ex__(arrayobject *self, PyObject *value)
2149/*[clinic end generated code: output=051e0a6175d0eddb input=c36c3f85de7df6cd]*/
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 PyObject *dict;
2152 PyObject *result;
2153 PyObject *array_str;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002154 int typecode = self->ob_descr->typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002155 int mformat_code;
2156 static PyObject *array_reconstructor = NULL;
2157 long protocol;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002158 _Py_IDENTIFIER(_array_reconstructor);
2159 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 if (array_reconstructor == NULL) {
2162 PyObject *array_module = PyImport_ImportModule("array");
2163 if (array_module == NULL)
2164 return NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002165 array_reconstructor = _PyObject_GetAttrId(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 array_module,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002167 &PyId__array_reconstructor);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 Py_DECREF(array_module);
2169 if (array_reconstructor == NULL)
2170 return NULL;
2171 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 if (!PyLong_Check(value)) {
2174 PyErr_SetString(PyExc_TypeError,
2175 "__reduce_ex__ argument should an integer");
2176 return NULL;
2177 }
2178 protocol = PyLong_AsLong(value);
2179 if (protocol == -1 && PyErr_Occurred())
2180 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002181
Brett Cannon1eb32c22014-10-10 16:26:45 -04002182 dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 if (dict == NULL) {
2184 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2185 return NULL;
2186 PyErr_Clear();
2187 dict = Py_None;
2188 Py_INCREF(dict);
2189 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002191 mformat_code = typecode_to_mformat_code(typecode);
2192 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2193 /* Convert the array to a list if we got something weird
2194 * (e.g., non-IEEE floats), or we are pickling the array using
2195 * a Python 2.x compatible protocol.
2196 *
2197 * It is necessary to use a list representation for Python 2.x
2198 * compatible pickle protocol, since Python 2's str objects
2199 * are unpickled as unicode by Python 3. Thus it is impossible
2200 * to make arrays unpicklable by Python 3 by using their memory
2201 * representation, unless we resort to ugly hacks such as
2202 * coercing unicode objects to bytes in array_reconstructor.
2203 */
2204 PyObject *list;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002205 list = array_array_tolist_impl(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 if (list == NULL) {
2207 Py_DECREF(dict);
2208 return NULL;
2209 }
2210 result = Py_BuildValue(
Brett Cannon1eb32c22014-10-10 16:26:45 -04002211 "O(CO)O", Py_TYPE(self), typecode, list, dict);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002212 Py_DECREF(list);
2213 Py_DECREF(dict);
2214 return result;
2215 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002216
Brett Cannon1eb32c22014-10-10 16:26:45 -04002217 array_str = array_array_tobytes_impl(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 if (array_str == NULL) {
2219 Py_DECREF(dict);
2220 return NULL;
2221 }
2222 result = Py_BuildValue(
Brett Cannon1eb32c22014-10-10 16:26:45 -04002223 "O(OCiN)O", array_reconstructor, Py_TYPE(self), typecode,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 mformat_code, array_str, dict);
2225 Py_DECREF(dict);
2226 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002227}
2228
Martin v. Löwis99866332002-03-01 10:27:01 +00002229static PyObject *
2230array_get_typecode(arrayobject *a, void *closure)
2231{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002232 char typecode = a->ob_descr->typecode;
2233 return PyUnicode_FromOrdinal(typecode);
Martin v. Löwis99866332002-03-01 10:27:01 +00002234}
2235
2236static PyObject *
2237array_get_itemsize(arrayobject *a, void *closure)
2238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00002240}
2241
2242static PyGetSetDef array_getsets [] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 {"typecode", (getter) array_get_typecode, NULL,
2244 "the typecode character used to create the array"},
2245 {"itemsize", (getter) array_get_itemsize, NULL,
2246 "the size, in bytes, of one array item"},
2247 {NULL}
Martin v. Löwis99866332002-03-01 10:27:01 +00002248};
2249
Martin v. Löwis59683e82008-06-13 07:50:45 +00002250static PyMethodDef array_methods[] = {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002251 ARRAY_ARRAY_APPEND_METHODDEF
2252 ARRAY_ARRAY_BUFFER_INFO_METHODDEF
2253 ARRAY_ARRAY_BYTESWAP_METHODDEF
2254 ARRAY_ARRAY___COPY___METHODDEF
2255 ARRAY_ARRAY_COUNT_METHODDEF
2256 ARRAY_ARRAY___DEEPCOPY___METHODDEF
2257 ARRAY_ARRAY_EXTEND_METHODDEF
2258 ARRAY_ARRAY_FROMFILE_METHODDEF
2259 ARRAY_ARRAY_FROMLIST_METHODDEF
2260 ARRAY_ARRAY_FROMSTRING_METHODDEF
2261 ARRAY_ARRAY_FROMBYTES_METHODDEF
2262 ARRAY_ARRAY_FROMUNICODE_METHODDEF
2263 ARRAY_ARRAY_INDEX_METHODDEF
2264 ARRAY_ARRAY_INSERT_METHODDEF
2265 ARRAY_ARRAY_POP_METHODDEF
2266 ARRAY_ARRAY___REDUCE_EX___METHODDEF
2267 ARRAY_ARRAY_REMOVE_METHODDEF
2268 ARRAY_ARRAY_REVERSE_METHODDEF
2269 ARRAY_ARRAY_TOFILE_METHODDEF
2270 ARRAY_ARRAY_TOLIST_METHODDEF
2271 ARRAY_ARRAY_TOSTRING_METHODDEF
2272 ARRAY_ARRAY_TOBYTES_METHODDEF
2273 ARRAY_ARRAY_TOUNICODE_METHODDEF
2274 ARRAY_ARRAY___SIZEOF___METHODDEF
2275 {NULL, NULL} /* sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +00002276};
2277
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002278static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002279array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002280{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002281 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 PyObject *s, *v = NULL;
2283 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 len = Py_SIZE(a);
2286 typecode = a->ob_descr->typecode;
2287 if (len == 0) {
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002288 return PyUnicode_FromFormat("array('%c')", (int)typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002289 }
Gregory P. Smith9504b132012-12-10 20:20:20 -08002290 if (typecode == 'u') {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002291 v = array_array_tounicode_impl(a);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002292 } else {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002293 v = array_array_tolist_impl(a);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002294 }
Victor Stinner29ec5952013-02-26 00:27:38 +01002295 if (v == NULL)
2296 return NULL;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002297
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002298 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 Py_DECREF(v);
2300 return s;
Guido van Rossum778983b1993-02-19 15:55:02 +00002301}
2302
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002303static PyObject*
2304array_subscr(arrayobject* self, PyObject* item)
2305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 if (PyIndex_Check(item)) {
2307 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2308 if (i==-1 && PyErr_Occurred()) {
2309 return NULL;
2310 }
2311 if (i < 0)
2312 i += Py_SIZE(self);
2313 return array_item(self, i);
2314 }
2315 else if (PySlice_Check(item)) {
2316 Py_ssize_t start, stop, step, slicelength, cur, i;
2317 PyObject* result;
2318 arrayobject* ar;
2319 int itemsize = self->ob_descr->itemsize;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002320
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002321 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 &start, &stop, &step, &slicelength) < 0) {
2323 return NULL;
2324 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 if (slicelength <= 0) {
2327 return newarrayobject(&Arraytype, 0, self->ob_descr);
2328 }
2329 else if (step == 1) {
2330 PyObject *result = newarrayobject(&Arraytype,
2331 slicelength, self->ob_descr);
2332 if (result == NULL)
2333 return NULL;
2334 memcpy(((arrayobject *)result)->ob_item,
2335 self->ob_item + start * itemsize,
2336 slicelength * itemsize);
2337 return result;
2338 }
2339 else {
2340 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2341 if (!result) return NULL;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 ar = (arrayobject*)result;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 for (cur = start, i = 0; i < slicelength;
2346 cur += step, i++) {
2347 memcpy(ar->ob_item + i*itemsize,
2348 self->ob_item + cur*itemsize,
2349 itemsize);
2350 }
2351
2352 return result;
2353 }
2354 }
2355 else {
2356 PyErr_SetString(PyExc_TypeError,
2357 "array indices must be integers");
2358 return NULL;
2359 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002360}
2361
2362static int
2363array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2364{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 Py_ssize_t start, stop, step, slicelength, needed;
2366 arrayobject* other;
2367 int itemsize;
Thomas Woutersed03b412007-08-28 21:37:11 +00002368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002369 if (PyIndex_Check(item)) {
2370 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (i == -1 && PyErr_Occurred())
2373 return -1;
2374 if (i < 0)
2375 i += Py_SIZE(self);
2376 if (i < 0 || i >= Py_SIZE(self)) {
2377 PyErr_SetString(PyExc_IndexError,
2378 "array assignment index out of range");
2379 return -1;
2380 }
2381 if (value == NULL) {
2382 /* Fall through to slice assignment */
2383 start = i;
2384 stop = i + 1;
2385 step = 1;
2386 slicelength = 1;
2387 }
2388 else
2389 return (*self->ob_descr->setitem)(self, i, value);
2390 }
2391 else if (PySlice_Check(item)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002392 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 Py_SIZE(self), &start, &stop,
2394 &step, &slicelength) < 0) {
2395 return -1;
2396 }
2397 }
2398 else {
2399 PyErr_SetString(PyExc_TypeError,
2400 "array indices must be integer");
2401 return -1;
2402 }
2403 if (value == NULL) {
2404 other = NULL;
2405 needed = 0;
2406 }
2407 else if (array_Check(value)) {
2408 other = (arrayobject *)value;
2409 needed = Py_SIZE(other);
2410 if (self == other) {
2411 /* Special case "self[i:j] = self" -- copy self first */
2412 int ret;
2413 value = array_slice(other, 0, needed);
2414 if (value == NULL)
2415 return -1;
2416 ret = array_ass_subscr(self, item, value);
2417 Py_DECREF(value);
2418 return ret;
2419 }
2420 if (other->ob_descr != self->ob_descr) {
2421 PyErr_BadArgument();
2422 return -1;
2423 }
2424 }
2425 else {
2426 PyErr_Format(PyExc_TypeError,
2427 "can only assign array (not \"%.200s\") to array slice",
2428 Py_TYPE(value)->tp_name);
2429 return -1;
2430 }
2431 itemsize = self->ob_descr->itemsize;
2432 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2433 if ((step > 0 && stop < start) ||
2434 (step < 0 && stop > start))
2435 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 /* Issue #4509: If the array has exported buffers and the slice
2438 assignment would change the size of the array, fail early to make
2439 sure we don't modify it. */
2440 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2441 PyErr_SetString(PyExc_BufferError,
2442 "cannot resize an array that is exporting buffers");
2443 return -1;
2444 }
Mark Dickinsonbc099642010-01-29 17:27:24 +00002445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002446 if (step == 1) {
2447 if (slicelength > needed) {
2448 memmove(self->ob_item + (start + needed) * itemsize,
2449 self->ob_item + stop * itemsize,
2450 (Py_SIZE(self) - stop) * itemsize);
2451 if (array_resize(self, Py_SIZE(self) +
2452 needed - slicelength) < 0)
2453 return -1;
2454 }
2455 else if (slicelength < needed) {
2456 if (array_resize(self, Py_SIZE(self) +
2457 needed - slicelength) < 0)
2458 return -1;
2459 memmove(self->ob_item + (start + needed) * itemsize,
2460 self->ob_item + stop * itemsize,
2461 (Py_SIZE(self) - start - needed) * itemsize);
2462 }
2463 if (needed > 0)
2464 memcpy(self->ob_item + start * itemsize,
2465 other->ob_item, needed * itemsize);
2466 return 0;
2467 }
2468 else if (needed == 0) {
2469 /* Delete slice */
2470 size_t cur;
2471 Py_ssize_t i;
Thomas Woutersed03b412007-08-28 21:37:11 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (step < 0) {
2474 stop = start + 1;
2475 start = stop + step * (slicelength - 1) - 1;
2476 step = -step;
2477 }
2478 for (cur = start, i = 0; i < slicelength;
2479 cur += step, i++) {
2480 Py_ssize_t lim = step - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 if (cur + step >= (size_t)Py_SIZE(self))
2483 lim = Py_SIZE(self) - cur - 1;
2484 memmove(self->ob_item + (cur - i) * itemsize,
2485 self->ob_item + (cur + 1) * itemsize,
2486 lim * itemsize);
2487 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002488 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 if (cur < (size_t)Py_SIZE(self)) {
2490 memmove(self->ob_item + (cur-slicelength) * itemsize,
2491 self->ob_item + cur * itemsize,
2492 (Py_SIZE(self) - cur) * itemsize);
2493 }
2494 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2495 return -1;
2496 return 0;
2497 }
2498 else {
2499 Py_ssize_t cur, i;
2500
2501 if (needed != slicelength) {
2502 PyErr_Format(PyExc_ValueError,
2503 "attempt to assign array of size %zd "
2504 "to extended slice of size %zd",
2505 needed, slicelength);
2506 return -1;
2507 }
2508 for (cur = start, i = 0; i < slicelength;
2509 cur += step, i++) {
2510 memcpy(self->ob_item + cur * itemsize,
2511 other->ob_item + i * itemsize,
2512 itemsize);
2513 }
2514 return 0;
2515 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002516}
2517
2518static PyMappingMethods array_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 (lenfunc)array_length,
2520 (binaryfunc)array_subscr,
2521 (objobjargproc)array_ass_subscr
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002522};
2523
Guido van Rossumd8faa362007-04-27 19:54:29 +00002524static const void *emptybuf = "";
2525
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002526
2527static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002528array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 if (view==NULL) goto finish;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 view->buf = (void *)self->ob_item;
2533 view->obj = (PyObject*)self;
2534 Py_INCREF(self);
2535 if (view->buf == NULL)
2536 view->buf = (void *)emptybuf;
2537 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2538 view->readonly = 0;
2539 view->ndim = 1;
2540 view->itemsize = self->ob_descr->itemsize;
2541 view->suboffsets = NULL;
2542 view->shape = NULL;
2543 if ((flags & PyBUF_ND)==PyBUF_ND) {
2544 view->shape = &((Py_SIZE(self)));
2545 }
2546 view->strides = NULL;
2547 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2548 view->strides = &(view->itemsize);
2549 view->format = NULL;
2550 view->internal = NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02002551 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 view->format = self->ob_descr->formats;
Victor Stinner62bb3942012-08-06 00:46:05 +02002553#ifdef Py_UNICODE_WIDE
2554 if (self->ob_descr->typecode == 'u') {
2555 view->format = "w";
2556 }
2557#endif
2558 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002559
2560 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002561 self->ob_exports++;
2562 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002563}
2564
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002565static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002566array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002569}
2570
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002571static PySequenceMethods array_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002572 (lenfunc)array_length, /*sq_length*/
2573 (binaryfunc)array_concat, /*sq_concat*/
2574 (ssizeargfunc)array_repeat, /*sq_repeat*/
2575 (ssizeargfunc)array_item, /*sq_item*/
2576 0, /*sq_slice*/
2577 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2578 0, /*sq_ass_slice*/
2579 (objobjproc)array_contains, /*sq_contains*/
2580 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2581 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002582};
2583
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002584static PyBufferProcs array_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002585 (getbufferproc)array_buffer_getbuf,
2586 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002587};
2588
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002589static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002590array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002591{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 int c;
2593 PyObject *initial = NULL, *it = NULL;
2594 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00002595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002596 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
2597 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2600 return NULL;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002601
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08002602 if (initial && c != 'u') {
2603 if (PyUnicode_Check(initial)) {
2604 PyErr_Format(PyExc_TypeError, "cannot use a str to initialize "
2605 "an array with typecode '%c'", c);
2606 return NULL;
2607 }
2608 else if (array_Check(initial) &&
2609 ((arrayobject*)initial)->ob_descr->typecode == 'u') {
2610 PyErr_Format(PyExc_TypeError, "cannot use a unicode array to "
2611 "initialize an array with typecode '%c'", c);
2612 return NULL;
2613 }
2614 }
2615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 if (!(initial == NULL || PyList_Check(initial)
2617 || PyByteArray_Check(initial)
2618 || PyBytes_Check(initial)
2619 || PyTuple_Check(initial)
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002620 || ((c=='u') && PyUnicode_Check(initial))
2621 || (array_Check(initial)
2622 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 it = PyObject_GetIter(initial);
2624 if (it == NULL)
2625 return NULL;
2626 /* We set initial to NULL so that the subsequent code
2627 will create an empty array of the appropriate type
2628 and afterwards we can use array_iter_extend to populate
2629 the array.
2630 */
2631 initial = NULL;
2632 }
2633 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2634 if (descr->typecode == c) {
2635 PyObject *a;
2636 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002637
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002638 if (initial == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 len = 0;
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002640 else if (PyList_Check(initial))
2641 len = PyList_GET_SIZE(initial);
2642 else if (PyTuple_Check(initial) || array_Check(initial))
2643 len = Py_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 else
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002645 len = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +00002646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 a = newarrayobject(type, len, descr);
2648 if (a == NULL)
2649 return NULL;
2650
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002651 if (len > 0 && !array_Check(initial)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 Py_ssize_t i;
2653 for (i = 0; i < len; i++) {
2654 PyObject *v =
2655 PySequence_GetItem(initial, i);
2656 if (v == NULL) {
2657 Py_DECREF(a);
2658 return NULL;
2659 }
2660 if (setarrayitem(a, i, v) != 0) {
2661 Py_DECREF(v);
2662 Py_DECREF(a);
2663 return NULL;
2664 }
2665 Py_DECREF(v);
2666 }
2667 }
2668 else if (initial != NULL && (PyByteArray_Check(initial) ||
2669 PyBytes_Check(initial))) {
2670 PyObject *t_initial, *v;
2671 t_initial = PyTuple_Pack(1, initial);
2672 if (t_initial == NULL) {
2673 Py_DECREF(a);
2674 return NULL;
2675 }
Brett Cannon1eb32c22014-10-10 16:26:45 -04002676 v = array_array_frombytes((arrayobject *)a,
2677 t_initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002678 Py_DECREF(t_initial);
2679 if (v == NULL) {
2680 Py_DECREF(a);
2681 return NULL;
2682 }
2683 Py_DECREF(v);
2684 }
2685 else if (initial != NULL && PyUnicode_Check(initial)) {
Victor Stinner62bb3942012-08-06 00:46:05 +02002686 Py_UNICODE *ustr;
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002687 Py_ssize_t n;
Victor Stinner62bb3942012-08-06 00:46:05 +02002688
2689 ustr = PyUnicode_AsUnicode(initial);
2690 if (ustr == NULL) {
2691 PyErr_NoMemory();
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002692 Py_DECREF(a);
2693 return NULL;
2694 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002695
2696 n = PyUnicode_GET_DATA_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 if (n > 0) {
2698 arrayobject *self = (arrayobject *)a;
Victor Stinner62bb3942012-08-06 00:46:05 +02002699 char *item = self->ob_item;
2700 item = (char *)PyMem_Realloc(item, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 if (item == NULL) {
2702 PyErr_NoMemory();
2703 Py_DECREF(a);
2704 return NULL;
2705 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002706 self->ob_item = item;
2707 Py_SIZE(self) = n / sizeof(Py_UNICODE);
2708 memcpy(item, ustr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 self->allocated = Py_SIZE(self);
2710 }
2711 }
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002712 else if (initial != NULL && array_Check(initial)) {
2713 arrayobject *self = (arrayobject *)a;
2714 arrayobject *other = (arrayobject *)initial;
2715 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2716 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002717 if (it != NULL) {
2718 if (array_iter_extend((arrayobject *)a, it) == -1) {
2719 Py_DECREF(it);
2720 Py_DECREF(a);
2721 return NULL;
2722 }
2723 Py_DECREF(it);
2724 }
2725 return a;
2726 }
2727 }
2728 PyErr_SetString(PyExc_ValueError,
Meador Inge1c9f0c92011-09-20 19:55:51 -05002729#ifdef HAVE_LONG_LONG
2730 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
2731#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002732 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Meador Inge1c9f0c92011-09-20 19:55:51 -05002733#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002735}
2736
Guido van Rossum778983b1993-02-19 15:55:02 +00002737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002738PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002739"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002740an array of basic values: characters, integers, floating point\n\
2741numbers. Arrays are sequence types and behave very much like lists,\n\
Alexandre Vassalotti9730e332013-11-29 20:47:15 -08002742except that the type of objects stored in them is constrained.\n");
2743
2744PyDoc_STRVAR(arraytype_doc,
2745"array(typecode [, initializer]) -> array\n\
2746\n\
2747Return a new array whose items are restricted by typecode, and\n\
2748initialized from the optional initializer value, which must be a list,\n\
2749string or iterable over elements of the appropriate type.\n\
2750\n\
2751Arrays represent basic values and behave very much like lists, except\n\
2752the type of objects stored in them is constrained. The type is specified\n\
2753at object creation time by using a type code, which is a single character.\n\
2754The following type codes are defined:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002755\n\
2756 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002757 'b' signed integer 1 \n\
2758 'B' unsigned integer 1 \n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002759 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002760 'h' signed integer 2 \n\
2761 'H' unsigned integer 2 \n\
2762 'i' signed integer 2 \n\
2763 'I' unsigned integer 2 \n\
2764 'l' signed integer 4 \n\
2765 'L' unsigned integer 4 \n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002766 'q' signed integer 8 (see note) \n\
2767 'Q' unsigned integer 8 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002768 'f' floating point 4 \n\
2769 'd' floating point 8 \n\
2770\n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002771NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2772narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2773\n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002774NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
2775C compiler used to build Python supports 'long long', or, on Windows, \n\
2776'__int64'.\n\
2777\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002778Methods:\n\
2779\n\
2780append() -- append a new item to the end of the array\n\
2781buffer_info() -- return information giving the current memory info\n\
2782byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002783count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002784extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002785fromfile() -- read items from a file object\n\
2786fromlist() -- append items from the list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002787frombytes() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002788index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002789insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002790pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002791remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002792reverse() -- reverse the order of the items in the array\n\
2793tofile() -- write all items to a file object\n\
2794tolist() -- return the array converted to an ordinary list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002795tobytes() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002796\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002797Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002798\n\
2799typecode -- the typecode character used to create the array\n\
2800itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002801");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002802
Raymond Hettinger625812f2003-01-07 01:58:52 +00002803static PyObject *array_iter(arrayobject *ao);
2804
Tim Peters0c322792002-07-17 16:49:03 +00002805static PyTypeObject Arraytype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002806 PyVarObject_HEAD_INIT(NULL, 0)
2807 "array.array",
2808 sizeof(arrayobject),
2809 0,
2810 (destructor)array_dealloc, /* tp_dealloc */
2811 0, /* tp_print */
2812 0, /* tp_getattr */
2813 0, /* tp_setattr */
2814 0, /* tp_reserved */
2815 (reprfunc)array_repr, /* tp_repr */
2816 0, /* tp_as_number*/
2817 &array_as_sequence, /* tp_as_sequence*/
2818 &array_as_mapping, /* tp_as_mapping*/
2819 0, /* tp_hash */
2820 0, /* tp_call */
2821 0, /* tp_str */
2822 PyObject_GenericGetAttr, /* tp_getattro */
2823 0, /* tp_setattro */
2824 &array_as_buffer, /* tp_as_buffer*/
2825 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2826 arraytype_doc, /* tp_doc */
2827 0, /* tp_traverse */
2828 0, /* tp_clear */
2829 array_richcompare, /* tp_richcompare */
2830 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2831 (getiterfunc)array_iter, /* tp_iter */
2832 0, /* tp_iternext */
2833 array_methods, /* tp_methods */
2834 0, /* tp_members */
2835 array_getsets, /* tp_getset */
2836 0, /* tp_base */
2837 0, /* tp_dict */
2838 0, /* tp_descr_get */
2839 0, /* tp_descr_set */
2840 0, /* tp_dictoffset */
2841 0, /* tp_init */
2842 PyType_GenericAlloc, /* tp_alloc */
2843 array_new, /* tp_new */
2844 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002845};
2846
Raymond Hettinger625812f2003-01-07 01:58:52 +00002847
2848/*********************** Array Iterator **************************/
2849
Brett Cannon1eb32c22014-10-10 16:26:45 -04002850/*[clinic input]
2851class array.arrayiterator "arrayiterobject *" "&PyArrayIter_Type"
2852[clinic start generated code]*/
2853/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5aefd2d74d8c8e30]*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00002854
2855static PyObject *
2856array_iter(arrayobject *ao)
2857{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 arrayiterobject *it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 if (!array_Check(ao)) {
2861 PyErr_BadInternalCall();
2862 return NULL;
2863 }
Raymond Hettinger625812f2003-01-07 01:58:52 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2866 if (it == NULL)
2867 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002869 Py_INCREF(ao);
2870 it->ao = ao;
2871 it->index = 0;
2872 it->getitem = ao->ob_descr->getitem;
2873 PyObject_GC_Track(it);
2874 return (PyObject *)it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002875}
2876
2877static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002878arrayiter_next(arrayiterobject *it)
2879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 assert(PyArrayIter_Check(it));
2881 if (it->index < Py_SIZE(it->ao))
2882 return (*it->getitem)(it->ao, it->index++);
2883 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002884}
2885
2886static void
2887arrayiter_dealloc(arrayiterobject *it)
2888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 PyObject_GC_UnTrack(it);
2890 Py_XDECREF(it->ao);
2891 PyObject_GC_Del(it);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002892}
2893
2894static int
2895arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 Py_VISIT(it->ao);
2898 return 0;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002899}
2900
Brett Cannon1eb32c22014-10-10 16:26:45 -04002901/*[clinic input]
2902array.arrayiterator.__reduce__
2903
2904Return state information for pickling.
2905[clinic start generated code]*/
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002906
2907static PyObject *
Brett Cannon1eb32c22014-10-10 16:26:45 -04002908array_arrayiterator___reduce___impl(arrayiterobject *self)
2909/*[clinic end generated code: output=7898a52e8e66e016 input=a062ea1e9951417a]*/
2910{
2911 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
2912 self->ao, self->index);
2913}
2914
2915/*[clinic input]
2916array.arrayiterator.__setstate__
2917
2918 state: object
2919 /
2920
2921Set state information for unpickling.
2922[clinic start generated code]*/
2923
2924static PyObject *
2925array_arrayiterator___setstate__(arrayiterobject *self, PyObject *state)
2926/*[clinic end generated code: output=397da9904e443cbe input=f47d5ceda19e787b]*/
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002927{
2928 Py_ssize_t index = PyLong_AsSsize_t(state);
2929 if (index == -1 && PyErr_Occurred())
2930 return NULL;
2931 if (index < 0)
2932 index = 0;
Brett Cannon1eb32c22014-10-10 16:26:45 -04002933 else if (index > Py_SIZE(self->ao))
2934 index = Py_SIZE(self->ao); /* iterator exhausted */
2935 self->index = index;
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002936 Py_RETURN_NONE;
2937}
2938
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002939static PyMethodDef arrayiter_methods[] = {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002940 ARRAY_ARRAYITERATOR___REDUCE___METHODDEF
2941 ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002942 {NULL, NULL} /* sentinel */
2943};
2944
Raymond Hettinger625812f2003-01-07 01:58:52 +00002945static PyTypeObject PyArrayIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002946 PyVarObject_HEAD_INIT(NULL, 0)
2947 "arrayiterator", /* tp_name */
2948 sizeof(arrayiterobject), /* tp_basicsize */
2949 0, /* tp_itemsize */
2950 /* methods */
2951 (destructor)arrayiter_dealloc, /* tp_dealloc */
2952 0, /* tp_print */
2953 0, /* tp_getattr */
2954 0, /* tp_setattr */
2955 0, /* tp_reserved */
2956 0, /* tp_repr */
2957 0, /* tp_as_number */
2958 0, /* tp_as_sequence */
2959 0, /* tp_as_mapping */
2960 0, /* tp_hash */
2961 0, /* tp_call */
2962 0, /* tp_str */
2963 PyObject_GenericGetAttr, /* tp_getattro */
2964 0, /* tp_setattro */
2965 0, /* tp_as_buffer */
2966 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2967 0, /* tp_doc */
2968 (traverseproc)arrayiter_traverse, /* tp_traverse */
2969 0, /* tp_clear */
2970 0, /* tp_richcompare */
2971 0, /* tp_weaklistoffset */
2972 PyObject_SelfIter, /* tp_iter */
2973 (iternextfunc)arrayiter_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002974 arrayiter_methods, /* tp_methods */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002975};
2976
2977
2978/*********************** Install Module **************************/
2979
Martin v. Löwis99866332002-03-01 10:27:01 +00002980/* No functions in array module. */
2981static PyMethodDef a_methods[] = {
Brett Cannon1eb32c22014-10-10 16:26:45 -04002982 ARRAY__ARRAY_RECONSTRUCTOR_METHODDEF
Martin v. Löwis99866332002-03-01 10:27:01 +00002983 {NULL, NULL, 0, NULL} /* Sentinel */
2984};
2985
Martin v. Löwis1a214512008-06-11 05:26:20 +00002986static struct PyModuleDef arraymodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002987 PyModuleDef_HEAD_INIT,
2988 "array",
2989 module_doc,
2990 -1,
2991 a_methods,
2992 NULL,
2993 NULL,
2994 NULL,
2995 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002996};
2997
Martin v. Löwis99866332002-03-01 10:27:01 +00002998
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002999PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00003000PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00003001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 PyObject *m;
Georg Brandl4cb0de22011-09-28 21:49:49 +02003003 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003004 PyObject *typecodes;
3005 Py_ssize_t size = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003006 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00003007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 if (PyType_Ready(&Arraytype) < 0)
3009 return NULL;
3010 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
3011 m = PyModule_Create(&arraymodule);
3012 if (m == NULL)
3013 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00003014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 Py_INCREF((PyObject *)&Arraytype);
3016 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
3017 Py_INCREF((PyObject *)&Arraytype);
3018 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00003019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 for (descr=descriptors; descr->typecode != '\0'; descr++) {
3021 size++;
3022 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00003023
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003024 p = buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 for (descr = descriptors; descr->typecode != '\0'; descr++) {
3026 *p++ = (char)descr->typecode;
3027 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003028 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02003030 PyModule_AddObject(m, "typecodes", typecodes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031
3032 if (PyErr_Occurred()) {
3033 Py_DECREF(m);
3034 m = NULL;
3035 }
3036 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00003037}