blob: b24b4c9f13e4b9b514b83704c7c0f995a0714de0 [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);
Georg Brandlae83d6e2009-08-13 09:04:31 +0000738 /* Issue #4509: If the array has exported buffers and the slice
739 assignment would change the size of the array, fail early to make
740 sure we don't modify it. */
741 if (d != 0 && a->ob_exports > 0) {
742 PyErr_SetString(PyExc_BufferError,
743 "cannot resize an array that is exporting buffers");
744 return -1;
745 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 if (d < 0) { /* Delete -d items */
747 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
748 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000749 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000750 if (array_resize(a, Py_SIZE(a) + d) == -1)
751 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000752 }
753 else if (d > 0) { /* Insert d items */
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000754 if (array_resize(a, Py_SIZE(a) + d))
Guido van Rossum778983b1993-02-19 15:55:02 +0000755 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000756 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
757 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000758 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000759 }
760 if (n > 0)
761 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
762 n*b->ob_descr->itemsize);
763 return 0;
764#undef b
765}
766
767static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000768array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000769{
Christian Heimes90aa7642007-12-19 02:45:37 +0000770 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000771 PyErr_SetString(PyExc_IndexError,
772 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000773 return -1;
774 }
775 if (v == NULL)
776 return array_ass_slice(a, i, i+1, v);
777 return (*a->ob_descr->setitem)(a, i, v);
778}
779
780static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000781setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000782{
Martin v. Löwis99866332002-03-01 10:27:01 +0000783 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000784 return array_ass_item((arrayobject *)a, i, v);
785}
786
Martin v. Löwis99866332002-03-01 10:27:01 +0000787static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000788array_iter_extend(arrayobject *self, PyObject *bb)
789{
790 PyObject *it, *v;
791
792 it = PyObject_GetIter(bb);
793 if (it == NULL)
794 return -1;
795
796 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000797 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000798 Py_DECREF(v);
799 Py_DECREF(it);
800 return -1;
801 }
802 Py_DECREF(v);
803 }
804 Py_DECREF(it);
805 if (PyErr_Occurred())
806 return -1;
807 return 0;
808}
809
810static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000811array_do_extend(arrayobject *self, PyObject *bb)
812{
Georg Brandlae83d6e2009-08-13 09:04:31 +0000813 Py_ssize_t size, oldsize, bbsize;
814
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000815 if (!array_Check(bb))
816 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000817#define b ((arrayobject *)bb)
818 if (self->ob_descr != b->ob_descr) {
819 PyErr_SetString(PyExc_TypeError,
820 "can only extend with array of same kind");
821 return -1;
822 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000823 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
824 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
825 PyErr_NoMemory();
826 return -1;
827 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000828 oldsize = Py_SIZE(self);
Georg Brandlae83d6e2009-08-13 09:04:31 +0000829 /* Get the size of bb before resizing the array since bb could be self. */
830 bbsize = Py_SIZE(bb);
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000831 size = oldsize + Py_SIZE(b);
832 if (array_resize(self, size) == -1)
Martin v. Löwis99866332002-03-01 10:27:01 +0000833 return -1;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000834 memcpy(self->ob_item + oldsize * self->ob_descr->itemsize,
Georg Brandlae83d6e2009-08-13 09:04:31 +0000835 b->ob_item, bbsize * b->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +0000836
837 return 0;
838#undef b
839}
840
841static PyObject *
842array_inplace_concat(arrayobject *self, PyObject *bb)
843{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000844 if (!array_Check(bb)) {
845 PyErr_Format(PyExc_TypeError,
846 "can only extend array with array (not \"%.200s\")",
Christian Heimes90aa7642007-12-19 02:45:37 +0000847 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000848 return NULL;
849 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000850 if (array_do_extend(self, bb) == -1)
851 return NULL;
852 Py_INCREF(self);
853 return (PyObject *)self;
854}
855
856static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000857array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000858{
859 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000860 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000861
Christian Heimes90aa7642007-12-19 02:45:37 +0000862 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000863 if (n < 0)
864 n = 0;
865 items = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000866 if ((self->ob_descr->itemsize != 0) &&
867 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
868 return PyErr_NoMemory();
869 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000870 size = Py_SIZE(self) * self->ob_descr->itemsize;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000871 if (n > 0 && size > PY_SSIZE_T_MAX / n) {
872 return PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000873 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +0000874 if (array_resize(self, n * Py_SIZE(self)) == -1)
875 return NULL;
876 items = p = self->ob_item;
877 for (i = 1; i < n; i++) {
878 p += size;
879 memcpy(p, items, size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000880 }
881 }
882 Py_INCREF(self);
883 return (PyObject *)self;
884}
885
886
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000887static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000888ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000889{
890 if (ins1(self, where, v) != 0)
891 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000892 Py_INCREF(Py_None);
893 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000894}
895
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000896static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000897array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000898{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000899 Py_ssize_t count = 0;
900 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000901
Christian Heimes90aa7642007-12-19 02:45:37 +0000902 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000903 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000904 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000905 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000906 if (cmp > 0)
907 count++;
908 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000909 return NULL;
910 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000911 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000912}
913
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000914PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000915"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000917Return number of occurrences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918
919static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000920array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000922 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923
Christian Heimes90aa7642007-12-19 02:45:37 +0000924 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000926 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
927 Py_DECREF(selfi);
928 if (cmp > 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000929 return PyLong_FromLong((long)i);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000931 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000932 return NULL;
933 }
934 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
935 return NULL;
936}
937
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000938PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000939"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000940\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000941Return index of first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000942
Raymond Hettinger625812f2003-01-07 01:58:52 +0000943static int
944array_contains(arrayobject *self, PyObject *v)
945{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000946 Py_ssize_t i;
947 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000948
Christian Heimes90aa7642007-12-19 02:45:37 +0000949 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000950 PyObject *selfi = getarrayitem((PyObject *)self, i);
951 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
952 Py_DECREF(selfi);
953 }
954 return cmp;
955}
956
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000957static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000958array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959{
960 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961
Christian Heimes90aa7642007-12-19 02:45:37 +0000962 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000963 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000964 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
965 Py_DECREF(selfi);
966 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000967 if (array_ass_slice(self, i, i+1,
968 (PyObject *)NULL) != 0)
969 return NULL;
970 Py_INCREF(Py_None);
971 return Py_None;
972 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000973 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974 return NULL;
975 }
976 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
977 return NULL;
978}
979
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000980PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000981"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982\n\
Mark Dickinson934896d2009-02-21 20:59:32 +0000983Remove the first occurrence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984
985static PyObject *
986array_pop(arrayobject *self, PyObject *args)
987{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000988 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000989 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000990 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000991 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000992 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000993 /* Special-case most common failure cause */
994 PyErr_SetString(PyExc_IndexError, "pop from empty array");
995 return NULL;
996 }
997 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000998 i += Py_SIZE(self);
999 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001000 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1001 return NULL;
1002 }
1003 v = getarrayitem((PyObject *)self,i);
1004 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1005 Py_DECREF(v);
1006 return NULL;
1007 }
1008 return v;
1009}
1010
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001011PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001012"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001013\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001014Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001015
1016static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001017array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001018{
Martin v. Löwis99866332002-03-01 10:27:01 +00001019 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001020 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001021 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001022 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001023}
1024
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001025PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001026"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001027\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001028 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001029
1030static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001031array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001032{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001033 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001035 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001036 return NULL;
1037 return ins(self, i, v);
1038}
1039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001040PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001041"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001042\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001043Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001044
1045
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001046static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001047array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001048{
Tim Peters077a11d2000-09-16 22:31:29 +00001049 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001050 retval = PyTuple_New(2);
1051 if (!retval)
1052 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001053
1054 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimes90aa7642007-12-19 02:45:37 +00001055 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001056
1057 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001058}
1059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001060PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001061"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001062\n\
1063Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001064the length in items of the buffer used to hold array's contents\n\
1065The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001066the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001067
1068
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001069static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001070array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001071{
Christian Heimes90aa7642007-12-19 02:45:37 +00001072 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001073}
1074
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001075PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001076"append(x)\n\
1077\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001078Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001079
1080
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001081static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001082array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001083{
1084 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001085 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001086
Guido van Rossum778983b1993-02-19 15:55:02 +00001087 switch (self->ob_descr->itemsize) {
1088 case 1:
1089 break;
1090 case 2:
Christian Heimes90aa7642007-12-19 02:45:37 +00001091 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001092 char p0 = p[0];
1093 p[0] = p[1];
1094 p[1] = p0;
1095 }
1096 break;
1097 case 4:
Christian Heimes90aa7642007-12-19 02:45:37 +00001098 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001099 char p0 = p[0];
1100 char p1 = p[1];
1101 p[0] = p[3];
1102 p[1] = p[2];
1103 p[2] = p1;
1104 p[3] = p0;
1105 }
1106 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001107 case 8:
Christian Heimes90aa7642007-12-19 02:45:37 +00001108 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001109 char p0 = p[0];
1110 char p1 = p[1];
1111 char p2 = p[2];
1112 char p3 = p[3];
1113 p[0] = p[7];
1114 p[1] = p[6];
1115 p[2] = p[5];
1116 p[3] = p[4];
1117 p[4] = p3;
1118 p[5] = p2;
1119 p[6] = p1;
1120 p[7] = p0;
1121 }
1122 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001123 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001124 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001125 "don't know how to byteswap this array type");
1126 return NULL;
1127 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001128 Py_INCREF(Py_None);
1129 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001130}
1131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001132PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001133"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001134\n\
Fred Drakebf272981999-12-03 17:15:30 +00001135Byteswap 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 +000011364, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001137
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001138static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001139array_reduce(arrayobject *array)
1140{
1141 PyObject *dict, *result;
1142
1143 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1144 if (dict == NULL) {
1145 PyErr_Clear();
1146 dict = Py_None;
1147 Py_INCREF(dict);
1148 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001149 if (Py_SIZE(array) > 0) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001150 if (array->ob_descr->itemsize
1151 > PY_SSIZE_T_MAX / Py_SIZE(array)) {
1152 return PyErr_NoMemory();
1153 }
Benjamin Petersona921fb02009-04-03 22:18:11 +00001154 result = Py_BuildValue("O(Cy#)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001155 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001156 array->ob_descr->typecode,
1157 array->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001158 Py_SIZE(array) * array->ob_descr->itemsize,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001159 dict);
1160 } else {
Benjamin Petersona921fb02009-04-03 22:18:11 +00001161 result = Py_BuildValue("O(C)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001162 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001163 array->ob_descr->typecode,
1164 dict);
1165 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001166 Py_DECREF(dict);
1167 return result;
1168}
1169
1170PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1171
1172static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001173array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001174{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001175 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001176 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001177 /* little buffer to hold items while swapping */
1178 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001179 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001180
Christian Heimes90aa7642007-12-19 02:45:37 +00001181 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001182 for (p = self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001183 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001184 p < q;
1185 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001186 /* memory areas guaranteed disjoint, so memcpy
1187 * is safe (& memmove may be slower).
1188 */
1189 memcpy(tmp, p, itemsize);
1190 memcpy(p, q, itemsize);
1191 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001192 }
1193 }
Tim Petersbb307342000-09-10 05:22:54 +00001194
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195 Py_INCREF(Py_None);
1196 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001197}
Guido van Rossume77a7571993-11-03 15:01:26 +00001198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001199PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001200"reverse()\n\
1201\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001202Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001203
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001204
1205/* Forward */
1206static PyObject *array_fromstring(arrayobject *self, PyObject *args);
1207
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001208static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001209array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001210{
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001211 PyObject *f, *b, *res;
1212 Py_ssize_t itemsize = self->ob_descr->itemsize;
1213 Py_ssize_t n, nbytes;
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001214 int not_enough_bytes;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001215
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001216 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001217 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001218
1219 nbytes = n * itemsize;
1220 if (nbytes < 0 || nbytes/itemsize != n) {
1221 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001222 return NULL;
1223 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001224
1225 b = PyObject_CallMethod(f, "read", "n", nbytes);
1226 if (b == NULL)
1227 return NULL;
1228
Christian Heimes72b710a2008-05-26 13:28:38 +00001229 if (!PyBytes_Check(b)) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001230 PyErr_SetString(PyExc_TypeError,
1231 "read() didn't return bytes");
1232 Py_DECREF(b);
1233 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001234 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001235
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001236 not_enough_bytes = (PyBytes_GET_SIZE(b) != nbytes);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001237
1238 args = Py_BuildValue("(O)", b);
1239 Py_DECREF(b);
1240 if (args == NULL)
1241 return NULL;
1242
1243 res = array_fromstring(self, args);
1244 Py_DECREF(args);
Hirokazu Yamamoto54d0df62009-03-06 03:04:07 +00001245 if (res == NULL)
1246 return NULL;
1247
1248 if (not_enough_bytes) {
1249 PyErr_SetString(PyExc_EOFError,
1250 "read() didn't return enough bytes");
1251 Py_DECREF(res);
1252 return NULL;
1253 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001254
1255 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001256}
1257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001258PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001259"fromfile(f, n)\n\
1260\n\
1261Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001262array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001263
1264
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001266array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001267{
Christian Heimes90aa7642007-12-19 02:45:37 +00001268 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001269 /* Write 64K blocks at a time */
1270 /* XXX Make the block size settable */
1271 int BLOCKSIZE = 64*1024;
1272 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1273 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001274
Christian Heimes90aa7642007-12-19 02:45:37 +00001275 if (Py_SIZE(self) == 0)
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001276 goto done;
1277
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001278 for (i = 0; i < nblocks; i++) {
1279 char* ptr = self->ob_item + i*BLOCKSIZE;
1280 Py_ssize_t size = BLOCKSIZE;
1281 PyObject *bytes, *res;
1282 if (i*BLOCKSIZE + size > nbytes)
1283 size = nbytes - i*BLOCKSIZE;
Christian Heimes72b710a2008-05-26 13:28:38 +00001284 bytes = PyBytes_FromStringAndSize(ptr, size);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001285 if (bytes == NULL)
Guido van Rossum778983b1993-02-19 15:55:02 +00001286 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001287 res = PyObject_CallMethod(f, "write", "O", bytes);
1288 Py_DECREF(bytes);
1289 if (res == NULL)
1290 return NULL;
Martin v. Löwisa291c8f2007-08-11 14:25:27 +00001291 Py_DECREF(res); /* drop write result */
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001292 }
1293
1294 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295 Py_INCREF(Py_None);
1296 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001297}
1298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001299PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001300"tofile(f)\n\
1301\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001302Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001303
1304
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001305static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001306array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001307{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001308 Py_ssize_t n;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001309
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001310 if (!PyList_Check(list)) {
1311 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001312 return NULL;
1313 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001314 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001315 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001316 Py_ssize_t i, old_size;
1317 old_size = Py_SIZE(self);
1318 if (array_resize(self, old_size + n) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +00001319 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001320 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001321 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 if ((*self->ob_descr->setitem)(self,
Christian Heimes90aa7642007-12-19 02:45:37 +00001323 Py_SIZE(self) - n + i, v) != 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001324 array_resize(self, old_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001325 return NULL;
1326 }
1327 }
1328 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001329 Py_INCREF(Py_None);
1330 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001331}
1332
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001333PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001334"fromlist(list)\n\
1335\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001336Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001337
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001339array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001340{
Christian Heimes90aa7642007-12-19 02:45:37 +00001341 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001342 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001343
Guido van Rossum778983b1993-02-19 15:55:02 +00001344 if (list == NULL)
1345 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001346 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001348 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 return NULL;
1351 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001352 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001353 }
1354 return list;
1355}
1356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001357PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001358"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001359\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001360Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001361
1362
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001363static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001364array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001365{
1366 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001367 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001368 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001369 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001370 return NULL;
1371 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001372 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001373 "string length not a multiple of item size");
1374 return NULL;
1375 }
1376 n = n / itemsize;
1377 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001378 Py_ssize_t old_size = Py_SIZE(self);
1379 if ((n > PY_SSIZE_T_MAX - old_size) ||
1380 ((old_size + n) > PY_SSIZE_T_MAX / itemsize)) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001381 return PyErr_NoMemory();
1382 }
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001383 if (array_resize(self, old_size + n) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +00001384 return NULL;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001385 memcpy(self->ob_item + old_size * itemsize,
1386 str, n * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001387 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001388 Py_INCREF(Py_None);
1389 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001390}
1391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001392PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001393"fromstring(string)\n\
1394\n\
1395Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001396values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001397
1398
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001399static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001400array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001401{
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001402 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1403 return PyBytes_FromStringAndSize(self->ob_item,
1404 Py_SIZE(self) * self->ob_descr->itemsize);
1405 } else {
1406 return PyErr_NoMemory();
1407 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001408}
1409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001410PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001411"tostring() -> string\n\
1412\n\
1413Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001414representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001415
Martin v. Löwis99866332002-03-01 10:27:01 +00001416
1417
Martin v. Löwis99866332002-03-01 10:27:01 +00001418static PyObject *
1419array_fromunicode(arrayobject *self, PyObject *args)
1420{
1421 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001422 Py_ssize_t n;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001423 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001424
1425 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1426 return NULL;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001427 typecode = self->ob_descr->typecode;
1428 if ((typecode != 'u')) {
1429 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001430 "fromunicode() may only be called on "
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001431 "unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001432 return NULL;
1433 }
1434 if (n > 0) {
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001435 Py_ssize_t old_size = Py_SIZE(self);
1436 if (array_resize(self, old_size + n) == -1)
Martin v. Löwis99866332002-03-01 10:27:01 +00001437 return NULL;
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001438 memcpy(self->ob_item + old_size * sizeof(Py_UNICODE),
Martin v. Löwis99866332002-03-01 10:27:01 +00001439 ustr, n * sizeof(Py_UNICODE));
1440 }
1441
1442 Py_INCREF(Py_None);
1443 return Py_None;
1444}
1445
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001446PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001447"fromunicode(ustr)\n\
1448\n\
1449Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001450The array must be a unicode type array; otherwise a ValueError\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001451is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001452append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001453
1454
1455static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001456array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001457{
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001458 char typecode;
1459 typecode = self->ob_descr->typecode;
1460 if ((typecode != 'u')) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001461 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001462 "tounicode() may only be called on unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001463 return NULL;
1464 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001465 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001466}
1467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001468PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001469"tounicode() -> unicode\n\
1470\n\
1471Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001472a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001473array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001474an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001475
Martin v. Löwis99866332002-03-01 10:27:01 +00001476
1477
1478static PyObject *
1479array_get_typecode(arrayobject *a, void *closure)
1480{
1481 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001482 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001483}
1484
1485static PyObject *
1486array_get_itemsize(arrayobject *a, void *closure)
1487{
Christian Heimes217cfd12007-12-02 14:31:20 +00001488 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001489}
1490
1491static PyGetSetDef array_getsets [] = {
1492 {"typecode", (getter) array_get_typecode, NULL,
1493 "the typecode character used to create the array"},
1494 {"itemsize", (getter) array_get_itemsize, NULL,
1495 "the size, in bytes, of one array item"},
1496 {NULL}
1497};
1498
Martin v. Löwis59683e82008-06-13 07:50:45 +00001499static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001500 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001501 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001502 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001503 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001504 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001505 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001506 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1507 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001508 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001509 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001510 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001511 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001512 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001513 extend_doc},
1514 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1515 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001516 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001517 fromlist_doc},
1518 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1519 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001520 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1521 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001522 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001523 index_doc},
1524 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1525 insert_doc},
1526 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1527 pop_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001528 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1529 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001530 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001531 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001532 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001533 reverse_doc},
1534/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1535 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001536 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001537 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001538 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001539 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001540 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001541 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001542 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001543 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001544 {NULL, NULL} /* sentinel */
1545};
1546
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001547static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001548array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001549{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00001550 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001551 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001552 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001553
Christian Heimes90aa7642007-12-19 02:45:37 +00001554 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001555 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001556 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001557 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00001558 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001559 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001560 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001561 else
1562 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001563
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001564 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
1565 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001566 return s;
1567}
1568
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001569static PyObject*
1570array_subscr(arrayobject* self, PyObject* item)
1571{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001572 if (PyIndex_Check(item)) {
1573 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001574 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001575 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001576 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001577 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001578 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001579 return array_item(self, i);
1580 }
1581 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001582 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001583 PyObject* result;
1584 arrayobject* ar;
1585 int itemsize = self->ob_descr->itemsize;
1586
Christian Heimes90aa7642007-12-19 02:45:37 +00001587 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001588 &start, &stop, &step, &slicelength) < 0) {
1589 return NULL;
1590 }
1591
1592 if (slicelength <= 0) {
1593 return newarrayobject(&Arraytype, 0, self->ob_descr);
1594 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001595 else if (step == 1) {
1596 PyObject *result = newarrayobject(&Arraytype,
1597 slicelength, self->ob_descr);
1598 if (result == NULL)
1599 return NULL;
1600 memcpy(((arrayobject *)result)->ob_item,
1601 self->ob_item + start * itemsize,
1602 slicelength * itemsize);
1603 return result;
1604 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001605 else {
1606 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1607 if (!result) return NULL;
1608
1609 ar = (arrayobject*)result;
1610
1611 for (cur = start, i = 0; i < slicelength;
1612 cur += step, i++) {
1613 memcpy(ar->ob_item + i*itemsize,
1614 self->ob_item + cur*itemsize,
1615 itemsize);
1616 }
1617
1618 return result;
1619 }
1620 }
1621 else {
1622 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00001623 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001624 return NULL;
1625 }
1626}
1627
1628static int
1629array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1630{
Thomas Woutersed03b412007-08-28 21:37:11 +00001631 Py_ssize_t start, stop, step, slicelength, needed;
1632 arrayobject* other;
1633 int itemsize;
1634
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001635 if (PyIndex_Check(item)) {
1636 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00001637
1638 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001639 return -1;
1640 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001641 i += Py_SIZE(self);
1642 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001643 PyErr_SetString(PyExc_IndexError,
1644 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001645 return -1;
1646 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001647 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001648 /* Fall through to slice assignment */
1649 start = i;
1650 stop = i + 1;
1651 step = 1;
1652 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001653 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001654 else
1655 return (*self->ob_descr->setitem)(self, i, value);
1656 }
1657 else if (PySlice_Check(item)) {
1658 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001659 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00001660 &step, &slicelength) < 0) {
1661 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001662 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001663 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001664 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00001665 PyErr_SetString(PyExc_TypeError,
1666 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001667 return -1;
1668 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001669 if (value == NULL) {
1670 other = NULL;
1671 needed = 0;
1672 }
1673 else if (array_Check(value)) {
1674 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00001675 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00001676 if (self == other) {
1677 /* Special case "self[i:j] = self" -- copy self first */
1678 int ret;
1679 value = array_slice(other, 0, needed);
1680 if (value == NULL)
1681 return -1;
1682 ret = array_ass_subscr(self, item, value);
1683 Py_DECREF(value);
1684 return ret;
1685 }
1686 if (other->ob_descr != self->ob_descr) {
1687 PyErr_BadArgument();
1688 return -1;
1689 }
1690 }
1691 else {
1692 PyErr_Format(PyExc_TypeError,
1693 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00001694 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00001695 return -1;
1696 }
1697 itemsize = self->ob_descr->itemsize;
1698 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1699 if ((step > 0 && stop < start) ||
1700 (step < 0 && stop > start))
1701 stop = start;
Georg Brandldf475152009-08-13 09:05:38 +00001702
1703 /* Issue #4509: If the array has exported buffers and the slice
1704 assignment would change the size of the array, fail early to make
1705 sure we don't modify it. */
1706 if ((needed == 0 || slicelength != needed) && self->ob_exports > 0) {
1707 PyErr_SetString(PyExc_BufferError,
1708 "cannot resize an array that is exporting buffers");
1709 return -1;
1710 }
1711
Thomas Woutersed03b412007-08-28 21:37:11 +00001712 if (step == 1) {
1713 if (slicelength > needed) {
1714 memmove(self->ob_item + (start + needed) * itemsize,
1715 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001716 (Py_SIZE(self) - stop) * itemsize);
1717 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001718 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001719 return -1;
1720 }
1721 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001722 if (array_resize(self, Py_SIZE(self) +
Antoine Pitrou3ad3a0d2008-12-18 17:08:32 +00001723 needed - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001724 return -1;
1725 memmove(self->ob_item + (start + needed) * itemsize,
1726 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001727 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001728 }
1729 if (needed > 0)
1730 memcpy(self->ob_item + start * itemsize,
1731 other->ob_item, needed * itemsize);
1732 return 0;
1733 }
1734 else if (needed == 0) {
1735 /* Delete slice */
1736 Py_ssize_t cur, i;
1737
1738 if (step < 0) {
1739 stop = start + 1;
1740 start = stop + step * (slicelength - 1) - 1;
1741 step = -step;
1742 }
1743 for (cur = start, i = 0; i < slicelength;
1744 cur += step, i++) {
1745 Py_ssize_t lim = step - 1;
1746
Christian Heimes90aa7642007-12-19 02:45:37 +00001747 if (cur + step >= Py_SIZE(self))
1748 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00001749 memmove(self->ob_item + (cur - i) * itemsize,
1750 self->ob_item + (cur + 1) * itemsize,
1751 lim * itemsize);
1752 }
1753 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00001754 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001755 memmove(self->ob_item + (cur-slicelength) * itemsize,
1756 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001757 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001758 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001759 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001760 return -1;
1761 return 0;
1762 }
1763 else {
1764 Py_ssize_t cur, i;
1765
1766 if (needed != slicelength) {
1767 PyErr_Format(PyExc_ValueError,
1768 "attempt to assign array of size %zd "
1769 "to extended slice of size %zd",
1770 needed, slicelength);
1771 return -1;
1772 }
1773 for (cur = start, i = 0; i < slicelength;
1774 cur += step, i++) {
1775 memcpy(self->ob_item + cur * itemsize,
1776 other->ob_item + i * itemsize,
1777 itemsize);
1778 }
1779 return 0;
1780 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001781}
1782
1783static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001784 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001785 (binaryfunc)array_subscr,
1786 (objobjargproc)array_ass_subscr
1787};
1788
Guido van Rossumd8faa362007-04-27 19:54:29 +00001789static const void *emptybuf = "";
1790
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001791
1792static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001793array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001794{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001795 if (view==NULL) goto finish;
1796
1797 view->buf = (void *)self->ob_item;
Martin v. Löwis423be952008-08-13 15:53:07 +00001798 view->obj = (PyObject*)self;
1799 Py_INCREF(self);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001800 if (view->buf == NULL)
1801 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00001802 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001803 view->readonly = 0;
1804 view->ndim = 1;
1805 view->itemsize = self->ob_descr->itemsize;
1806 view->suboffsets = NULL;
1807 view->shape = NULL;
1808 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001809 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001810 }
1811 view->strides = NULL;
1812 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
1813 view->strides = &(view->itemsize);
1814 view->format = NULL;
1815 view->internal = NULL;
1816 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00001817 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001818#ifdef Py_UNICODE_WIDE
1819 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00001820 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001821 }
1822#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001823 }
1824
1825 finish:
1826 self->ob_exports++;
1827 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001828}
1829
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001830static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001831array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001832{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001833 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001834}
1835
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001836static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001837 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001838 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001839 (ssizeargfunc)array_repeat, /*sq_repeat*/
1840 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001841 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001842 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001843 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001844 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001845 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001846 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001847};
1848
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001849static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001850 (getbufferproc)array_buffer_getbuf,
1851 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001852};
1853
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001854static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001855array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001856{
Guido van Rossum8934fc22007-06-30 23:44:36 +00001857 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001858 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001859 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001860
Thomas Woutersb2137042007-02-01 18:02:27 +00001861 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001862 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001863
Walter Dörwaldd0941302007-07-01 21:58:22 +00001864 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00001865 return NULL;
1866
1867 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00001868 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00001869 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00001870 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001871 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001872 it = PyObject_GetIter(initial);
1873 if (it == NULL)
1874 return NULL;
1875 /* We set initial to NULL so that the subsequent code
1876 will create an empty array of the appropriate type
1877 and afterwards we can use array_iter_extend to populate
1878 the array.
1879 */
1880 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001881 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001882 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1883 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001884 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001885 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001886
1887 if (initial == NULL || !(PyList_Check(initial)
1888 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001889 len = 0;
1890 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001891 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001892
1893 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001894 if (a == NULL)
1895 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001896
Guido van Rossum778983b1993-02-19 15:55:02 +00001897 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001898 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001899 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001900 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001901 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001902 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001903 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001904 return NULL;
1905 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001906 if (setarrayitem(a, i, v) != 0) {
1907 Py_DECREF(v);
1908 Py_DECREF(a);
1909 return NULL;
1910 }
1911 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001912 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001913 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00001914 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00001915 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001916 PyObject *t_initial, *v;
1917 t_initial = PyTuple_Pack(1, initial);
1918 if (t_initial == NULL) {
1919 Py_DECREF(a);
1920 return NULL;
1921 }
1922 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001923 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001924 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001925 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001926 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001927 return NULL;
1928 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001929 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001930 }
1931 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001932 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001933 if (n > 0) {
1934 arrayobject *self = (arrayobject *)a;
1935 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001936 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001937 if (item == NULL) {
1938 PyErr_NoMemory();
1939 Py_DECREF(a);
1940 return NULL;
1941 }
1942 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001943 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001944 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00001945 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001946 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001947 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001948 if (it != NULL) {
1949 if (array_iter_extend((arrayobject *)a, it) == -1) {
1950 Py_DECREF(it);
1951 Py_DECREF(a);
1952 return NULL;
1953 }
1954 Py_DECREF(it);
1955 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001956 return a;
1957 }
1958 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001959 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00001960 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001961 return NULL;
1962}
1963
Guido van Rossum778983b1993-02-19 15:55:02 +00001964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001965PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001966"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001967an array of basic values: characters, integers, floating point\n\
1968numbers. Arrays are sequence types and behave very much like lists,\n\
1969except that the type of objects stored in them is constrained. The\n\
1970type is specified at object creation time by using a type code, which\n\
1971is a single character. The following type codes are defined:\n\
1972\n\
1973 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001974 'b' signed integer 1 \n\
1975 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001976 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001977 'h' signed integer 2 \n\
1978 'H' unsigned integer 2 \n\
1979 'i' signed integer 2 \n\
1980 'I' unsigned integer 2 \n\
1981 'l' signed integer 4 \n\
1982 'L' unsigned integer 4 \n\
1983 'f' floating point 4 \n\
1984 'd' floating point 8 \n\
1985\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001986NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
1987narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
1988\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001989The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001990\n\
1991array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001992");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001994PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001995"array(typecode [, initializer]) -> array\n\
1996\n\
1997Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001998initialized from the optional initializer value, which must be a list,\n\
1999string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002000\n\
2001Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002002the type of objects stored in them is constrained.\n\
2003\n\
2004Methods:\n\
2005\n\
2006append() -- append a new item to the end of the array\n\
2007buffer_info() -- return information giving the current memory info\n\
2008byteswap() -- byteswap all the items of the array\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002009count() -- return number of occurrences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002010extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002011fromfile() -- read items from a file object\n\
2012fromlist() -- append items from the list\n\
2013fromstring() -- append items from the string\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002014index() -- return index of first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002015insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002016pop() -- remove and return item (default last)\n\
Mark Dickinson934896d2009-02-21 20:59:32 +00002017remove() -- remove first occurrence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002018reverse() -- reverse the order of the items in the array\n\
2019tofile() -- write all items to a file object\n\
2020tolist() -- return the array converted to an ordinary list\n\
2021tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002022\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002023Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002024\n\
2025typecode -- the typecode character used to create the array\n\
2026itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002028
Raymond Hettinger625812f2003-01-07 01:58:52 +00002029static PyObject *array_iter(arrayobject *ao);
2030
Tim Peters0c322792002-07-17 16:49:03 +00002031static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002032 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002033 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002034 sizeof(arrayobject),
2035 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002036 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002037 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002038 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002039 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002040 0, /* tp_reserved */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002041 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002042 0, /* tp_as_number*/
2043 &array_as_sequence, /* tp_as_sequence*/
2044 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002045 0, /* tp_hash */
2046 0, /* tp_call */
2047 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002048 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002049 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002050 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002051 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002052 arraytype_doc, /* tp_doc */
2053 0, /* tp_traverse */
2054 0, /* tp_clear */
2055 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002056 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002057 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002058 0, /* tp_iternext */
2059 array_methods, /* tp_methods */
2060 0, /* tp_members */
2061 array_getsets, /* tp_getset */
2062 0, /* tp_base */
2063 0, /* tp_dict */
2064 0, /* tp_descr_get */
2065 0, /* tp_descr_set */
2066 0, /* tp_dictoffset */
2067 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002068 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002069 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002070 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002071};
2072
Raymond Hettinger625812f2003-01-07 01:58:52 +00002073
2074/*********************** Array Iterator **************************/
2075
2076typedef struct {
2077 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002078 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002079 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002080 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002081} arrayiterobject;
2082
2083static PyTypeObject PyArrayIter_Type;
2084
2085#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2086
2087static PyObject *
2088array_iter(arrayobject *ao)
2089{
2090 arrayiterobject *it;
2091
2092 if (!array_Check(ao)) {
2093 PyErr_BadInternalCall();
2094 return NULL;
2095 }
2096
2097 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2098 if (it == NULL)
2099 return NULL;
2100
2101 Py_INCREF(ao);
2102 it->ao = ao;
2103 it->index = 0;
2104 it->getitem = ao->ob_descr->getitem;
2105 PyObject_GC_Track(it);
2106 return (PyObject *)it;
2107}
2108
2109static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002110arrayiter_next(arrayiterobject *it)
2111{
2112 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002113 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002114 return (*it->getitem)(it->ao, it->index++);
2115 return NULL;
2116}
2117
2118static void
2119arrayiter_dealloc(arrayiterobject *it)
2120{
2121 PyObject_GC_UnTrack(it);
2122 Py_XDECREF(it->ao);
2123 PyObject_GC_Del(it);
2124}
2125
2126static int
2127arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2128{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002129 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002130 return 0;
2131}
2132
2133static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002134 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002135 "arrayiterator", /* tp_name */
2136 sizeof(arrayiterobject), /* tp_basicsize */
2137 0, /* tp_itemsize */
2138 /* methods */
2139 (destructor)arrayiter_dealloc, /* tp_dealloc */
2140 0, /* tp_print */
2141 0, /* tp_getattr */
2142 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +00002143 0, /* tp_reserved */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002144 0, /* tp_repr */
2145 0, /* tp_as_number */
2146 0, /* tp_as_sequence */
2147 0, /* tp_as_mapping */
2148 0, /* tp_hash */
2149 0, /* tp_call */
2150 0, /* tp_str */
2151 PyObject_GenericGetAttr, /* tp_getattro */
2152 0, /* tp_setattro */
2153 0, /* tp_as_buffer */
2154 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2155 0, /* tp_doc */
2156 (traverseproc)arrayiter_traverse, /* tp_traverse */
2157 0, /* tp_clear */
2158 0, /* tp_richcompare */
2159 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002160 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002161 (iternextfunc)arrayiter_next, /* tp_iternext */
2162 0, /* tp_methods */
2163};
2164
2165
2166/*********************** Install Module **************************/
2167
Martin v. Löwis99866332002-03-01 10:27:01 +00002168/* No functions in array module. */
2169static PyMethodDef a_methods[] = {
2170 {NULL, NULL, 0, NULL} /* Sentinel */
2171};
2172
Martin v. Löwis1a214512008-06-11 05:26:20 +00002173static struct PyModuleDef arraymodule = {
2174 PyModuleDef_HEAD_INIT,
2175 "array",
2176 module_doc,
2177 -1,
2178 a_methods,
2179 NULL,
2180 NULL,
2181 NULL,
2182 NULL
2183};
2184
Martin v. Löwis99866332002-03-01 10:27:01 +00002185
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002186PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002187PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002188{
Fred Drakef4e34842002-04-01 03:45:06 +00002189 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002190 PyObject *typecodes;
2191 Py_ssize_t size = 0;
2192 register Py_UNICODE *p;
2193 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002194
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002195 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002196 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002197 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002198 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002199 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002200 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002201
2202 Py_INCREF((PyObject *)&Arraytype);
2203 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2204 Py_INCREF((PyObject *)&Arraytype);
2205 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002206
2207 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2208 size++;
2209 }
2210
2211 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2212 p = PyUnicode_AS_UNICODE(typecodes);
2213 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2214 *p++ = (char)descr->typecode;
2215 }
2216
2217 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2218
Martin v. Löwis1a214512008-06-11 05:26:20 +00002219 if (PyErr_Occurred()) {
2220 Py_DECREF(m);
2221 m = NULL;
2222 }
2223 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002224}