blob: f5706ddc417e0be21e0499d654a65b30915ea07c [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +020025 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 int itemsize;
27 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
29 char *formats;
30 int is_integer_type;
31 int is_signed;
Guido van Rossum778983b1993-02-19 15:55:02 +000032};
33
34typedef struct arrayobject {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 PyObject_VAR_HEAD
36 char *ob_item;
37 Py_ssize_t allocated;
38 struct arraydescr *ob_descr;
39 PyObject *weakreflist; /* List of weak references */
40 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000041} arrayobject;
42
Jeremy Hylton938ace62002-07-17 16:30:39 +000043static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000044
Martin v. Löwis99866332002-03-01 10:27:01 +000045#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +000046#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000047
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000048static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000049array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000051 char *items;
52 size_t _new_size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
55 PyErr_SetString(PyExc_BufferError,
56 "cannot resize an array that is exporting buffers");
57 return -1;
58 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 /* Bypass realloc() when a previous overallocation is large enough
61 to accommodate the newsize. If the newsize is 16 smaller than the
62 current size, then proceed with the realloc() to shrink the array.
63 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 if (self->allocated >= newsize &&
66 Py_SIZE(self) < newsize + 16 &&
67 self->ob_item != NULL) {
68 Py_SIZE(self) = newsize;
69 return 0;
70 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000072 if (newsize == 0) {
73 PyMem_FREE(self->ob_item);
74 self->ob_item = NULL;
75 Py_SIZE(self) = 0;
76 self->allocated = 0;
77 return 0;
78 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 /* This over-allocates proportional to the array size, making room
81 * for additional growth. The over-allocation is mild, but is
82 * enough to give linear-time amortized behavior over a long
83 * sequence of appends() in the presence of a poorly-performing
84 * system realloc().
85 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
86 * Note, the pattern starts out the same as for lists but then
87 * grows at a smaller rate so that larger arrays only overallocate
88 * by about 1/16th -- this is done because arrays are presumed to be more
89 * memory critical.
90 */
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
93 items = self->ob_item;
94 /* XXX The following multiplication and division does not optimize away
95 like it does for lists since the size is not known at compile time */
96 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
97 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
98 else
99 items = NULL;
100 if (items == NULL) {
101 PyErr_NoMemory();
102 return -1;
103 }
104 self->ob_item = items;
105 Py_SIZE(self) = newsize;
106 self->allocated = _new_size;
107 return 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000108}
109
Tim Petersbb307342000-09-10 05:22:54 +0000110/****************************************************************************
111Get and Set functions for each type.
112A Get function takes an arrayobject* and an integer index, returning the
113array value at that index wrapped in an appropriate PyObject*.
114A Set function takes an arrayobject, integer index, and PyObject*; sets
115the array value at that index to the raw C data extracted from the PyObject*,
116and returns 0 if successful, else nonzero on failure (PyObject* not of an
117appropriate type or value).
118Note that the basic Get and Set functions do NOT check that the index is
119in bounds; that's the responsibility of the caller.
120****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000121
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000122static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000125 long x = ((char *)ap->ob_item)[i];
126 if (x >= 128)
127 x -= 256;
128 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000129}
130
131static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000132b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 short x;
135 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
136 must use the next size up that is signed ('h') and manually do
137 the overflow checking */
138 if (!PyArg_Parse(v, "h;array item must be integer", &x))
139 return -1;
140 else if (x < -128) {
141 PyErr_SetString(PyExc_OverflowError,
142 "signed char is less than minimum");
143 return -1;
144 }
145 else if (x > 127) {
146 PyErr_SetString(PyExc_OverflowError,
147 "signed char is greater than maximum");
148 return -1;
149 }
150 if (i >= 0)
151 ((char *)ap->ob_item)[i] = (char)x;
152 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000153}
154
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000155static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 long x = ((unsigned char *)ap->ob_item)[i];
159 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000160}
161
Fred Drake541dc3b2000-06-28 17:49:30 +0000162static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000163BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 unsigned char x;
166 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
167 if (!PyArg_Parse(v, "b;array item must be integer", &x))
168 return -1;
169 if (i >= 0)
170 ((char *)ap->ob_item)[i] = x;
171 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000172}
Guido van Rossum549ab711997-01-03 19:09:47 +0000173
Martin v. Löwis99866332002-03-01 10:27:01 +0000174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
Victor Stinner62bb3942012-08-06 00:46:05 +0200177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
Martin v. Löwis99866332002-03-01 10:27:01 +0000178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
Victor Stinner62bb3942012-08-06 00:46:05 +0200183 Py_UNICODE *p;
184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
Victor Stinner62bb3942012-08-06 00:46:05 +0200186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000187 return -1;
Victor Stinner62bb3942012-08-06 00:46:05 +0200188 if (len != 1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
191 return -1;
192 }
193 if (i >= 0)
Victor Stinner62bb3942012-08-06 00:46:05 +0200194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000196}
Martin v. Löwis99866332002-03-01 10:27:01 +0000197
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000205
Guido van Rossum778983b1993-02-19 15:55:02 +0000206static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000207h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 short x;
210 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
211 if (!PyArg_Parse(v, "h;array item must be integer", &x))
212 return -1;
213 if (i >= 0)
214 ((short *)ap->ob_item)[i] = x;
215 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000216}
217
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000218static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000219HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000222}
223
Fred Drake541dc3b2000-06-28 17:49:30 +0000224static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000225HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 int x;
228 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
229 must use the next size up and manually do the overflow checking */
230 if (!PyArg_Parse(v, "i;array item must be integer", &x))
231 return -1;
232 else if (x < 0) {
233 PyErr_SetString(PyExc_OverflowError,
234 "unsigned short is less than minimum");
235 return -1;
236 }
237 else if (x > USHRT_MAX) {
238 PyErr_SetString(PyExc_OverflowError,
239 "unsigned short is greater than maximum");
240 return -1;
241 }
242 if (i >= 0)
243 ((short *)ap->ob_item)[i] = (short)x;
244 return 0;
Fred Drake541dc3b2000-06-28 17:49:30 +0000245}
Guido van Rossum549ab711997-01-03 19:09:47 +0000246
247static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000248i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000249{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000251}
252
253static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 int x;
257 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
258 if (!PyArg_Parse(v, "i;array item must be integer", &x))
259 return -1;
260 if (i >= 0)
261 ((int *)ap->ob_item)[i] = x;
262 return 0;
Guido van Rossume77a7571993-11-03 15:01:26 +0000263}
264
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000265static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000266II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000267{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000268 return PyLong_FromUnsignedLong(
269 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000270}
271
272static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000273II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000274{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000275 unsigned long x;
276 if (PyLong_Check(v)) {
277 x = PyLong_AsUnsignedLong(v);
278 if (x == (unsigned long) -1 && PyErr_Occurred())
279 return -1;
280 }
281 else {
282 long y;
283 if (!PyArg_Parse(v, "l;array item must be integer", &y))
284 return -1;
285 if (y < 0) {
286 PyErr_SetString(PyExc_OverflowError,
287 "unsigned int is less than minimum");
288 return -1;
289 }
290 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 }
293 if (x > UINT_MAX) {
294 PyErr_SetString(PyExc_OverflowError,
295 "unsigned int is greater than maximum");
296 return -1;
297 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000299 if (i >= 0)
300 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
301 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000302}
303
304static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000305l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000308}
309
310static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000311l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 long x;
314 if (!PyArg_Parse(v, "l;array item must be integer", &x))
315 return -1;
316 if (i >= 0)
317 ((long *)ap->ob_item)[i] = x;
318 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000319}
320
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000321static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000322LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000323{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000325}
326
327static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000328LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 unsigned long x;
331 if (PyLong_Check(v)) {
332 x = PyLong_AsUnsignedLong(v);
333 if (x == (unsigned long) -1 && PyErr_Occurred())
334 return -1;
335 }
336 else {
337 long y;
338 if (!PyArg_Parse(v, "l;array item must be integer", &y))
339 return -1;
340 if (y < 0) {
341 PyErr_SetString(PyExc_OverflowError,
342 "unsigned long is less than minimum");
343 return -1;
344 }
345 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 }
348 if (x > ULONG_MAX) {
349 PyErr_SetString(PyExc_OverflowError,
350 "unsigned long is greater than maximum");
351 return -1;
352 }
Tim Petersbb307342000-09-10 05:22:54 +0000353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 if (i >= 0)
355 ((unsigned long *)ap->ob_item)[i] = x;
356 return 0;
Guido van Rossum549ab711997-01-03 19:09:47 +0000357}
358
Meador Inge1c9f0c92011-09-20 19:55:51 -0500359#ifdef HAVE_LONG_LONG
360
361static PyObject *
362q_getitem(arrayobject *ap, Py_ssize_t i)
363{
364 return PyLong_FromLongLong(((PY_LONG_LONG *)ap->ob_item)[i]);
365}
366
367static int
368q_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
369{
370 PY_LONG_LONG x;
371 if (!PyArg_Parse(v, "L;array item must be integer", &x))
372 return -1;
373 if (i >= 0)
374 ((PY_LONG_LONG *)ap->ob_item)[i] = x;
375 return 0;
376}
377
378static PyObject *
379QQ_getitem(arrayobject *ap, Py_ssize_t i)
380{
381 return PyLong_FromUnsignedLongLong(
382 ((unsigned PY_LONG_LONG *)ap->ob_item)[i]);
383}
384
385static int
386QQ_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
387{
388 unsigned PY_LONG_LONG x;
389 if (PyLong_Check(v)) {
390 x = PyLong_AsUnsignedLongLong(v);
391 if (x == (unsigned PY_LONG_LONG) -1 && PyErr_Occurred())
392 return -1;
393 }
394 else {
395 PY_LONG_LONG y;
396 if (!PyArg_Parse(v, "L;array item must be integer", &y))
397 return -1;
398 if (y < 0) {
399 PyErr_SetString(PyExc_OverflowError,
400 "unsigned long long is less than minimum");
401 return -1;
402 }
403 x = (unsigned PY_LONG_LONG)y;
404 }
405
406 if (i >= 0)
407 ((unsigned PY_LONG_LONG *)ap->ob_item)[i] = x;
408 return 0;
409}
410#endif
411
Guido van Rossum549ab711997-01-03 19:09:47 +0000412static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000413f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000414{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000415 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000416}
417
418static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000419f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 float x;
422 if (!PyArg_Parse(v, "f;array item must be float", &x))
423 return -1;
424 if (i >= 0)
425 ((float *)ap->ob_item)[i] = x;
426 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000427}
428
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000430d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000432 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000433}
434
435static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000436d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 double x;
439 if (!PyArg_Parse(v, "d;array item must be float", &x))
440 return -1;
441 if (i >= 0)
442 ((double *)ap->ob_item)[i] = x;
443 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000444}
445
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000446
Alexandre Vassalottiad077152009-07-15 17:49:23 +0000447/* Description of types.
448 *
449 * Don't forget to update typecode_to_mformat_code() if you add a new
450 * typecode.
451 */
Guido van Rossum234f9421993-06-17 12:35:49 +0000452static struct arraydescr descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 {'b', 1, b_getitem, b_setitem, "b", 1, 1},
454 {'B', 1, BB_getitem, BB_setitem, "B", 1, 0},
Victor Stinner62bb3942012-08-06 00:46:05 +0200455 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u", 0, 0},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 {'h', sizeof(short), h_getitem, h_setitem, "h", 1, 1},
457 {'H', sizeof(short), HH_getitem, HH_setitem, "H", 1, 0},
458 {'i', sizeof(int), i_getitem, i_setitem, "i", 1, 1},
459 {'I', sizeof(int), II_getitem, II_setitem, "I", 1, 0},
460 {'l', sizeof(long), l_getitem, l_setitem, "l", 1, 1},
461 {'L', sizeof(long), LL_getitem, LL_setitem, "L", 1, 0},
Meador Inge1c9f0c92011-09-20 19:55:51 -0500462#ifdef HAVE_LONG_LONG
463 {'q', sizeof(PY_LONG_LONG), q_getitem, q_setitem, "q", 1, 1},
464 {'Q', sizeof(PY_LONG_LONG), QQ_getitem, QQ_setitem, "Q", 1, 0},
465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 {'f', sizeof(float), f_getitem, f_setitem, "f", 0, 0},
467 {'d', sizeof(double), d_getitem, d_setitem, "d", 0, 0},
468 {'\0', 0, 0, 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000469};
Tim Petersbb307342000-09-10 05:22:54 +0000470
471/****************************************************************************
472Implementations of array object methods.
473****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000474
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000475static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000476newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 arrayobject *op;
479 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000481 if (size < 0) {
482 PyErr_BadInternalCall();
483 return NULL;
484 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 /* Check for overflow */
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100487 if (size > PY_SSIZE_T_MAX / descr->itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 return PyErr_NoMemory();
489 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +0100490 nbytes = size * descr->itemsize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 op = (arrayobject *) type->tp_alloc(type, 0);
492 if (op == NULL) {
493 return NULL;
494 }
495 op->ob_descr = descr;
496 op->allocated = size;
497 op->weakreflist = NULL;
498 Py_SIZE(op) = size;
499 if (size <= 0) {
500 op->ob_item = NULL;
501 }
502 else {
503 op->ob_item = PyMem_NEW(char, nbytes);
504 if (op->ob_item == NULL) {
505 Py_DECREF(op);
506 return PyErr_NoMemory();
507 }
508 }
509 op->ob_exports = 0;
510 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000511}
512
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000513static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000514getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000515{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 register arrayobject *ap;
517 assert(array_Check(op));
518 ap = (arrayobject *)op;
519 assert(i>=0 && i<Py_SIZE(ap));
520 return (*ap->ob_descr->getitem)(ap, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000521}
522
523static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000524ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000525{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 char *items;
527 Py_ssize_t n = Py_SIZE(self);
528 if (v == NULL) {
529 PyErr_BadInternalCall();
530 return -1;
531 }
532 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
533 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 if (array_resize(self, n+1) == -1)
536 return -1;
537 items = self->ob_item;
538 if (where < 0) {
539 where += n;
540 if (where < 0)
541 where = 0;
542 }
543 if (where > n)
544 where = n;
545 /* appends don't need to call memmove() */
546 if (where != n)
547 memmove(items + (where+1)*self->ob_descr->itemsize,
548 items + where*self->ob_descr->itemsize,
549 (n-where)*self->ob_descr->itemsize);
550 return (*self->ob_descr->setitem)(self, where, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000551}
552
Guido van Rossum778983b1993-02-19 15:55:02 +0000553/* Methods */
554
555static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000556array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (op->weakreflist != NULL)
559 PyObject_ClearWeakRefs((PyObject *) op);
560 if (op->ob_item != NULL)
561 PyMem_DEL(op->ob_item);
562 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000563}
564
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000565static PyObject *
566array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 arrayobject *va, *wa;
569 PyObject *vi = NULL;
570 PyObject *wi = NULL;
571 Py_ssize_t i, k;
572 PyObject *res;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000573
Brian Curtindfc80e32011-08-10 20:28:54 -0500574 if (!array_Check(v) || !array_Check(w))
575 Py_RETURN_NOTIMPLEMENTED;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 va = (arrayobject *)v;
578 wa = (arrayobject *)w;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
581 /* Shortcut: if the lengths differ, the arrays differ */
582 if (op == Py_EQ)
583 res = Py_False;
584 else
585 res = Py_True;
586 Py_INCREF(res);
587 return res;
588 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Search for the first index where items are different */
591 k = 1;
592 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
593 vi = getarrayitem(v, i);
594 wi = getarrayitem(w, i);
595 if (vi == NULL || wi == NULL) {
596 Py_XDECREF(vi);
597 Py_XDECREF(wi);
598 return NULL;
599 }
600 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
601 if (k == 0)
602 break; /* Keeping vi and wi alive! */
603 Py_DECREF(vi);
604 Py_DECREF(wi);
605 if (k < 0)
606 return NULL;
607 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (k) {
610 /* No more items to compare -- compare sizes */
611 Py_ssize_t vs = Py_SIZE(va);
612 Py_ssize_t ws = Py_SIZE(wa);
613 int cmp;
614 switch (op) {
615 case Py_LT: cmp = vs < ws; break;
616 case Py_LE: cmp = vs <= ws; break;
617 case Py_EQ: cmp = vs == ws; break;
618 case Py_NE: cmp = vs != ws; break;
619 case Py_GT: cmp = vs > ws; break;
620 case Py_GE: cmp = vs >= ws; break;
621 default: return NULL; /* cannot happen */
622 }
623 if (cmp)
624 res = Py_True;
625 else
626 res = Py_False;
627 Py_INCREF(res);
628 return res;
629 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* We have an item that differs. First, shortcuts for EQ/NE */
632 if (op == Py_EQ) {
633 Py_INCREF(Py_False);
634 res = Py_False;
635 }
636 else if (op == Py_NE) {
637 Py_INCREF(Py_True);
638 res = Py_True;
639 }
640 else {
641 /* Compare the final item again using the proper operator */
642 res = PyObject_RichCompare(vi, wi, op);
643 }
644 Py_DECREF(vi);
645 Py_DECREF(wi);
646 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000647}
648
Martin v. Löwis18e16552006-02-15 17:27:45 +0000649static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000650array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000653}
654
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000655static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000656array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 if (i < 0 || i >= Py_SIZE(a)) {
659 PyErr_SetString(PyExc_IndexError, "array index out of range");
660 return NULL;
661 }
662 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000663}
664
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000665static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000666array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000667{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 arrayobject *np;
669 if (ilow < 0)
670 ilow = 0;
671 else if (ilow > Py_SIZE(a))
672 ilow = Py_SIZE(a);
673 if (ihigh < 0)
674 ihigh = 0;
675 if (ihigh < ilow)
676 ihigh = ilow;
677 else if (ihigh > Py_SIZE(a))
678 ihigh = Py_SIZE(a);
679 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
680 if (np == NULL)
681 return NULL;
682 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
683 (ihigh-ilow) * a->ob_descr->itemsize);
684 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000685}
686
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000687static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000688array_copy(arrayobject *a, PyObject *unused)
689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000691}
692
693PyDoc_STRVAR(copy_doc,
694"copy(array)\n\
695\n\
696 Return a copy of the array.");
697
698static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000699array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000700{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 Py_ssize_t size;
702 arrayobject *np;
703 if (!array_Check(bb)) {
704 PyErr_Format(PyExc_TypeError,
705 "can only append array (not \"%.200s\") to array",
706 Py_TYPE(bb)->tp_name);
707 return NULL;
708 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000709#define b ((arrayobject *)bb)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 if (a->ob_descr != b->ob_descr) {
711 PyErr_BadArgument();
712 return NULL;
713 }
714 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
715 return PyErr_NoMemory();
716 }
717 size = Py_SIZE(a) + Py_SIZE(b);
718 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
719 if (np == NULL) {
720 return NULL;
721 }
722 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
723 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
724 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
725 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000726#undef b
727}
728
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000729static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000730array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 Py_ssize_t size;
733 arrayobject *np;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000734 Py_ssize_t oldbytes, newbytes;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 if (n < 0)
736 n = 0;
737 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
738 return PyErr_NoMemory();
739 }
740 size = Py_SIZE(a) * n;
741 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
742 if (np == NULL)
743 return NULL;
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000744 if (n == 0)
745 return (PyObject *)np;
746 oldbytes = Py_SIZE(a) * a->ob_descr->itemsize;
747 newbytes = oldbytes * n;
748 /* this follows the code in unicode_repeat */
749 if (oldbytes == 1) {
750 memset(np->ob_item, a->ob_item[0], newbytes);
751 } else {
752 Py_ssize_t done = oldbytes;
753 Py_MEMCPY(np->ob_item, a->ob_item, oldbytes);
754 while (done < newbytes) {
755 Py_ssize_t ncopy = (done <= newbytes-done) ? done : newbytes-done;
756 Py_MEMCPY(np->ob_item+done, np->ob_item, ncopy);
757 done += ncopy;
758 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000759 }
Georg Brandlc29cc6a2010-12-04 11:02:04 +0000760 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000761}
762
763static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000764array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 char *item;
767 Py_ssize_t n; /* Size of replacement array */
768 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000769#define b ((arrayobject *)v)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 if (v == NULL)
771 n = 0;
772 else if (array_Check(v)) {
773 n = Py_SIZE(b);
774 if (a == b) {
775 /* Special case "a[i:j] = a" -- copy b first */
776 int ret;
777 v = array_slice(b, 0, n);
778 if (!v)
779 return -1;
780 ret = array_ass_slice(a, ilow, ihigh, v);
781 Py_DECREF(v);
782 return ret;
783 }
784 if (b->ob_descr != a->ob_descr) {
785 PyErr_BadArgument();
786 return -1;
787 }
788 }
789 else {
790 PyErr_Format(PyExc_TypeError,
791 "can only assign array (not \"%.200s\") to array slice",
792 Py_TYPE(v)->tp_name);
793 return -1;
794 }
795 if (ilow < 0)
796 ilow = 0;
797 else if (ilow > Py_SIZE(a))
798 ilow = Py_SIZE(a);
799 if (ihigh < 0)
800 ihigh = 0;
801 if (ihigh < ilow)
802 ihigh = ilow;
803 else if (ihigh > Py_SIZE(a))
804 ihigh = Py_SIZE(a);
805 item = a->ob_item;
806 d = n - (ihigh-ilow);
807 /* Issue #4509: If the array has exported buffers and the slice
808 assignment would change the size of the array, fail early to make
809 sure we don't modify it. */
810 if (d != 0 && a->ob_exports > 0) {
811 PyErr_SetString(PyExc_BufferError,
812 "cannot resize an array that is exporting buffers");
813 return -1;
814 }
815 if (d < 0) { /* Delete -d items */
816 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
817 item + ihigh*a->ob_descr->itemsize,
818 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
819 if (array_resize(a, Py_SIZE(a) + d) == -1)
820 return -1;
821 }
822 else if (d > 0) { /* Insert d items */
823 if (array_resize(a, Py_SIZE(a) + d))
824 return -1;
825 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
826 item + ihigh*a->ob_descr->itemsize,
827 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
828 }
829 if (n > 0)
830 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
831 n*b->ob_descr->itemsize);
832 return 0;
Guido van Rossum778983b1993-02-19 15:55:02 +0000833#undef b
834}
835
836static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000837array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 if (i < 0 || i >= Py_SIZE(a)) {
840 PyErr_SetString(PyExc_IndexError,
841 "array assignment index out of range");
842 return -1;
843 }
844 if (v == NULL)
845 return array_ass_slice(a, i, i+1, v);
846 return (*a->ob_descr->setitem)(a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000847}
848
849static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000850setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 assert(array_Check(a));
853 return array_ass_item((arrayobject *)a, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000854}
855
Martin v. Löwis99866332002-03-01 10:27:01 +0000856static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000857array_iter_extend(arrayobject *self, PyObject *bb)
858{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 PyObject *it, *v;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 it = PyObject_GetIter(bb);
862 if (it == NULL)
863 return -1;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 while ((v = PyIter_Next(it)) != NULL) {
Mark Dickinson346f0af2010-08-06 09:36:57 +0000866 if (ins1(self, Py_SIZE(self), v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 Py_DECREF(v);
868 Py_DECREF(it);
869 return -1;
870 }
871 Py_DECREF(v);
872 }
873 Py_DECREF(it);
874 if (PyErr_Occurred())
875 return -1;
876 return 0;
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000877}
878
879static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000880array_do_extend(arrayobject *self, PyObject *bb)
881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 Py_ssize_t size, oldsize, bbsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 if (!array_Check(bb))
885 return array_iter_extend(self, bb);
886#define b ((arrayobject *)bb)
887 if (self->ob_descr != b->ob_descr) {
888 PyErr_SetString(PyExc_TypeError,
889 "can only extend with array of same kind");
890 return -1;
891 }
892 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
893 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
894 PyErr_NoMemory();
895 return -1;
896 }
897 oldsize = Py_SIZE(self);
898 /* Get the size of bb before resizing the array since bb could be self. */
899 bbsize = Py_SIZE(bb);
900 size = oldsize + Py_SIZE(b);
901 if (array_resize(self, size) == -1)
902 return -1;
903 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
904 b->ob_item, bbsize * b->ob_descr->itemsize);
905
906 return 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000907#undef b
908}
909
910static PyObject *
911array_inplace_concat(arrayobject *self, PyObject *bb)
912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 if (!array_Check(bb)) {
914 PyErr_Format(PyExc_TypeError,
915 "can only extend array with array (not \"%.200s\")",
916 Py_TYPE(bb)->tp_name);
917 return NULL;
918 }
919 if (array_do_extend(self, bb) == -1)
920 return NULL;
921 Py_INCREF(self);
922 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000923}
924
925static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000926array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 char *items, *p;
929 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 if (Py_SIZE(self) > 0) {
932 if (n < 0)
933 n = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 if ((self->ob_descr->itemsize != 0) &&
935 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
936 return PyErr_NoMemory();
937 }
938 size = Py_SIZE(self) * self->ob_descr->itemsize;
939 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
940 return PyErr_NoMemory();
941 }
942 if (array_resize(self, n * Py_SIZE(self)) == -1)
943 return NULL;
944 items = p = self->ob_item;
945 for (i = 1; i < n; i++) {
946 p += size;
947 memcpy(p, items, size);
948 }
949 }
950 Py_INCREF(self);
951 return (PyObject *)self;
Martin v. Löwis99866332002-03-01 10:27:01 +0000952}
953
954
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000955static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000956ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 if (ins1(self, where, v) != 0)
959 return NULL;
960 Py_INCREF(Py_None);
961 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000962}
963
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000964static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000965array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 Py_ssize_t count = 0;
968 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +0200971 PyObject *selfi;
972 int cmp;
973
974 selfi = getarrayitem((PyObject *)self, i);
975 if (selfi == NULL)
976 return NULL;
977 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 Py_DECREF(selfi);
979 if (cmp > 0)
980 count++;
981 else if (cmp < 0)
982 return NULL;
983 }
984 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000985}
986
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000987PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000988"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000989\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000990Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000991
992static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000993array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +0200998 PyObject *selfi;
999 int cmp;
1000
1001 selfi = getarrayitem((PyObject *)self, i);
1002 if (selfi == NULL)
1003 return NULL;
1004 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 Py_DECREF(selfi);
1006 if (cmp > 0) {
1007 return PyLong_FromLong((long)i);
1008 }
1009 else if (cmp < 0)
1010 return NULL;
1011 }
1012 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
1013 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001014}
1015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001016PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001017"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001018\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001019Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001020
Raymond Hettinger625812f2003-01-07 01:58:52 +00001021static int
1022array_contains(arrayobject *self, PyObject *v)
1023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 Py_ssize_t i;
1025 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
1028 PyObject *selfi = getarrayitem((PyObject *)self, i);
Victor Stinner0b142e22013-07-17 23:01:30 +02001029 if (selfi == NULL)
Victor Stinner4755bea2013-07-18 01:12:35 +02001030 return -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
1032 Py_DECREF(selfi);
1033 }
1034 return cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +00001035}
1036
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001037static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001038array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001039{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001042 for (i = 0; i < Py_SIZE(self); i++) {
Victor Stinner0b142e22013-07-17 23:01:30 +02001043 PyObject *selfi;
1044 int cmp;
1045
1046 selfi = getarrayitem((PyObject *)self,i);
1047 if (selfi == NULL)
1048 return NULL;
1049 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 Py_DECREF(selfi);
1051 if (cmp > 0) {
1052 if (array_ass_slice(self, i, i+1,
1053 (PyObject *)NULL) != 0)
1054 return NULL;
1055 Py_INCREF(Py_None);
1056 return Py_None;
1057 }
1058 else if (cmp < 0)
1059 return NULL;
1060 }
1061 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
1062 return NULL;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001063}
1064
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001065PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001066"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001067\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001068Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001069
1070static PyObject *
1071array_pop(arrayobject *self, PyObject *args)
1072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 Py_ssize_t i = -1;
1074 PyObject *v;
1075 if (!PyArg_ParseTuple(args, "|n:pop", &i))
1076 return NULL;
1077 if (Py_SIZE(self) == 0) {
1078 /* Special-case most common failure cause */
1079 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1080 return NULL;
1081 }
1082 if (i < 0)
1083 i += Py_SIZE(self);
1084 if (i < 0 || i >= Py_SIZE(self)) {
1085 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1086 return NULL;
1087 }
Victor Stinner0b142e22013-07-17 23:01:30 +02001088 v = getarrayitem((PyObject *)self, i);
1089 if (v == NULL)
1090 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1092 Py_DECREF(v);
1093 return NULL;
1094 }
1095 return v;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001096}
1097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001098PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001099"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001100\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001101Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001102
1103static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001104array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 if (array_do_extend(self, bb) == -1)
1107 return NULL;
1108 Py_INCREF(Py_None);
1109 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001110}
1111
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001112PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001113"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001114\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001115 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001116
1117static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001118array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001119{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 Py_ssize_t i;
1121 PyObject *v;
1122 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
1123 return NULL;
1124 return ins(self, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001125}
1126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001127PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001128"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001129\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001130Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001131
1132
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001133static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001134array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 PyObject* retval = NULL;
1137 retval = PyTuple_New(2);
1138 if (!retval)
1139 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1142 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001145}
1146
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001147PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001148"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001149\n\
1150Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001151the length in items of the buffer used to hold array's contents\n\
1152The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001153the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001154
1155
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001156static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001157array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001158{
Mark Dickinson346f0af2010-08-06 09:36:57 +00001159 return ins(self, Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001160}
1161
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001162PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001163"append(x)\n\
1164\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001165Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001166
1167
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001168static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001169array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 char *p;
1172 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001174 switch (self->ob_descr->itemsize) {
1175 case 1:
1176 break;
1177 case 2:
1178 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
1179 char p0 = p[0];
1180 p[0] = p[1];
1181 p[1] = p0;
1182 }
1183 break;
1184 case 4:
1185 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
1186 char p0 = p[0];
1187 char p1 = p[1];
1188 p[0] = p[3];
1189 p[1] = p[2];
1190 p[2] = p1;
1191 p[3] = p0;
1192 }
1193 break;
1194 case 8:
1195 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
1196 char p0 = p[0];
1197 char p1 = p[1];
1198 char p2 = p[2];
1199 char p3 = p[3];
1200 p[0] = p[7];
1201 p[1] = p[6];
1202 p[2] = p[5];
1203 p[3] = p[4];
1204 p[4] = p3;
1205 p[5] = p2;
1206 p[6] = p1;
1207 p[7] = p0;
1208 }
1209 break;
1210 default:
1211 PyErr_SetString(PyExc_RuntimeError,
1212 "don't know how to byteswap this array type");
1213 return NULL;
1214 }
1215 Py_INCREF(Py_None);
1216 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001217}
1218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001219PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001220"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001221\n\
Fred Drakebf272981999-12-03 17:15:30 +00001222Byteswap all items of the array. If the items in the array are not 1, 2,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000012234, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001224
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001225static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001226array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 register Py_ssize_t itemsize = self->ob_descr->itemsize;
1229 register char *p, *q;
1230 /* little buffer to hold items while swapping */
1231 char tmp[256]; /* 8 is probably enough -- but why skimp */
1232 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 if (Py_SIZE(self) > 1) {
1235 for (p = self->ob_item,
1236 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
1237 p < q;
1238 p += itemsize, q -= itemsize) {
1239 /* memory areas guaranteed disjoint, so memcpy
1240 * is safe (& memmove may be slower).
1241 */
1242 memcpy(tmp, p, itemsize);
1243 memcpy(p, q, itemsize);
1244 memcpy(q, tmp, itemsize);
1245 }
1246 }
Tim Petersbb307342000-09-10 05:22:54 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 Py_INCREF(Py_None);
1249 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001250}
Guido van Rossume77a7571993-11-03 15:01:26 +00001251
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001252PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001253"reverse()\n\
1254\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001255Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001256
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001257
1258/* Forward */
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001259static PyObject *array_frombytes(arrayobject *self, PyObject *args);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001260
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001262array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 PyObject *f, *b, *res;
1265 Py_ssize_t itemsize = self->ob_descr->itemsize;
1266 Py_ssize_t n, nbytes;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001267 _Py_IDENTIFIER(read);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
1271 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001272
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001273 if (n < 0) {
1274 PyErr_SetString(PyExc_ValueError, "negative count");
1275 return NULL;
1276 }
1277 if (n > PY_SSIZE_T_MAX / itemsize) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 PyErr_NoMemory();
1279 return NULL;
1280 }
Mark Dickinsonc04ddff2012-10-06 18:04:49 +01001281 nbytes = n * itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001282
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001283 b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 if (b == NULL)
1285 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 if (!PyBytes_Check(b)) {
1288 PyErr_SetString(PyExc_TypeError,
1289 "read() didn't return bytes");
1290 Py_DECREF(b);
1291 return NULL;
1292 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001295
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 args = Py_BuildValue("(O)", b);
1297 Py_DECREF(b);
1298 if (args == NULL)
1299 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001300
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001301 res = array_frombytes(self, args);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 Py_DECREF(args);
1303 if (res == NULL)
1304 return NULL;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 if (not_enough_bytes) {
1307 PyErr_SetString(PyExc_EOFError,
1308 "read() didn't return enough bytes");
1309 Py_DECREF(res);
1310 return NULL;
1311 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001314}
1315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001316PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001317"fromfile(f, n)\n\
1318\n\
1319Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001320array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001321
1322
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001323static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001324array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
1327 /* Write 64K blocks at a time */
1328 /* XXX Make the block size settable */
1329 int BLOCKSIZE = 64*1024;
1330 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1331 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 if (Py_SIZE(self) == 0)
1334 goto done;
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 for (i = 0; i < nblocks; i++) {
1337 char* ptr = self->ob_item + i*BLOCKSIZE;
1338 Py_ssize_t size = BLOCKSIZE;
1339 PyObject *bytes, *res;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02001340 _Py_IDENTIFIER(write);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 if (i*BLOCKSIZE + size > nbytes)
1343 size = nbytes - i*BLOCKSIZE;
1344 bytes = PyBytes_FromStringAndSize(ptr, size);
1345 if (bytes == NULL)
1346 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02001347 res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 Py_DECREF(bytes);
1349 if (res == NULL)
1350 return NULL;
1351 Py_DECREF(res); /* drop write result */
1352 }
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001353
1354 done:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001355 Py_INCREF(Py_None);
1356 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001357}
1358
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001359PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001360"tofile(f)\n\
1361\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001362Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001363
1364
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001366array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001368 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 if (!PyList_Check(list)) {
1371 PyErr_SetString(PyExc_TypeError, "arg must be list");
1372 return NULL;
1373 }
1374 n = PyList_Size(list);
1375 if (n > 0) {
1376 Py_ssize_t i, old_size;
1377 old_size = Py_SIZE(self);
1378 if (array_resize(self, old_size + n) == -1)
1379 return NULL;
1380 for (i = 0; i < n; i++) {
1381 PyObject *v = PyList_GetItem(list, i);
1382 if ((*self->ob_descr->setitem)(self,
1383 Py_SIZE(self) - n + i, v) != 0) {
1384 array_resize(self, old_size);
1385 return NULL;
1386 }
1387 }
1388 }
1389 Py_INCREF(Py_None);
1390 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001391}
1392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001393PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001394"fromlist(list)\n\
1395\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001396Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001397
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001398static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001399array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001401 PyObject *list = PyList_New(Py_SIZE(self));
1402 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001404 if (list == NULL)
1405 return NULL;
1406 for (i = 0; i < Py_SIZE(self); i++) {
1407 PyObject *v = getarrayitem((PyObject *)self, i);
Victor Stinner4755bea2013-07-18 01:12:35 +02001408 if (v == NULL)
1409 goto error;
1410 if (PyList_SetItem(list, i, v) < 0)
1411 goto error;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 }
1413 return list;
Victor Stinner4755bea2013-07-18 01:12:35 +02001414
1415error:
1416 Py_DECREF(list);
1417 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001418}
1419
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001420PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001421"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001422\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001423Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001424
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001425static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001426frombytes(arrayobject *self, Py_buffer *buffer)
Guido van Rossum778983b1993-02-19 15:55:02 +00001427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 int itemsize = self->ob_descr->itemsize;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001429 Py_ssize_t n;
1430 if (buffer->itemsize != 1) {
1431 PyBuffer_Release(buffer);
1432 PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required.");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001433 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001434 }
1435 n = buffer->len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 if (n % itemsize != 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001437 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 PyErr_SetString(PyExc_ValueError,
1439 "string length not a multiple of item size");
1440 return NULL;
1441 }
1442 n = n / itemsize;
1443 if (n > 0) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001444 Py_ssize_t old_size = Py_SIZE(self);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 if ((n > PY_SSIZE_T_MAX - old_size) ||
1446 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001447 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 return PyErr_NoMemory();
1449 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001450 if (array_resize(self, old_size + n) == -1) {
1451 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 return NULL;
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001453 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 memcpy(self->ob_item + old_size * itemsize,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001455 buffer->buf, n * itemsize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001457 PyBuffer_Release(buffer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 Py_INCREF(Py_None);
1459 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001460}
1461
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001462static PyObject *
1463array_fromstring(arrayobject *self, PyObject *args)
1464{
1465 Py_buffer buffer;
1466 if (PyErr_WarnEx(PyExc_DeprecationWarning,
1467 "fromstring() is deprecated. Use frombytes() instead.", 2) != 0)
1468 return NULL;
1469 if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer))
1470 return NULL;
1471 else
1472 return frombytes(self, &buffer);
1473}
1474
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001475PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001476"fromstring(string)\n\
1477\n\
1478Appends items from the string, interpreting it as an array of machine\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001479values, as if it had been read from a file using the fromfile() method).\n\
1480\n\
1481This method is deprecated. Use frombytes instead.");
1482
1483
1484static PyObject *
1485array_frombytes(arrayobject *self, PyObject *args)
1486{
1487 Py_buffer buffer;
1488 if (!PyArg_ParseTuple(args, "y*:frombytes", &buffer))
1489 return NULL;
1490 else
1491 return frombytes(self, &buffer);
1492}
1493
1494PyDoc_STRVAR(frombytes_doc,
1495"frombytes(bytestring)\n\
1496\n\
1497Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001498values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001499
1500
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001501static PyObject *
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001502array_tobytes(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1505 return PyBytes_FromStringAndSize(self->ob_item,
1506 Py_SIZE(self) * self->ob_descr->itemsize);
1507 } else {
1508 return PyErr_NoMemory();
1509 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001510}
1511
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001512PyDoc_STRVAR(tobytes_doc,
1513"tobytes() -> bytes\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001514\n\
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001515Convert the array to an array of machine values and return the bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001516representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001517
Martin v. Löwis99866332002-03-01 10:27:01 +00001518
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001519static PyObject *
1520array_tostring(arrayobject *self, PyObject *unused)
1521{
Victor Stinner9f0b51e2010-11-09 09:38:30 +00001522 if (PyErr_WarnEx(PyExc_DeprecationWarning,
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00001523 "tostring() is deprecated. Use tobytes() instead.", 2) != 0)
1524 return NULL;
1525 return array_tobytes(self, unused);
1526}
1527
1528PyDoc_STRVAR(tostring_doc,
1529"tostring() -> bytes\n\
1530\n\
1531Convert the array to an array of machine values and return the bytes\n\
1532representation.\n\
1533\n\
1534This method is deprecated. Use tobytes instead.");
1535
Martin v. Löwis99866332002-03-01 10:27:01 +00001536
Martin v. Löwis99866332002-03-01 10:27:01 +00001537static PyObject *
1538array_fromunicode(arrayobject *self, PyObject *args)
1539{
Victor Stinner62bb3942012-08-06 00:46:05 +02001540 Py_UNICODE *ustr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001541 Py_ssize_t n;
Victor Stinner62bb3942012-08-06 00:46:05 +02001542 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001543
Victor Stinner62bb3942012-08-06 00:46:05 +02001544 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 return NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02001546 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001547 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 PyErr_SetString(PyExc_ValueError,
1549 "fromunicode() may only be called on "
1550 "unicode type arrays");
1551 return NULL;
1552 }
1553 if (n > 0) {
1554 Py_ssize_t old_size = Py_SIZE(self);
1555 if (array_resize(self, old_size + n) == -1)
1556 return NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02001557 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
1558 ustr, n * sizeof(Py_UNICODE));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 Py_INCREF(Py_None);
1562 return Py_None;
Martin v. Löwis99866332002-03-01 10:27:01 +00001563}
1564
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001565PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001566"fromunicode(ustr)\n\
1567\n\
1568Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001569The array must be a unicode type array; otherwise a ValueError\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02001570is raised. Use array.frombytes(ustr.encode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001571append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001572
1573
1574static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001575array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001576{
Victor Stinner62bb3942012-08-06 00:46:05 +02001577 char typecode;
1578 typecode = self->ob_descr->typecode;
Gregory P. Smith9504b132012-12-10 20:20:20 -08001579 if (typecode != 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 PyErr_SetString(PyExc_ValueError,
1581 "tounicode() may only be called on unicode type arrays");
1582 return NULL;
1583 }
Victor Stinner62bb3942012-08-06 00:46:05 +02001584 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001585}
1586
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001587PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001588"tounicode() -> unicode\n\
1589\n\
1590Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001591a unicode type array; otherwise a ValueError is raised. Use\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02001592array.tobytes().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001593an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001594
Martin v. Löwis99866332002-03-01 10:27:01 +00001595
Meador Inge03b4d502012-08-10 22:35:45 -05001596static PyObject *
1597array_sizeof(arrayobject *self, PyObject *unused)
1598{
1599 Py_ssize_t res;
1600 res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize;
1601 return PyLong_FromSsize_t(res);
1602}
1603
1604PyDoc_STRVAR(sizeof_doc,
1605"__sizeof__() -> int\n\
1606\n\
1607Size of the array in memory, in bytes.");
1608
Martin v. Löwis99866332002-03-01 10:27:01 +00001609
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001610/*********************** Pickling support ************************/
1611
1612enum machine_format_code {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 UNKNOWN_FORMAT = -1,
1614 /* UNKNOWN_FORMAT is used to indicate that the machine format for an
1615 * array type code cannot be interpreted. When this occurs, a list of
1616 * Python objects is used to represent the content of the array
1617 * instead of using the memory content of the array directly. In that
1618 * case, the array_reconstructor mechanism is bypassed completely, and
1619 * the standard array constructor is used instead.
1620 *
1621 * This is will most likely occur when the machine doesn't use IEEE
1622 * floating-point numbers.
1623 */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 UNSIGNED_INT8 = 0,
1626 SIGNED_INT8 = 1,
1627 UNSIGNED_INT16_LE = 2,
1628 UNSIGNED_INT16_BE = 3,
1629 SIGNED_INT16_LE = 4,
1630 SIGNED_INT16_BE = 5,
1631 UNSIGNED_INT32_LE = 6,
1632 UNSIGNED_INT32_BE = 7,
1633 SIGNED_INT32_LE = 8,
1634 SIGNED_INT32_BE = 9,
1635 UNSIGNED_INT64_LE = 10,
1636 UNSIGNED_INT64_BE = 11,
1637 SIGNED_INT64_LE = 12,
1638 SIGNED_INT64_BE = 13,
1639 IEEE_754_FLOAT_LE = 14,
1640 IEEE_754_FLOAT_BE = 15,
1641 IEEE_754_DOUBLE_LE = 16,
1642 IEEE_754_DOUBLE_BE = 17,
1643 UTF16_LE = 18,
1644 UTF16_BE = 19,
1645 UTF32_LE = 20,
1646 UTF32_BE = 21
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001647};
1648#define MACHINE_FORMAT_CODE_MIN 0
1649#define MACHINE_FORMAT_CODE_MAX 21
1650
1651static const struct mformatdescr {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 size_t size;
1653 int is_signed;
1654 int is_big_endian;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001655} mformat_descriptors[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 {1, 0, 0}, /* 0: UNSIGNED_INT8 */
1657 {1, 1, 0}, /* 1: SIGNED_INT8 */
1658 {2, 0, 0}, /* 2: UNSIGNED_INT16_LE */
1659 {2, 0, 1}, /* 3: UNSIGNED_INT16_BE */
1660 {2, 1, 0}, /* 4: SIGNED_INT16_LE */
1661 {2, 1, 1}, /* 5: SIGNED_INT16_BE */
1662 {4, 0, 0}, /* 6: UNSIGNED_INT32_LE */
1663 {4, 0, 1}, /* 7: UNSIGNED_INT32_BE */
1664 {4, 1, 0}, /* 8: SIGNED_INT32_LE */
1665 {4, 1, 1}, /* 9: SIGNED_INT32_BE */
1666 {8, 0, 0}, /* 10: UNSIGNED_INT64_LE */
1667 {8, 0, 1}, /* 11: UNSIGNED_INT64_BE */
1668 {8, 1, 0}, /* 12: SIGNED_INT64_LE */
1669 {8, 1, 1}, /* 13: SIGNED_INT64_BE */
1670 {4, 0, 0}, /* 14: IEEE_754_FLOAT_LE */
1671 {4, 0, 1}, /* 15: IEEE_754_FLOAT_BE */
1672 {8, 0, 0}, /* 16: IEEE_754_DOUBLE_LE */
1673 {8, 0, 1}, /* 17: IEEE_754_DOUBLE_BE */
1674 {4, 0, 0}, /* 18: UTF16_LE */
1675 {4, 0, 1}, /* 19: UTF16_BE */
1676 {8, 0, 0}, /* 20: UTF32_LE */
1677 {8, 0, 1} /* 21: UTF32_BE */
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001678};
1679
1680
1681/*
1682 * Internal: This function is used to find the machine format of a given
1683 * array type code. This returns UNKNOWN_FORMAT when the machine format cannot
1684 * be found.
1685 */
1686static enum machine_format_code
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001687typecode_to_mformat_code(char typecode)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001688{
Christian Heimes743e0cd2012-10-17 23:52:17 +02001689 const int is_big_endian = PY_BIG_ENDIAN;
1690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 size_t intsize;
1692 int is_signed;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 switch (typecode) {
1695 case 'b':
1696 return SIGNED_INT8;
1697 case 'B':
1698 return UNSIGNED_INT8;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 case 'u':
Victor Stinner62bb3942012-08-06 00:46:05 +02001701 if (sizeof(Py_UNICODE) == 2) {
1702 return UTF16_LE + is_big_endian;
1703 }
1704 if (sizeof(Py_UNICODE) == 4) {
1705 return UTF32_LE + is_big_endian;
1706 }
1707 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001709 case 'f':
1710 if (sizeof(float) == 4) {
1711 const float y = 16711938.0;
1712 if (memcmp(&y, "\x4b\x7f\x01\x02", 4) == 0)
1713 return IEEE_754_FLOAT_BE;
1714 if (memcmp(&y, "\x02\x01\x7f\x4b", 4) == 0)
1715 return IEEE_754_FLOAT_LE;
1716 }
1717 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001718
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 case 'd':
1720 if (sizeof(double) == 8) {
1721 const double x = 9006104071832581.0;
1722 if (memcmp(&x, "\x43\x3f\xff\x01\x02\x03\x04\x05", 8) == 0)
1723 return IEEE_754_DOUBLE_BE;
1724 if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0)
1725 return IEEE_754_DOUBLE_LE;
1726 }
1727 return UNKNOWN_FORMAT;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 /* Integers */
1730 case 'h':
1731 intsize = sizeof(short);
1732 is_signed = 1;
1733 break;
1734 case 'H':
1735 intsize = sizeof(short);
1736 is_signed = 0;
1737 break;
1738 case 'i':
1739 intsize = sizeof(int);
1740 is_signed = 1;
1741 break;
1742 case 'I':
1743 intsize = sizeof(int);
1744 is_signed = 0;
1745 break;
1746 case 'l':
1747 intsize = sizeof(long);
1748 is_signed = 1;
1749 break;
1750 case 'L':
1751 intsize = sizeof(long);
1752 is_signed = 0;
1753 break;
Meador Inge1c9f0c92011-09-20 19:55:51 -05001754#if HAVE_LONG_LONG
1755 case 'q':
1756 intsize = sizeof(PY_LONG_LONG);
1757 is_signed = 1;
1758 break;
1759 case 'Q':
1760 intsize = sizeof(PY_LONG_LONG);
1761 is_signed = 0;
1762 break;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 default:
1765 return UNKNOWN_FORMAT;
1766 }
1767 switch (intsize) {
1768 case 2:
1769 return UNSIGNED_INT16_LE + is_big_endian + (2 * is_signed);
1770 case 4:
1771 return UNSIGNED_INT32_LE + is_big_endian + (2 * is_signed);
1772 case 8:
1773 return UNSIGNED_INT64_LE + is_big_endian + (2 * is_signed);
1774 default:
1775 return UNKNOWN_FORMAT;
1776 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001777}
1778
1779/* Forward declaration. */
1780static PyObject *array_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
1781
1782/*
1783 * Internal: This function wraps the array constructor--i.e., array_new()--to
1784 * allow the creation of array objects from C code without having to deal
1785 * directly the tuple argument of array_new(). The typecode argument is a
1786 * Unicode character value, like 'i' or 'f' for example, representing an array
1787 * type code. The items argument is a bytes or a list object from which
1788 * contains the initial value of the array.
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 *
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001790 * On success, this functions returns the array object created. Otherwise,
1791 * NULL is returned to indicate a failure.
1792 */
1793static PyObject *
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001794make_array(PyTypeObject *arraytype, char typecode, PyObject *items)
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 PyObject *new_args;
1797 PyObject *array_obj;
1798 PyObject *typecode_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 assert(arraytype != NULL);
1801 assert(items != NULL);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001802
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001803 typecode_obj = PyUnicode_FromOrdinal(typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 if (typecode_obj == NULL)
1805 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 new_args = PyTuple_New(2);
1808 if (new_args == NULL)
1809 return NULL;
1810 Py_INCREF(items);
1811 PyTuple_SET_ITEM(new_args, 0, typecode_obj);
1812 PyTuple_SET_ITEM(new_args, 1, items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 array_obj = array_new(arraytype, new_args, NULL);
1815 Py_DECREF(new_args);
1816 if (array_obj == NULL)
1817 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 return array_obj;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001820}
1821
1822/*
1823 * This functions is a special constructor used when unpickling an array. It
1824 * provides a portable way to rebuild an array from its memory representation.
1825 */
1826static PyObject *
1827array_reconstructor(PyObject *self, PyObject *args)
1828{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 PyTypeObject *arraytype;
1830 PyObject *items;
1831 PyObject *converted_items;
1832 PyObject *result;
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001833 int typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 enum machine_format_code mformat_code;
1835 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 if (!PyArg_ParseTuple(args, "OCiO:array._array_reconstructor",
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001838 &arraytype, &typecode, &mformat_code, &items))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001841 if (!PyType_Check(arraytype)) {
1842 PyErr_Format(PyExc_TypeError,
1843 "first argument must a type object, not %.200s",
1844 Py_TYPE(arraytype)->tp_name);
1845 return NULL;
1846 }
1847 if (!PyType_IsSubtype(arraytype, &Arraytype)) {
1848 PyErr_Format(PyExc_TypeError,
1849 "%.200s is not a subtype of %.200s",
1850 arraytype->tp_name, Arraytype.tp_name);
1851 return NULL;
1852 }
1853 for (descr = descriptors; descr->typecode != '\0'; descr++) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001854 if ((int)descr->typecode == typecode)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 break;
1856 }
1857 if (descr->typecode == '\0') {
1858 PyErr_SetString(PyExc_ValueError,
1859 "second argument must be a valid type code");
1860 return NULL;
1861 }
1862 if (mformat_code < MACHINE_FORMAT_CODE_MIN ||
1863 mformat_code > MACHINE_FORMAT_CODE_MAX) {
1864 PyErr_SetString(PyExc_ValueError,
1865 "third argument must be a valid machine format code.");
1866 return NULL;
1867 }
1868 if (!PyBytes_Check(items)) {
1869 PyErr_Format(PyExc_TypeError,
1870 "fourth argument should be bytes, not %.200s",
1871 Py_TYPE(items)->tp_name);
1872 return NULL;
1873 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 /* Fast path: No decoding has to be done. */
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001876 if (mformat_code == typecode_to_mformat_code((char)typecode) ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001877 mformat_code == UNKNOWN_FORMAT) {
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02001878 return make_array(arraytype, (char)typecode, items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001879 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 /* Slow path: Decode the byte string according to the given machine
1882 * format code. This occurs when the computer unpickling the array
1883 * object is architecturally different from the one that pickled the
1884 * array.
1885 */
1886 if (Py_SIZE(items) % mformat_descriptors[mformat_code].size != 0) {
1887 PyErr_SetString(PyExc_ValueError,
1888 "string length not a multiple of item size");
1889 return NULL;
1890 }
1891 switch (mformat_code) {
1892 case IEEE_754_FLOAT_LE:
1893 case IEEE_754_FLOAT_BE: {
1894 int i;
1895 int le = (mformat_code == IEEE_754_FLOAT_LE) ? 1 : 0;
1896 Py_ssize_t itemcount = Py_SIZE(items) / 4;
1897 const unsigned char *memstr =
1898 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001900 converted_items = PyList_New(itemcount);
1901 if (converted_items == NULL)
1902 return NULL;
1903 for (i = 0; i < itemcount; i++) {
1904 PyObject *pyfloat = PyFloat_FromDouble(
1905 _PyFloat_Unpack4(&memstr[i * 4], le));
1906 if (pyfloat == NULL) {
1907 Py_DECREF(converted_items);
1908 return NULL;
1909 }
1910 PyList_SET_ITEM(converted_items, i, pyfloat);
1911 }
1912 break;
1913 }
1914 case IEEE_754_DOUBLE_LE:
1915 case IEEE_754_DOUBLE_BE: {
1916 int i;
1917 int le = (mformat_code == IEEE_754_DOUBLE_LE) ? 1 : 0;
1918 Py_ssize_t itemcount = Py_SIZE(items) / 8;
1919 const unsigned char *memstr =
1920 (unsigned char *)PyBytes_AS_STRING(items);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 converted_items = PyList_New(itemcount);
1923 if (converted_items == NULL)
1924 return NULL;
1925 for (i = 0; i < itemcount; i++) {
1926 PyObject *pyfloat = PyFloat_FromDouble(
1927 _PyFloat_Unpack8(&memstr[i * 8], le));
1928 if (pyfloat == NULL) {
1929 Py_DECREF(converted_items);
1930 return NULL;
1931 }
1932 PyList_SET_ITEM(converted_items, i, pyfloat);
1933 }
1934 break;
1935 }
1936 case UTF16_LE:
1937 case UTF16_BE: {
1938 int byteorder = (mformat_code == UTF16_LE) ? -1 : 1;
1939 converted_items = PyUnicode_DecodeUTF16(
1940 PyBytes_AS_STRING(items), Py_SIZE(items),
1941 "strict", &byteorder);
1942 if (converted_items == NULL)
1943 return NULL;
1944 break;
1945 }
1946 case UTF32_LE:
1947 case UTF32_BE: {
1948 int byteorder = (mformat_code == UTF32_LE) ? -1 : 1;
1949 converted_items = PyUnicode_DecodeUTF32(
1950 PyBytes_AS_STRING(items), Py_SIZE(items),
1951 "strict", &byteorder);
1952 if (converted_items == NULL)
1953 return NULL;
1954 break;
1955 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001957 case UNSIGNED_INT8:
1958 case SIGNED_INT8:
1959 case UNSIGNED_INT16_LE:
1960 case UNSIGNED_INT16_BE:
1961 case SIGNED_INT16_LE:
1962 case SIGNED_INT16_BE:
1963 case UNSIGNED_INT32_LE:
1964 case UNSIGNED_INT32_BE:
1965 case SIGNED_INT32_LE:
1966 case SIGNED_INT32_BE:
1967 case UNSIGNED_INT64_LE:
1968 case UNSIGNED_INT64_BE:
1969 case SIGNED_INT64_LE:
1970 case SIGNED_INT64_BE: {
1971 int i;
1972 const struct mformatdescr mf_descr =
1973 mformat_descriptors[mformat_code];
1974 Py_ssize_t itemcount = Py_SIZE(items) / mf_descr.size;
1975 const unsigned char *memstr =
1976 (unsigned char *)PyBytes_AS_STRING(items);
1977 struct arraydescr *descr;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 /* If possible, try to pack array's items using a data type
1980 * that fits better. This may result in an array with narrower
1981 * or wider elements.
1982 *
1983 * For example, if a 32-bit machine pickles a L-code array of
1984 * unsigned longs, then the array will be unpickled by 64-bit
1985 * machine as an I-code array of unsigned ints.
1986 *
1987 * XXX: Is it possible to write a unit test for this?
1988 */
1989 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1990 if (descr->is_integer_type &&
1991 descr->itemsize == mf_descr.size &&
1992 descr->is_signed == mf_descr.is_signed)
1993 typecode = descr->typecode;
1994 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 converted_items = PyList_New(itemcount);
1997 if (converted_items == NULL)
1998 return NULL;
1999 for (i = 0; i < itemcount; i++) {
2000 PyObject *pylong;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 pylong = _PyLong_FromByteArray(
2003 &memstr[i * mf_descr.size],
2004 mf_descr.size,
2005 !mf_descr.is_big_endian,
2006 mf_descr.is_signed);
2007 if (pylong == NULL) {
2008 Py_DECREF(converted_items);
2009 return NULL;
2010 }
2011 PyList_SET_ITEM(converted_items, i, pylong);
2012 }
2013 break;
2014 }
2015 case UNKNOWN_FORMAT:
2016 /* Impossible, but needed to shut up GCC about the unhandled
2017 * enumeration value.
2018 */
2019 default:
2020 PyErr_BadArgument();
2021 return NULL;
2022 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002023
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002024 result = make_array(arraytype, (char)typecode, converted_items);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 Py_DECREF(converted_items);
2026 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002027}
2028
2029static PyObject *
2030array_reduce_ex(arrayobject *array, PyObject *value)
2031{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 PyObject *dict;
2033 PyObject *result;
2034 PyObject *array_str;
2035 int typecode = array->ob_descr->typecode;
2036 int mformat_code;
2037 static PyObject *array_reconstructor = NULL;
2038 long protocol;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02002039 _Py_IDENTIFIER(_array_reconstructor);
2040 _Py_IDENTIFIER(__dict__);
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002042 if (array_reconstructor == NULL) {
2043 PyObject *array_module = PyImport_ImportModule("array");
2044 if (array_module == NULL)
2045 return NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002046 array_reconstructor = _PyObject_GetAttrId(
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 array_module,
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002048 &PyId__array_reconstructor);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 Py_DECREF(array_module);
2050 if (array_reconstructor == NULL)
2051 return NULL;
2052 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 if (!PyLong_Check(value)) {
2055 PyErr_SetString(PyExc_TypeError,
2056 "__reduce_ex__ argument should an integer");
2057 return NULL;
2058 }
2059 protocol = PyLong_AsLong(value);
2060 if (protocol == -1 && PyErr_Occurred())
2061 return NULL;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002062
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +02002063 dict = _PyObject_GetAttrId((PyObject *)array, &PyId___dict__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 if (dict == NULL) {
2065 if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2066 return NULL;
2067 PyErr_Clear();
2068 dict = Py_None;
2069 Py_INCREF(dict);
2070 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 mformat_code = typecode_to_mformat_code(typecode);
2073 if (mformat_code == UNKNOWN_FORMAT || protocol < 3) {
2074 /* Convert the array to a list if we got something weird
2075 * (e.g., non-IEEE floats), or we are pickling the array using
2076 * a Python 2.x compatible protocol.
2077 *
2078 * It is necessary to use a list representation for Python 2.x
2079 * compatible pickle protocol, since Python 2's str objects
2080 * are unpickled as unicode by Python 3. Thus it is impossible
2081 * to make arrays unpicklable by Python 3 by using their memory
2082 * representation, unless we resort to ugly hacks such as
2083 * coercing unicode objects to bytes in array_reconstructor.
2084 */
2085 PyObject *list;
2086 list = array_tolist(array, NULL);
2087 if (list == NULL) {
2088 Py_DECREF(dict);
2089 return NULL;
2090 }
2091 result = Py_BuildValue(
2092 "O(CO)O", Py_TYPE(array), typecode, list, dict);
2093 Py_DECREF(list);
2094 Py_DECREF(dict);
2095 return result;
2096 }
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002097
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002098 array_str = array_tobytes(array, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002099 if (array_str == NULL) {
2100 Py_DECREF(dict);
2101 return NULL;
2102 }
2103 result = Py_BuildValue(
2104 "O(OCiN)O", array_reconstructor, Py_TYPE(array), typecode,
2105 mformat_code, array_str, dict);
2106 Py_DECREF(dict);
2107 return result;
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002108}
2109
2110PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
2111
Martin v. Löwis99866332002-03-01 10:27:01 +00002112static PyObject *
2113array_get_typecode(arrayobject *a, void *closure)
2114{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002115 char typecode = a->ob_descr->typecode;
2116 return PyUnicode_FromOrdinal(typecode);
Martin v. Löwis99866332002-03-01 10:27:01 +00002117}
2118
2119static PyObject *
2120array_get_itemsize(arrayobject *a, void *closure)
2121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00002123}
2124
2125static PyGetSetDef array_getsets [] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 {"typecode", (getter) array_get_typecode, NULL,
2127 "the typecode character used to create the array"},
2128 {"itemsize", (getter) array_get_itemsize, NULL,
2129 "the size, in bytes, of one array item"},
2130 {NULL}
Martin v. Löwis99866332002-03-01 10:27:01 +00002131};
2132
Martin v. Löwis59683e82008-06-13 07:50:45 +00002133static PyMethodDef array_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002134 {"append", (PyCFunction)array_append, METH_O,
2135 append_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002136 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002137 buffer_info_doc},
2138 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
2139 byteswap_doc},
2140 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
2141 copy_doc},
2142 {"count", (PyCFunction)array_count, METH_O,
2143 count_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002144 {"__deepcopy__", (PyCFunction)array_copy, METH_O,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 copy_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002146 {"extend", (PyCFunction)array_extend, METH_O,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 extend_doc},
2148 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
2149 fromfile_doc},
2150 {"fromlist", (PyCFunction)array_fromlist, METH_O,
2151 fromlist_doc},
2152 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
2153 fromstring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002154 {"frombytes", (PyCFunction)array_frombytes, METH_VARARGS,
2155 frombytes_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
2157 fromunicode_doc},
2158 {"index", (PyCFunction)array_index, METH_O,
2159 index_doc},
2160 {"insert", (PyCFunction)array_insert, METH_VARARGS,
2161 insert_doc},
2162 {"pop", (PyCFunction)array_pop, METH_VARARGS,
2163 pop_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002164 {"__reduce_ex__", (PyCFunction)array_reduce_ex, METH_O,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 reduce_doc},
2166 {"remove", (PyCFunction)array_remove, METH_O,
2167 remove_doc},
2168 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
2169 reverse_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 {"tofile", (PyCFunction)array_tofile, METH_O,
2171 tofile_doc},
2172 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
2173 tolist_doc},
2174 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
2175 tostring_doc},
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002176 {"tobytes", (PyCFunction)array_tobytes, METH_NOARGS,
2177 tobytes_doc},
Eli Bendersky03ab4d32012-12-31 15:34:20 -08002178 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 tounicode_doc},
Meador Inge03b4d502012-08-10 22:35:45 -05002180 {"__sizeof__", (PyCFunction)array_sizeof, METH_NOARGS,
2181 sizeof_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 {NULL, NULL} /* sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +00002183};
2184
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002185static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00002186array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00002187{
Victor Stinnerf8bb7d02011-09-30 00:03:59 +02002188 char typecode;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002189 PyObject *s, *v = NULL;
2190 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 len = Py_SIZE(a);
2193 typecode = a->ob_descr->typecode;
2194 if (len == 0) {
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002195 return PyUnicode_FromFormat("array('%c')", (int)typecode);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002196 }
Gregory P. Smith9504b132012-12-10 20:20:20 -08002197 if (typecode == 'u') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 v = array_tounicode(a, NULL);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002199 } else {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002200 v = array_tolist(a, NULL);
Gregory P. Smith9504b132012-12-10 20:20:20 -08002201 }
Victor Stinner29ec5952013-02-26 00:27:38 +01002202 if (v == NULL)
2203 return NULL;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00002204
Amaury Forgeot d'Arc24aa26b2010-11-25 08:13:35 +00002205 s = PyUnicode_FromFormat("array('%c', %R)", (int)typecode, v);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002206 Py_DECREF(v);
2207 return s;
Guido van Rossum778983b1993-02-19 15:55:02 +00002208}
2209
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002210static PyObject*
2211array_subscr(arrayobject* self, PyObject* item)
2212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 if (PyIndex_Check(item)) {
2214 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
2215 if (i==-1 && PyErr_Occurred()) {
2216 return NULL;
2217 }
2218 if (i < 0)
2219 i += Py_SIZE(self);
2220 return array_item(self, i);
2221 }
2222 else if (PySlice_Check(item)) {
2223 Py_ssize_t start, stop, step, slicelength, cur, i;
2224 PyObject* result;
2225 arrayobject* ar;
2226 int itemsize = self->ob_descr->itemsize;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002227
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002228 if (PySlice_GetIndicesEx(item, Py_SIZE(self),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 &start, &stop, &step, &slicelength) < 0) {
2230 return NULL;
2231 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 if (slicelength <= 0) {
2234 return newarrayobject(&Arraytype, 0, self->ob_descr);
2235 }
2236 else if (step == 1) {
2237 PyObject *result = newarrayobject(&Arraytype,
2238 slicelength, self->ob_descr);
2239 if (result == NULL)
2240 return NULL;
2241 memcpy(((arrayobject *)result)->ob_item,
2242 self->ob_item + start * itemsize,
2243 slicelength * itemsize);
2244 return result;
2245 }
2246 else {
2247 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
2248 if (!result) return NULL;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002250 ar = (arrayobject*)result;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 for (cur = start, i = 0; i < slicelength;
2253 cur += step, i++) {
2254 memcpy(ar->ob_item + i*itemsize,
2255 self->ob_item + cur*itemsize,
2256 itemsize);
2257 }
2258
2259 return result;
2260 }
2261 }
2262 else {
2263 PyErr_SetString(PyExc_TypeError,
2264 "array indices must be integers");
2265 return NULL;
2266 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002267}
2268
2269static int
2270array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
2271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 Py_ssize_t start, stop, step, slicelength, needed;
2273 arrayobject* other;
2274 int itemsize;
Thomas Woutersed03b412007-08-28 21:37:11 +00002275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 if (PyIndex_Check(item)) {
2277 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 if (i == -1 && PyErr_Occurred())
2280 return -1;
2281 if (i < 0)
2282 i += Py_SIZE(self);
2283 if (i < 0 || i >= Py_SIZE(self)) {
2284 PyErr_SetString(PyExc_IndexError,
2285 "array assignment index out of range");
2286 return -1;
2287 }
2288 if (value == NULL) {
2289 /* Fall through to slice assignment */
2290 start = i;
2291 stop = i + 1;
2292 step = 1;
2293 slicelength = 1;
2294 }
2295 else
2296 return (*self->ob_descr->setitem)(self, i, value);
2297 }
2298 else if (PySlice_Check(item)) {
Martin v. Löwis4d0d4712010-12-03 20:14:31 +00002299 if (PySlice_GetIndicesEx(item,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 Py_SIZE(self), &start, &stop,
2301 &step, &slicelength) < 0) {
2302 return -1;
2303 }
2304 }
2305 else {
2306 PyErr_SetString(PyExc_TypeError,
2307 "array indices must be integer");
2308 return -1;
2309 }
2310 if (value == NULL) {
2311 other = NULL;
2312 needed = 0;
2313 }
2314 else if (array_Check(value)) {
2315 other = (arrayobject *)value;
2316 needed = Py_SIZE(other);
2317 if (self == other) {
2318 /* Special case "self[i:j] = self" -- copy self first */
2319 int ret;
2320 value = array_slice(other, 0, needed);
2321 if (value == NULL)
2322 return -1;
2323 ret = array_ass_subscr(self, item, value);
2324 Py_DECREF(value);
2325 return ret;
2326 }
2327 if (other->ob_descr != self->ob_descr) {
2328 PyErr_BadArgument();
2329 return -1;
2330 }
2331 }
2332 else {
2333 PyErr_Format(PyExc_TypeError,
2334 "can only assign array (not \"%.200s\") to array slice",
2335 Py_TYPE(value)->tp_name);
2336 return -1;
2337 }
2338 itemsize = self->ob_descr->itemsize;
2339 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
2340 if ((step > 0 && stop < start) ||
2341 (step < 0 && stop > start))
2342 stop = start;
Alexandre Vassalotti47137252009-07-05 19:57:00 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 /* Issue #4509: If the array has exported buffers and the slice
2345 assignment would change the size of the array, fail early to make
2346 sure we don't modify it. */
2347 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
2348 PyErr_SetString(PyExc_BufferError,
2349 "cannot resize an array that is exporting buffers");
2350 return -1;
2351 }
Mark Dickinsonbc099642010-01-29 17:27:24 +00002352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 if (step == 1) {
2354 if (slicelength > needed) {
2355 memmove(self->ob_item + (start + needed) * itemsize,
2356 self->ob_item + stop * itemsize,
2357 (Py_SIZE(self) - stop) * itemsize);
2358 if (array_resize(self, Py_SIZE(self) +
2359 needed - slicelength) < 0)
2360 return -1;
2361 }
2362 else if (slicelength < needed) {
2363 if (array_resize(self, Py_SIZE(self) +
2364 needed - slicelength) < 0)
2365 return -1;
2366 memmove(self->ob_item + (start + needed) * itemsize,
2367 self->ob_item + stop * itemsize,
2368 (Py_SIZE(self) - start - needed) * itemsize);
2369 }
2370 if (needed > 0)
2371 memcpy(self->ob_item + start * itemsize,
2372 other->ob_item, needed * itemsize);
2373 return 0;
2374 }
2375 else if (needed == 0) {
2376 /* Delete slice */
2377 size_t cur;
2378 Py_ssize_t i;
Thomas Woutersed03b412007-08-28 21:37:11 +00002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 if (step < 0) {
2381 stop = start + 1;
2382 start = stop + step * (slicelength - 1) - 1;
2383 step = -step;
2384 }
2385 for (cur = start, i = 0; i < slicelength;
2386 cur += step, i++) {
2387 Py_ssize_t lim = step - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 if (cur + step >= (size_t)Py_SIZE(self))
2390 lim = Py_SIZE(self) - cur - 1;
2391 memmove(self->ob_item + (cur - i) * itemsize,
2392 self->ob_item + (cur + 1) * itemsize,
2393 lim * itemsize);
2394 }
Mark Dickinsonc7d93b72011-09-25 15:34:32 +01002395 cur = start + (size_t)slicelength * step;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 if (cur < (size_t)Py_SIZE(self)) {
2397 memmove(self->ob_item + (cur-slicelength) * itemsize,
2398 self->ob_item + cur * itemsize,
2399 (Py_SIZE(self) - cur) * itemsize);
2400 }
2401 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
2402 return -1;
2403 return 0;
2404 }
2405 else {
2406 Py_ssize_t cur, i;
2407
2408 if (needed != slicelength) {
2409 PyErr_Format(PyExc_ValueError,
2410 "attempt to assign array of size %zd "
2411 "to extended slice of size %zd",
2412 needed, slicelength);
2413 return -1;
2414 }
2415 for (cur = start, i = 0; i < slicelength;
2416 cur += step, i++) {
2417 memcpy(self->ob_item + cur * itemsize,
2418 other->ob_item + i * itemsize,
2419 itemsize);
2420 }
2421 return 0;
2422 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002423}
2424
2425static PyMappingMethods array_as_mapping = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 (lenfunc)array_length,
2427 (binaryfunc)array_subscr,
2428 (objobjargproc)array_ass_subscr
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00002429};
2430
Guido van Rossumd8faa362007-04-27 19:54:29 +00002431static const void *emptybuf = "";
2432
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002433
2434static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002435array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002436{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 if (view==NULL) goto finish;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002439 view->buf = (void *)self->ob_item;
2440 view->obj = (PyObject*)self;
2441 Py_INCREF(self);
2442 if (view->buf == NULL)
2443 view->buf = (void *)emptybuf;
2444 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
2445 view->readonly = 0;
2446 view->ndim = 1;
2447 view->itemsize = self->ob_descr->itemsize;
2448 view->suboffsets = NULL;
2449 view->shape = NULL;
2450 if ((flags & PyBUF_ND)==PyBUF_ND) {
2451 view->shape = &((Py_SIZE(self)));
2452 }
2453 view->strides = NULL;
2454 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
2455 view->strides = &(view->itemsize);
2456 view->format = NULL;
2457 view->internal = NULL;
Victor Stinner62bb3942012-08-06 00:46:05 +02002458 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 view->format = self->ob_descr->formats;
Victor Stinner62bb3942012-08-06 00:46:05 +02002460#ifdef Py_UNICODE_WIDE
2461 if (self->ob_descr->typecode == 'u') {
2462 view->format = "w";
2463 }
2464#endif
2465 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002466
2467 finish:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 self->ob_exports++;
2469 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002470}
2471
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002472static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00002473array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002476}
2477
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002478static PySequenceMethods array_as_sequence = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002479 (lenfunc)array_length, /*sq_length*/
2480 (binaryfunc)array_concat, /*sq_concat*/
2481 (ssizeargfunc)array_repeat, /*sq_repeat*/
2482 (ssizeargfunc)array_item, /*sq_item*/
2483 0, /*sq_slice*/
2484 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
2485 0, /*sq_ass_slice*/
2486 (objobjproc)array_contains, /*sq_contains*/
2487 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
2488 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00002489};
2490
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002491static PyBufferProcs array_as_buffer = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 (getbufferproc)array_buffer_getbuf,
2493 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00002494};
2495
Roger E. Masse2919eaa1996-12-09 20:10:36 +00002496static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00002497array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00002498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 int c;
2500 PyObject *initial = NULL, *it = NULL;
2501 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
2504 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00002505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
2507 return NULL;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 if (!(initial == NULL || PyList_Check(initial)
2510 || PyByteArray_Check(initial)
2511 || PyBytes_Check(initial)
2512 || PyTuple_Check(initial)
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002513 || ((c=='u') && PyUnicode_Check(initial))
2514 || (array_Check(initial)
2515 && c == ((arrayobject*)initial)->ob_descr->typecode))) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 it = PyObject_GetIter(initial);
2517 if (it == NULL)
2518 return NULL;
2519 /* We set initial to NULL so that the subsequent code
2520 will create an empty array of the appropriate type
2521 and afterwards we can use array_iter_extend to populate
2522 the array.
2523 */
2524 initial = NULL;
2525 }
2526 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2527 if (descr->typecode == c) {
2528 PyObject *a;
2529 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00002530
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002531 if (initial == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 len = 0;
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002533 else if (PyList_Check(initial))
2534 len = PyList_GET_SIZE(initial);
2535 else if (PyTuple_Check(initial) || array_Check(initial))
2536 len = Py_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 else
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002538 len = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +00002539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 a = newarrayobject(type, len, descr);
2541 if (a == NULL)
2542 return NULL;
2543
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002544 if (len > 0 && !array_Check(initial)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002545 Py_ssize_t i;
2546 for (i = 0; i < len; i++) {
2547 PyObject *v =
2548 PySequence_GetItem(initial, i);
2549 if (v == NULL) {
2550 Py_DECREF(a);
2551 return NULL;
2552 }
2553 if (setarrayitem(a, i, v) != 0) {
2554 Py_DECREF(v);
2555 Py_DECREF(a);
2556 return NULL;
2557 }
2558 Py_DECREF(v);
2559 }
2560 }
2561 else if (initial != NULL && (PyByteArray_Check(initial) ||
2562 PyBytes_Check(initial))) {
2563 PyObject *t_initial, *v;
2564 t_initial = PyTuple_Pack(1, initial);
2565 if (t_initial == NULL) {
2566 Py_DECREF(a);
2567 return NULL;
2568 }
Antoine Pitrou1ce3eb52010-09-01 20:29:34 +00002569 v = array_frombytes((arrayobject *)a,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 t_initial);
2571 Py_DECREF(t_initial);
2572 if (v == NULL) {
2573 Py_DECREF(a);
2574 return NULL;
2575 }
2576 Py_DECREF(v);
2577 }
2578 else if (initial != NULL && PyUnicode_Check(initial)) {
Victor Stinner62bb3942012-08-06 00:46:05 +02002579 Py_UNICODE *ustr;
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002580 Py_ssize_t n;
Victor Stinner62bb3942012-08-06 00:46:05 +02002581
2582 ustr = PyUnicode_AsUnicode(initial);
2583 if (ustr == NULL) {
2584 PyErr_NoMemory();
Victor Stinner1fbcaef2011-09-30 01:54:04 +02002585 Py_DECREF(a);
2586 return NULL;
2587 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002588
2589 n = PyUnicode_GET_DATA_SIZE(initial);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002590 if (n > 0) {
2591 arrayobject *self = (arrayobject *)a;
Victor Stinner62bb3942012-08-06 00:46:05 +02002592 char *item = self->ob_item;
2593 item = (char *)PyMem_Realloc(item, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 if (item == NULL) {
2595 PyErr_NoMemory();
2596 Py_DECREF(a);
2597 return NULL;
2598 }
Victor Stinner62bb3942012-08-06 00:46:05 +02002599 self->ob_item = item;
2600 Py_SIZE(self) = n / sizeof(Py_UNICODE);
2601 memcpy(item, ustr, n);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 self->allocated = Py_SIZE(self);
2603 }
2604 }
Alexander Belopolskyef4a03f2011-01-11 21:44:00 +00002605 else if (initial != NULL && array_Check(initial)) {
2606 arrayobject *self = (arrayobject *)a;
2607 arrayobject *other = (arrayobject *)initial;
2608 memcpy(self->ob_item, other->ob_item, len * other->ob_descr->itemsize);
2609 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 if (it != NULL) {
2611 if (array_iter_extend((arrayobject *)a, it) == -1) {
2612 Py_DECREF(it);
2613 Py_DECREF(a);
2614 return NULL;
2615 }
2616 Py_DECREF(it);
2617 }
2618 return a;
2619 }
2620 }
2621 PyErr_SetString(PyExc_ValueError,
Meador Inge1c9f0c92011-09-20 19:55:51 -05002622#ifdef HAVE_LONG_LONG
2623 "bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)");
2624#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Meador Inge1c9f0c92011-09-20 19:55:51 -05002626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00002628}
2629
Guido van Rossum778983b1993-02-19 15:55:02 +00002630
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002631PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002632"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002633an array of basic values: characters, integers, floating point\n\
2634numbers. Arrays are sequence types and behave very much like lists,\n\
2635except that the type of objects stored in them is constrained. The\n\
2636type is specified at object creation time by using a type code, which\n\
2637is a single character. The following type codes are defined:\n\
2638\n\
2639 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002640 'b' signed integer 1 \n\
2641 'B' unsigned integer 1 \n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002642 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002643 'h' signed integer 2 \n\
2644 'H' unsigned integer 2 \n\
2645 'i' signed integer 2 \n\
2646 'I' unsigned integer 2 \n\
2647 'l' signed integer 4 \n\
2648 'L' unsigned integer 4 \n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002649 'q' signed integer 8 (see note) \n\
2650 'Q' unsigned integer 8 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002651 'f' floating point 4 \n\
2652 'd' floating point 8 \n\
2653\n\
Victor Stinner62bb3942012-08-06 00:46:05 +02002654NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2655narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2656\n\
Meador Inge1c9f0c92011-09-20 19:55:51 -05002657NOTE: The 'q' and 'Q' type codes are only available if the platform \n\
2658C compiler used to build Python supports 'long long', or, on Windows, \n\
2659'__int64'.\n\
2660\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002661The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002662\n\
2663array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002664");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002666PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002667"array(typecode [, initializer]) -> array\n\
2668\n\
2669Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002670initialized from the optional initializer value, which must be a list,\n\
Florent Xicluna0e686cb2011-12-09 23:41:19 +01002671string or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002672\n\
2673Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002674the type of objects stored in them is constrained.\n\
2675\n\
2676Methods:\n\
2677\n\
2678append() -- append a new item to the end of the array\n\
2679buffer_info() -- return information giving the current memory info\n\
2680byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002681count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002682extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002683fromfile() -- read items from a file object\n\
2684fromlist() -- append items from the list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002685frombytes() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002686index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002687insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002688pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002689remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002690reverse() -- reverse the order of the items in the array\n\
2691tofile() -- write all items to a file object\n\
2692tolist() -- return the array converted to an ordinary list\n\
Florent Xiclunac45fb252011-10-24 13:14:55 +02002693tobytes() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002694\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002695Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002696\n\
2697typecode -- the typecode character used to create the array\n\
2698itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002700
Raymond Hettinger625812f2003-01-07 01:58:52 +00002701static PyObject *array_iter(arrayobject *ao);
2702
Tim Peters0c322792002-07-17 16:49:03 +00002703static PyTypeObject Arraytype = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 PyVarObject_HEAD_INIT(NULL, 0)
2705 "array.array",
2706 sizeof(arrayobject),
2707 0,
2708 (destructor)array_dealloc, /* tp_dealloc */
2709 0, /* tp_print */
2710 0, /* tp_getattr */
2711 0, /* tp_setattr */
2712 0, /* tp_reserved */
2713 (reprfunc)array_repr, /* tp_repr */
2714 0, /* tp_as_number*/
2715 &array_as_sequence, /* tp_as_sequence*/
2716 &array_as_mapping, /* tp_as_mapping*/
2717 0, /* tp_hash */
2718 0, /* tp_call */
2719 0, /* tp_str */
2720 PyObject_GenericGetAttr, /* tp_getattro */
2721 0, /* tp_setattro */
2722 &array_as_buffer, /* tp_as_buffer*/
2723 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
2724 arraytype_doc, /* tp_doc */
2725 0, /* tp_traverse */
2726 0, /* tp_clear */
2727 array_richcompare, /* tp_richcompare */
2728 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
2729 (getiterfunc)array_iter, /* tp_iter */
2730 0, /* tp_iternext */
2731 array_methods, /* tp_methods */
2732 0, /* tp_members */
2733 array_getsets, /* tp_getset */
2734 0, /* tp_base */
2735 0, /* tp_dict */
2736 0, /* tp_descr_get */
2737 0, /* tp_descr_set */
2738 0, /* tp_dictoffset */
2739 0, /* tp_init */
2740 PyType_GenericAlloc, /* tp_alloc */
2741 array_new, /* tp_new */
2742 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002743};
2744
Raymond Hettinger625812f2003-01-07 01:58:52 +00002745
2746/*********************** Array Iterator **************************/
2747
2748typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 PyObject_HEAD
2750 Py_ssize_t index;
2751 arrayobject *ao;
2752 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002753} arrayiterobject;
2754
2755static PyTypeObject PyArrayIter_Type;
2756
2757#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2758
2759static PyObject *
2760array_iter(arrayobject *ao)
2761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 arrayiterobject *it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 if (!array_Check(ao)) {
2765 PyErr_BadInternalCall();
2766 return NULL;
2767 }
Raymond Hettinger625812f2003-01-07 01:58:52 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2770 if (it == NULL)
2771 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 Py_INCREF(ao);
2774 it->ao = ao;
2775 it->index = 0;
2776 it->getitem = ao->ob_descr->getitem;
2777 PyObject_GC_Track(it);
2778 return (PyObject *)it;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002779}
2780
2781static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002782arrayiter_next(arrayiterobject *it)
2783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002784 assert(PyArrayIter_Check(it));
2785 if (it->index < Py_SIZE(it->ao))
2786 return (*it->getitem)(it->ao, it->index++);
2787 return NULL;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002788}
2789
2790static void
2791arrayiter_dealloc(arrayiterobject *it)
2792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 PyObject_GC_UnTrack(it);
2794 Py_XDECREF(it->ao);
2795 PyObject_GC_Del(it);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002796}
2797
2798static int
2799arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 Py_VISIT(it->ao);
2802 return 0;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002803}
2804
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002805static PyObject *
2806arrayiter_reduce(arrayiterobject *it)
2807{
Antoine Pitroua7013882012-04-05 00:04:20 +02002808 return Py_BuildValue("N(O)n", _PyObject_GetBuiltin("iter"),
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002809 it->ao, it->index);
2810}
2811
2812static PyObject *
2813arrayiter_setstate(arrayiterobject *it, PyObject *state)
2814{
2815 Py_ssize_t index = PyLong_AsSsize_t(state);
2816 if (index == -1 && PyErr_Occurred())
2817 return NULL;
2818 if (index < 0)
2819 index = 0;
2820 it->index = index;
2821 Py_RETURN_NONE;
2822}
2823
2824PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
2825static PyMethodDef arrayiter_methods[] = {
2826 {"__reduce__", (PyCFunction)arrayiter_reduce, METH_NOARGS,
2827 reduce_doc},
2828 {"__setstate__", (PyCFunction)arrayiter_setstate, METH_O,
2829 setstate_doc},
2830 {NULL, NULL} /* sentinel */
2831};
2832
Raymond Hettinger625812f2003-01-07 01:58:52 +00002833static PyTypeObject PyArrayIter_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 PyVarObject_HEAD_INIT(NULL, 0)
2835 "arrayiterator", /* tp_name */
2836 sizeof(arrayiterobject), /* tp_basicsize */
2837 0, /* tp_itemsize */
2838 /* methods */
2839 (destructor)arrayiter_dealloc, /* tp_dealloc */
2840 0, /* tp_print */
2841 0, /* tp_getattr */
2842 0, /* tp_setattr */
2843 0, /* tp_reserved */
2844 0, /* tp_repr */
2845 0, /* tp_as_number */
2846 0, /* tp_as_sequence */
2847 0, /* tp_as_mapping */
2848 0, /* tp_hash */
2849 0, /* tp_call */
2850 0, /* tp_str */
2851 PyObject_GenericGetAttr, /* tp_getattro */
2852 0, /* tp_setattro */
2853 0, /* tp_as_buffer */
2854 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2855 0, /* tp_doc */
2856 (traverseproc)arrayiter_traverse, /* tp_traverse */
2857 0, /* tp_clear */
2858 0, /* tp_richcompare */
2859 0, /* tp_weaklistoffset */
2860 PyObject_SelfIter, /* tp_iter */
2861 (iternextfunc)arrayiter_next, /* tp_iternext */
Kristján Valur Jónsson31668b82012-04-03 10:49:41 +00002862 arrayiter_methods, /* tp_methods */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002863};
2864
2865
2866/*********************** Install Module **************************/
2867
Martin v. Löwis99866332002-03-01 10:27:01 +00002868/* No functions in array module. */
2869static PyMethodDef a_methods[] = {
Alexandre Vassalottiad077152009-07-15 17:49:23 +00002870 {"_array_reconstructor", array_reconstructor, METH_VARARGS,
2871 PyDoc_STR("Internal. Used for pickling support.")},
Martin v. Löwis99866332002-03-01 10:27:01 +00002872 {NULL, NULL, 0, NULL} /* Sentinel */
2873};
2874
Martin v. Löwis1a214512008-06-11 05:26:20 +00002875static struct PyModuleDef arraymodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 PyModuleDef_HEAD_INIT,
2877 "array",
2878 module_doc,
2879 -1,
2880 a_methods,
2881 NULL,
2882 NULL,
2883 NULL,
2884 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00002885};
2886
Martin v. Löwis99866332002-03-01 10:27:01 +00002887
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002888PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002889PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 PyObject *m;
Georg Brandl4cb0de22011-09-28 21:49:49 +02002892 char buffer[Py_ARRAY_LENGTH(descriptors)], *p;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 PyObject *typecodes;
2894 Py_ssize_t size = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 if (PyType_Ready(&Arraytype) < 0)
2898 return NULL;
2899 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
2900 m = PyModule_Create(&arraymodule);
2901 if (m == NULL)
2902 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 Py_INCREF((PyObject *)&Arraytype);
2905 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2906 Py_INCREF((PyObject *)&Arraytype);
2907 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002908
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002909 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2910 size++;
2911 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002912
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002913 p = buffer;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2915 *p++ = (char)descr->typecode;
2916 }
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002917 typecodes = PyUnicode_DecodeASCII(buffer, p - buffer, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918
Martin v. Löwisd63a3b82011-09-28 07:41:54 +02002919 PyModule_AddObject(m, "typecodes", typecodes);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002920
2921 if (PyErr_Occurred()) {
2922 Py_DECREF(m);
2923 m = NULL;
2924 }
2925 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002926}