blob: d2ae367b18e901c8e8934a0918849f5acc0b34e6 [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;
Martin v. Löwis99866332002-03-01 10:27:01 +0000808
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000809 if (!array_Check(bb))
810 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000811#define b ((arrayobject *)bb)
812 if (self->ob_descr != b->ob_descr) {
813 PyErr_SetString(PyExc_TypeError,
814 "can only extend with array of same kind");
815 return -1;
816 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000817 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
818 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
819 PyErr_NoMemory();
820 return -1;
821 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000822 size = Py_SIZE(self) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000823 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
824 if (self->ob_item == NULL) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000825 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000826 return -1;
827 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000828 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
829 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
830 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000831 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000832
833 return 0;
834#undef b
835}
836
837static PyObject *
838array_inplace_concat(arrayobject *self, PyObject *bb)
839{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000840 if (!array_Check(bb)) {
841 PyErr_Format(PyExc_TypeError,
842 "can only extend array with array (not \"%.200s\")",
Christian Heimes90aa7642007-12-19 02:45:37 +0000843 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000844 return NULL;
845 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000846 if (array_do_extend(self, bb) == -1)
847 return NULL;
848 Py_INCREF(self);
849 return (PyObject *)self;
850}
851
852static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000853array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000854{
855 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000856 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000857
Christian Heimes90aa7642007-12-19 02:45:37 +0000858 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000859 if (n < 0)
860 n = 0;
861 items = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000862 if ((self->ob_descr->itemsize != 0) &&
863 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
864 return PyErr_NoMemory();
865 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000866 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000867 if (n == 0) {
868 PyMem_FREE(items);
869 self->ob_item = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000870 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000871 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000872 }
873 else {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +0000874 if (size > PY_SSIZE_T_MAX / n) {
875 return PyErr_NoMemory();
876 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000877 PyMem_Resize(items, char, n * size);
878 if (items == NULL)
879 return PyErr_NoMemory();
880 p = items;
881 for (i = 1; i < n; i++) {
882 p += size;
883 memcpy(p, items, size);
884 }
885 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000886 Py_SIZE(self) *= n;
887 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000888 }
889 }
890 Py_INCREF(self);
891 return (PyObject *)self;
892}
893
894
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000895static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000896ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000897{
898 if (ins1(self, where, v) != 0)
899 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000900 Py_INCREF(Py_None);
901 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000902}
903
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000904static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000905array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000906{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907 Py_ssize_t count = 0;
908 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000909
Christian Heimes90aa7642007-12-19 02:45:37 +0000910 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000912 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000914 if (cmp > 0)
915 count++;
916 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000917 return NULL;
918 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000919 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920}
921
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000922PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000923"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000925Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926
927static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000928array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000929{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000930 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931
Christian Heimes90aa7642007-12-19 02:45:37 +0000932 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000934 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
935 Py_DECREF(selfi);
936 if (cmp > 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000937 return PyLong_FromLong((long)i);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000938 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000939 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000940 return NULL;
941 }
942 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
943 return NULL;
944}
945
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000946PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000947"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000948\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000949Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000950
Raymond Hettinger625812f2003-01-07 01:58:52 +0000951static int
952array_contains(arrayobject *self, PyObject *v)
953{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000954 Py_ssize_t i;
955 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000956
Christian Heimes90aa7642007-12-19 02:45:37 +0000957 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000958 PyObject *selfi = getarrayitem((PyObject *)self, i);
959 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
960 Py_DECREF(selfi);
961 }
962 return cmp;
963}
964
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000965static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000966array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000967{
968 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969
Christian Heimes90aa7642007-12-19 02:45:37 +0000970 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000971 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000972 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
973 Py_DECREF(selfi);
974 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000975 if (array_ass_slice(self, i, i+1,
976 (PyObject *)NULL) != 0)
977 return NULL;
978 Py_INCREF(Py_None);
979 return Py_None;
980 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000981 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982 return NULL;
983 }
984 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
985 return NULL;
986}
987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000988PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000989"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000990\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000991Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000992
993static PyObject *
994array_pop(arrayobject *self, PyObject *args)
995{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000996 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000997 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000998 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000999 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001000 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001001 /* Special-case most common failure cause */
1002 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1003 return NULL;
1004 }
1005 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001006 i += Py_SIZE(self);
1007 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001008 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1009 return NULL;
1010 }
1011 v = getarrayitem((PyObject *)self,i);
1012 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1013 Py_DECREF(v);
1014 return NULL;
1015 }
1016 return v;
1017}
1018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001019PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001020"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001022Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001023
1024static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001025array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026{
Martin v. Löwis99866332002-03-01 10:27:01 +00001027 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001028 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001029 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001030 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001031}
1032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001033PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001034"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001035\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001036 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001037
1038static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001039array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001040{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001041 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001042 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001043 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001044 return NULL;
1045 return ins(self, i, v);
1046}
1047
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001048PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001049"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001050\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001051Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001052
1053
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001054static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001055array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001056{
Tim Peters077a11d2000-09-16 22:31:29 +00001057 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001058 retval = PyTuple_New(2);
1059 if (!retval)
1060 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001061
1062 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimes90aa7642007-12-19 02:45:37 +00001063 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001064
1065 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001066}
1067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001068PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001069"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001070\n\
1071Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001072the length in items of the buffer used to hold array's contents\n\
1073The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001074the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001075
1076
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001077static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001078array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001079{
Christian Heimes90aa7642007-12-19 02:45:37 +00001080 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001081}
1082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001083PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001084"append(x)\n\
1085\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001086Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001087
1088
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001090array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001091{
1092 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001093 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001094
Guido van Rossum778983b1993-02-19 15:55:02 +00001095 switch (self->ob_descr->itemsize) {
1096 case 1:
1097 break;
1098 case 2:
Christian Heimes90aa7642007-12-19 02:45:37 +00001099 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001100 char p0 = p[0];
1101 p[0] = p[1];
1102 p[1] = p0;
1103 }
1104 break;
1105 case 4:
Christian Heimes90aa7642007-12-19 02:45:37 +00001106 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001107 char p0 = p[0];
1108 char p1 = p[1];
1109 p[0] = p[3];
1110 p[1] = p[2];
1111 p[2] = p1;
1112 p[3] = p0;
1113 }
1114 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001115 case 8:
Christian Heimes90aa7642007-12-19 02:45:37 +00001116 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001117 char p0 = p[0];
1118 char p1 = p[1];
1119 char p2 = p[2];
1120 char p3 = p[3];
1121 p[0] = p[7];
1122 p[1] = p[6];
1123 p[2] = p[5];
1124 p[3] = p[4];
1125 p[4] = p3;
1126 p[5] = p2;
1127 p[6] = p1;
1128 p[7] = p0;
1129 }
1130 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001131 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001132 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001133 "don't know how to byteswap this array type");
1134 return NULL;
1135 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001136 Py_INCREF(Py_None);
1137 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001138}
1139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001140PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001141"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001142\n\
Fred Drakebf272981999-12-03 17:15:30 +00001143Byteswap 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 +000011444, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001145
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001146static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001147array_reduce(arrayobject *array)
1148{
1149 PyObject *dict, *result;
1150
1151 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1152 if (dict == NULL) {
1153 PyErr_Clear();
1154 dict = Py_None;
1155 Py_INCREF(dict);
1156 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001157 if (Py_SIZE(array) > 0) {
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001158 if (array->ob_descr->itemsize
1159 > PY_SSIZE_T_MAX / Py_SIZE(array)) {
1160 return PyErr_NoMemory();
1161 }
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001162 result = Py_BuildValue("O(cy#)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001163 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001164 array->ob_descr->typecode,
1165 array->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001166 Py_SIZE(array) * array->ob_descr->itemsize,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001167 dict);
1168 } else {
1169 result = Py_BuildValue("O(c)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001170 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001171 array->ob_descr->typecode,
1172 dict);
1173 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001174 Py_DECREF(dict);
1175 return result;
1176}
1177
1178PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1179
1180static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001181array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001182{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001183 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001184 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001185 /* little buffer to hold items while swapping */
1186 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001187 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001188
Christian Heimes90aa7642007-12-19 02:45:37 +00001189 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001190 for (p = self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001191 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001192 p < q;
1193 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001194 /* memory areas guaranteed disjoint, so memcpy
1195 * is safe (& memmove may be slower).
1196 */
1197 memcpy(tmp, p, itemsize);
1198 memcpy(p, q, itemsize);
1199 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 }
1201 }
Tim Petersbb307342000-09-10 05:22:54 +00001202
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001203 Py_INCREF(Py_None);
1204 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001205}
Guido van Rossume77a7571993-11-03 15:01:26 +00001206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001207PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001208"reverse()\n\
1209\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001210Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001211
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001212
1213/* Forward */
1214static PyObject *array_fromstring(arrayobject *self, PyObject *args);
1215
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001216static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001217array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001218{
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001219 PyObject *f, *b, *res;
1220 Py_ssize_t itemsize = self->ob_descr->itemsize;
1221 Py_ssize_t n, nbytes;
1222
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001223 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001224 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001225
1226 nbytes = n * itemsize;
1227 if (nbytes < 0 || nbytes/itemsize != n) {
1228 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 return NULL;
1230 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001231
1232 b = PyObject_CallMethod(f, "read", "n", nbytes);
1233 if (b == NULL)
1234 return NULL;
1235
Christian Heimes72b710a2008-05-26 13:28:38 +00001236 if (!PyBytes_Check(b)) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001237 PyErr_SetString(PyExc_TypeError,
1238 "read() didn't return bytes");
1239 Py_DECREF(b);
1240 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001241 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001242
Christian Heimes72b710a2008-05-26 13:28:38 +00001243 if (PyBytes_GET_SIZE(b) != nbytes) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001244 PyErr_SetString(PyExc_EOFError,
1245 "read() didn't return enough bytes");
1246 Py_DECREF(b);
1247 return NULL;
1248 }
1249
1250 args = Py_BuildValue("(O)", b);
1251 Py_DECREF(b);
1252 if (args == NULL)
1253 return NULL;
1254
1255 res = array_fromstring(self, args);
1256 Py_DECREF(args);
1257
1258 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001259}
1260
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001261PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001262"fromfile(f, n)\n\
1263\n\
1264Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001265array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001266
1267
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001269array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001270{
Christian Heimes90aa7642007-12-19 02:45:37 +00001271 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001272 /* Write 64K blocks at a time */
1273 /* XXX Make the block size settable */
1274 int BLOCKSIZE = 64*1024;
1275 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1276 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001277
Christian Heimes90aa7642007-12-19 02:45:37 +00001278 if (Py_SIZE(self) == 0)
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001279 goto done;
1280
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001281 for (i = 0; i < nblocks; i++) {
1282 char* ptr = self->ob_item + i*BLOCKSIZE;
1283 Py_ssize_t size = BLOCKSIZE;
1284 PyObject *bytes, *res;
1285 if (i*BLOCKSIZE + size > nbytes)
1286 size = nbytes - i*BLOCKSIZE;
Christian Heimes72b710a2008-05-26 13:28:38 +00001287 bytes = PyBytes_FromStringAndSize(ptr, size);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001288 if (bytes == NULL)
Guido van Rossum778983b1993-02-19 15:55:02 +00001289 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001290 res = PyObject_CallMethod(f, "write", "O", bytes);
1291 Py_DECREF(bytes);
1292 if (res == NULL)
1293 return NULL;
Martin v. Löwisa291c8f2007-08-11 14:25:27 +00001294 Py_DECREF(res); /* drop write result */
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001295 }
1296
1297 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001298 Py_INCREF(Py_None);
1299 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001300}
1301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001302PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001303"tofile(f)\n\
1304\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001305Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001306
1307
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001308static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001309array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001310{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001311 Py_ssize_t n;
1312 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001313
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001314 if (!PyList_Check(list)) {
1315 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001316 return NULL;
1317 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001318 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001319 if (n > 0) {
1320 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001321 Py_ssize_t i;
Christian Heimes90aa7642007-12-19 02:45:37 +00001322 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001323 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001324 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001325 return NULL;
1326 }
1327 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001328 Py_SIZE(self) += n;
1329 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001330 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001331 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001332 if ((*self->ob_descr->setitem)(self,
Christian Heimes90aa7642007-12-19 02:45:37 +00001333 Py_SIZE(self) - n + i, v) != 0) {
1334 Py_SIZE(self) -= n;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001335 if (itemsize && (Py_SIZE(self) > PY_SSIZE_T_MAX / itemsize)) {
1336 return PyErr_NoMemory();
1337 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338 PyMem_RESIZE(item, char,
Christian Heimes90aa7642007-12-19 02:45:37 +00001339 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001340 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001341 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001342 return NULL;
1343 }
1344 }
1345 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001346 Py_INCREF(Py_None);
1347 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001348}
1349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001350PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001351"fromlist(list)\n\
1352\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001353Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001354
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001355static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001356array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001357{
Christian Heimes90aa7642007-12-19 02:45:37 +00001358 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001359 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001360
Guido van Rossum778983b1993-02-19 15:55:02 +00001361 if (list == NULL)
1362 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001363 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001364 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001365 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001366 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001367 return NULL;
1368 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001369 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001370 }
1371 return list;
1372}
1373
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001374PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001375"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001376\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001377Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001378
1379
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001380static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001381array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001382{
1383 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001384 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001385 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001386 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001387 return NULL;
1388 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001389 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001390 "string length not a multiple of item size");
1391 return NULL;
1392 }
1393 n = n / itemsize;
1394 if (n > 0) {
1395 char *item = self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001396 if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1397 ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1398 return PyErr_NoMemory();
1399 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001400 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001401 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001402 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001403 return NULL;
1404 }
1405 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001406 Py_SIZE(self) += n;
1407 self->allocated = Py_SIZE(self);
1408 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001409 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001410 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001411 Py_INCREF(Py_None);
1412 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001413}
1414
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001415PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001416"fromstring(string)\n\
1417\n\
1418Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001419values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001420
1421
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001422static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001423array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001424{
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001425 if (Py_SIZE(self) <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1426 return PyBytes_FromStringAndSize(self->ob_item,
1427 Py_SIZE(self) * self->ob_descr->itemsize);
1428 } else {
1429 return PyErr_NoMemory();
1430 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001431}
1432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001433PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001434"tostring() -> string\n\
1435\n\
1436Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001438
Martin v. Löwis99866332002-03-01 10:27:01 +00001439
1440
Martin v. Löwis99866332002-03-01 10:27:01 +00001441static PyObject *
1442array_fromunicode(arrayobject *self, PyObject *args)
1443{
1444 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001445 Py_ssize_t n;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001446 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001447
1448 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1449 return NULL;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001450 typecode = self->ob_descr->typecode;
1451 if ((typecode != 'u')) {
1452 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001453 "fromunicode() may only be called on "
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001454 "unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001455 return NULL;
1456 }
1457 if (n > 0) {
1458 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Amaury Forgeot d'Arc9c74b142008-06-18 00:47:36 +00001459 if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1460 return PyErr_NoMemory();
1461 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001462 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001463 if (item == NULL) {
1464 PyErr_NoMemory();
1465 return NULL;
1466 }
1467 self->ob_item = (char *) item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001468 Py_SIZE(self) += n;
1469 self->allocated = Py_SIZE(self);
1470 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001471 ustr, n * sizeof(Py_UNICODE));
1472 }
1473
1474 Py_INCREF(Py_None);
1475 return Py_None;
1476}
1477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001479"fromunicode(ustr)\n\
1480\n\
1481Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001482The array must be a unicode type array; otherwise a ValueError\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001483is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001484append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001485
1486
1487static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001488array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001489{
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001490 char typecode;
1491 typecode = self->ob_descr->typecode;
1492 if ((typecode != 'u')) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001493 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001494 "tounicode() may only be called on unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001495 return NULL;
1496 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001497 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001498}
1499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001500PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001501"tounicode() -> unicode\n\
1502\n\
1503Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001504a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001505array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001507
Martin v. Löwis99866332002-03-01 10:27:01 +00001508
1509
1510static PyObject *
1511array_get_typecode(arrayobject *a, void *closure)
1512{
1513 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001514 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001515}
1516
1517static PyObject *
1518array_get_itemsize(arrayobject *a, void *closure)
1519{
Christian Heimes217cfd12007-12-02 14:31:20 +00001520 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001521}
1522
1523static PyGetSetDef array_getsets [] = {
1524 {"typecode", (getter) array_get_typecode, NULL,
1525 "the typecode character used to create the array"},
1526 {"itemsize", (getter) array_get_itemsize, NULL,
1527 "the size, in bytes, of one array item"},
1528 {NULL}
1529};
1530
Martin v. Löwis59683e82008-06-13 07:50:45 +00001531static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001532 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001533 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001534 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001535 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001536 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001537 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001538 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1539 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001540 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001541 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001542 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001543 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001544 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001545 extend_doc},
1546 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1547 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001548 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001549 fromlist_doc},
1550 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1551 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001552 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1553 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001554 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001555 index_doc},
1556 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1557 insert_doc},
1558 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1559 pop_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001560 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1561 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001562 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001563 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001564 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001565 reverse_doc},
1566/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1567 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001568 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001569 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001570 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001571 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001572 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001573 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001574 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001575 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001576 {NULL, NULL} /* sentinel */
1577};
1578
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001579static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001580array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001581{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00001582 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001583 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001584 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001585
Christian Heimes90aa7642007-12-19 02:45:37 +00001586 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001587 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001588 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001589 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00001590 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001591 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001592 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001593 else
1594 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001595
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001596 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
1597 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001598 return s;
1599}
1600
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001601static PyObject*
1602array_subscr(arrayobject* self, PyObject* item)
1603{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001604 if (PyIndex_Check(item)) {
1605 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001606 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001607 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001608 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001609 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001610 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001611 return array_item(self, i);
1612 }
1613 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001614 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001615 PyObject* result;
1616 arrayobject* ar;
1617 int itemsize = self->ob_descr->itemsize;
1618
Christian Heimes90aa7642007-12-19 02:45:37 +00001619 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001620 &start, &stop, &step, &slicelength) < 0) {
1621 return NULL;
1622 }
1623
1624 if (slicelength <= 0) {
1625 return newarrayobject(&Arraytype, 0, self->ob_descr);
1626 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001627 else if (step == 1) {
1628 PyObject *result = newarrayobject(&Arraytype,
1629 slicelength, self->ob_descr);
1630 if (result == NULL)
1631 return NULL;
1632 memcpy(((arrayobject *)result)->ob_item,
1633 self->ob_item + start * itemsize,
1634 slicelength * itemsize);
1635 return result;
1636 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001637 else {
1638 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1639 if (!result) return NULL;
1640
1641 ar = (arrayobject*)result;
1642
1643 for (cur = start, i = 0; i < slicelength;
1644 cur += step, i++) {
1645 memcpy(ar->ob_item + i*itemsize,
1646 self->ob_item + cur*itemsize,
1647 itemsize);
1648 }
1649
1650 return result;
1651 }
1652 }
1653 else {
1654 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00001655 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001656 return NULL;
1657 }
1658}
1659
1660static int
1661array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1662{
Thomas Woutersed03b412007-08-28 21:37:11 +00001663 Py_ssize_t start, stop, step, slicelength, needed;
1664 arrayobject* other;
1665 int itemsize;
1666
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001667 if (PyIndex_Check(item)) {
1668 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00001669
1670 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001671 return -1;
1672 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001673 i += Py_SIZE(self);
1674 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001675 PyErr_SetString(PyExc_IndexError,
1676 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001677 return -1;
1678 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001679 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001680 /* Fall through to slice assignment */
1681 start = i;
1682 stop = i + 1;
1683 step = 1;
1684 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001685 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001686 else
1687 return (*self->ob_descr->setitem)(self, i, value);
1688 }
1689 else if (PySlice_Check(item)) {
1690 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001691 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00001692 &step, &slicelength) < 0) {
1693 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001694 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001695 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001696 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00001697 PyErr_SetString(PyExc_TypeError,
1698 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001699 return -1;
1700 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001701 if (value == NULL) {
1702 other = NULL;
1703 needed = 0;
1704 }
1705 else if (array_Check(value)) {
1706 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00001707 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00001708 if (self == other) {
1709 /* Special case "self[i:j] = self" -- copy self first */
1710 int ret;
1711 value = array_slice(other, 0, needed);
1712 if (value == NULL)
1713 return -1;
1714 ret = array_ass_subscr(self, item, value);
1715 Py_DECREF(value);
1716 return ret;
1717 }
1718 if (other->ob_descr != self->ob_descr) {
1719 PyErr_BadArgument();
1720 return -1;
1721 }
1722 }
1723 else {
1724 PyErr_Format(PyExc_TypeError,
1725 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00001726 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00001727 return -1;
1728 }
1729 itemsize = self->ob_descr->itemsize;
1730 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1731 if ((step > 0 && stop < start) ||
1732 (step < 0 && stop > start))
1733 stop = start;
1734 if (step == 1) {
1735 if (slicelength > needed) {
1736 memmove(self->ob_item + (start + needed) * itemsize,
1737 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001738 (Py_SIZE(self) - stop) * itemsize);
1739 if (array_resize(self, Py_SIZE(self) +
Thomas Woutersed03b412007-08-28 21:37:11 +00001740 needed - slicelength) < 0)
1741 return -1;
1742 }
1743 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001744 if (array_resize(self, Py_SIZE(self) +
Thomas Woutersed03b412007-08-28 21:37:11 +00001745 needed - slicelength) < 0)
1746 return -1;
1747 memmove(self->ob_item + (start + needed) * itemsize,
1748 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001749 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001750 }
1751 if (needed > 0)
1752 memcpy(self->ob_item + start * itemsize,
1753 other->ob_item, needed * itemsize);
1754 return 0;
1755 }
1756 else if (needed == 0) {
1757 /* Delete slice */
1758 Py_ssize_t cur, i;
1759
1760 if (step < 0) {
1761 stop = start + 1;
1762 start = stop + step * (slicelength - 1) - 1;
1763 step = -step;
1764 }
1765 for (cur = start, i = 0; i < slicelength;
1766 cur += step, i++) {
1767 Py_ssize_t lim = step - 1;
1768
Christian Heimes90aa7642007-12-19 02:45:37 +00001769 if (cur + step >= Py_SIZE(self))
1770 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00001771 memmove(self->ob_item + (cur - i) * itemsize,
1772 self->ob_item + (cur + 1) * itemsize,
1773 lim * itemsize);
1774 }
1775 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00001776 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001777 memmove(self->ob_item + (cur-slicelength) * itemsize,
1778 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001779 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001780 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001781 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001782 return -1;
1783 return 0;
1784 }
1785 else {
1786 Py_ssize_t cur, i;
1787
1788 if (needed != slicelength) {
1789 PyErr_Format(PyExc_ValueError,
1790 "attempt to assign array of size %zd "
1791 "to extended slice of size %zd",
1792 needed, slicelength);
1793 return -1;
1794 }
1795 for (cur = start, i = 0; i < slicelength;
1796 cur += step, i++) {
1797 memcpy(self->ob_item + cur * itemsize,
1798 other->ob_item + i * itemsize,
1799 itemsize);
1800 }
1801 return 0;
1802 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001803}
1804
1805static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001806 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001807 (binaryfunc)array_subscr,
1808 (objobjargproc)array_ass_subscr
1809};
1810
Guido van Rossumd8faa362007-04-27 19:54:29 +00001811static const void *emptybuf = "";
1812
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001813
1814static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001815array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001816{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001817 if (view==NULL) goto finish;
1818
1819 view->buf = (void *)self->ob_item;
1820 if (view->buf == NULL)
1821 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00001822 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001823 view->readonly = 0;
1824 view->ndim = 1;
1825 view->itemsize = self->ob_descr->itemsize;
1826 view->suboffsets = NULL;
1827 view->shape = NULL;
1828 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001829 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001830 }
1831 view->strides = NULL;
1832 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
1833 view->strides = &(view->itemsize);
1834 view->format = NULL;
1835 view->internal = NULL;
1836 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00001837 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001838#ifdef Py_UNICODE_WIDE
1839 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00001840 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001841 }
1842#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001843 }
1844
1845 finish:
1846 self->ob_exports++;
1847 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001848}
1849
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001850static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001851array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001852{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001853 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001854}
1855
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001856static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001857 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001858 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001859 (ssizeargfunc)array_repeat, /*sq_repeat*/
1860 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001861 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001862 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001863 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001864 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001865 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001866 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001867};
1868
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001869static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001870 (getbufferproc)array_buffer_getbuf,
1871 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001872};
1873
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001874static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001875array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001876{
Guido van Rossum8934fc22007-06-30 23:44:36 +00001877 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001878 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001879 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001880
Thomas Woutersb2137042007-02-01 18:02:27 +00001881 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001882 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001883
Walter Dörwaldd0941302007-07-01 21:58:22 +00001884 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00001885 return NULL;
1886
1887 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00001888 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00001889 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00001890 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001891 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001892 it = PyObject_GetIter(initial);
1893 if (it == NULL)
1894 return NULL;
1895 /* We set initial to NULL so that the subsequent code
1896 will create an empty array of the appropriate type
1897 and afterwards we can use array_iter_extend to populate
1898 the array.
1899 */
1900 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001901 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001902 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1903 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001904 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001905 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001906
1907 if (initial == NULL || !(PyList_Check(initial)
1908 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001909 len = 0;
1910 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001911 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001912
1913 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001914 if (a == NULL)
1915 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001916
Guido van Rossum778983b1993-02-19 15:55:02 +00001917 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001918 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001919 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001920 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001921 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001922 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001923 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001924 return NULL;
1925 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001926 if (setarrayitem(a, i, v) != 0) {
1927 Py_DECREF(v);
1928 Py_DECREF(a);
1929 return NULL;
1930 }
1931 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001932 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001933 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00001934 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00001935 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001936 PyObject *t_initial, *v;
1937 t_initial = PyTuple_Pack(1, initial);
1938 if (t_initial == NULL) {
1939 Py_DECREF(a);
1940 return NULL;
1941 }
1942 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001943 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001944 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001945 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001946 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001947 return NULL;
1948 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001949 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001950 }
1951 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001952 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001953 if (n > 0) {
1954 arrayobject *self = (arrayobject *)a;
1955 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001956 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001957 if (item == NULL) {
1958 PyErr_NoMemory();
1959 Py_DECREF(a);
1960 return NULL;
1961 }
1962 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001963 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001964 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00001965 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001966 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001967 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001968 if (it != NULL) {
1969 if (array_iter_extend((arrayobject *)a, it) == -1) {
1970 Py_DECREF(it);
1971 Py_DECREF(a);
1972 return NULL;
1973 }
1974 Py_DECREF(it);
1975 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001976 return a;
1977 }
1978 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001979 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00001980 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001981 return NULL;
1982}
1983
Guido van Rossum778983b1993-02-19 15:55:02 +00001984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001985PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001986"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001987an array of basic values: characters, integers, floating point\n\
1988numbers. Arrays are sequence types and behave very much like lists,\n\
1989except that the type of objects stored in them is constrained. The\n\
1990type is specified at object creation time by using a type code, which\n\
1991is a single character. The following type codes are defined:\n\
1992\n\
1993 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001994 'b' signed integer 1 \n\
1995 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001996 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001997 'h' signed integer 2 \n\
1998 'H' unsigned integer 2 \n\
1999 'i' signed integer 2 \n\
2000 'I' unsigned integer 2 \n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00002001 'w' unicode character 4 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002002 'l' signed integer 4 \n\
2003 'L' unsigned integer 4 \n\
2004 'f' floating point 4 \n\
2005 'd' floating point 8 \n\
2006\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002007NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
2008narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
2009\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002010The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002011\n\
2012array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002016"array(typecode [, initializer]) -> array\n\
2017\n\
2018Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002019initialized from the optional initializer value, which must be a list,\n\
2020string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002021\n\
2022Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002023the type of objects stored in them is constrained.\n\
2024\n\
2025Methods:\n\
2026\n\
2027append() -- append a new item to the end of the array\n\
2028buffer_info() -- return information giving the current memory info\n\
2029byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002030count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002031extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002032fromfile() -- read items from a file object\n\
2033fromlist() -- append items from the list\n\
2034fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002035index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002036insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002037pop() -- remove and return item (default last)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002038remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002039reverse() -- reverse the order of the items in the array\n\
2040tofile() -- write all items to a file object\n\
2041tolist() -- return the array converted to an ordinary list\n\
2042tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002043\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002044Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002045\n\
2046typecode -- the typecode character used to create the array\n\
2047itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002048");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002049
Raymond Hettinger625812f2003-01-07 01:58:52 +00002050static PyObject *array_iter(arrayobject *ao);
2051
Tim Peters0c322792002-07-17 16:49:03 +00002052static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002053 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002054 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002055 sizeof(arrayobject),
2056 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002057 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002058 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002059 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002060 0, /* tp_setattr */
2061 0, /* tp_compare */
2062 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002063 0, /* tp_as_number*/
2064 &array_as_sequence, /* tp_as_sequence*/
2065 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002066 0, /* tp_hash */
2067 0, /* tp_call */
2068 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002069 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002070 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002071 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002072 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002073 arraytype_doc, /* tp_doc */
2074 0, /* tp_traverse */
2075 0, /* tp_clear */
2076 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002077 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002078 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002079 0, /* tp_iternext */
2080 array_methods, /* tp_methods */
2081 0, /* tp_members */
2082 array_getsets, /* tp_getset */
2083 0, /* tp_base */
2084 0, /* tp_dict */
2085 0, /* tp_descr_get */
2086 0, /* tp_descr_set */
2087 0, /* tp_dictoffset */
2088 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002089 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002090 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002091 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002092};
2093
Raymond Hettinger625812f2003-01-07 01:58:52 +00002094
2095/*********************** Array Iterator **************************/
2096
2097typedef struct {
2098 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002099 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002100 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002101 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002102} arrayiterobject;
2103
2104static PyTypeObject PyArrayIter_Type;
2105
2106#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2107
2108static PyObject *
2109array_iter(arrayobject *ao)
2110{
2111 arrayiterobject *it;
2112
2113 if (!array_Check(ao)) {
2114 PyErr_BadInternalCall();
2115 return NULL;
2116 }
2117
2118 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2119 if (it == NULL)
2120 return NULL;
2121
2122 Py_INCREF(ao);
2123 it->ao = ao;
2124 it->index = 0;
2125 it->getitem = ao->ob_descr->getitem;
2126 PyObject_GC_Track(it);
2127 return (PyObject *)it;
2128}
2129
2130static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002131arrayiter_next(arrayiterobject *it)
2132{
2133 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002134 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002135 return (*it->getitem)(it->ao, it->index++);
2136 return NULL;
2137}
2138
2139static void
2140arrayiter_dealloc(arrayiterobject *it)
2141{
2142 PyObject_GC_UnTrack(it);
2143 Py_XDECREF(it->ao);
2144 PyObject_GC_Del(it);
2145}
2146
2147static int
2148arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2149{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002150 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002151 return 0;
2152}
2153
2154static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002155 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002156 "arrayiterator", /* tp_name */
2157 sizeof(arrayiterobject), /* tp_basicsize */
2158 0, /* tp_itemsize */
2159 /* methods */
2160 (destructor)arrayiter_dealloc, /* tp_dealloc */
2161 0, /* tp_print */
2162 0, /* tp_getattr */
2163 0, /* tp_setattr */
2164 0, /* tp_compare */
2165 0, /* tp_repr */
2166 0, /* tp_as_number */
2167 0, /* tp_as_sequence */
2168 0, /* tp_as_mapping */
2169 0, /* tp_hash */
2170 0, /* tp_call */
2171 0, /* tp_str */
2172 PyObject_GenericGetAttr, /* tp_getattro */
2173 0, /* tp_setattro */
2174 0, /* tp_as_buffer */
2175 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2176 0, /* tp_doc */
2177 (traverseproc)arrayiter_traverse, /* tp_traverse */
2178 0, /* tp_clear */
2179 0, /* tp_richcompare */
2180 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002181 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002182 (iternextfunc)arrayiter_next, /* tp_iternext */
2183 0, /* tp_methods */
2184};
2185
2186
2187/*********************** Install Module **************************/
2188
Martin v. Löwis99866332002-03-01 10:27:01 +00002189/* No functions in array module. */
2190static PyMethodDef a_methods[] = {
2191 {NULL, NULL, 0, NULL} /* Sentinel */
2192};
2193
Martin v. Löwis1a214512008-06-11 05:26:20 +00002194static struct PyModuleDef arraymodule = {
2195 PyModuleDef_HEAD_INIT,
2196 "array",
2197 module_doc,
2198 -1,
2199 a_methods,
2200 NULL,
2201 NULL,
2202 NULL,
2203 NULL
2204};
2205
Martin v. Löwis99866332002-03-01 10:27:01 +00002206
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002207PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002208PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002209{
Fred Drakef4e34842002-04-01 03:45:06 +00002210 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002211 PyObject *typecodes;
2212 Py_ssize_t size = 0;
2213 register Py_UNICODE *p;
2214 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002215
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002216 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002217 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002218 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002219 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002220 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002221 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002222
2223 Py_INCREF((PyObject *)&Arraytype);
2224 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2225 Py_INCREF((PyObject *)&Arraytype);
2226 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002227
2228 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2229 size++;
2230 }
2231
2232 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2233 p = PyUnicode_AS_UNICODE(typecodes);
2234 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2235 *p++ = (char)descr->typecode;
2236 }
2237
2238 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2239
Martin v. Löwis1a214512008-06-11 05:26:20 +00002240 if (PyErr_Occurred()) {
2241 Py_DECREF(m);
2242 m = NULL;
2243 }
2244 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002245}