blob: 16a7a7e198387ef248ebbd0ebea842dccd0cc994 [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
52 /* Bypass realloc() when a previous overallocation is large enough
53 to accommodate the newsize. If the newsize is 16 smaller than the
54 current size, then proceed with the realloc() to shrink the list.
55 */
56
57 if (self->allocated >= newsize &&
Christian Heimes90aa7642007-12-19 02:45:37 +000058 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000059 self->ob_item != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +000060 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000061 return 0;
62 }
63
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000064 if (self->ob_exports > 0) {
65 PyErr_SetString(PyExc_BufferError,
66 "cannot resize an array that is exporting data");
67 return -1;
68 }
69
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000070 /* This over-allocates proportional to the array size, making room
71 * for additional growth. The over-allocation is mild, but is
72 * enough to give linear-time amortized behavior over a long
73 * sequence of appends() in the presence of a poorly-performing
74 * system realloc().
75 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
76 * Note, the pattern starts out the same as for lists but then
77 * grows at a smaller rate so that larger arrays only overallocate
78 * by about 1/16th -- this is done because arrays are presumed to be more
79 * memory critical.
80 */
81
Christian Heimes90aa7642007-12-19 02:45:37 +000082 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000083 items = self->ob_item;
84 /* XXX The following multiplication and division does not optimize away
85 like it does for lists since the size is not known at compile time */
86 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
87 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
88 else
89 items = NULL;
90 if (items == NULL) {
91 PyErr_NoMemory();
92 return -1;
93 }
94 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +000095 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000096 self->allocated = _new_size;
97 return 0;
98}
99
Tim Petersbb307342000-09-10 05:22:54 +0000100/****************************************************************************
101Get and Set functions for each type.
102A Get function takes an arrayobject* and an integer index, returning the
103array value at that index wrapped in an appropriate PyObject*.
104A Set function takes an arrayobject, integer index, and PyObject*; sets
105the array value at that index to the raw C data extracted from the PyObject*,
106and returns 0 if successful, else nonzero on failure (PyObject* not of an
107appropriate type or value).
108Note that the basic Get and Set functions do NOT check that the index is
109in bounds; that's the responsibility of the caller.
110****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000111
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000112static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000113b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000114{
115 long x = ((char *)ap->ob_item)[i];
116 if (x >= 128)
117 x -= 256;
Christian Heimes217cfd12007-12-02 14:31:20 +0000118 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000119}
120
121static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
Fred Drake541dc3b2000-06-28 17:49:30 +0000124 short x;
125 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
126 must use the next size up that is signed ('h') and manually do
127 the overflow checking */
128 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000129 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000130 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000131 PyErr_SetString(PyExc_OverflowError,
132 "signed char is less than minimum");
133 return -1;
134 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000135 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000136 PyErr_SetString(PyExc_OverflowError,
137 "signed char is greater than maximum");
138 return -1;
139 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000140 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000141 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000142 return 0;
143}
144
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000145static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000146BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000147{
148 long x = ((unsigned char *)ap->ob_item)[i];
Christian Heimes217cfd12007-12-02 14:31:20 +0000149 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000150}
151
Fred Drake541dc3b2000-06-28 17:49:30 +0000152static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000153BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000154{
155 unsigned char x;
156 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
157 if (!PyArg_Parse(v, "b;array item must be integer", &x))
158 return -1;
159 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000160 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000161 return 0;
162}
Guido van Rossum549ab711997-01-03 19:09:47 +0000163
Martin v. Löwis99866332002-03-01 10:27:01 +0000164static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000165u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000166{
167 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
168}
169
170static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000171u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000172{
173 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000174 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000175
176 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
177 return -1;
178 if (len != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000179 PyErr_SetString(PyExc_TypeError,
180 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000181 return -1;
182 }
183 if (i >= 0)
184 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
185 return 0;
186}
Martin v. Löwis99866332002-03-01 10:27:01 +0000187
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000188
Guido van Rossum549ab711997-01-03 19:09:47 +0000189static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000190h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000191{
Christian Heimes217cfd12007-12-02 14:31:20 +0000192 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000193}
194
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000195
Guido van Rossum778983b1993-02-19 15:55:02 +0000196static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000197h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000198{
199 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000200 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000201 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000202 return -1;
203 if (i >= 0)
204 ((short *)ap->ob_item)[i] = x;
205 return 0;
206}
207
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000208static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000209HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000210{
Christian Heimes217cfd12007-12-02 14:31:20 +0000211 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000212}
213
Fred Drake541dc3b2000-06-28 17:49:30 +0000214static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000215HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000216{
217 int x;
218 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
219 must use the next size up and manually do the overflow checking */
220 if (!PyArg_Parse(v, "i;array item must be integer", &x))
221 return -1;
222 else if (x < 0) {
223 PyErr_SetString(PyExc_OverflowError,
224 "unsigned short is less than minimum");
225 return -1;
226 }
227 else if (x > USHRT_MAX) {
228 PyErr_SetString(PyExc_OverflowError,
229 "unsigned short is greater than maximum");
230 return -1;
231 }
232 if (i >= 0)
233 ((short *)ap->ob_item)[i] = (short)x;
234 return 0;
235}
Guido van Rossum549ab711997-01-03 19:09:47 +0000236
237static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000238i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000239{
Christian Heimes217cfd12007-12-02 14:31:20 +0000240 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000241}
242
243static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000244i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000245{
246 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000247 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000248 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000249 return -1;
250 if (i >= 0)
251 ((int *)ap->ob_item)[i] = x;
252 return 0;
253}
254
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000255static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000256II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000257{
258 return PyLong_FromUnsignedLong(
259 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
260}
261
262static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000263II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000264{
265 unsigned long x;
266 if (PyLong_Check(v)) {
267 x = PyLong_AsUnsignedLong(v);
268 if (x == (unsigned long) -1 && PyErr_Occurred())
269 return -1;
270 }
271 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000272 long y;
273 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000274 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000275 if (y < 0) {
276 PyErr_SetString(PyExc_OverflowError,
277 "unsigned int is less than minimum");
278 return -1;
279 }
280 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000281
Guido van Rossum549ab711997-01-03 19:09:47 +0000282 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000283 if (x > UINT_MAX) {
284 PyErr_SetString(PyExc_OverflowError,
285 "unsigned int is greater than maximum");
286 return -1;
287 }
288
Guido van Rossum549ab711997-01-03 19:09:47 +0000289 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000290 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 return 0;
292}
293
294static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000295l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000296{
Christian Heimes217cfd12007-12-02 14:31:20 +0000297 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000298}
299
300static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000302{
303 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000304 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000305 return -1;
306 if (i >= 0)
307 ((long *)ap->ob_item)[i] = x;
308 return 0;
309}
310
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000311static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000312LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000313{
314 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
315}
316
317static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000318LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000319{
320 unsigned long x;
321 if (PyLong_Check(v)) {
322 x = PyLong_AsUnsignedLong(v);
323 if (x == (unsigned long) -1 && PyErr_Occurred())
324 return -1;
325 }
326 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000327 long y;
328 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000329 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000330 if (y < 0) {
331 PyErr_SetString(PyExc_OverflowError,
332 "unsigned long is less than minimum");
333 return -1;
334 }
335 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000336
Guido van Rossum549ab711997-01-03 19:09:47 +0000337 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000338 if (x > ULONG_MAX) {
339 PyErr_SetString(PyExc_OverflowError,
340 "unsigned long is greater than maximum");
341 return -1;
342 }
Tim Petersbb307342000-09-10 05:22:54 +0000343
Guido van Rossum549ab711997-01-03 19:09:47 +0000344 if (i >= 0)
345 ((unsigned long *)ap->ob_item)[i] = x;
346 return 0;
347}
348
349static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000350f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000351{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000352 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000353}
354
355static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000356f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000357{
358 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000359 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000360 return -1;
361 if (i >= 0)
362 ((float *)ap->ob_item)[i] = x;
363 return 0;
364}
365
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000366static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000367d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000368{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000369 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000370}
371
372static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000373d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000374{
375 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000376 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000377 return -1;
378 if (i >= 0)
379 ((double *)ap->ob_item)[i] = x;
380 return 0;
381}
382
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000383
Guido van Rossum778983b1993-02-19 15:55:02 +0000384/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000385static struct arraydescr descriptors[] = {
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000386 {'b', 1, b_getitem, b_setitem, "b"},
387 {'B', 1, BB_getitem, BB_setitem, "B"},
Travis E. Oliphantddacf962007-10-13 21:03:27 +0000388 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u"},
Travis E. Oliphantb803c512007-08-20 07:16:33 +0000389 {'h', sizeof(short), h_getitem, h_setitem, "h"},
390 {'H', sizeof(short), HH_getitem, HH_setitem, "H"},
391 {'i', sizeof(int), i_getitem, i_setitem, "i"},
392 {'I', sizeof(int), II_getitem, II_setitem, "I"},
393 {'l', sizeof(long), l_getitem, l_setitem, "l"},
394 {'L', sizeof(long), LL_getitem, LL_setitem, "L"},
395 {'f', sizeof(float), f_getitem, f_setitem, "f"},
396 {'d', sizeof(double), d_getitem, d_setitem, "d"},
397 {'\0', 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000398};
Tim Petersbb307342000-09-10 05:22:54 +0000399
400/****************************************************************************
401Implementations of array object methods.
402****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000403
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000404static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000405newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000406{
Guido van Rossum778983b1993-02-19 15:55:02 +0000407 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000408 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000409
Guido van Rossum778983b1993-02-19 15:55:02 +0000410 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000411 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000412 return NULL;
413 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000414
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 nbytes = size * descr->itemsize;
416 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000417 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000418 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000419 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000420 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000422 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000424 op->ob_descr = descr;
425 op->allocated = size;
426 op->weakreflist = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000427 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 if (size <= 0) {
429 op->ob_item = NULL;
430 }
431 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000432 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 if (op->ob_item == NULL) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000434 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000435 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 }
437 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000438 op->ob_exports = 0;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000440}
441
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000442static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000444{
445 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000446 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 ap = (arrayobject *)op;
Christian Heimes90aa7642007-12-19 02:45:37 +0000448 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000449 return (*ap->ob_descr->getitem)(ap, i);
450}
451
452static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
Guido van Rossum778983b1993-02-19 15:55:02 +0000455 char *items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000456 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000458 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return -1;
460 }
461 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
462 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000463
464 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000466 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000467 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000468 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000469 if (where < 0)
470 where = 0;
471 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000472 if (where > n)
473 where = n;
474 /* appends don't need to call memmove() */
475 if (where != n)
476 memmove(items + (where+1)*self->ob_descr->itemsize,
477 items + where*self->ob_descr->itemsize,
478 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000479 return (*self->ob_descr->setitem)(self, where, v);
480}
481
Guido van Rossum778983b1993-02-19 15:55:02 +0000482/* Methods */
483
484static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000485array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000486{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000487 if (op->weakreflist != NULL)
488 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000490 PyMem_DEL(op->ob_item);
Christian Heimes90aa7642007-12-19 02:45:37 +0000491 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000492}
493
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000494static PyObject *
495array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000497 arrayobject *va, *wa;
498 PyObject *vi = NULL;
499 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000500 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000501 PyObject *res;
502
Martin v. Löwis99866332002-03-01 10:27:01 +0000503 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504 Py_INCREF(Py_NotImplemented);
505 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000506 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507
508 va = (arrayobject *)v;
509 wa = (arrayobject *)w;
510
Christian Heimes90aa7642007-12-19 02:45:37 +0000511 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000512 /* Shortcut: if the lengths differ, the arrays differ */
513 if (op == Py_EQ)
514 res = Py_False;
515 else
516 res = Py_True;
517 Py_INCREF(res);
518 return res;
519 }
520
521 /* Search for the first index where items are different */
522 k = 1;
Christian Heimes90aa7642007-12-19 02:45:37 +0000523 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000524 vi = getarrayitem(v, i);
525 wi = getarrayitem(w, i);
526 if (vi == NULL || wi == NULL) {
527 Py_XDECREF(vi);
528 Py_XDECREF(wi);
529 return NULL;
530 }
531 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
532 if (k == 0)
533 break; /* Keeping vi and wi alive! */
534 Py_DECREF(vi);
535 Py_DECREF(wi);
536 if (k < 0)
537 return NULL;
538 }
539
540 if (k) {
541 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +0000542 Py_ssize_t vs = Py_SIZE(va);
543 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000544 int cmp;
545 switch (op) {
546 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000547 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000548 case Py_EQ: cmp = vs == ws; break;
549 case Py_NE: cmp = vs != ws; break;
550 case Py_GT: cmp = vs > ws; break;
551 case Py_GE: cmp = vs >= ws; break;
552 default: return NULL; /* cannot happen */
553 }
554 if (cmp)
555 res = Py_True;
556 else
557 res = Py_False;
558 Py_INCREF(res);
559 return res;
560 }
561
562 /* We have an item that differs. First, shortcuts for EQ/NE */
563 if (op == Py_EQ) {
564 Py_INCREF(Py_False);
565 res = Py_False;
566 }
567 else if (op == Py_NE) {
568 Py_INCREF(Py_True);
569 res = Py_True;
570 }
571 else {
572 /* Compare the final item again using the proper operator */
573 res = PyObject_RichCompare(vi, wi, op);
574 }
575 Py_DECREF(vi);
576 Py_DECREF(wi);
577 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000578}
579
Martin v. Löwis18e16552006-02-15 17:27:45 +0000580static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000581array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000582{
Christian Heimes90aa7642007-12-19 02:45:37 +0000583 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000584}
585
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000586static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000587array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000588{
Christian Heimes90aa7642007-12-19 02:45:37 +0000589 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000590 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000591 return NULL;
592 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000593 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
599 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000600 if (ilow < 0)
601 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000602 else if (ilow > Py_SIZE(a))
603 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604 if (ihigh < 0)
605 ihigh = 0;
606 if (ihigh < ilow)
607 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000608 else if (ihigh > Py_SIZE(a))
609 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000610 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000611 if (np == NULL)
612 return NULL;
613 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
614 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000615 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000616}
617
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000618static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000619array_copy(arrayobject *a, PyObject *unused)
620{
Christian Heimes90aa7642007-12-19 02:45:37 +0000621 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000622}
623
624PyDoc_STRVAR(copy_doc,
625"copy(array)\n\
626\n\
627 Return a copy of the array.");
628
629static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000630array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000631{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000632 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000633 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000634 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000635 PyErr_Format(PyExc_TypeError,
636 "can only append array (not \"%.200s\") to array",
Christian Heimes90aa7642007-12-19 02:45:37 +0000637 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000638 return NULL;
639 }
640#define b ((arrayobject *)bb)
641 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000642 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 return NULL;
644 }
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000645 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
646 return PyErr_NoMemory();
647 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000648 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000649 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000650 if (np == NULL) {
651 return NULL;
652 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000653 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
654 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
655 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000656 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000657#undef b
658}
659
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000660static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000661array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000662{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000663 Py_ssize_t i;
664 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000665 arrayobject *np;
666 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000667 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000668 if (n < 0)
669 n = 0;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000670 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
671 return PyErr_NoMemory();
672 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000673 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000674 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 if (np == NULL)
676 return NULL;
677 p = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000678 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000679 for (i = 0; i < n; i++) {
680 memcpy(p, a->ob_item, nbytes);
681 p += nbytes;
682 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000683 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000684}
685
686static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000687array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000688{
689 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000690 Py_ssize_t n; /* Size of replacement array */
691 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000692#define b ((arrayobject *)v)
693 if (v == NULL)
694 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000695 else if (array_Check(v)) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000696 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000697 if (a == b) {
698 /* Special case "a[i:j] = a" -- copy b first */
699 int ret;
700 v = array_slice(b, 0, n);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000701 if (!v)
702 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000703 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000704 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000705 return ret;
706 }
707 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000708 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000709 return -1;
710 }
711 }
712 else {
Fred Drake137507e2000-06-01 02:02:46 +0000713 PyErr_Format(PyExc_TypeError,
714 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +0000715 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000716 return -1;
717 }
718 if (ilow < 0)
719 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000720 else if (ilow > Py_SIZE(a))
721 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000722 if (ihigh < 0)
723 ihigh = 0;
724 if (ihigh < ilow)
725 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000726 else if (ihigh > Py_SIZE(a))
727 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000728 item = a->ob_item;
729 d = n - (ihigh-ilow);
730 if (d < 0) { /* Delete -d items */
731 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
732 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000733 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
734 Py_SIZE(a) += d;
735 PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000736 /* Can't fail */
737 a->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000738 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000739 }
740 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000741 PyMem_RESIZE(item, char,
Christian Heimes90aa7642007-12-19 02:45:37 +0000742 (Py_SIZE(a) + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000743 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000744 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000745 return -1;
746 }
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);
Guido van Rossum778983b1993-02-19 15:55:02 +0000750 a->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000751 Py_SIZE(a) += d;
752 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 }
754 if (n > 0)
755 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
756 n*b->ob_descr->itemsize);
757 return 0;
758#undef b
759}
760
761static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000762array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000763{
Christian Heimes90aa7642007-12-19 02:45:37 +0000764 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000765 PyErr_SetString(PyExc_IndexError,
766 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000767 return -1;
768 }
769 if (v == NULL)
770 return array_ass_slice(a, i, i+1, v);
771 return (*a->ob_descr->setitem)(a, i, v);
772}
773
774static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000775setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000776{
Martin v. Löwis99866332002-03-01 10:27:01 +0000777 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000778 return array_ass_item((arrayobject *)a, i, v);
779}
780
Martin v. Löwis99866332002-03-01 10:27:01 +0000781static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000782array_iter_extend(arrayobject *self, PyObject *bb)
783{
784 PyObject *it, *v;
785
786 it = PyObject_GetIter(bb);
787 if (it == NULL)
788 return -1;
789
790 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000791 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000792 Py_DECREF(v);
793 Py_DECREF(it);
794 return -1;
795 }
796 Py_DECREF(v);
797 }
798 Py_DECREF(it);
799 if (PyErr_Occurred())
800 return -1;
801 return 0;
802}
803
804static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000805array_do_extend(arrayobject *self, PyObject *bb)
806{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000807 Py_ssize_t size;
Georg Brandld492ad82008-07-23 16:13:07 +0000808 char *old_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000809
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000810 if (!array_Check(bb))
811 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000812#define b ((arrayobject *)bb)
813 if (self->ob_descr != b->ob_descr) {
814 PyErr_SetString(PyExc_TypeError,
815 "can only extend with array of same kind");
816 return -1;
817 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000818 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
819 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
820 PyErr_NoMemory();
821 return -1;
822 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000823 size = Py_SIZE(self) + Py_SIZE(b);
Georg Brandld492ad82008-07-23 16:13:07 +0000824 old_item = self->ob_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000825 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
826 if (self->ob_item == NULL) {
Georg Brandld492ad82008-07-23 16:13:07 +0000827 self->ob_item = old_item;
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000828 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000829 return -1;
830 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000831 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
832 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
833 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000834 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000835
836 return 0;
837#undef b
838}
839
840static PyObject *
841array_inplace_concat(arrayobject *self, PyObject *bb)
842{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000843 if (!array_Check(bb)) {
844 PyErr_Format(PyExc_TypeError,
845 "can only extend array with array (not \"%.200s\")",
Christian Heimes90aa7642007-12-19 02:45:37 +0000846 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000847 return NULL;
848 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000849 if (array_do_extend(self, bb) == -1)
850 return NULL;
851 Py_INCREF(self);
852 return (PyObject *)self;
853}
854
855static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000856array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000857{
858 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000859 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000860
Christian Heimes90aa7642007-12-19 02:45:37 +0000861 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000862 if (n < 0)
863 n = 0;
864 items = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000865 if ((self->ob_descr->itemsize != 0) &&
866 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
867 return PyErr_NoMemory();
868 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000869 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000870 if (n == 0) {
871 PyMem_FREE(items);
872 self->ob_item = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000873 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000874 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000875 }
876 else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000877 if (size > PY_SSIZE_T_MAX / n) {
878 return PyErr_NoMemory();
879 }
Georg Brandld492ad82008-07-23 16:13:07 +0000880 PyMem_RESIZE(items, char, n * size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000881 if (items == NULL)
882 return PyErr_NoMemory();
883 p = items;
884 for (i = 1; i < n; i++) {
885 p += size;
886 memcpy(p, items, size);
887 }
888 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000889 Py_SIZE(self) *= n;
890 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000891 }
892 }
893 Py_INCREF(self);
894 return (PyObject *)self;
895}
896
897
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000898static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000899ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000900{
901 if (ins1(self, where, v) != 0)
902 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000903 Py_INCREF(Py_None);
904 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000905}
906
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000907static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000908array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000909{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000910 Py_ssize_t count = 0;
911 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000912
Christian Heimes90aa7642007-12-19 02:45:37 +0000913 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000915 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000917 if (cmp > 0)
918 count++;
919 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920 return NULL;
921 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000922 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923}
924
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000925PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000926"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000928Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000929
930static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000931array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000932{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000933 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000934
Christian Heimes90aa7642007-12-19 02:45:37 +0000935 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000936 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000937 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
938 Py_DECREF(selfi);
939 if (cmp > 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000940 return PyLong_FromLong((long)i);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000941 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000942 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943 return NULL;
944 }
945 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
946 return NULL;
947}
948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000949PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000950"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000951\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000952Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000953
Raymond Hettinger625812f2003-01-07 01:58:52 +0000954static int
955array_contains(arrayobject *self, PyObject *v)
956{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000957 Py_ssize_t i;
958 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000959
Christian Heimes90aa7642007-12-19 02:45:37 +0000960 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000961 PyObject *selfi = getarrayitem((PyObject *)self, i);
962 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
963 Py_DECREF(selfi);
964 }
965 return cmp;
966}
967
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000968static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000969array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000970{
971 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000972
Christian Heimes90aa7642007-12-19 02:45:37 +0000973 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000975 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
976 Py_DECREF(selfi);
977 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000978 if (array_ass_slice(self, i, i+1,
979 (PyObject *)NULL) != 0)
980 return NULL;
981 Py_INCREF(Py_None);
982 return Py_None;
983 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000984 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000985 return NULL;
986 }
987 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
988 return NULL;
989}
990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000991PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000992"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000993\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000994Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000995
996static PyObject *
997array_pop(arrayobject *self, PyObject *args)
998{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000999 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001000 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001001 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001002 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001003 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001004 /* Special-case most common failure cause */
1005 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1006 return NULL;
1007 }
1008 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001009 i += Py_SIZE(self);
1010 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001011 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1012 return NULL;
1013 }
1014 v = getarrayitem((PyObject *)self,i);
1015 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1016 Py_DECREF(v);
1017 return NULL;
1018 }
1019 return v;
1020}
1021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001022PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001023"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001024\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001025Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026
1027static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001028array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001029{
Martin v. Löwis99866332002-03-01 10:27:01 +00001030 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001031 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001032 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001033 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001034}
1035
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001036PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001037"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001038\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001039 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001040
1041static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001042array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001043{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001044 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001045 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001046 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001047 return NULL;
1048 return ins(self, i, v);
1049}
1050
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001051PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001052"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001053\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001054Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001055
1056
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001057static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001058array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001059{
Tim Peters077a11d2000-09-16 22:31:29 +00001060 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001061 retval = PyTuple_New(2);
1062 if (!retval)
1063 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001064
1065 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimes90aa7642007-12-19 02:45:37 +00001066 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001067
1068 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001069}
1070
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001071PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001072"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001073\n\
1074Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001075the length in items of the buffer used to hold array's contents\n\
1076The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001077the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001078
1079
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001080static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001081array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001082{
Christian Heimes90aa7642007-12-19 02:45:37 +00001083 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001084}
1085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001086PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001087"append(x)\n\
1088\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001089Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001090
1091
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001092static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001093array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001094{
1095 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001096 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001097
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 switch (self->ob_descr->itemsize) {
1099 case 1:
1100 break;
1101 case 2:
Christian Heimes90aa7642007-12-19 02:45:37 +00001102 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001103 char p0 = p[0];
1104 p[0] = p[1];
1105 p[1] = p0;
1106 }
1107 break;
1108 case 4:
Christian Heimes90aa7642007-12-19 02:45:37 +00001109 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 char p0 = p[0];
1111 char p1 = p[1];
1112 p[0] = p[3];
1113 p[1] = p[2];
1114 p[2] = p1;
1115 p[3] = p0;
1116 }
1117 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001118 case 8:
Christian Heimes90aa7642007-12-19 02:45:37 +00001119 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001120 char p0 = p[0];
1121 char p1 = p[1];
1122 char p2 = p[2];
1123 char p3 = p[3];
1124 p[0] = p[7];
1125 p[1] = p[6];
1126 p[2] = p[5];
1127 p[3] = p[4];
1128 p[4] = p3;
1129 p[5] = p2;
1130 p[6] = p1;
1131 p[7] = p0;
1132 }
1133 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001134 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001135 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001136 "don't know how to byteswap this array type");
1137 return NULL;
1138 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139 Py_INCREF(Py_None);
1140 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001141}
1142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001143PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001144"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001145\n\
Fred Drakebf272981999-12-03 17:15:30 +00001146Byteswap 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 +000011474, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001148
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001150array_reduce(arrayobject *array)
1151{
1152 PyObject *dict, *result;
1153
1154 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1155 if (dict == NULL) {
1156 PyErr_Clear();
1157 dict = Py_None;
1158 Py_INCREF(dict);
1159 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001160 if (Py_SIZE(array) > 0) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001161 if (array->ob_descr->itemsize
1162 > PY_SSIZE_T_MAX / Py_SIZE(array)) {
1163 return PyErr_NoMemory();
1164 }
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001165 result = Py_BuildValue("O(cy#)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001166 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001167 array->ob_descr->typecode,
1168 array->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001169 Py_SIZE(array) * array->ob_descr->itemsize,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001170 dict);
1171 } else {
1172 result = Py_BuildValue("O(c)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001173 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001174 array->ob_descr->typecode,
1175 dict);
1176 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001177 Py_DECREF(dict);
1178 return result;
1179}
1180
1181PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1182
1183static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001184array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001185{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001186 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001187 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001188 /* little buffer to hold items while swapping */
1189 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001190 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001191
Christian Heimes90aa7642007-12-19 02:45:37 +00001192 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001193 for (p = self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001194 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001195 p < q;
1196 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001197 /* memory areas guaranteed disjoint, so memcpy
1198 * is safe (& memmove may be slower).
1199 */
1200 memcpy(tmp, p, itemsize);
1201 memcpy(p, q, itemsize);
1202 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001203 }
1204 }
Tim Petersbb307342000-09-10 05:22:54 +00001205
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001206 Py_INCREF(Py_None);
1207 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001208}
Guido van Rossume77a7571993-11-03 15:01:26 +00001209
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001210PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001211"reverse()\n\
1212\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001213Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001214
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001215
1216/* Forward */
1217static PyObject *array_fromstring(arrayobject *self, PyObject *args);
1218
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001219static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001220array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001221{
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001222 PyObject *f, *b, *res;
1223 Py_ssize_t itemsize = self->ob_descr->itemsize;
1224 Py_ssize_t n, nbytes;
1225
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001226 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001227 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001228
1229 nbytes = n * itemsize;
1230 if (nbytes < 0 || nbytes/itemsize != n) {
1231 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 return NULL;
1233 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001234
1235 b = PyObject_CallMethod(f, "read", "n", nbytes);
1236 if (b == NULL)
1237 return NULL;
1238
Christian Heimes72b710a2008-05-26 13:28:38 +00001239 if (!PyBytes_Check(b)) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001240 PyErr_SetString(PyExc_TypeError,
1241 "read() didn't return bytes");
1242 Py_DECREF(b);
1243 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001244 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001245
Christian Heimes72b710a2008-05-26 13:28:38 +00001246 if (PyBytes_GET_SIZE(b) != nbytes) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001247 PyErr_SetString(PyExc_EOFError,
1248 "read() didn't return enough bytes");
1249 Py_DECREF(b);
1250 return NULL;
1251 }
1252
1253 args = Py_BuildValue("(O)", b);
1254 Py_DECREF(b);
1255 if (args == NULL)
1256 return NULL;
1257
1258 res = array_fromstring(self, args);
1259 Py_DECREF(args);
1260
1261 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001262}
1263
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001264PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001265"fromfile(f, n)\n\
1266\n\
1267Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001268array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001269
1270
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001271static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001272array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001273{
Christian Heimes90aa7642007-12-19 02:45:37 +00001274 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001275 /* Write 64K blocks at a time */
1276 /* XXX Make the block size settable */
1277 int BLOCKSIZE = 64*1024;
1278 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1279 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001280
Christian Heimes90aa7642007-12-19 02:45:37 +00001281 if (Py_SIZE(self) == 0)
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001282 goto done;
1283
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001284 for (i = 0; i < nblocks; i++) {
1285 char* ptr = self->ob_item + i*BLOCKSIZE;
1286 Py_ssize_t size = BLOCKSIZE;
1287 PyObject *bytes, *res;
1288 if (i*BLOCKSIZE + size > nbytes)
1289 size = nbytes - i*BLOCKSIZE;
Christian Heimes72b710a2008-05-26 13:28:38 +00001290 bytes = PyBytes_FromStringAndSize(ptr, size);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001291 if (bytes == NULL)
Guido van Rossum778983b1993-02-19 15:55:02 +00001292 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001293 res = PyObject_CallMethod(f, "write", "O", bytes);
1294 Py_DECREF(bytes);
1295 if (res == NULL)
1296 return NULL;
Martin v. Löwisa291c8f2007-08-11 14:25:27 +00001297 Py_DECREF(res); /* drop write result */
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001298 }
1299
1300 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001301 Py_INCREF(Py_None);
1302 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001303}
1304
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001305PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001306"tofile(f)\n\
1307\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001308Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001309
1310
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001311static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001312array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001313{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001314 Py_ssize_t n;
1315 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001316
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317 if (!PyList_Check(list)) {
1318 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001319 return NULL;
1320 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001321 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 if (n > 0) {
1323 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001324 Py_ssize_t i;
Christian Heimes90aa7642007-12-19 02:45:37 +00001325 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001326 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001327 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 return NULL;
1329 }
1330 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001331 Py_SIZE(self) += n;
1332 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001333 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001334 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 if ((*self->ob_descr->setitem)(self,
Christian Heimes90aa7642007-12-19 02:45:37 +00001336 Py_SIZE(self) - n + i, v) != 0) {
1337 Py_SIZE(self) -= n;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001338 if (itemsize && (Py_SIZE(self) > PY_SSIZE_T_MAX / itemsize)) {
1339 return PyErr_NoMemory();
1340 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001341 PyMem_RESIZE(item, char,
Christian Heimes90aa7642007-12-19 02:45:37 +00001342 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001344 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001345 return NULL;
1346 }
1347 }
1348 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 Py_INCREF(Py_None);
1350 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001351}
1352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001353PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001354"fromlist(list)\n\
1355\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001357
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001358static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001359array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001360{
Christian Heimes90aa7642007-12-19 02:45:37 +00001361 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001362 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001363
Guido van Rossum778983b1993-02-19 15:55:02 +00001364 if (list == NULL)
1365 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001366 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001367 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001368 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001369 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001370 return NULL;
1371 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001372 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001373 }
1374 return list;
1375}
1376
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001377PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001378"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001379\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001380Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001381
1382
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001383static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001384array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001385{
1386 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001387 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001389 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001390 return NULL;
1391 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001392 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001393 "string length not a multiple of item size");
1394 return NULL;
1395 }
1396 n = n / itemsize;
1397 if (n > 0) {
1398 char *item = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001399 if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1400 ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1401 return PyErr_NoMemory();
1402 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001403 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001404 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001405 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 return NULL;
1407 }
1408 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001409 Py_SIZE(self) += n;
1410 self->allocated = Py_SIZE(self);
1411 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001412 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001413 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001414 Py_INCREF(Py_None);
1415 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001416}
1417
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001418PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001419"fromstring(string)\n\
1420\n\
1421Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001422values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001423
1424
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001425static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001426array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001427{
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001428 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1429 return PyBytes_FromStringAndSize(self->ob_item,
1430 Py_SIZE(self) * self->ob_descr->itemsize);
1431 } else {
1432 return PyErr_NoMemory();
1433 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001434}
1435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001436PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001437"tostring() -> string\n\
1438\n\
1439Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001440representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001441
Martin v. Löwis99866332002-03-01 10:27:01 +00001442
1443
Martin v. Löwis99866332002-03-01 10:27:01 +00001444static PyObject *
1445array_fromunicode(arrayobject *self, PyObject *args)
1446{
1447 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001448 Py_ssize_t n;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001449 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001450
1451 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1452 return NULL;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001453 typecode = self->ob_descr->typecode;
1454 if ((typecode != 'u')) {
1455 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001456 "fromunicode() may only be called on "
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001457 "unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001458 return NULL;
1459 }
1460 if (n > 0) {
1461 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001462 if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1463 return PyErr_NoMemory();
1464 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001465 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001466 if (item == NULL) {
1467 PyErr_NoMemory();
1468 return NULL;
1469 }
1470 self->ob_item = (char *) item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001471 Py_SIZE(self) += n;
1472 self->allocated = Py_SIZE(self);
1473 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001474 ustr, n * sizeof(Py_UNICODE));
1475 }
1476
1477 Py_INCREF(Py_None);
1478 return Py_None;
1479}
1480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001481PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001482"fromunicode(ustr)\n\
1483\n\
1484Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001485The array must be a unicode type array; otherwise a ValueError\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001486is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001488
1489
1490static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001491array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001492{
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001493 char typecode;
1494 typecode = self->ob_descr->typecode;
1495 if ((typecode != 'u')) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001496 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001497 "tounicode() may only be called on unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001498 return NULL;
1499 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001500 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001501}
1502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001503PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001504"tounicode() -> unicode\n\
1505\n\
1506Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001507a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001508array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001510
Martin v. Löwis99866332002-03-01 10:27:01 +00001511
1512
1513static PyObject *
1514array_get_typecode(arrayobject *a, void *closure)
1515{
1516 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001517 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001518}
1519
1520static PyObject *
1521array_get_itemsize(arrayobject *a, void *closure)
1522{
Christian Heimes217cfd12007-12-02 14:31:20 +00001523 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001524}
1525
1526static PyGetSetDef array_getsets [] = {
1527 {"typecode", (getter) array_get_typecode, NULL,
1528 "the typecode character used to create the array"},
1529 {"itemsize", (getter) array_get_itemsize, NULL,
1530 "the size, in bytes, of one array item"},
1531 {NULL}
1532};
1533
Martin v. Löwis59683e82008-06-13 07:50:45 +00001534static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001535 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001536 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001537 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001538 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001539 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001540 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001541 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1542 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001543 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001544 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001545 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001546 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001547 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001548 extend_doc},
1549 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1550 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001551 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001552 fromlist_doc},
1553 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1554 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001555 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1556 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001557 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001558 index_doc},
1559 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1560 insert_doc},
1561 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1562 pop_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001563 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1564 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001565 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001566 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001567 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001568 reverse_doc},
1569/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1570 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001571 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001572 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001573 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001574 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001575 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001576 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001577 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001578 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001579 {NULL, NULL} /* sentinel */
1580};
1581
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001582static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001583array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001584{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00001585 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001586 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001587 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001588
Christian Heimes90aa7642007-12-19 02:45:37 +00001589 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001590 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001591 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001592 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00001593 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001594 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001595 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001596 else
1597 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001598
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001599 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
1600 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001601 return s;
1602}
1603
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001604static PyObject*
1605array_subscr(arrayobject* self, PyObject* item)
1606{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001607 if (PyIndex_Check(item)) {
1608 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001609 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001610 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001611 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001612 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001613 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001614 return array_item(self, i);
1615 }
1616 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001617 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001618 PyObject* result;
1619 arrayobject* ar;
1620 int itemsize = self->ob_descr->itemsize;
1621
Christian Heimes90aa7642007-12-19 02:45:37 +00001622 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001623 &start, &stop, &step, &slicelength) < 0) {
1624 return NULL;
1625 }
1626
1627 if (slicelength <= 0) {
1628 return newarrayobject(&Arraytype, 0, self->ob_descr);
1629 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001630 else if (step == 1) {
1631 PyObject *result = newarrayobject(&Arraytype,
1632 slicelength, self->ob_descr);
1633 if (result == NULL)
1634 return NULL;
1635 memcpy(((arrayobject *)result)->ob_item,
1636 self->ob_item + start * itemsize,
1637 slicelength * itemsize);
1638 return result;
1639 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001640 else {
1641 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1642 if (!result) return NULL;
1643
1644 ar = (arrayobject*)result;
1645
1646 for (cur = start, i = 0; i < slicelength;
1647 cur += step, i++) {
1648 memcpy(ar->ob_item + i*itemsize,
1649 self->ob_item + cur*itemsize,
1650 itemsize);
1651 }
1652
1653 return result;
1654 }
1655 }
1656 else {
1657 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00001658 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001659 return NULL;
1660 }
1661}
1662
1663static int
1664array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1665{
Thomas Woutersed03b412007-08-28 21:37:11 +00001666 Py_ssize_t start, stop, step, slicelength, needed;
1667 arrayobject* other;
1668 int itemsize;
1669
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001670 if (PyIndex_Check(item)) {
1671 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00001672
1673 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001674 return -1;
1675 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001676 i += Py_SIZE(self);
1677 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001678 PyErr_SetString(PyExc_IndexError,
1679 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001680 return -1;
1681 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001682 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001683 /* Fall through to slice assignment */
1684 start = i;
1685 stop = i + 1;
1686 step = 1;
1687 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001688 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001689 else
1690 return (*self->ob_descr->setitem)(self, i, value);
1691 }
1692 else if (PySlice_Check(item)) {
1693 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001694 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00001695 &step, &slicelength) < 0) {
1696 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001697 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001698 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001699 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00001700 PyErr_SetString(PyExc_TypeError,
1701 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001702 return -1;
1703 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001704 if (value == NULL) {
1705 other = NULL;
1706 needed = 0;
1707 }
1708 else if (array_Check(value)) {
1709 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00001710 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00001711 if (self == other) {
1712 /* Special case "self[i:j] = self" -- copy self first */
1713 int ret;
1714 value = array_slice(other, 0, needed);
1715 if (value == NULL)
1716 return -1;
1717 ret = array_ass_subscr(self, item, value);
1718 Py_DECREF(value);
1719 return ret;
1720 }
1721 if (other->ob_descr != self->ob_descr) {
1722 PyErr_BadArgument();
1723 return -1;
1724 }
1725 }
1726 else {
1727 PyErr_Format(PyExc_TypeError,
1728 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00001729 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00001730 return -1;
1731 }
1732 itemsize = self->ob_descr->itemsize;
1733 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1734 if ((step > 0 && stop < start) ||
1735 (step < 0 && stop > start))
1736 stop = start;
1737 if (step == 1) {
1738 if (slicelength > needed) {
1739 memmove(self->ob_item + (start + needed) * itemsize,
1740 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001741 (Py_SIZE(self) - stop) * itemsize);
1742 if (array_resize(self, Py_SIZE(self) +
Thomas Woutersed03b412007-08-28 21:37:11 +00001743 needed - slicelength) < 0)
1744 return -1;
1745 }
1746 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001747 if (array_resize(self, Py_SIZE(self) +
Thomas Woutersed03b412007-08-28 21:37:11 +00001748 needed - slicelength) < 0)
1749 return -1;
1750 memmove(self->ob_item + (start + needed) * itemsize,
1751 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001752 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001753 }
1754 if (needed > 0)
1755 memcpy(self->ob_item + start * itemsize,
1756 other->ob_item, needed * itemsize);
1757 return 0;
1758 }
1759 else if (needed == 0) {
1760 /* Delete slice */
1761 Py_ssize_t cur, i;
1762
1763 if (step < 0) {
1764 stop = start + 1;
1765 start = stop + step * (slicelength - 1) - 1;
1766 step = -step;
1767 }
1768 for (cur = start, i = 0; i < slicelength;
1769 cur += step, i++) {
1770 Py_ssize_t lim = step - 1;
1771
Christian Heimes90aa7642007-12-19 02:45:37 +00001772 if (cur + step >= Py_SIZE(self))
1773 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00001774 memmove(self->ob_item + (cur - i) * itemsize,
1775 self->ob_item + (cur + 1) * itemsize,
1776 lim * itemsize);
1777 }
1778 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00001779 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001780 memmove(self->ob_item + (cur-slicelength) * itemsize,
1781 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001782 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001783 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001784 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001785 return -1;
1786 return 0;
1787 }
1788 else {
1789 Py_ssize_t cur, i;
1790
1791 if (needed != slicelength) {
1792 PyErr_Format(PyExc_ValueError,
1793 "attempt to assign array of size %zd "
1794 "to extended slice of size %zd",
1795 needed, slicelength);
1796 return -1;
1797 }
1798 for (cur = start, i = 0; i < slicelength;
1799 cur += step, i++) {
1800 memcpy(self->ob_item + cur * itemsize,
1801 other->ob_item + i * itemsize,
1802 itemsize);
1803 }
1804 return 0;
1805 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001806}
1807
1808static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001809 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001810 (binaryfunc)array_subscr,
1811 (objobjargproc)array_ass_subscr
1812};
1813
Guido van Rossumd8faa362007-04-27 19:54:29 +00001814static const void *emptybuf = "";
1815
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001816
1817static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001818array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001819{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001820 if (view==NULL) goto finish;
1821
1822 view->buf = (void *)self->ob_item;
Martin v. Löwis423be952008-08-13 15:53:07 +00001823 view->obj = (PyObject*)self;
1824 Py_INCREF(self);
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001825 if (view->buf == NULL)
1826 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00001827 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001828 view->readonly = 0;
1829 view->ndim = 1;
1830 view->itemsize = self->ob_descr->itemsize;
1831 view->suboffsets = NULL;
1832 view->shape = NULL;
1833 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001834 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001835 }
1836 view->strides = NULL;
1837 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
1838 view->strides = &(view->itemsize);
1839 view->format = NULL;
1840 view->internal = NULL;
1841 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00001842 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001843#ifdef Py_UNICODE_WIDE
1844 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00001845 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001846 }
1847#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001848 }
1849
1850 finish:
1851 self->ob_exports++;
1852 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001853}
1854
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001855static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001856array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001857{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001858 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001859}
1860
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001861static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001862 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001863 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001864 (ssizeargfunc)array_repeat, /*sq_repeat*/
1865 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001866 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001867 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001868 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001869 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001870 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001871 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001872};
1873
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001874static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001875 (getbufferproc)array_buffer_getbuf,
1876 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001877};
1878
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001879static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001880array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001881{
Guido van Rossum8934fc22007-06-30 23:44:36 +00001882 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001883 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001884 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001885
Thomas Woutersb2137042007-02-01 18:02:27 +00001886 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001887 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001888
Walter Dörwaldd0941302007-07-01 21:58:22 +00001889 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00001890 return NULL;
1891
1892 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00001893 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00001894 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00001895 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001896 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001897 it = PyObject_GetIter(initial);
1898 if (it == NULL)
1899 return NULL;
1900 /* We set initial to NULL so that the subsequent code
1901 will create an empty array of the appropriate type
1902 and afterwards we can use array_iter_extend to populate
1903 the array.
1904 */
1905 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001906 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001907 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1908 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001909 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001910 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001911
1912 if (initial == NULL || !(PyList_Check(initial)
1913 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001914 len = 0;
1915 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001916 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001917
1918 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001919 if (a == NULL)
1920 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001921
Guido van Rossum778983b1993-02-19 15:55:02 +00001922 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001923 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001924 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001925 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001926 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001927 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001928 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001929 return NULL;
1930 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001931 if (setarrayitem(a, i, v) != 0) {
1932 Py_DECREF(v);
1933 Py_DECREF(a);
1934 return NULL;
1935 }
1936 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001937 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001938 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00001939 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00001940 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001941 PyObject *t_initial, *v;
1942 t_initial = PyTuple_Pack(1, initial);
1943 if (t_initial == NULL) {
1944 Py_DECREF(a);
1945 return NULL;
1946 }
1947 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001948 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001949 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001950 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001951 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001952 return NULL;
1953 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001954 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001955 }
1956 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001957 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001958 if (n > 0) {
1959 arrayobject *self = (arrayobject *)a;
1960 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001961 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001962 if (item == NULL) {
1963 PyErr_NoMemory();
1964 Py_DECREF(a);
1965 return NULL;
1966 }
1967 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001968 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001969 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00001970 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001971 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001972 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001973 if (it != NULL) {
1974 if (array_iter_extend((arrayobject *)a, it) == -1) {
1975 Py_DECREF(it);
1976 Py_DECREF(a);
1977 return NULL;
1978 }
1979 Py_DECREF(it);
1980 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001981 return a;
1982 }
1983 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001984 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00001985 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001986 return NULL;
1987}
1988
Guido van Rossum778983b1993-02-19 15:55:02 +00001989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001990PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001991"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001992an array of basic values: characters, integers, floating point\n\
1993numbers. Arrays are sequence types and behave very much like lists,\n\
1994except that the type of objects stored in them is constrained. The\n\
1995type is specified at object creation time by using a type code, which\n\
1996is a single character. The following type codes are defined:\n\
1997\n\
1998 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001999 'b' signed integer 1 \n\
2000 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002001 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002002 'h' signed integer 2 \n\
2003 'H' unsigned integer 2 \n\
2004 'i' signed integer 2 \n\
2005 'I' unsigned integer 2 \n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002006 'w' unicode character 4 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002007 'l' signed integer 4 \n\
2008 'L' unsigned integer 4 \n\
2009 'f' floating point 4 \n\
2010 'd' floating point 8 \n\
2011\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002012NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2013narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2014\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002015The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002016\n\
2017array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002018");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002020PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002021"array(typecode [, initializer]) -> array\n\
2022\n\
2023Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002024initialized from the optional initializer value, which must be a list,\n\
2025string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002026\n\
2027Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002028the type of objects stored in them is constrained.\n\
2029\n\
2030Methods:\n\
2031\n\
2032append() -- append a new item to the end of the array\n\
2033buffer_info() -- return information giving the current memory info\n\
2034byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002035count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002036extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002037fromfile() -- read items from a file object\n\
2038fromlist() -- append items from the list\n\
2039fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002040index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002041insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002042pop() -- remove and return item (default last)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002043remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002044reverse() -- reverse the order of the items in the array\n\
2045tofile() -- write all items to a file object\n\
2046tolist() -- return the array converted to an ordinary list\n\
2047tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002048\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002049Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002050\n\
2051typecode -- the typecode character used to create the array\n\
2052itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002053");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002054
Raymond Hettinger625812f2003-01-07 01:58:52 +00002055static PyObject *array_iter(arrayobject *ao);
2056
Tim Peters0c322792002-07-17 16:49:03 +00002057static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002058 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002059 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002060 sizeof(arrayobject),
2061 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002062 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002063 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002064 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002065 0, /* tp_setattr */
2066 0, /* tp_compare */
2067 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002068 0, /* tp_as_number*/
2069 &array_as_sequence, /* tp_as_sequence*/
2070 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002071 0, /* tp_hash */
2072 0, /* tp_call */
2073 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002074 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002075 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002076 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002077 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002078 arraytype_doc, /* tp_doc */
2079 0, /* tp_traverse */
2080 0, /* tp_clear */
2081 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002082 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002083 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002084 0, /* tp_iternext */
2085 array_methods, /* tp_methods */
2086 0, /* tp_members */
2087 array_getsets, /* tp_getset */
2088 0, /* tp_base */
2089 0, /* tp_dict */
2090 0, /* tp_descr_get */
2091 0, /* tp_descr_set */
2092 0, /* tp_dictoffset */
2093 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002094 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002095 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002096 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002097};
2098
Raymond Hettinger625812f2003-01-07 01:58:52 +00002099
2100/*********************** Array Iterator **************************/
2101
2102typedef struct {
2103 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002104 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002105 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002106 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002107} arrayiterobject;
2108
2109static PyTypeObject PyArrayIter_Type;
2110
2111#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2112
2113static PyObject *
2114array_iter(arrayobject *ao)
2115{
2116 arrayiterobject *it;
2117
2118 if (!array_Check(ao)) {
2119 PyErr_BadInternalCall();
2120 return NULL;
2121 }
2122
2123 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2124 if (it == NULL)
2125 return NULL;
2126
2127 Py_INCREF(ao);
2128 it->ao = ao;
2129 it->index = 0;
2130 it->getitem = ao->ob_descr->getitem;
2131 PyObject_GC_Track(it);
2132 return (PyObject *)it;
2133}
2134
2135static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002136arrayiter_next(arrayiterobject *it)
2137{
2138 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002139 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002140 return (*it->getitem)(it->ao, it->index++);
2141 return NULL;
2142}
2143
2144static void
2145arrayiter_dealloc(arrayiterobject *it)
2146{
2147 PyObject_GC_UnTrack(it);
2148 Py_XDECREF(it->ao);
2149 PyObject_GC_Del(it);
2150}
2151
2152static int
2153arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2154{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002155 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002156 return 0;
2157}
2158
2159static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002160 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002161 "arrayiterator", /* tp_name */
2162 sizeof(arrayiterobject), /* tp_basicsize */
2163 0, /* tp_itemsize */
2164 /* methods */
2165 (destructor)arrayiter_dealloc, /* tp_dealloc */
2166 0, /* tp_print */
2167 0, /* tp_getattr */
2168 0, /* tp_setattr */
2169 0, /* tp_compare */
2170 0, /* tp_repr */
2171 0, /* tp_as_number */
2172 0, /* tp_as_sequence */
2173 0, /* tp_as_mapping */
2174 0, /* tp_hash */
2175 0, /* tp_call */
2176 0, /* tp_str */
2177 PyObject_GenericGetAttr, /* tp_getattro */
2178 0, /* tp_setattro */
2179 0, /* tp_as_buffer */
2180 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2181 0, /* tp_doc */
2182 (traverseproc)arrayiter_traverse, /* tp_traverse */
2183 0, /* tp_clear */
2184 0, /* tp_richcompare */
2185 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002186 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002187 (iternextfunc)arrayiter_next, /* tp_iternext */
2188 0, /* tp_methods */
2189};
2190
2191
2192/*********************** Install Module **************************/
2193
Martin v. Löwis99866332002-03-01 10:27:01 +00002194/* No functions in array module. */
2195static PyMethodDef a_methods[] = {
2196 {NULL, NULL, 0, NULL} /* Sentinel */
2197};
2198
Martin v. Löwis1a214512008-06-11 05:26:20 +00002199static struct PyModuleDef arraymodule = {
2200 PyModuleDef_HEAD_INIT,
2201 "array",
2202 module_doc,
2203 -1,
2204 a_methods,
2205 NULL,
2206 NULL,
2207 NULL,
2208 NULL
2209};
2210
Martin v. Löwis99866332002-03-01 10:27:01 +00002211
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002212PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002213PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002214{
Fred Drakef4e34842002-04-01 03:45:06 +00002215 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002216 PyObject *typecodes;
2217 Py_ssize_t size = 0;
2218 register Py_UNICODE *p;
2219 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002220
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002221 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002222 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002223 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002224 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002225 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002226 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002227
2228 Py_INCREF((PyObject *)&Arraytype);
2229 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2230 Py_INCREF((PyObject *)&Arraytype);
2231 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002232
2233 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2234 size++;
2235 }
2236
2237 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2238 p = PyUnicode_AS_UNICODE(typecodes);
2239 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2240 *p++ = (char)descr->typecode;
2241 }
2242
2243 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2244
Martin v. Löwis1a214512008-06-11 05:26:20 +00002245 if (PyErr_Occurred()) {
2246 Py_DECREF(m);
2247 m = NULL;
2248 }
2249 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002250}