blob: 89ed27a0b7480b465622a4300337797bcc42b0f8 [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 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +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 *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000032 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000033 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000034 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000035 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000036 PyObject *weakreflist; /* List of weak references */
Guido van Rossum778983b1993-02-19 15:55:02 +000037} arrayobject;
38
Jeremy Hylton938ace62002-07-17 16:30:39 +000039static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000040
Martin v. Löwis99866332002-03-01 10:27:01 +000041#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimese93237d2007-12-19 02:37:44 +000042#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000043
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000044static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000045array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046{
47 char *items;
48 size_t _new_size;
49
50 /* Bypass realloc() when a previous overallocation is large enough
51 to accommodate the newsize. If the newsize is 16 smaller than the
52 current size, then proceed with the realloc() to shrink the list.
53 */
54
55 if (self->allocated >= newsize &&
Christian Heimese93237d2007-12-19 02:37:44 +000056 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000057 self->ob_item != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +000058 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000059 return 0;
60 }
61
62 /* This over-allocates proportional to the array size, making room
63 * for additional growth. The over-allocation is mild, but is
64 * enough to give linear-time amortized behavior over a long
65 * sequence of appends() in the presence of a poorly-performing
66 * system realloc().
67 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
68 * Note, the pattern starts out the same as for lists but then
69 * grows at a smaller rate so that larger arrays only overallocate
70 * by about 1/16th -- this is done because arrays are presumed to be more
71 * memory critical.
72 */
73
Christian Heimese93237d2007-12-19 02:37:44 +000074 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000075 items = self->ob_item;
76 /* XXX The following multiplication and division does not optimize away
77 like it does for lists since the size is not known at compile time */
78 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
79 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
80 else
81 items = NULL;
82 if (items == NULL) {
83 PyErr_NoMemory();
84 return -1;
85 }
86 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +000087 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000088 self->allocated = _new_size;
89 return 0;
90}
91
Tim Petersbb307342000-09-10 05:22:54 +000092/****************************************************************************
93Get and Set functions for each type.
94A Get function takes an arrayobject* and an integer index, returning the
95array value at that index wrapped in an appropriate PyObject*.
96A Set function takes an arrayobject, integer index, and PyObject*; sets
97the array value at that index to the raw C data extracted from the PyObject*,
98and returns 0 if successful, else nonzero on failure (PyObject* not of an
99appropriate type or value).
100Note that the basic Get and Set functions do NOT check that the index is
101in bounds; that's the responsibility of the caller.
102****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000103
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000104static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000105c_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000106{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000107 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000108}
109
110static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000112{
113 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000114 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000115 return -1;
116 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000117 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000118 return 0;
119}
120
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000121static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
124 long x = ((char *)ap->ob_item)[i];
125 if (x >= 128)
126 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000127 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000128}
129
130static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000131b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000132{
Fred Drake541dc3b2000-06-28 17:49:30 +0000133 short x;
134 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
135 must use the next size up that is signed ('h') and manually do
136 the overflow checking */
137 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000138 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000139 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000140 PyErr_SetString(PyExc_OverflowError,
141 "signed char is less than minimum");
142 return -1;
143 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000144 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000145 PyErr_SetString(PyExc_OverflowError,
146 "signed char is greater than maximum");
147 return -1;
148 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000149 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000150 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000151 return 0;
152}
153
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000154static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000155BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000156{
157 long x = ((unsigned char *)ap->ob_item)[i];
158 return PyInt_FromLong(x);
159}
160
Fred Drake541dc3b2000-06-28 17:49:30 +0000161static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000163{
164 unsigned char x;
165 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
166 if (!PyArg_Parse(v, "b;array item must be integer", &x))
167 return -1;
168 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000169 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000170 return 0;
171}
Guido van Rossum549ab711997-01-03 19:09:47 +0000172
Martin v. Löwis99866332002-03-01 10:27:01 +0000173#ifdef Py_USING_UNICODE
174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
183 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
Neal Norwitz92a6be42006-04-03 04:46:28 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
196}
197#endif
198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000202 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
205static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000206h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000207{
208 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000209 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000210 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000211 return -1;
212 if (i >= 0)
213 ((short *)ap->ob_item)[i] = x;
214 return 0;
215}
216
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000218HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000219{
220 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
221}
222
Fred Drake541dc3b2000-06-28 17:49:30 +0000223static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000225{
226 int x;
227 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
228 must use the next size up and manually do the overflow checking */
229 if (!PyArg_Parse(v, "i;array item must be integer", &x))
230 return -1;
231 else if (x < 0) {
232 PyErr_SetString(PyExc_OverflowError,
233 "unsigned short is less than minimum");
234 return -1;
235 }
236 else if (x > USHRT_MAX) {
237 PyErr_SetString(PyExc_OverflowError,
238 "unsigned short is greater than maximum");
239 return -1;
240 }
241 if (i >= 0)
242 ((short *)ap->ob_item)[i] = (short)x;
243 return 0;
244}
Guido van Rossum549ab711997-01-03 19:09:47 +0000245
246static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000247i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000248{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000249 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000250}
251
252static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000254{
255 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000256 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000257 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000258 return -1;
259 if (i >= 0)
260 ((int *)ap->ob_item)[i] = x;
261 return 0;
262}
263
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000264static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000266{
267 return PyLong_FromUnsignedLong(
268 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
269}
270
271static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000273{
274 unsigned long x;
275 if (PyLong_Check(v)) {
276 x = PyLong_AsUnsignedLong(v);
277 if (x == (unsigned long) -1 && PyErr_Occurred())
278 return -1;
279 }
280 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000281 long y;
282 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000284 if (y < 0) {
285 PyErr_SetString(PyExc_OverflowError,
286 "unsigned int is less than minimum");
287 return -1;
288 }
289 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000290
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000292 if (x > UINT_MAX) {
293 PyErr_SetString(PyExc_OverflowError,
294 "unsigned int is greater than maximum");
295 return -1;
296 }
297
Guido van Rossum549ab711997-01-03 19:09:47 +0000298 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000299 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000300 return 0;
301}
302
303static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000305{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000307}
308
309static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000311{
312 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000313 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000314 return -1;
315 if (i >= 0)
316 ((long *)ap->ob_item)[i] = x;
317 return 0;
318}
319
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000320static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000322{
323 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
324}
325
326static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000328{
329 unsigned long x;
330 if (PyLong_Check(v)) {
331 x = PyLong_AsUnsignedLong(v);
332 if (x == (unsigned long) -1 && PyErr_Occurred())
333 return -1;
334 }
335 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000336 long y;
337 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000338 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000339 if (y < 0) {
340 PyErr_SetString(PyExc_OverflowError,
341 "unsigned long is less than minimum");
342 return -1;
343 }
344 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000345
Guido van Rossum549ab711997-01-03 19:09:47 +0000346 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000347 if (x > ULONG_MAX) {
348 PyErr_SetString(PyExc_OverflowError,
349 "unsigned long is greater than maximum");
350 return -1;
351 }
Tim Petersbb307342000-09-10 05:22:54 +0000352
Guido van Rossum549ab711997-01-03 19:09:47 +0000353 if (i >= 0)
354 ((unsigned long *)ap->ob_item)[i] = x;
355 return 0;
356}
357
358static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000359f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000360{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000361 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000362}
363
364static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000365f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000366{
367 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000368 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 return -1;
370 if (i >= 0)
371 ((float *)ap->ob_item)[i] = x;
372 return 0;
373}
374
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000378 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000379}
380
381static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000383{
384 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 return -1;
387 if (i >= 0)
388 ((double *)ap->ob_item)[i] = x;
389 return 0;
390}
391
392/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000393static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 {'c', sizeof(char), c_getitem, c_setitem},
395 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000396 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000397#ifdef Py_USING_UNICODE
398 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
399#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000402 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000403 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000405 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 {'f', sizeof(float), f_getitem, f_setitem},
407 {'d', sizeof(double), d_getitem, d_setitem},
408 {'\0', 0, 0, 0} /* Sentinel */
409};
Tim Petersbb307342000-09-10 05:22:54 +0000410
411/****************************************************************************
412Implementations of array object methods.
413****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000414
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000415static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000416newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000417{
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000420
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000422 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 return NULL;
424 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000425
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 nbytes = size * descr->itemsize;
427 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000428 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000431 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000433 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 }
Christian Heimese93237d2007-12-19 02:37:44 +0000435 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 if (size <= 0) {
437 op->ob_item = NULL;
438 }
439 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000440 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000441 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000442 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 }
445 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000446 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000447 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000448 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
455 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000456 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 ap = (arrayobject *)op;
Christian Heimese93237d2007-12-19 02:37:44 +0000458 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return (*ap->ob_descr->getitem)(ap, i);
460}
461
462static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 char *items;
Christian Heimese93237d2007-12-19 02:37:44 +0000466 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000473
474 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000479 if (where < 0)
480 where = 0;
481 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 if (where > n)
483 where = n;
484 /* appends don't need to call memmove() */
485 if (where != n)
486 memmove(items + (where+1)*self->ob_descr->itemsize,
487 items + where*self->ob_descr->itemsize,
488 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossum778983b1993-02-19 15:55:02 +0000492/* Methods */
493
494static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000495array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000497 if (op->weakreflist != NULL)
498 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000499 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyMem_DEL(op->ob_item);
Christian Heimese93237d2007-12-19 02:37:44 +0000501 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000502}
503
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504static PyObject *
505array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000506{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 arrayobject *va, *wa;
508 PyObject *vi = NULL;
509 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 PyObject *res;
512
Martin v. Löwis99866332002-03-01 10:27:01 +0000513 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000514 Py_INCREF(Py_NotImplemented);
515 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000517
518 va = (arrayobject *)v;
519 wa = (arrayobject *)w;
520
Christian Heimese93237d2007-12-19 02:37:44 +0000521 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000522 /* Shortcut: if the lengths differ, the arrays differ */
523 if (op == Py_EQ)
524 res = Py_False;
525 else
526 res = Py_True;
527 Py_INCREF(res);
528 return res;
529 }
530
531 /* Search for the first index where items are different */
532 k = 1;
Christian Heimese93237d2007-12-19 02:37:44 +0000533 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000534 vi = getarrayitem(v, i);
535 wi = getarrayitem(w, i);
536 if (vi == NULL || wi == NULL) {
537 Py_XDECREF(vi);
538 Py_XDECREF(wi);
539 return NULL;
540 }
541 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542 if (k == 0)
543 break; /* Keeping vi and wi alive! */
544 Py_DECREF(vi);
545 Py_DECREF(wi);
546 if (k < 0)
547 return NULL;
548 }
549
550 if (k) {
551 /* No more items to compare -- compare sizes */
Christian Heimese93237d2007-12-19 02:37:44 +0000552 Py_ssize_t vs = Py_SIZE(va);
553 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 int cmp;
555 switch (op) {
556 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000557 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 case Py_EQ: cmp = vs == ws; break;
559 case Py_NE: cmp = vs != ws; break;
560 case Py_GT: cmp = vs > ws; break;
561 case Py_GE: cmp = vs >= ws; break;
562 default: return NULL; /* cannot happen */
563 }
564 if (cmp)
565 res = Py_True;
566 else
567 res = Py_False;
568 Py_INCREF(res);
569 return res;
570 }
571
572 /* We have an item that differs. First, shortcuts for EQ/NE */
573 if (op == Py_EQ) {
574 Py_INCREF(Py_False);
575 res = Py_False;
576 }
577 else if (op == Py_NE) {
578 Py_INCREF(Py_True);
579 res = Py_True;
580 }
581 else {
582 /* Compare the final item again using the proper operator */
583 res = PyObject_RichCompare(vi, wi, op);
584 }
585 Py_DECREF(vi);
586 Py_DECREF(wi);
587 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
Martin v. Löwis18e16552006-02-15 17:27:45 +0000590static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
Christian Heimese93237d2007-12-19 02:37:44 +0000593 return Py_SIZE(a);
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_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
Christian Heimese93237d2007-12-19 02:37:44 +0000599 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return NULL;
602 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604}
605
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000606static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000607array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000608{
609 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 if (ilow < 0)
611 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000612 else if (ilow > Py_SIZE(a))
613 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 if (ihigh < 0)
615 ihigh = 0;
616 if (ihigh < ilow)
617 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000618 else if (ihigh > Py_SIZE(a))
619 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000620 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 if (np == NULL)
622 return NULL;
623 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000629array_copy(arrayobject *a, PyObject *unused)
630{
Christian Heimese93237d2007-12-19 02:37:44 +0000631 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000632}
633
634PyDoc_STRVAR(copy_doc,
635"copy(array)\n\
636\n\
637 Return a copy of the array.");
638
639static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000640array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000641{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000644 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000645 PyErr_Format(PyExc_TypeError,
646 "can only append array (not \"%.200s\") to array",
Christian Heimese93237d2007-12-19 02:37:44 +0000647 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return NULL;
649 }
650#define b ((arrayobject *)bb)
651 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return NULL;
654 }
Christian Heimese93237d2007-12-19 02:37:44 +0000655 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000656 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000657 if (np == NULL) {
658 return NULL;
659 }
Christian Heimese93237d2007-12-19 02:37:44 +0000660 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
661 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
662 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000663 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000664#undef b
665}
666
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000668array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000669{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000670 Py_ssize_t i;
671 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000672 arrayobject *np;
673 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 if (n < 0)
676 n = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000677 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000678 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000679 if (np == NULL)
680 return NULL;
681 p = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000682 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 for (i = 0; i < n; i++) {
684 memcpy(p, a->ob_item, nbytes);
685 p += nbytes;
686 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000687 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000688}
689
690static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000691array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000692{
693 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000694 Py_ssize_t n; /* Size of replacement array */
695 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000696#define b ((arrayobject *)v)
697 if (v == NULL)
698 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000699 else if (array_Check(v)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000700 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000701 if (a == b) {
702 /* Special case "a[i:j] = a" -- copy b first */
703 int ret;
704 v = array_slice(b, 0, n);
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +0000705 if (!v)
706 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000707 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000708 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000709 return ret;
710 }
711 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000712 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 return -1;
714 }
715 }
716 else {
Fred Drake137507e2000-06-01 02:02:46 +0000717 PyErr_Format(PyExc_TypeError,
718 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +0000719 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000720 return -1;
721 }
722 if (ilow < 0)
723 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000724 else if (ilow > Py_SIZE(a))
725 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000726 if (ihigh < 0)
727 ihigh = 0;
728 if (ihigh < ilow)
729 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000730 else if (ihigh > Py_SIZE(a))
731 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000732 item = a->ob_item;
733 d = n - (ihigh-ilow);
734 if (d < 0) { /* Delete -d items */
735 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
736 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000737 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
738 Py_SIZE(a) += d;
739 PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000740 /* Can't fail */
741 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000742 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000743 }
744 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000745 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +0000746 (Py_SIZE(a) + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000747 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000748 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000749 return -1;
750 }
751 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
752 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000753 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000754 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000755 Py_SIZE(a) += d;
756 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000757 }
758 if (n > 0)
759 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
760 n*b->ob_descr->itemsize);
761 return 0;
762#undef b
763}
764
765static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000766array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000767{
Christian Heimese93237d2007-12-19 02:37:44 +0000768 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000769 PyErr_SetString(PyExc_IndexError,
770 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000771 return -1;
772 }
773 if (v == NULL)
774 return array_ass_slice(a, i, i+1, v);
775 return (*a->ob_descr->setitem)(a, i, v);
776}
777
778static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000779setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000780{
Martin v. Löwis99866332002-03-01 10:27:01 +0000781 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000782 return array_ass_item((arrayobject *)a, i, v);
783}
784
Martin v. Löwis99866332002-03-01 10:27:01 +0000785static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000786array_iter_extend(arrayobject *self, PyObject *bb)
787{
788 PyObject *it, *v;
789
790 it = PyObject_GetIter(bb);
791 if (it == NULL)
792 return -1;
793
794 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +0000795 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000796 Py_DECREF(v);
797 Py_DECREF(it);
798 return -1;
799 }
800 Py_DECREF(v);
801 }
802 Py_DECREF(it);
803 if (PyErr_Occurred())
804 return -1;
805 return 0;
806}
807
808static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000809array_do_extend(arrayobject *self, PyObject *bb)
810{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000811 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000812
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000813 if (!array_Check(bb))
814 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000815#define b ((arrayobject *)bb)
816 if (self->ob_descr != b->ob_descr) {
817 PyErr_SetString(PyExc_TypeError,
818 "can only extend with array of same kind");
819 return -1;
820 }
Christian Heimese93237d2007-12-19 02:37:44 +0000821 size = Py_SIZE(self) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000822 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
823 if (self->ob_item == NULL) {
824 PyObject_Del(self);
825 PyErr_NoMemory();
826 return -1;
827 }
Christian Heimese93237d2007-12-19 02:37:44 +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 Heimese93237d2007-12-19 02:37:44 +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 Heimese93237d2007-12-19 02:37:44 +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;
Christian Heimese93237d2007-12-19 02:37:44 +0000862 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000863 if (n == 0) {
864 PyMem_FREE(items);
865 self->ob_item = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000866 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000867 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000868 }
869 else {
870 PyMem_Resize(items, char, n * size);
871 if (items == NULL)
872 return PyErr_NoMemory();
873 p = items;
874 for (i = 1; i < n; i++) {
875 p += size;
876 memcpy(p, items, size);
877 }
878 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +0000879 Py_SIZE(self) *= n;
880 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000881 }
882 }
883 Py_INCREF(self);
884 return (PyObject *)self;
885}
886
887
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000888static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000889ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000890{
891 if (ins1(self, where, v) != 0)
892 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000893 Py_INCREF(Py_None);
894 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000895}
896
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000897static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000898array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000899{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000900 Py_ssize_t count = 0;
901 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000902
Christian Heimese93237d2007-12-19 02:37:44 +0000903 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000904 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000905 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000906 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000907 if (cmp > 0)
908 count++;
909 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000910 return NULL;
911 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000912 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913}
914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000915PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000916"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000917\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000918Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919
920static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000921array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000923 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924
Christian Heimese93237d2007-12-19 02:37:44 +0000925 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000927 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
928 Py_DECREF(selfi);
929 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930 return PyInt_FromLong((long)i);
931 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000932 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933 return NULL;
934 }
935 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
936 return NULL;
937}
938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000939PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000940"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000941\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000942Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943
Raymond Hettinger625812f2003-01-07 01:58:52 +0000944static int
945array_contains(arrayobject *self, PyObject *v)
946{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000947 Py_ssize_t i;
948 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000949
Christian Heimese93237d2007-12-19 02:37:44 +0000950 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000951 PyObject *selfi = getarrayitem((PyObject *)self, i);
952 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
953 Py_DECREF(selfi);
954 }
955 return cmp;
956}
957
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000958static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000959array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000960{
961 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000962
Christian Heimese93237d2007-12-19 02:37:44 +0000963 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000964 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000965 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
966 Py_DECREF(selfi);
967 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000968 if (array_ass_slice(self, i, i+1,
969 (PyObject *)NULL) != 0)
970 return NULL;
971 Py_INCREF(Py_None);
972 return Py_None;
973 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000974 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000975 return NULL;
976 }
977 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
978 return NULL;
979}
980
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000981PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000982"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000983\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000984Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000985
986static PyObject *
987array_pop(arrayobject *self, PyObject *args)
988{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000989 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000990 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000991 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000992 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000993 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000994 /* Special-case most common failure cause */
995 PyErr_SetString(PyExc_IndexError, "pop from empty array");
996 return NULL;
997 }
998 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +0000999 i += Py_SIZE(self);
1000 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001001 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1002 return NULL;
1003 }
1004 v = getarrayitem((PyObject *)self,i);
1005 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1006 Py_DECREF(v);
1007 return NULL;
1008 }
1009 return v;
1010}
1011
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001012PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001013"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001014\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001015Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001016
1017static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001018array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019{
Martin v. Löwis99866332002-03-01 10:27:01 +00001020 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001022 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001023 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001024}
1025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001026PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001027"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001028\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001029 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001030
1031static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001032array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001033{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001034 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001035 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001036 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001037 return NULL;
1038 return ins(self, i, v);
1039}
1040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001041PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001042"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001043\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001044Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001045
1046
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001047static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001048array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001049{
Tim Peters077a11d2000-09-16 22:31:29 +00001050 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001051 retval = PyTuple_New(2);
1052 if (!retval)
1053 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001054
1055 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimese93237d2007-12-19 02:37:44 +00001056 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001057
1058 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001059}
1060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001062"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001063\n\
1064Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001065the length in items of the buffer used to hold array's contents\n\
1066The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001067the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001068
1069
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001070static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001071array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001072{
Christian Heimese93237d2007-12-19 02:37:44 +00001073 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001074}
1075
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001076PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001077"append(x)\n\
1078\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001079Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001080
1081
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001082static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001083array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001084{
1085 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001086 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001087
Guido van Rossum778983b1993-02-19 15:55:02 +00001088 switch (self->ob_descr->itemsize) {
1089 case 1:
1090 break;
1091 case 2:
Christian Heimese93237d2007-12-19 02:37:44 +00001092 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001093 char p0 = p[0];
1094 p[0] = p[1];
1095 p[1] = p0;
1096 }
1097 break;
1098 case 4:
Christian Heimese93237d2007-12-19 02:37:44 +00001099 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001100 char p0 = p[0];
1101 char p1 = p[1];
1102 p[0] = p[3];
1103 p[1] = p[2];
1104 p[2] = p1;
1105 p[3] = p0;
1106 }
1107 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001108 case 8:
Christian Heimese93237d2007-12-19 02:37:44 +00001109 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001110 char p0 = p[0];
1111 char p1 = p[1];
1112 char p2 = p[2];
1113 char p3 = p[3];
1114 p[0] = p[7];
1115 p[1] = p[6];
1116 p[2] = p[5];
1117 p[3] = p[4];
1118 p[4] = p3;
1119 p[5] = p2;
1120 p[6] = p1;
1121 p[7] = p0;
1122 }
1123 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001124 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001125 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001126 "don't know how to byteswap this array type");
1127 return NULL;
1128 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 Py_INCREF(Py_None);
1130 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001131}
1132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001133PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001134"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001135\n\
Fred Drakebf272981999-12-03 17:15:30 +00001136Byteswap 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 +000011374, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001138
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001140array_reduce(arrayobject *array)
1141{
1142 PyObject *dict, *result;
1143
1144 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1145 if (dict == NULL) {
1146 PyErr_Clear();
1147 dict = Py_None;
1148 Py_INCREF(dict);
1149 }
Christian Heimese93237d2007-12-19 02:37:44 +00001150 if (Py_SIZE(array) > 0) {
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001151 result = Py_BuildValue("O(cs#)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001152 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001153 array->ob_descr->typecode,
1154 array->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001155 Py_SIZE(array) * array->ob_descr->itemsize,
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001156 dict);
1157 } else {
1158 result = Py_BuildValue("O(c)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001159 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001160 array->ob_descr->typecode,
1161 dict);
1162 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001163 Py_DECREF(dict);
1164 return result;
1165}
1166
1167PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1168
1169static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001170array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001171{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001172 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001173 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001174 /* little buffer to hold items while swapping */
1175 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001176 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001177
Christian Heimese93237d2007-12-19 02:37:44 +00001178 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001179 for (p = self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001180 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001181 p < q;
1182 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001183 /* memory areas guaranteed disjoint, so memcpy
1184 * is safe (& memmove may be slower).
1185 */
1186 memcpy(tmp, p, itemsize);
1187 memcpy(p, q, itemsize);
1188 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001189 }
1190 }
Tim Petersbb307342000-09-10 05:22:54 +00001191
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001192 Py_INCREF(Py_None);
1193 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001194}
Guido van Rossume77a7571993-11-03 15:01:26 +00001195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001196PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001197"reverse()\n\
1198\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001199Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001200
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001201static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001202array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001203{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001204 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001205 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001206 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001207 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001208 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001209 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001210 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001211 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001212 return NULL;
1213 }
1214 if (n > 0) {
1215 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001216 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001217 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001218 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001219 size_t newbytes;
1220 /* Be careful here about overflow */
Christian Heimese93237d2007-12-19 02:37:44 +00001221 if ((newlength = Py_SIZE(self) + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001222 (newbytes = newlength * itemsize) / itemsize !=
1223 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001224 goto nomem;
1225 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001226 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001227 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 return NULL;
1230 }
1231 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001232 Py_SIZE(self) += n;
1233 self->allocated = Py_SIZE(self);
1234 nread = fread(item + (Py_SIZE(self) - n) * itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001235 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001236 if (nread < (size_t)n) {
Christian Heimese93237d2007-12-19 02:37:44 +00001237 Py_SIZE(self) -= (n - nread);
1238 PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001239 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001240 self->allocated = Py_SIZE(self);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001241 PyErr_SetString(PyExc_EOFError,
1242 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001243 return NULL;
1244 }
1245 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001246 Py_INCREF(Py_None);
1247 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001248}
1249
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001250PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001251"fromfile(f, n)\n\
1252\n\
1253Read n objects from the file object f and append them to the end of the\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001254array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001255
1256
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001257static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001258array_fromfile_as_read(arrayobject *self, PyObject *args)
1259{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001260 if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001261 "use array.fromfile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001262 return NULL;
1263 return array_fromfile(self, args);
1264}
1265
1266
1267static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001268array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001269{
Guido van Rossum778983b1993-02-19 15:55:02 +00001270 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001271
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001272 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001273 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001274 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001275 return NULL;
1276 }
1277 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001278 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1279 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001280 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001281 clearerr(fp);
1282 return NULL;
1283 }
1284 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001285 Py_INCREF(Py_None);
1286 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001287}
1288
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001289PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001290"tofile(f)\n\
1291\n\
1292Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001293write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001294
1295
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001296static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001297array_tofile_as_write(arrayobject *self, PyObject *f)
1298{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001299 if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001300 "use array.tofile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001301 return NULL;
1302 return array_tofile(self, f);
1303}
1304
1305
1306static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001307array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001308{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001309 Py_ssize_t n;
1310 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001311
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 if (!PyList_Check(list)) {
1313 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001314 return NULL;
1315 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001316 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001317 if (n > 0) {
1318 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001319 Py_ssize_t i;
Christian Heimese93237d2007-12-19 02:37:44 +00001320 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001321 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001322 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001323 return NULL;
1324 }
1325 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001326 Py_SIZE(self) += n;
1327 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001329 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001330 if ((*self->ob_descr->setitem)(self,
Christian Heimese93237d2007-12-19 02:37:44 +00001331 Py_SIZE(self) - n + i, v) != 0) {
1332 Py_SIZE(self) -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +00001334 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001336 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001337 return NULL;
1338 }
1339 }
1340 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001341 Py_INCREF(Py_None);
1342 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001343}
1344
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001345PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001346"fromlist(list)\n\
1347\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001348Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001349
1350
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001351static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001352array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001353{
Christian Heimese93237d2007-12-19 02:37:44 +00001354 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001355 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001356
Guido van Rossum778983b1993-02-19 15:55:02 +00001357 if (list == NULL)
1358 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001359 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001361 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 return NULL;
1364 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001366 }
1367 return list;
1368}
1369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001370PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001371"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001372\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001373Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001374
1375
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001376static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001377array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001378{
1379 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001380 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001381 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001382 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001383 return NULL;
1384 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001385 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 "string length not a multiple of item size");
1387 return NULL;
1388 }
1389 n = n / itemsize;
1390 if (n > 0) {
1391 char *item = self->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +00001392 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001393 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001394 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001395 return NULL;
1396 }
1397 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001398 Py_SIZE(self) += n;
1399 self->allocated = Py_SIZE(self);
1400 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001401 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403 Py_INCREF(Py_None);
1404 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001405}
1406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001407PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001408"fromstring(string)\n\
1409\n\
1410Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001411values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001412
1413
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001414static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001415array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001416{
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001417 return PyString_FromStringAndSize(self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001418 Py_SIZE(self) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001419}
1420
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001421PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001422"tostring() -> string\n\
1423\n\
1424Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001425representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001426
Martin v. Löwis99866332002-03-01 10:27:01 +00001427
1428
1429#ifdef Py_USING_UNICODE
1430static PyObject *
1431array_fromunicode(arrayobject *self, PyObject *args)
1432{
1433 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001434 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001435
1436 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1437 return NULL;
1438 if (self->ob_descr->typecode != 'u') {
1439 PyErr_SetString(PyExc_ValueError,
1440 "fromunicode() may only be called on "
1441 "type 'u' arrays");
1442 return NULL;
1443 }
1444 if (n > 0) {
1445 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +00001446 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001447 if (item == NULL) {
1448 PyErr_NoMemory();
1449 return NULL;
1450 }
1451 self->ob_item = (char *) item;
Christian Heimese93237d2007-12-19 02:37:44 +00001452 Py_SIZE(self) += n;
1453 self->allocated = Py_SIZE(self);
1454 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001455 ustr, n * sizeof(Py_UNICODE));
1456 }
1457
1458 Py_INCREF(Py_None);
1459 return Py_None;
1460}
1461
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001462PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001463"fromunicode(ustr)\n\
1464\n\
1465Extends this array with data from the unicode string ustr.\n\
1466The array must be a type 'u' array; otherwise a ValueError\n\
1467is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001468append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001469
1470
1471static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001472array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001473{
Martin v. Löwis99866332002-03-01 10:27:01 +00001474 if (self->ob_descr->typecode != 'u') {
1475 PyErr_SetString(PyExc_ValueError,
1476 "tounicode() may only be called on type 'u' arrays");
1477 return NULL;
1478 }
Christian Heimese93237d2007-12-19 02:37:44 +00001479 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001480}
1481
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001482PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001483"tounicode() -> unicode\n\
1484\n\
1485Convert the array to a unicode string. The array must be\n\
1486a type 'u' array; otherwise a ValueError is raised. Use\n\
1487array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001488an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001489
1490#endif /* Py_USING_UNICODE */
1491
1492
1493static PyObject *
1494array_get_typecode(arrayobject *a, void *closure)
1495{
1496 char tc = a->ob_descr->typecode;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001497 return PyString_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001498}
1499
1500static PyObject *
1501array_get_itemsize(arrayobject *a, void *closure)
1502{
1503 return PyInt_FromLong((long)a->ob_descr->itemsize);
1504}
1505
1506static PyGetSetDef array_getsets [] = {
1507 {"typecode", (getter) array_get_typecode, NULL,
1508 "the typecode character used to create the array"},
1509 {"itemsize", (getter) array_get_itemsize, NULL,
1510 "the size, in bytes, of one array item"},
1511 {NULL}
1512};
1513
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001514PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001515 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001516 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001517 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001518 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001519 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001520 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001521 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1522 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001523 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001524 count_doc},
Thomas Wouters9e398ca2006-08-24 18:40:20 +00001525 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001526 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001527 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001528 extend_doc},
1529 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1530 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001531 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001532 fromlist_doc},
1533 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1534 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001535#ifdef Py_USING_UNICODE
1536 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1537 fromunicode_doc},
1538#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001539 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001540 index_doc},
1541 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1542 insert_doc},
1543 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1544 pop_doc},
Georg Brandl1e7c3752008-03-25 08:37:23 +00001545 {"read", (PyCFunction)array_fromfile_as_read, METH_VARARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001546 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001547 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1548 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001549 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001550 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001551 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001552 reverse_doc},
1553/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1554 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001556 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001557 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001558 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001559 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001560 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001561#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001562 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001563 tounicode_doc},
1564#endif
Georg Brandl1e7c3752008-03-25 08:37:23 +00001565 {"write", (PyCFunction)array_tofile_as_write, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001566 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001567 {NULL, NULL} /* sentinel */
1568};
1569
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001570static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001571array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001572{
Martin v. Löwis99866332002-03-01 10:27:01 +00001573 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001574 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001575 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001576
Christian Heimese93237d2007-12-19 02:37:44 +00001577 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001578 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001579 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001580 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001581 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001582 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001583
1584 if (typecode == 'c')
1585 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001586#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001587 else if (typecode == 'u')
1588 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001589#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001590 else
1591 v = array_tolist(a, NULL);
1592 t = PyObject_Repr(v);
1593 Py_XDECREF(v);
1594
1595 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001596 s = PyString_FromString(buf);
1597 PyString_ConcatAndDel(&s, t);
1598 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001599 return s;
1600}
1601
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001602static PyObject*
1603array_subscr(arrayobject* self, PyObject* item)
1604{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001605 if (PyIndex_Check(item)) {
1606 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001607 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001608 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001609 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001610 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001611 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001612 return array_item(self, i);
1613 }
1614 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001615 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001616 PyObject* result;
1617 arrayobject* ar;
1618 int itemsize = self->ob_descr->itemsize;
1619
Christian Heimese93237d2007-12-19 02:37:44 +00001620 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001621 &start, &stop, &step, &slicelength) < 0) {
1622 return NULL;
1623 }
1624
1625 if (slicelength <= 0) {
1626 return newarrayobject(&Arraytype, 0, self->ob_descr);
1627 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001628 else if (step == 1) {
1629 PyObject *result = newarrayobject(&Arraytype,
1630 slicelength, self->ob_descr);
1631 if (result == NULL)
1632 return NULL;
1633 memcpy(((arrayobject *)result)->ob_item,
1634 self->ob_item + start * itemsize,
1635 slicelength * itemsize);
1636 return result;
1637 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001638 else {
1639 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1640 if (!result) return NULL;
1641
1642 ar = (arrayobject*)result;
1643
1644 for (cur = start, i = 0; i < slicelength;
1645 cur += step, i++) {
1646 memcpy(ar->ob_item + i*itemsize,
1647 self->ob_item + cur*itemsize,
1648 itemsize);
1649 }
1650
1651 return result;
1652 }
1653 }
1654 else {
1655 PyErr_SetString(PyExc_TypeError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001656 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001657 return NULL;
1658 }
1659}
1660
1661static int
1662array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1663{
Thomas Wouters3ccec682007-08-28 15:28:19 +00001664 Py_ssize_t start, stop, step, slicelength, needed;
1665 arrayobject* other;
1666 int itemsize;
1667
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001668 if (PyIndex_Check(item)) {
1669 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001670
1671 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001672 return -1;
1673 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001674 i += Py_SIZE(self);
1675 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001676 PyErr_SetString(PyExc_IndexError,
1677 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001678 return -1;
1679 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001680 if (value == NULL) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001681 /* Fall through to slice assignment */
1682 start = i;
1683 stop = i + 1;
1684 step = 1;
1685 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001686 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001687 else
1688 return (*self->ob_descr->setitem)(self, i, value);
1689 }
1690 else if (PySlice_Check(item)) {
1691 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimese93237d2007-12-19 02:37:44 +00001692 Py_SIZE(self), &start, &stop,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001693 &step, &slicelength) < 0) {
1694 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001695 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001696 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001697 else {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001698 PyErr_SetString(PyExc_TypeError,
1699 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001700 return -1;
1701 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001702 if (value == NULL) {
1703 other = NULL;
1704 needed = 0;
1705 }
1706 else if (array_Check(value)) {
1707 other = (arrayobject *)value;
Christian Heimese93237d2007-12-19 02:37:44 +00001708 needed = Py_SIZE(other);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001709 if (self == other) {
1710 /* Special case "self[i:j] = self" -- copy self first */
1711 int ret;
1712 value = array_slice(other, 0, needed);
1713 if (value == NULL)
1714 return -1;
1715 ret = array_ass_subscr(self, item, value);
1716 Py_DECREF(value);
1717 return ret;
1718 }
1719 if (other->ob_descr != self->ob_descr) {
1720 PyErr_BadArgument();
1721 return -1;
1722 }
1723 }
1724 else {
1725 PyErr_Format(PyExc_TypeError,
1726 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +00001727 Py_TYPE(value)->tp_name);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001728 return -1;
1729 }
1730 itemsize = self->ob_descr->itemsize;
1731 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1732 if ((step > 0 && stop < start) ||
1733 (step < 0 && stop > start))
1734 stop = start;
1735 if (step == 1) {
1736 if (slicelength > needed) {
1737 memmove(self->ob_item + (start + needed) * itemsize,
1738 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001739 (Py_SIZE(self) - stop) * itemsize);
1740 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001741 needed - slicelength) < 0)
1742 return -1;
1743 }
1744 else if (slicelength < needed) {
Christian Heimese93237d2007-12-19 02:37:44 +00001745 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001746 needed - slicelength) < 0)
1747 return -1;
1748 memmove(self->ob_item + (start + needed) * itemsize,
1749 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001750 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001751 }
1752 if (needed > 0)
1753 memcpy(self->ob_item + start * itemsize,
1754 other->ob_item, needed * itemsize);
1755 return 0;
1756 }
1757 else if (needed == 0) {
1758 /* Delete slice */
1759 Py_ssize_t cur, i;
1760
1761 if (step < 0) {
1762 stop = start + 1;
1763 start = stop + step * (slicelength - 1) - 1;
1764 step = -step;
1765 }
1766 for (cur = start, i = 0; i < slicelength;
1767 cur += step, i++) {
1768 Py_ssize_t lim = step - 1;
1769
Christian Heimese93237d2007-12-19 02:37:44 +00001770 if (cur + step >= Py_SIZE(self))
1771 lim = Py_SIZE(self) - cur - 1;
Thomas Wouters3ccec682007-08-28 15:28:19 +00001772 memmove(self->ob_item + (cur - i) * itemsize,
1773 self->ob_item + (cur + 1) * itemsize,
1774 lim * itemsize);
1775 }
1776 cur = start + slicelength * step;
Christian Heimese93237d2007-12-19 02:37:44 +00001777 if (cur < Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001778 memmove(self->ob_item + (cur-slicelength) * itemsize,
1779 self->ob_item + cur * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001780 (Py_SIZE(self) - cur) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001781 }
Christian Heimese93237d2007-12-19 02:37:44 +00001782 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Wouters3ccec682007-08-28 15:28:19 +00001783 return -1;
1784 return 0;
1785 }
1786 else {
1787 Py_ssize_t cur, i;
1788
1789 if (needed != slicelength) {
1790 PyErr_Format(PyExc_ValueError,
1791 "attempt to assign array of size %zd "
1792 "to extended slice of size %zd",
1793 needed, slicelength);
1794 return -1;
1795 }
1796 for (cur = start, i = 0; i < slicelength;
1797 cur += step, i++) {
1798 memcpy(self->ob_item + cur * itemsize,
1799 other->ob_item + i * itemsize,
1800 itemsize);
1801 }
1802 return 0;
1803 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001804}
1805
1806static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001807 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001808 (binaryfunc)array_subscr,
1809 (objobjargproc)array_ass_subscr
1810};
1811
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001812static const void *emptybuf = "";
1813
Martin v. Löwis18e16552006-02-15 17:27:45 +00001814static Py_ssize_t
1815array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001816{
1817 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001818 PyErr_SetString(PyExc_SystemError,
1819 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001820 return -1;
1821 }
1822 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001823 if (*ptr == NULL)
1824 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001825 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001826}
1827
Martin v. Löwis18e16552006-02-15 17:27:45 +00001828static Py_ssize_t
1829array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001830{
1831 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001832 PyErr_SetString(PyExc_SystemError,
1833 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001834 return -1;
1835 }
1836 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001837 if (*ptr == NULL)
1838 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001839 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001840}
1841
Martin v. Löwis18e16552006-02-15 17:27:45 +00001842static Py_ssize_t
1843array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001844{
1845 if ( lenp )
Christian Heimese93237d2007-12-19 02:37:44 +00001846 *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001847 return 1;
1848}
1849
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001850static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001851 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001852 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001853 (ssizeargfunc)array_repeat, /*sq_repeat*/
1854 (ssizeargfunc)array_item, /*sq_item*/
1855 (ssizessizeargfunc)array_slice, /*sq_slice*/
1856 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1857 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001858 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001859 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001860 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001861};
1862
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001863static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001864 (readbufferproc)array_buffer_getreadbuf,
1865 (writebufferproc)array_buffer_getwritebuf,
1866 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001867 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001868};
1869
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001870static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001871array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001872{
1873 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001874 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001875 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001876
Georg Brandlb84c1372007-01-21 10:28:43 +00001877 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001878 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001879
1880 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1881 return NULL;
1882
1883 if (!(initial == NULL || PyList_Check(initial)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001884 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001885 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001886 it = PyObject_GetIter(initial);
1887 if (it == NULL)
1888 return NULL;
1889 /* We set initial to NULL so that the subsequent code
1890 will create an empty array of the appropriate type
1891 and afterwards we can use array_iter_extend to populate
1892 the array.
1893 */
1894 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001895 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001896 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1897 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001898 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001899 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001900
1901 if (initial == NULL || !(PyList_Check(initial)
1902 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001903 len = 0;
1904 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001905 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001906
1907 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001908 if (a == NULL)
1909 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001910
Guido van Rossum778983b1993-02-19 15:55:02 +00001911 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001912 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001913 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001914 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001915 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001916 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001917 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001918 return NULL;
1919 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001920 if (setarrayitem(a, i, v) != 0) {
1921 Py_DECREF(v);
1922 Py_DECREF(a);
1923 return NULL;
1924 }
1925 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001926 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001927 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001928 PyObject *t_initial, *v;
1929 t_initial = PyTuple_Pack(1, initial);
1930 if (t_initial == NULL) {
1931 Py_DECREF(a);
1932 return NULL;
1933 }
1934 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001935 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001936 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001937 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001938 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001939 return NULL;
1940 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001941 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001942#ifdef Py_USING_UNICODE
1943 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001944 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001945 if (n > 0) {
1946 arrayobject *self = (arrayobject *)a;
1947 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001948 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001949 if (item == NULL) {
1950 PyErr_NoMemory();
1951 Py_DECREF(a);
1952 return NULL;
1953 }
1954 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001955 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001956 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimese93237d2007-12-19 02:37:44 +00001957 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001958 }
1959#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001960 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001961 if (it != NULL) {
1962 if (array_iter_extend((arrayobject *)a, it) == -1) {
1963 Py_DECREF(it);
1964 Py_DECREF(a);
1965 return NULL;
1966 }
1967 Py_DECREF(it);
1968 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001969 return a;
1970 }
1971 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001972 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001973 "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001974 return NULL;
1975}
1976
Guido van Rossum778983b1993-02-19 15:55:02 +00001977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001979"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001980an array of basic values: characters, integers, floating point\n\
1981numbers. Arrays are sequence types and behave very much like lists,\n\
1982except that the type of objects stored in them is constrained. The\n\
1983type is specified at object creation time by using a type code, which\n\
1984is a single character. The following type codes are defined:\n\
1985\n\
1986 Type code C Type Minimum size in bytes \n\
1987 'c' character 1 \n\
1988 'b' signed integer 1 \n\
1989 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001990 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001991 'h' signed integer 2 \n\
1992 'H' unsigned integer 2 \n\
1993 'i' signed integer 2 \n\
1994 'I' unsigned integer 2 \n\
1995 'l' signed integer 4 \n\
1996 'L' unsigned integer 4 \n\
1997 'f' floating point 4 \n\
1998 'd' floating point 8 \n\
1999\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002000The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002001\n\
2002array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002003");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002005PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002006"array(typecode [, initializer]) -> array\n\
2007\n\
2008Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002009initialized from the optional initializer value, which must be a list,\n\
2010string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002011\n\
2012Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002013the type of objects stored in them is constrained.\n\
2014\n\
2015Methods:\n\
2016\n\
2017append() -- append a new item to the end of the array\n\
2018buffer_info() -- return information giving the current memory info\n\
2019byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002020count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002021extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002022fromfile() -- read items from a file object\n\
2023fromlist() -- append items from the list\n\
2024fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002025index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002026insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002027pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002028read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002029remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002030reverse() -- reverse the order of the items in the array\n\
2031tofile() -- write all items to a file object\n\
2032tolist() -- return the array converted to an ordinary list\n\
2033tostring() -- return the array converted to a string\n\
2034write() -- DEPRECATED, use tofile()\n\
2035\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002036Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002037\n\
2038typecode -- the typecode character used to create the array\n\
2039itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002040");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002041
Raymond Hettinger625812f2003-01-07 01:58:52 +00002042static PyObject *array_iter(arrayobject *ao);
2043
Tim Peters0c322792002-07-17 16:49:03 +00002044static PyTypeObject Arraytype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002045 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002046 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002047 sizeof(arrayobject),
2048 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002049 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002050 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002051 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002052 0, /* tp_setattr */
2053 0, /* tp_compare */
2054 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002055 0, /* tp_as_number*/
2056 &array_as_sequence, /* tp_as_sequence*/
2057 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002058 0, /* tp_hash */
2059 0, /* tp_call */
2060 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002061 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002062 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002063 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002064 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002065 arraytype_doc, /* tp_doc */
2066 0, /* tp_traverse */
2067 0, /* tp_clear */
2068 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002069 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002070 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002071 0, /* tp_iternext */
2072 array_methods, /* tp_methods */
2073 0, /* tp_members */
2074 array_getsets, /* tp_getset */
2075 0, /* tp_base */
2076 0, /* tp_dict */
2077 0, /* tp_descr_get */
2078 0, /* tp_descr_set */
2079 0, /* tp_dictoffset */
2080 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002081 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002082 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002083 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002084};
2085
Raymond Hettinger625812f2003-01-07 01:58:52 +00002086
2087/*********************** Array Iterator **************************/
2088
2089typedef struct {
2090 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002091 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002092 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002093 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002094} arrayiterobject;
2095
2096static PyTypeObject PyArrayIter_Type;
2097
2098#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2099
2100static PyObject *
2101array_iter(arrayobject *ao)
2102{
2103 arrayiterobject *it;
2104
2105 if (!array_Check(ao)) {
2106 PyErr_BadInternalCall();
2107 return NULL;
2108 }
2109
2110 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2111 if (it == NULL)
2112 return NULL;
2113
2114 Py_INCREF(ao);
2115 it->ao = ao;
2116 it->index = 0;
2117 it->getitem = ao->ob_descr->getitem;
2118 PyObject_GC_Track(it);
2119 return (PyObject *)it;
2120}
2121
2122static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002123arrayiter_next(arrayiterobject *it)
2124{
2125 assert(PyArrayIter_Check(it));
Christian Heimese93237d2007-12-19 02:37:44 +00002126 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002127 return (*it->getitem)(it->ao, it->index++);
2128 return NULL;
2129}
2130
2131static void
2132arrayiter_dealloc(arrayiterobject *it)
2133{
2134 PyObject_GC_UnTrack(it);
2135 Py_XDECREF(it->ao);
2136 PyObject_GC_Del(it);
2137}
2138
2139static int
2140arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2141{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002142 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002143 return 0;
2144}
2145
2146static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002147 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002148 "arrayiterator", /* tp_name */
2149 sizeof(arrayiterobject), /* tp_basicsize */
2150 0, /* tp_itemsize */
2151 /* methods */
2152 (destructor)arrayiter_dealloc, /* tp_dealloc */
2153 0, /* tp_print */
2154 0, /* tp_getattr */
2155 0, /* tp_setattr */
2156 0, /* tp_compare */
2157 0, /* tp_repr */
2158 0, /* tp_as_number */
2159 0, /* tp_as_sequence */
2160 0, /* tp_as_mapping */
2161 0, /* tp_hash */
2162 0, /* tp_call */
2163 0, /* tp_str */
2164 PyObject_GenericGetAttr, /* tp_getattro */
2165 0, /* tp_setattro */
2166 0, /* tp_as_buffer */
2167 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2168 0, /* tp_doc */
2169 (traverseproc)arrayiter_traverse, /* tp_traverse */
2170 0, /* tp_clear */
2171 0, /* tp_richcompare */
2172 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002173 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002174 (iternextfunc)arrayiter_next, /* tp_iternext */
2175 0, /* tp_methods */
2176};
2177
2178
2179/*********************** Install Module **************************/
2180
Martin v. Löwis99866332002-03-01 10:27:01 +00002181/* No functions in array module. */
2182static PyMethodDef a_methods[] = {
2183 {NULL, NULL, 0, NULL} /* Sentinel */
2184};
2185
2186
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002187PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002188initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002189{
Fred Drakef4e34842002-04-01 03:45:06 +00002190 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002191
Martin v. Löwis99866332002-03-01 10:27:01 +00002192 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002193 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002194 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002195 if (m == NULL)
2196 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002197
2198 Py_INCREF((PyObject *)&Arraytype);
2199 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2200 Py_INCREF((PyObject *)&Arraytype);
2201 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002202 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002203}