blob: 6dc46ad0b4d170c3ebe51160b30835bffdb9487a [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Travis E. Oliphantb803c512007-08-20 07:16:33 +000029 char *formats;
Guido van Rossum778983b1993-02-19 15:55:02 +000030};
31
32typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000033 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000034 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000035 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000036 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000037 PyObject *weakreflist; /* List of weak references */
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000038 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000039} arrayobject;
40
Jeremy Hylton938ace62002-07-17 16:30:39 +000041static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000042
Martin v. Löwis99866332002-03-01 10:27:01 +000043#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +000044#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000045
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000047array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000048{
49 char *items;
50 size_t _new_size;
51
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000052 if (self->ob_exports > 0 && newsize != Py_SIZE(self)) {
53 PyErr_SetString(PyExc_BufferError,
54 "cannot resize an array that is exporting buffers");
55 return -1;
56 }
57
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000058 /* Bypass realloc() when a previous overallocation is large enough
59 to accommodate the newsize. If the newsize is 16 smaller than the
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000060 current size, then proceed with the realloc() to shrink the array.
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000061 */
62
63 if (self->allocated >= newsize &&
Christian Heimes90aa7642007-12-19 02:45:37 +000064 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000065 self->ob_item != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +000066 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000067 return 0;
68 }
69
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +000070 if (newsize == 0) {
71 PyMem_FREE(self->ob_item);
72 self->ob_item = NULL;
73 Py_SIZE(self) = 0;
74 self->allocated = 0;
75 return 0;
76 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000077
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000078 /* This over-allocates proportional to the array size, making room
79 * for additional growth. The over-allocation is mild, but is
80 * enough to give linear-time amortized behavior over a long
81 * sequence of appends() in the presence of a poorly-performing
82 * system realloc().
83 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
84 * Note, the pattern starts out the same as for lists but then
85 * grows at a smaller rate so that larger arrays only overallocate
86 * by about 1/16th -- this is done because arrays are presumed to be more
87 * memory critical.
88 */
89
Christian Heimes90aa7642007-12-19 02:45:37 +000090 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000091 items = self->ob_item;
92 /* XXX The following multiplication and division does not optimize away
93 like it does for lists since the size is not known at compile time */
94 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
95 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
96 else
97 items = NULL;
98 if (items == NULL) {
99 PyErr_NoMemory();
100 return -1;
101 }
102 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000103 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000104 self->allocated = _new_size;
105 return 0;
106}
107
Tim Petersbb307342000-09-10 05:22:54 +0000108/****************************************************************************
109Get and Set functions for each type.
110A Get function takes an arrayobject* and an integer index, returning the
111array value at that index wrapped in an appropriate PyObject*.
112A Set function takes an arrayobject, integer index, and PyObject*; sets
113the array value at that index to the raw C data extracted from the PyObject*,
114and returns 0 if successful, else nonzero on failure (PyObject* not of an
115appropriate type or value).
116Note that the basic Get and Set functions do NOT check that the index is
117in bounds; that's the responsibility of the caller.
118****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000119
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000120static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000121b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000122{
123 long x = ((char *)ap->ob_item)[i];
124 if (x >= 128)
125 x -= 256;
Christian Heimes217cfd12007-12-02 14:31:20 +0000126 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000127}
128
129static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000130b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000131{
Fred Drake541dc3b2000-06-28 17:49:30 +0000132 short x;
133 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
134 must use the next size up that is signed ('h') and manually do
135 the overflow checking */
136 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000137 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000138 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000139 PyErr_SetString(PyExc_OverflowError,
140 "signed char is less than minimum");
141 return -1;
142 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000143 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000144 PyErr_SetString(PyExc_OverflowError,
145 "signed char is greater than maximum");
146 return -1;
147 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000148 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000149 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000150 return 0;
151}
152
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000153static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000154BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000155{
156 long x = ((unsigned char *)ap->ob_item)[i];
Christian Heimes217cfd12007-12-02 14:31:20 +0000157 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000158}
159
Fred Drake541dc3b2000-06-28 17:49:30 +0000160static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000161BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000162{
163 unsigned char x;
164 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
165 if (!PyArg_Parse(v, "b;array item must be integer", &x))
166 return -1;
167 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000168 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000169 return 0;
170}
Guido van Rossum549ab711997-01-03 19:09:47 +0000171
Martin v. Löwis99866332002-03-01 10:27:01 +0000172static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000173u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000174{
175 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
176}
177
178static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000179u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000180{
181 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000182 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000183
184 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
185 return -1;
186 if (len != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000187 PyErr_SetString(PyExc_TypeError,
188 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000189 return -1;
190 }
191 if (i >= 0)
192 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
193 return 0;
194}
Martin v. Löwis99866332002-03-01 10:27:01 +0000195
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000196
Guido van Rossum549ab711997-01-03 19:09:47 +0000197static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000198h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000199{
Christian Heimes217cfd12007-12-02 14:31:20 +0000200 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000201}
202
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000203
Guido van Rossum778983b1993-02-19 15:55:02 +0000204static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000205h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000206{
207 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000208 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000209 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000210 return -1;
211 if (i >= 0)
212 ((short *)ap->ob_item)[i] = x;
213 return 0;
214}
215
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000216static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000217HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000218{
Christian Heimes217cfd12007-12-02 14:31:20 +0000219 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000220}
221
Fred Drake541dc3b2000-06-28 17:49:30 +0000222static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000224{
225 int x;
226 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
227 must use the next size up and manually do the overflow checking */
228 if (!PyArg_Parse(v, "i;array item must be integer", &x))
229 return -1;
230 else if (x < 0) {
231 PyErr_SetString(PyExc_OverflowError,
232 "unsigned short is less than minimum");
233 return -1;
234 }
235 else if (x > USHRT_MAX) {
236 PyErr_SetString(PyExc_OverflowError,
237 "unsigned short is greater than maximum");
238 return -1;
239 }
240 if (i >= 0)
241 ((short *)ap->ob_item)[i] = (short)x;
242 return 0;
243}
Guido van Rossum549ab711997-01-03 19:09:47 +0000244
245static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000246i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000247{
Christian Heimes217cfd12007-12-02 14:31:20 +0000248 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000249}
250
251static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000252i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000253{
254 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000255 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000256 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000257 return -1;
258 if (i >= 0)
259 ((int *)ap->ob_item)[i] = x;
260 return 0;
261}
262
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000263static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000264II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000265{
266 return PyLong_FromUnsignedLong(
267 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
268}
269
270static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000271II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000272{
273 unsigned long x;
274 if (PyLong_Check(v)) {
275 x = PyLong_AsUnsignedLong(v);
276 if (x == (unsigned long) -1 && PyErr_Occurred())
277 return -1;
278 }
279 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000280 long y;
281 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000282 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000283 if (y < 0) {
284 PyErr_SetString(PyExc_OverflowError,
285 "unsigned int is less than minimum");
286 return -1;
287 }
288 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000289
Guido van Rossum549ab711997-01-03 19:09:47 +0000290 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000291 if (x > UINT_MAX) {
292 PyErr_SetString(PyExc_OverflowError,
293 "unsigned int is greater than maximum");
294 return -1;
295 }
296
Guido van Rossum549ab711997-01-03 19:09:47 +0000297 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000298 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000299 return 0;
300}
301
302static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000303l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000304{
Christian Heimes217cfd12007-12-02 14:31:20 +0000305 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000306}
307
308static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000309l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000310{
311 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000312 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000313 return -1;
314 if (i >= 0)
315 ((long *)ap->ob_item)[i] = x;
316 return 0;
317}
318
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000319static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000321{
322 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
323}
324
325static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000326LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000327{
328 unsigned long x;
329 if (PyLong_Check(v)) {
330 x = PyLong_AsUnsignedLong(v);
331 if (x == (unsigned long) -1 && PyErr_Occurred())
332 return -1;
333 }
334 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000335 long y;
336 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000337 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000338 if (y < 0) {
339 PyErr_SetString(PyExc_OverflowError,
340 "unsigned long is less than minimum");
341 return -1;
342 }
343 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000344
Guido van Rossum549ab711997-01-03 19:09:47 +0000345 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000346 if (x > ULONG_MAX) {
347 PyErr_SetString(PyExc_OverflowError,
348 "unsigned long is greater than maximum");
349 return -1;
350 }
Tim Petersbb307342000-09-10 05:22:54 +0000351
Guido van Rossum549ab711997-01-03 19:09:47 +0000352 if (i >= 0)
353 ((unsigned long *)ap->ob_item)[i] = x;
354 return 0;
355}
356
357static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000358f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000359{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000360 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000361}
362
363static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000365{
366 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000367 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000368 return -1;
369 if (i >= 0)
370 ((float *)ap->ob_item)[i] = x;
371 return 0;
372}
373
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000374static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000375d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000376{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000377 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000378}
379
380static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000381d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000382{
383 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000384 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000385 return -1;
386 if (i >= 0)
387 ((double *)ap->ob_item)[i] = x;
388 return 0;
389}
390
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000391
Guido van Rossum778983b1993-02-19 15:55:02 +0000392/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000393static struct arraydescr descriptors[] = {
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000394 {'b', 1, b_getitem, b_setitem, "b"},
395 {'B', 1, BB_getitem, BB_setitem, "B"},
Travis E. Oliphantddacf962007-10-13 21:03:27 +0000396 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u"},
Travis E. Oliphantb803c512007-08-20 07:16:33 +0000397 {'h', sizeof(short), h_getitem, h_setitem, "h"},
398 {'H', sizeof(short), HH_getitem, HH_setitem, "H"},
399 {'i', sizeof(int), i_getitem, i_setitem, "i"},
400 {'I', sizeof(int), II_getitem, II_setitem, "I"},
401 {'l', sizeof(long), l_getitem, l_setitem, "l"},
402 {'L', sizeof(long), LL_getitem, LL_setitem, "L"},
403 {'f', sizeof(float), f_getitem, f_setitem, "f"},
404 {'d', sizeof(double), d_getitem, d_setitem, "d"},
405 {'\0', 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000406};
Tim Petersbb307342000-09-10 05:22:54 +0000407
408/****************************************************************************
409Implementations of array object methods.
410****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000411
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000412static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000413newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000414{
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000416 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000417
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000419 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 return NULL;
421 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000422
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 nbytes = size * descr->itemsize;
424 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000425 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000426 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000427 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000428 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000429 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000430 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000431 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000432 op->ob_descr = descr;
433 op->allocated = size;
434 op->weakreflist = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000435 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 if (size <= 0) {
437 op->ob_item = NULL;
438 }
439 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000440 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000441 if (op->ob_item == NULL) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000442 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 }
445 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000446 op->ob_exports = 0;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000447 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000448}
449
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000450static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000451getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000452{
453 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000454 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000455 ap = (arrayobject *)op;
Christian Heimes90aa7642007-12-19 02:45:37 +0000456 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 return (*ap->ob_descr->getitem)(ap, i);
458}
459
460static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000461ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000462{
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 char *items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000464 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000466 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 return -1;
468 }
469 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
470 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000471
472 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000473 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000474 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000475 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0)
478 where = 0;
479 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000480 if (where > n)
481 where = n;
482 /* appends don't need to call memmove() */
483 if (where != n)
484 memmove(items + (where+1)*self->ob_descr->itemsize,
485 items + where*self->ob_descr->itemsize,
486 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000487 return (*self->ob_descr->setitem)(self, where, v);
488}
489
Guido van Rossum778983b1993-02-19 15:55:02 +0000490/* Methods */
491
492static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000493array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000494{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000495 if (op->weakreflist != NULL)
496 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000497 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000498 PyMem_DEL(op->ob_item);
Christian Heimes90aa7642007-12-19 02:45:37 +0000499 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000500}
501
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000502static PyObject *
503array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000504{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000505 arrayobject *va, *wa;
506 PyObject *vi = NULL;
507 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000508 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000509 PyObject *res;
510
Martin v. Löwis99866332002-03-01 10:27:01 +0000511 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000512 Py_INCREF(Py_NotImplemented);
513 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000514 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000515
516 va = (arrayobject *)v;
517 wa = (arrayobject *)w;
518
Christian Heimes90aa7642007-12-19 02:45:37 +0000519 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000520 /* Shortcut: if the lengths differ, the arrays differ */
521 if (op == Py_EQ)
522 res = Py_False;
523 else
524 res = Py_True;
525 Py_INCREF(res);
526 return res;
527 }
528
529 /* Search for the first index where items are different */
530 k = 1;
Christian Heimes90aa7642007-12-19 02:45:37 +0000531 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000532 vi = getarrayitem(v, i);
533 wi = getarrayitem(w, i);
534 if (vi == NULL || wi == NULL) {
535 Py_XDECREF(vi);
536 Py_XDECREF(wi);
537 return NULL;
538 }
539 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
540 if (k == 0)
541 break; /* Keeping vi and wi alive! */
542 Py_DECREF(vi);
543 Py_DECREF(wi);
544 if (k < 0)
545 return NULL;
546 }
547
548 if (k) {
549 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +0000550 Py_ssize_t vs = Py_SIZE(va);
551 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000552 int cmp;
553 switch (op) {
554 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000555 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000556 case Py_EQ: cmp = vs == ws; break;
557 case Py_NE: cmp = vs != ws; break;
558 case Py_GT: cmp = vs > ws; break;
559 case Py_GE: cmp = vs >= ws; break;
560 default: return NULL; /* cannot happen */
561 }
562 if (cmp)
563 res = Py_True;
564 else
565 res = Py_False;
566 Py_INCREF(res);
567 return res;
568 }
569
570 /* We have an item that differs. First, shortcuts for EQ/NE */
571 if (op == Py_EQ) {
572 Py_INCREF(Py_False);
573 res = Py_False;
574 }
575 else if (op == Py_NE) {
576 Py_INCREF(Py_True);
577 res = Py_True;
578 }
579 else {
580 /* Compare the final item again using the proper operator */
581 res = PyObject_RichCompare(vi, wi, op);
582 }
583 Py_DECREF(vi);
584 Py_DECREF(wi);
585 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000586}
587
Martin v. Löwis18e16552006-02-15 17:27:45 +0000588static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000589array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000590{
Christian Heimes90aa7642007-12-19 02:45:37 +0000591 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000592}
593
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000594static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000595array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000596{
Christian Heimes90aa7642007-12-19 02:45:37 +0000597 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000598 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000599 return NULL;
600 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000601 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000602}
603
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000604static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000605array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000606{
607 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000608 if (ilow < 0)
609 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000610 else if (ilow > Py_SIZE(a))
611 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000612 if (ihigh < 0)
613 ihigh = 0;
614 if (ihigh < ilow)
615 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000616 else if (ihigh > Py_SIZE(a))
617 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000618 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000619 if (np == NULL)
620 return NULL;
621 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
622 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000623 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000624}
625
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000626static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000627array_copy(arrayobject *a, PyObject *unused)
628{
Christian Heimes90aa7642007-12-19 02:45:37 +0000629 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000630}
631
632PyDoc_STRVAR(copy_doc,
633"copy(array)\n\
634\n\
635 Return a copy of the array.");
636
637static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000638array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000639{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000640 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000641 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000642 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000643 PyErr_Format(PyExc_TypeError,
644 "can only append array (not \"%.200s\") to array",
Christian Heimes90aa7642007-12-19 02:45:37 +0000645 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000646 return NULL;
647 }
648#define b ((arrayobject *)bb)
649 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000650 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000651 return NULL;
652 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000653 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
654 return PyErr_NoMemory();
655 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000656 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000657 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000658 if (np == NULL) {
659 return NULL;
660 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000661 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
662 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
663 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000664 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000665#undef b
666}
667
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000668static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000669array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000670{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671 Py_ssize_t i;
672 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000673 arrayobject *np;
674 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000675 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000676 if (n < 0)
677 n = 0;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000678 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
679 return PyErr_NoMemory();
680 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000681 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000682 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 if (np == NULL)
684 return NULL;
685 p = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000686 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000687 for (i = 0; i < n; i++) {
688 memcpy(p, a->ob_item, nbytes);
689 p += nbytes;
690 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000691 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000692}
693
694static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000695array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000696{
697 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000698 Py_ssize_t n; /* Size of replacement array */
699 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000700#define b ((arrayobject *)v)
701 if (v == NULL)
702 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000703 else if (array_Check(v)) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000704 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000705 if (a == b) {
706 /* Special case "a[i:j] = a" -- copy b first */
707 int ret;
708 v = array_slice(b, 0, n);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000709 if (!v)
710 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000711 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000712 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 return ret;
714 }
715 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000716 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000717 return -1;
718 }
719 }
720 else {
Fred Drake137507e2000-06-01 02:02:46 +0000721 PyErr_Format(PyExc_TypeError,
722 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +0000723 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000724 return -1;
725 }
726 if (ilow < 0)
727 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000728 else if (ilow > Py_SIZE(a))
729 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000730 if (ihigh < 0)
731 ihigh = 0;
732 if (ihigh < ilow)
733 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000734 else if (ihigh > Py_SIZE(a))
735 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000736 item = a->ob_item;
737 d = n - (ihigh-ilow);
738 if (d < 0) { /* Delete -d items */
739 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
740 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000741 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000742 if (array_resize(a, Py_SIZE(a) + d) == -1)
743 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000744 }
745 else if (d > 0) { /* Insert d items */
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000746 if (array_resize(a, Py_SIZE(a) + d))
Guido van Rossum778983b1993-02-19 15:55:02 +0000747 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000748 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
749 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000750 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000751 }
752 if (n > 0)
753 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
754 n*b->ob_descr->itemsize);
755 return 0;
756#undef b
757}
758
759static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000760array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000761{
Christian Heimes90aa7642007-12-19 02:45:37 +0000762 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000763 PyErr_SetString(PyExc_IndexError,
764 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000765 return -1;
766 }
767 if (v == NULL)
768 return array_ass_slice(a, i, i+1, v);
769 return (*a->ob_descr->setitem)(a, i, v);
770}
771
772static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000773setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000774{
Martin v. Löwis99866332002-03-01 10:27:01 +0000775 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000776 return array_ass_item((arrayobject *)a, i, v);
777}
778
Martin v. Löwis99866332002-03-01 10:27:01 +0000779static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000780array_iter_extend(arrayobject *self, PyObject *bb)
781{
782 PyObject *it, *v;
783
784 it = PyObject_GetIter(bb);
785 if (it == NULL)
786 return -1;
787
788 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000789 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000790 Py_DECREF(v);
791 Py_DECREF(it);
792 return -1;
793 }
794 Py_DECREF(v);
795 }
796 Py_DECREF(it);
797 if (PyErr_Occurred())
798 return -1;
799 return 0;
800}
801
802static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000803array_do_extend(arrayobject *self, PyObject *bb)
804{
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000805 Py_ssize_t size, oldsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000806
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000807 if (!array_Check(bb))
808 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000809#define b ((arrayobject *)bb)
810 if (self->ob_descr != b->ob_descr) {
811 PyErr_SetString(PyExc_TypeError,
812 "can only extend with array of same kind");
813 return -1;
814 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000815 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
816 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
817 PyErr_NoMemory();
818 return -1;
819 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000820 oldsize = Py_SIZE(self);
821 size = oldsize + Py_SIZE(b);
822 if (array_resize(self, size) == -1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000823 return -1;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000824 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
825 b->ob_item, Py_SIZE(b) * b->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +0000826
827 return 0;
828#undef b
829}
830
831static PyObject *
832array_inplace_concat(arrayobject *self, PyObject *bb)
833{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000834 if (!array_Check(bb)) {
835 PyErr_Format(PyExc_TypeError,
836 "can only extend array with array (not \"%.200s\")",
Christian Heimes90aa7642007-12-19 02:45:37 +0000837 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000838 return NULL;
839 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000840 if (array_do_extend(self, bb) == -1)
841 return NULL;
842 Py_INCREF(self);
843 return (PyObject *)self;
844}
845
846static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000847array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000848{
849 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000850 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000851
Christian Heimes90aa7642007-12-19 02:45:37 +0000852 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000853 if (n < 0)
854 n = 0;
855 items = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000856 if ((self->ob_descr->itemsize != 0) &&
857 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
858 return PyErr_NoMemory();
859 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000860 size = Py_SIZE(self) * self->ob_descr->itemsize;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000861 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
862 return PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000863 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000864 if (array_resize(self, n * Py_SIZE(self)) == -1)
865 return NULL;
866 items = p = self->ob_item;
867 for (i = 1; i < n; i++) {
868 p += size;
869 memcpy(p, items, size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000870 }
871 }
872 Py_INCREF(self);
873 return (PyObject *)self;
874}
875
876
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000877static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000878ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000879{
880 if (ins1(self, where, v) != 0)
881 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882 Py_INCREF(Py_None);
883 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000884}
885
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000886static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000887array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000888{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000889 Py_ssize_t count = 0;
890 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000891
Christian Heimes90aa7642007-12-19 02:45:37 +0000892 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000893 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000894 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000895 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000896 if (cmp > 0)
897 count++;
898 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000899 return NULL;
900 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000901 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000902}
903
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000904PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000905"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000906\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000907Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000908
909static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000910array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000912 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913
Christian Heimes90aa7642007-12-19 02:45:37 +0000914 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000915 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000916 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
917 Py_DECREF(selfi);
918 if (cmp > 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000919 return PyLong_FromLong((long)i);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000921 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922 return NULL;
923 }
924 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
925 return NULL;
926}
927
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000928PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000929"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000931Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000932
Raymond Hettinger625812f2003-01-07 01:58:52 +0000933static int
934array_contains(arrayobject *self, PyObject *v)
935{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000936 Py_ssize_t i;
937 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000938
Christian Heimes90aa7642007-12-19 02:45:37 +0000939 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000940 PyObject *selfi = getarrayitem((PyObject *)self, i);
941 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
942 Py_DECREF(selfi);
943 }
944 return cmp;
945}
946
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000947static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000948array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000949{
950 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000951
Christian Heimes90aa7642007-12-19 02:45:37 +0000952 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000953 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000954 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
955 Py_DECREF(selfi);
956 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000957 if (array_ass_slice(self, i, i+1,
958 (PyObject *)NULL) != 0)
959 return NULL;
960 Py_INCREF(Py_None);
961 return Py_None;
962 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000963 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000964 return NULL;
965 }
966 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
967 return NULL;
968}
969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000970PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000971"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000972\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000973Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974
975static PyObject *
976array_pop(arrayobject *self, PyObject *args)
977{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000978 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000980 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000982 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000983 /* Special-case most common failure cause */
984 PyErr_SetString(PyExc_IndexError, "pop from empty array");
985 return NULL;
986 }
987 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000988 i += Py_SIZE(self);
989 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000990 PyErr_SetString(PyExc_IndexError, "pop index out of range");
991 return NULL;
992 }
993 v = getarrayitem((PyObject *)self,i);
994 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
995 Py_DECREF(v);
996 return NULL;
997 }
998 return v;
999}
1000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001001PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001002"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001003\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001004Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001005
1006static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001007array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001008{
Martin v. Löwis99866332002-03-01 10:27:01 +00001009 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001011 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001013}
1014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001015PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001016"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001017\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001018 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019
1020static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001021array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001022{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001023 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001024 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001025 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001026 return NULL;
1027 return ins(self, i, v);
1028}
1029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001030PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001031"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001033Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001034
1035
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001037array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001038{
Tim Peters077a11d2000-09-16 22:31:29 +00001039 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001040 retval = PyTuple_New(2);
1041 if (!retval)
1042 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001043
1044 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimes90aa7642007-12-19 02:45:37 +00001045 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001046
1047 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001048}
1049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001050PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001051"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001052\n\
1053Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001054the length in items of the buffer used to hold array's contents\n\
1055The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001056the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001057
1058
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001059static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001060array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001061{
Christian Heimes90aa7642007-12-19 02:45:37 +00001062 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001063}
1064
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001065PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001066"append(x)\n\
1067\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001068Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001069
1070
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001071static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001072array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001073{
1074 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001075 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001076
Guido van Rossum778983b1993-02-19 15:55:02 +00001077 switch (self->ob_descr->itemsize) {
1078 case 1:
1079 break;
1080 case 2:
Christian Heimes90aa7642007-12-19 02:45:37 +00001081 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001082 char p0 = p[0];
1083 p[0] = p[1];
1084 p[1] = p0;
1085 }
1086 break;
1087 case 4:
Christian Heimes90aa7642007-12-19 02:45:37 +00001088 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001089 char p0 = p[0];
1090 char p1 = p[1];
1091 p[0] = p[3];
1092 p[1] = p[2];
1093 p[2] = p1;
1094 p[3] = p0;
1095 }
1096 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001097 case 8:
Christian Heimes90aa7642007-12-19 02:45:37 +00001098 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001099 char p0 = p[0];
1100 char p1 = p[1];
1101 char p2 = p[2];
1102 char p3 = p[3];
1103 p[0] = p[7];
1104 p[1] = p[6];
1105 p[2] = p[5];
1106 p[3] = p[4];
1107 p[4] = p3;
1108 p[5] = p2;
1109 p[6] = p1;
1110 p[7] = p0;
1111 }
1112 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001113 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001114 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001115 "don't know how to byteswap this array type");
1116 return NULL;
1117 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001118 Py_INCREF(Py_None);
1119 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001120}
1121
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001122PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001123"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001124\n\
Fred Drakebf272981999-12-03 17:15:30 +00001125Byteswap 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 +000011264, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001127
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001128static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001129array_reduce(arrayobject *array)
1130{
1131 PyObject *dict, *result;
1132
1133 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1134 if (dict == NULL) {
1135 PyErr_Clear();
1136 dict = Py_None;
1137 Py_INCREF(dict);
1138 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001139 if (Py_SIZE(array) > 0) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001140 if (array->ob_descr->itemsize
1141 > PY_SSIZE_T_MAX / Py_SIZE(array)) {
1142 return PyErr_NoMemory();
1143 }
Benjamin Petersona921fb02009-04-03 22:18:11 +00001144 result = Py_BuildValue("O(Cy#)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001145 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 array->ob_descr->typecode,
1147 array->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001148 Py_SIZE(array) * array->ob_descr->itemsize,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001149 dict);
1150 } else {
Benjamin Petersona921fb02009-04-03 22:18:11 +00001151 result = Py_BuildValue("O(C)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001152 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001153 array->ob_descr->typecode,
1154 dict);
1155 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001156 Py_DECREF(dict);
1157 return result;
1158}
1159
1160PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1161
1162static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001163array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001164{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001165 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001166 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001167 /* little buffer to hold items while swapping */
1168 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001169 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001170
Christian Heimes90aa7642007-12-19 02:45:37 +00001171 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001172 for (p = self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001173 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001174 p < q;
1175 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001176 /* memory areas guaranteed disjoint, so memcpy
1177 * is safe (& memmove may be slower).
1178 */
1179 memcpy(tmp, p, itemsize);
1180 memcpy(p, q, itemsize);
1181 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001182 }
1183 }
Tim Petersbb307342000-09-10 05:22:54 +00001184
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001185 Py_INCREF(Py_None);
1186 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001187}
Guido van Rossume77a7571993-11-03 15:01:26 +00001188
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001189PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001190"reverse()\n\
1191\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001192Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001193
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001194
1195/* Forward */
1196static PyObject *array_fromstring(arrayobject *self, PyObject *args);
1197
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001198static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001199array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001200{
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001201 PyObject *f, *b, *res;
1202 Py_ssize_t itemsize = self->ob_descr->itemsize;
1203 Py_ssize_t n, nbytes;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001204 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001205
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001206 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001207 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001208
1209 nbytes = n * itemsize;
1210 if (nbytes < 0 || nbytes/itemsize != n) {
1211 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001212 return NULL;
1213 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001214
1215 b = PyObject_CallMethod(f, "read", "n", nbytes);
1216 if (b == NULL)
1217 return NULL;
1218
Christian Heimes72b710a2008-05-26 13:28:38 +00001219 if (!PyBytes_Check(b)) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001220 PyErr_SetString(PyExc_TypeError,
1221 "read() didn't return bytes");
1222 Py_DECREF(b);
1223 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001224 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001225
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001226 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001227
1228 args = Py_BuildValue("(O)", b);
1229 Py_DECREF(b);
1230 if (args == NULL)
1231 return NULL;
1232
1233 res = array_fromstring(self, args);
1234 Py_DECREF(args);
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001235 if (res == NULL)
1236 return NULL;
1237
1238 if (not_enough_bytes) {
1239 PyErr_SetString(PyExc_EOFError,
1240 "read() didn't return enough bytes");
1241 Py_DECREF(res);
1242 return NULL;
1243 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001244
1245 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001246}
1247
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001248PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001249"fromfile(f, n)\n\
1250\n\
1251Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001252array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001253
1254
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001255static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001256array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001257{
Christian Heimes90aa7642007-12-19 02:45:37 +00001258 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001259 /* Write 64K blocks at a time */
1260 /* XXX Make the block size settable */
1261 int BLOCKSIZE = 64*1024;
1262 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1263 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001264
Christian Heimes90aa7642007-12-19 02:45:37 +00001265 if (Py_SIZE(self) == 0)
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001266 goto done;
1267
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001268 for (i = 0; i < nblocks; i++) {
1269 char* ptr = self->ob_item + i*BLOCKSIZE;
1270 Py_ssize_t size = BLOCKSIZE;
1271 PyObject *bytes, *res;
1272 if (i*BLOCKSIZE + size > nbytes)
1273 size = nbytes - i*BLOCKSIZE;
Christian Heimes72b710a2008-05-26 13:28:38 +00001274 bytes = PyBytes_FromStringAndSize(ptr, size);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001275 if (bytes == NULL)
Guido van Rossum778983b1993-02-19 15:55:02 +00001276 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001277 res = PyObject_CallMethod(f, "write", "O", bytes);
1278 Py_DECREF(bytes);
1279 if (res == NULL)
1280 return NULL;
Martin v. Löwisa291c8f2007-08-11 14:25:27 +00001281 Py_DECREF(res); /* drop write result */
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001282 }
1283
1284 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001285 Py_INCREF(Py_None);
1286 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001287}
1288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001289PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001290"tofile(f)\n\
1291\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001292Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001293
1294
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001296array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001297{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001298 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001299
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001300 if (!PyList_Check(list)) {
1301 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001302 return NULL;
1303 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001304 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001305 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001306 Py_ssize_t i, old_size;
1307 old_size = Py_SIZE(self);
1308 if (array_resize(self, old_size + n) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +00001309 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001310 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001311 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001312 if ((*self->ob_descr->setitem)(self,
Christian Heimes90aa7642007-12-19 02:45:37 +00001313 Py_SIZE(self) - n + i, v) != 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001314 array_resize(self, old_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001315 return NULL;
1316 }
1317 }
1318 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001319 Py_INCREF(Py_None);
1320 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001321}
1322
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001323PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001324"fromlist(list)\n\
1325\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001326Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001327
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001328static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001329array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001330{
Christian Heimes90aa7642007-12-19 02:45:37 +00001331 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001332 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001333
Guido van Rossum778983b1993-02-19 15:55:02 +00001334 if (list == NULL)
1335 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001336 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001337 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001338 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001339 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001340 return NULL;
1341 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001342 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 }
1344 return list;
1345}
1346
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001347PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001348"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001349\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001350Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001351
1352
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001353static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001354array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001355{
1356 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001357 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001358 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001359 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001360 return NULL;
1361 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 "string length not a multiple of item size");
1364 return NULL;
1365 }
1366 n = n / itemsize;
1367 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001368 Py_ssize_t old_size = Py_SIZE(self);
1369 if ((n > PY_SSIZE_T_MAX - old_size) ||
1370 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001371 return PyErr_NoMemory();
1372 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001373 if (array_resize(self, old_size + n) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +00001374 return NULL;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001375 memcpy(self->ob_item + old_size * itemsize,
1376 str, n * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001377 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001378 Py_INCREF(Py_None);
1379 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001380}
1381
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001382PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001383"fromstring(string)\n\
1384\n\
1385Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001386values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001387
1388
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001389static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001390array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001391{
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001392 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1393 return PyBytes_FromStringAndSize(self->ob_item,
1394 Py_SIZE(self) * self->ob_descr->itemsize);
1395 } else {
1396 return PyErr_NoMemory();
1397 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001398}
1399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001400PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001401"tostring() -> string\n\
1402\n\
1403Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001404representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001405
Martin v. Löwis99866332002-03-01 10:27:01 +00001406
1407
Martin v. Löwis99866332002-03-01 10:27:01 +00001408static PyObject *
1409array_fromunicode(arrayobject *self, PyObject *args)
1410{
1411 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001412 Py_ssize_t n;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001413 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001414
1415 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1416 return NULL;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001417 typecode = self->ob_descr->typecode;
1418 if ((typecode != 'u')) {
1419 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001420 "fromunicode() may only be called on "
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001421 "unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001422 return NULL;
1423 }
1424 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001425 Py_ssize_t old_size = Py_SIZE(self);
1426 if (array_resize(self, old_size + n) == -1)
Martin v. Löwis99866332002-03-01 10:27:01 +00001427 return NULL;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001428 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
Martin v. Löwis99866332002-03-01 10:27:01 +00001429 ustr, n * sizeof(Py_UNICODE));
1430 }
1431
1432 Py_INCREF(Py_None);
1433 return Py_None;
1434}
1435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001436PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001437"fromunicode(ustr)\n\
1438\n\
1439Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001440The array must be a unicode type array; otherwise a ValueError\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001441is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001443
1444
1445static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001446array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001447{
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001448 char typecode;
1449 typecode = self->ob_descr->typecode;
1450 if ((typecode != 'u')) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001451 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001452 "tounicode() may only be called on unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001453 return NULL;
1454 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001455 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001456}
1457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001458PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001459"tounicode() -> unicode\n\
1460\n\
1461Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001462a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001463array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001464an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001465
Martin v. Löwis99866332002-03-01 10:27:01 +00001466
1467
1468static PyObject *
1469array_get_typecode(arrayobject *a, void *closure)
1470{
1471 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001472 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001473}
1474
1475static PyObject *
1476array_get_itemsize(arrayobject *a, void *closure)
1477{
Christian Heimes217cfd12007-12-02 14:31:20 +00001478 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001479}
1480
1481static PyGetSetDef array_getsets [] = {
1482 {"typecode", (getter) array_get_typecode, NULL,
1483 "the typecode character used to create the array"},
1484 {"itemsize", (getter) array_get_itemsize, NULL,
1485 "the size, in bytes, of one array item"},
1486 {NULL}
1487};
1488
Martin v. Löwis59683e82008-06-13 07:50:45 +00001489static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001490 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001491 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001492 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001493 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001494 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001495 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001496 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1497 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001498 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001499 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001500 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001501 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001502 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001503 extend_doc},
1504 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1505 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001506 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001507 fromlist_doc},
1508 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1509 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001510 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1511 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001512 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001513 index_doc},
1514 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1515 insert_doc},
1516 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1517 pop_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001518 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1519 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001520 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001521 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001522 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001523 reverse_doc},
1524/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1525 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001526 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001527 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001528 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001529 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001530 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001531 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001532 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001533 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001534 {NULL, NULL} /* sentinel */
1535};
1536
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001537static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001538array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001539{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00001540 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001541 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001542 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001543
Christian Heimes90aa7642007-12-19 02:45:37 +00001544 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001545 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001546 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001547 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00001548 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001549 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001550 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001551 else
1552 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001553
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001554 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
1555 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001556 return s;
1557}
1558
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001559static PyObject*
1560array_subscr(arrayobject* self, PyObject* item)
1561{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001562 if (PyIndex_Check(item)) {
1563 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001564 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001565 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001566 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001567 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001568 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001569 return array_item(self, i);
1570 }
1571 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001572 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001573 PyObject* result;
1574 arrayobject* ar;
1575 int itemsize = self->ob_descr->itemsize;
1576
Christian Heimes90aa7642007-12-19 02:45:37 +00001577 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001578 &start, &stop, &step, &slicelength) < 0) {
1579 return NULL;
1580 }
1581
1582 if (slicelength <= 0) {
1583 return newarrayobject(&Arraytype, 0, self->ob_descr);
1584 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001585 else if (step == 1) {
1586 PyObject *result = newarrayobject(&Arraytype,
1587 slicelength, self->ob_descr);
1588 if (result == NULL)
1589 return NULL;
1590 memcpy(((arrayobject *)result)->ob_item,
1591 self->ob_item + start * itemsize,
1592 slicelength * itemsize);
1593 return result;
1594 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001595 else {
1596 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1597 if (!result) return NULL;
1598
1599 ar = (arrayobject*)result;
1600
1601 for (cur = start, i = 0; i < slicelength;
1602 cur += step, i++) {
1603 memcpy(ar->ob_item + i*itemsize,
1604 self->ob_item + cur*itemsize,
1605 itemsize);
1606 }
1607
1608 return result;
1609 }
1610 }
1611 else {
1612 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00001613 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001614 return NULL;
1615 }
1616}
1617
1618static int
1619array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1620{
Thomas Woutersed03b412007-08-28 21:37:11 +00001621 Py_ssize_t start, stop, step, slicelength, needed;
1622 arrayobject* other;
1623 int itemsize;
1624
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001625 if (PyIndex_Check(item)) {
1626 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00001627
1628 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001629 return -1;
1630 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001631 i += Py_SIZE(self);
1632 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001633 PyErr_SetString(PyExc_IndexError,
1634 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001635 return -1;
1636 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001637 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001638 /* Fall through to slice assignment */
1639 start = i;
1640 stop = i + 1;
1641 step = 1;
1642 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001643 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001644 else
1645 return (*self->ob_descr->setitem)(self, i, value);
1646 }
1647 else if (PySlice_Check(item)) {
1648 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001649 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00001650 &step, &slicelength) < 0) {
1651 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001652 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001653 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001654 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00001655 PyErr_SetString(PyExc_TypeError,
1656 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001657 return -1;
1658 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001659 if (value == NULL) {
1660 other = NULL;
1661 needed = 0;
1662 }
1663 else if (array_Check(value)) {
1664 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00001665 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00001666 if (self == other) {
1667 /* Special case "self[i:j] = self" -- copy self first */
1668 int ret;
1669 value = array_slice(other, 0, needed);
1670 if (value == NULL)
1671 return -1;
1672 ret = array_ass_subscr(self, item, value);
1673 Py_DECREF(value);
1674 return ret;
1675 }
1676 if (other->ob_descr != self->ob_descr) {
1677 PyErr_BadArgument();
1678 return -1;
1679 }
1680 }
1681 else {
1682 PyErr_Format(PyExc_TypeError,
1683 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00001684 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00001685 return -1;
1686 }
1687 itemsize = self->ob_descr->itemsize;
1688 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1689 if ((step > 0 && stop < start) ||
1690 (step < 0 && stop > start))
1691 stop = start;
1692 if (step == 1) {
1693 if (slicelength > needed) {
1694 memmove(self->ob_item + (start + needed) * itemsize,
1695 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001696 (Py_SIZE(self) - stop) * itemsize);
1697 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001698 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001699 return -1;
1700 }
1701 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001702 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001703 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001704 return -1;
1705 memmove(self->ob_item + (start + needed) * itemsize,
1706 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001707 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001708 }
1709 if (needed > 0)
1710 memcpy(self->ob_item + start * itemsize,
1711 other->ob_item, needed * itemsize);
1712 return 0;
1713 }
1714 else if (needed == 0) {
1715 /* Delete slice */
1716 Py_ssize_t cur, i;
1717
1718 if (step < 0) {
1719 stop = start + 1;
1720 start = stop + step * (slicelength - 1) - 1;
1721 step = -step;
1722 }
1723 for (cur = start, i = 0; i < slicelength;
1724 cur += step, i++) {
1725 Py_ssize_t lim = step - 1;
1726
Christian Heimes90aa7642007-12-19 02:45:37 +00001727 if (cur + step >= Py_SIZE(self))
1728 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00001729 memmove(self->ob_item + (cur - i) * itemsize,
1730 self->ob_item + (cur + 1) * itemsize,
1731 lim * itemsize);
1732 }
1733 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00001734 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001735 memmove(self->ob_item + (cur-slicelength) * itemsize,
1736 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001737 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001738 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001739 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001740 return -1;
1741 return 0;
1742 }
1743 else {
1744 Py_ssize_t cur, i;
1745
1746 if (needed != slicelength) {
1747 PyErr_Format(PyExc_ValueError,
1748 "attempt to assign array of size %zd "
1749 "to extended slice of size %zd",
1750 needed, slicelength);
1751 return -1;
1752 }
1753 for (cur = start, i = 0; i < slicelength;
1754 cur += step, i++) {
1755 memcpy(self->ob_item + cur * itemsize,
1756 other->ob_item + i * itemsize,
1757 itemsize);
1758 }
1759 return 0;
1760 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001761}
1762
1763static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001764 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001765 (binaryfunc)array_subscr,
1766 (objobjargproc)array_ass_subscr
1767};
1768
Guido van Rossumd8faa362007-04-27 19:54:29 +00001769static const void *emptybuf = "";
1770
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001771
1772static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001773array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001774{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001775 if (view==NULL) goto finish;
1776
1777 view->buf = (void *)self->ob_item;
Martin v. Löwis423be952008-08-13 15:53:07 +00001778 view->obj = (PyObject*)self;
1779 Py_INCREF(self);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001780 if (view->buf == NULL)
1781 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00001782 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001783 view->readonly = 0;
1784 view->ndim = 1;
1785 view->itemsize = self->ob_descr->itemsize;
1786 view->suboffsets = NULL;
1787 view->shape = NULL;
1788 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001789 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001790 }
1791 view->strides = NULL;
1792 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
1793 view->strides = &(view->itemsize);
1794 view->format = NULL;
1795 view->internal = NULL;
1796 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00001797 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001798#ifdef Py_UNICODE_WIDE
1799 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00001800 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001801 }
1802#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001803 }
1804
1805 finish:
1806 self->ob_exports++;
1807 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001808}
1809
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001810static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001811array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001812{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001813 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001814}
1815
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001816static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001817 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001818 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001819 (ssizeargfunc)array_repeat, /*sq_repeat*/
1820 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001821 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001822 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001823 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001824 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001825 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001827};
1828
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001829static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001830 (getbufferproc)array_buffer_getbuf,
1831 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001832};
1833
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001834static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001835array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001836{
Guido van Rossum8934fc22007-06-30 23:44:36 +00001837 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001838 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001839 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001840
Thomas Woutersb2137042007-02-01 18:02:27 +00001841 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001842 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001843
Walter Dörwaldd0941302007-07-01 21:58:22 +00001844 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00001845 return NULL;
1846
1847 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00001848 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00001849 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00001850 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001851 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001852 it = PyObject_GetIter(initial);
1853 if (it == NULL)
1854 return NULL;
1855 /* We set initial to NULL so that the subsequent code
1856 will create an empty array of the appropriate type
1857 and afterwards we can use array_iter_extend to populate
1858 the array.
1859 */
1860 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001861 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001862 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1863 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001864 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001865 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001866
1867 if (initial == NULL || !(PyList_Check(initial)
1868 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001869 len = 0;
1870 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001871 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001872
1873 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001874 if (a == NULL)
1875 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001876
Guido van Rossum778983b1993-02-19 15:55:02 +00001877 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001878 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001879 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001880 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001881 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001882 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001883 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001884 return NULL;
1885 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001886 if (setarrayitem(a, i, v) != 0) {
1887 Py_DECREF(v);
1888 Py_DECREF(a);
1889 return NULL;
1890 }
1891 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001892 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001893 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00001894 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00001895 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001896 PyObject *t_initial, *v;
1897 t_initial = PyTuple_Pack(1, initial);
1898 if (t_initial == NULL) {
1899 Py_DECREF(a);
1900 return NULL;
1901 }
1902 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001903 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001904 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001905 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001906 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001907 return NULL;
1908 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001909 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001910 }
1911 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001912 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001913 if (n > 0) {
1914 arrayobject *self = (arrayobject *)a;
1915 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001916 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001917 if (item == NULL) {
1918 PyErr_NoMemory();
1919 Py_DECREF(a);
1920 return NULL;
1921 }
1922 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001923 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001924 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00001925 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001926 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001927 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001928 if (it != NULL) {
1929 if (array_iter_extend((arrayobject *)a, it) == -1) {
1930 Py_DECREF(it);
1931 Py_DECREF(a);
1932 return NULL;
1933 }
1934 Py_DECREF(it);
1935 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001936 return a;
1937 }
1938 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001939 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00001940 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001941 return NULL;
1942}
1943
Guido van Rossum778983b1993-02-19 15:55:02 +00001944
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001945PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001946"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001947an array of basic values: characters, integers, floating point\n\
1948numbers. Arrays are sequence types and behave very much like lists,\n\
1949except that the type of objects stored in them is constrained. The\n\
1950type is specified at object creation time by using a type code, which\n\
1951is a single character. The following type codes are defined:\n\
1952\n\
1953 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001954 'b' signed integer 1 \n\
1955 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001956 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001957 'h' signed integer 2 \n\
1958 'H' unsigned integer 2 \n\
1959 'i' signed integer 2 \n\
1960 'I' unsigned integer 2 \n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001961 'w' unicode character 4 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001962 'l' signed integer 4 \n\
1963 'L' unsigned integer 4 \n\
1964 'f' floating point 4 \n\
1965 'd' floating point 8 \n\
1966\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001967NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
1968narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
1969\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001970The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001971\n\
1972array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001973");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001976"array(typecode [, initializer]) -> array\n\
1977\n\
1978Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001979initialized from the optional initializer value, which must be a list,\n\
1980string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001981\n\
1982Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001983the type of objects stored in them is constrained.\n\
1984\n\
1985Methods:\n\
1986\n\
1987append() -- append a new item to the end of the array\n\
1988buffer_info() -- return information giving the current memory info\n\
1989byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001990count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001991extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001992fromfile() -- read items from a file object\n\
1993fromlist() -- append items from the list\n\
1994fromstring() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001995index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001996insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001997pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00001998remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001999reverse() -- reverse the order of the items in the array\n\
2000tofile() -- write all items to a file object\n\
2001tolist() -- return the array converted to an ordinary list\n\
2002tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002003\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002004Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002005\n\
2006typecode -- the typecode character used to create the array\n\
2007itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002008");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002009
Raymond Hettinger625812f2003-01-07 01:58:52 +00002010static PyObject *array_iter(arrayobject *ao);
2011
Tim Peters0c322792002-07-17 16:49:03 +00002012static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002013 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002014 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002015 sizeof(arrayobject),
2016 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002017 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002018 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002019 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002020 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002021 0, /* tp_reserved */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002022 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002023 0, /* tp_as_number*/
2024 &array_as_sequence, /* tp_as_sequence*/
2025 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002026 0, /* tp_hash */
2027 0, /* tp_call */
2028 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002029 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002030 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002031 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002032 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002033 arraytype_doc, /* tp_doc */
2034 0, /* tp_traverse */
2035 0, /* tp_clear */
2036 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002037 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002038 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002039 0, /* tp_iternext */
2040 array_methods, /* tp_methods */
2041 0, /* tp_members */
2042 array_getsets, /* tp_getset */
2043 0, /* tp_base */
2044 0, /* tp_dict */
2045 0, /* tp_descr_get */
2046 0, /* tp_descr_set */
2047 0, /* tp_dictoffset */
2048 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002049 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002050 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002051 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002052};
2053
Raymond Hettinger625812f2003-01-07 01:58:52 +00002054
2055/*********************** Array Iterator **************************/
2056
2057typedef struct {
2058 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002059 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002060 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002061 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002062} arrayiterobject;
2063
2064static PyTypeObject PyArrayIter_Type;
2065
2066#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2067
2068static PyObject *
2069array_iter(arrayobject *ao)
2070{
2071 arrayiterobject *it;
2072
2073 if (!array_Check(ao)) {
2074 PyErr_BadInternalCall();
2075 return NULL;
2076 }
2077
2078 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2079 if (it == NULL)
2080 return NULL;
2081
2082 Py_INCREF(ao);
2083 it->ao = ao;
2084 it->index = 0;
2085 it->getitem = ao->ob_descr->getitem;
2086 PyObject_GC_Track(it);
2087 return (PyObject *)it;
2088}
2089
2090static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002091arrayiter_next(arrayiterobject *it)
2092{
2093 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002094 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002095 return (*it->getitem)(it->ao, it->index++);
2096 return NULL;
2097}
2098
2099static void
2100arrayiter_dealloc(arrayiterobject *it)
2101{
2102 PyObject_GC_UnTrack(it);
2103 Py_XDECREF(it->ao);
2104 PyObject_GC_Del(it);
2105}
2106
2107static int
2108arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2109{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002110 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002111 return 0;
2112}
2113
2114static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002115 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002116 "arrayiterator", /* tp_name */
2117 sizeof(arrayiterobject), /* tp_basicsize */
2118 0, /* tp_itemsize */
2119 /* methods */
2120 (destructor)arrayiter_dealloc, /* tp_dealloc */
2121 0, /* tp_print */
2122 0, /* tp_getattr */
2123 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002124 0, /* tp_reserved */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002125 0, /* tp_repr */
2126 0, /* tp_as_number */
2127 0, /* tp_as_sequence */
2128 0, /* tp_as_mapping */
2129 0, /* tp_hash */
2130 0, /* tp_call */
2131 0, /* tp_str */
2132 PyObject_GenericGetAttr, /* tp_getattro */
2133 0, /* tp_setattro */
2134 0, /* tp_as_buffer */
2135 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2136 0, /* tp_doc */
2137 (traverseproc)arrayiter_traverse, /* tp_traverse */
2138 0, /* tp_clear */
2139 0, /* tp_richcompare */
2140 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002141 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002142 (iternextfunc)arrayiter_next, /* tp_iternext */
2143 0, /* tp_methods */
2144};
2145
2146
2147/*********************** Install Module **************************/
2148
Martin v. Löwis99866332002-03-01 10:27:01 +00002149/* No functions in array module. */
2150static PyMethodDef a_methods[] = {
2151 {NULL, NULL, 0, NULL} /* Sentinel */
2152};
2153
Martin v. Löwis1a214512008-06-11 05:26:20 +00002154static struct PyModuleDef arraymodule = {
2155 PyModuleDef_HEAD_INIT,
2156 "array",
2157 module_doc,
2158 -1,
2159 a_methods,
2160 NULL,
2161 NULL,
2162 NULL,
2163 NULL
2164};
2165
Martin v. Löwis99866332002-03-01 10:27:01 +00002166
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002167PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002168PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002169{
Fred Drakef4e34842002-04-01 03:45:06 +00002170 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002171 PyObject *typecodes;
2172 Py_ssize_t size = 0;
2173 register Py_UNICODE *p;
2174 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002175
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002176 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002177 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002178 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002179 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002180 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002181 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002182
2183 Py_INCREF((PyObject *)&Arraytype);
2184 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2185 Py_INCREF((PyObject *)&Arraytype);
2186 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002187
2188 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2189 size++;
2190 }
2191
2192 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2193 p = PyUnicode_AS_UNICODE(typecodes);
2194 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2195 *p++ = (char)descr->typecode;
2196 }
2197
2198 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2199
Martin v. Löwis1a214512008-06-11 05:26:20 +00002200 if (PyErr_Occurred()) {
2201 Py_DECREF(m);
2202 m = NULL;
2203 }
2204 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002205}