blob: bcd82aa977a72fcfff0a8af2d9fc22d621e793fb [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 }
Neal Norwitz705cd062008-06-13 06:02:26 +0000435 op->ob_descr = descr;
436 op->allocated = size;
437 op->weakreflist = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000438 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000439 if (size <= 0) {
440 op->ob_item = NULL;
441 }
442 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 if (op->ob_item == NULL) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000445 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 }
448 }
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 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000655 if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {
656 return PyErr_NoMemory();
657 }
Christian Heimese93237d2007-12-19 02:37:44 +0000658 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000659 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000660 if (np == NULL) {
661 return NULL;
662 }
Christian Heimese93237d2007-12-19 02:37:44 +0000663 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
664 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
665 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000666 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000667#undef b
668}
669
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000672{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673 Py_ssize_t i;
674 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 arrayobject *np;
676 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000677 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000678 if (n < 0)
679 n = 0;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000680 if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {
681 return PyErr_NoMemory();
682 }
Christian Heimese93237d2007-12-19 02:37:44 +0000683 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000684 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000685 if (np == NULL)
686 return NULL;
687 p = np->ob_item;
Christian Heimese93237d2007-12-19 02:37:44 +0000688 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000689 for (i = 0; i < n; i++) {
690 memcpy(p, a->ob_item, nbytes);
691 p += nbytes;
692 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000694}
695
696static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000697array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000698{
699 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000700 Py_ssize_t n; /* Size of replacement array */
701 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000702#define b ((arrayobject *)v)
703 if (v == NULL)
704 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000705 else if (array_Check(v)) {
Christian Heimese93237d2007-12-19 02:37:44 +0000706 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000707 if (a == b) {
708 /* Special case "a[i:j] = a" -- copy b first */
709 int ret;
710 v = array_slice(b, 0, n);
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +0000711 if (!v)
712 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000714 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000715 return ret;
716 }
717 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000718 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000719 return -1;
720 }
721 }
722 else {
Fred Drake137507e2000-06-01 02:02:46 +0000723 PyErr_Format(PyExc_TypeError,
724 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +0000725 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000726 return -1;
727 }
728 if (ilow < 0)
729 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000730 else if (ilow > Py_SIZE(a))
731 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000732 if (ihigh < 0)
733 ihigh = 0;
734 if (ihigh < ilow)
735 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000736 else if (ihigh > Py_SIZE(a))
737 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000738 item = a->ob_item;
739 d = n - (ihigh-ilow);
740 if (d < 0) { /* Delete -d items */
741 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
742 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000743 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
744 Py_SIZE(a) += d;
745 PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 /* Can't fail */
747 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000748 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000749 }
750 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000751 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +0000752 (Py_SIZE(a) + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000754 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000755 return -1;
756 }
757 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
758 item + ihigh*a->ob_descr->itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +0000759 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000760 a->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +0000761 Py_SIZE(a) += d;
762 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000763 }
764 if (n > 0)
765 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
766 n*b->ob_descr->itemsize);
767 return 0;
768#undef b
769}
770
771static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000772array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000773{
Christian Heimese93237d2007-12-19 02:37:44 +0000774 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000775 PyErr_SetString(PyExc_IndexError,
776 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000777 return -1;
778 }
779 if (v == NULL)
780 return array_ass_slice(a, i, i+1, v);
781 return (*a->ob_descr->setitem)(a, i, v);
782}
783
784static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000785setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000786{
Martin v. Löwis99866332002-03-01 10:27:01 +0000787 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 return array_ass_item((arrayobject *)a, i, v);
789}
790
Martin v. Löwis99866332002-03-01 10:27:01 +0000791static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000792array_iter_extend(arrayobject *self, PyObject *bb)
793{
794 PyObject *it, *v;
795
796 it = PyObject_GetIter(bb);
797 if (it == NULL)
798 return -1;
799
800 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +0000801 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000802 Py_DECREF(v);
803 Py_DECREF(it);
804 return -1;
805 }
806 Py_DECREF(v);
807 }
808 Py_DECREF(it);
809 if (PyErr_Occurred())
810 return -1;
811 return 0;
812}
813
814static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000815array_do_extend(arrayobject *self, PyObject *bb)
816{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000817 Py_ssize_t size;
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000818 char *old_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000819
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000820 if (!array_Check(bb))
821 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000822#define b ((arrayobject *)bb)
823 if (self->ob_descr != b->ob_descr) {
824 PyErr_SetString(PyExc_TypeError,
825 "can only extend with array of same kind");
826 return -1;
827 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000828 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
829 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
Neal Norwitz705cd062008-06-13 06:02:26 +0000830 PyErr_NoMemory();
831 return -1;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000832 }
Christian Heimese93237d2007-12-19 02:37:44 +0000833 size = Py_SIZE(self) + Py_SIZE(b);
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000834 old_item = self->ob_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000835 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
836 if (self->ob_item == NULL) {
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000837 self->ob_item = old_item;
Neal Norwitz705cd062008-06-13 06:02:26 +0000838 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000839 return -1;
840 }
Christian Heimese93237d2007-12-19 02:37:44 +0000841 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
842 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
843 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000844 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000845
846 return 0;
847#undef b
848}
849
850static PyObject *
851array_inplace_concat(arrayobject *self, PyObject *bb)
852{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000853 if (!array_Check(bb)) {
854 PyErr_Format(PyExc_TypeError,
855 "can only extend array with array (not \"%.200s\")",
Christian Heimese93237d2007-12-19 02:37:44 +0000856 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000857 return NULL;
858 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000859 if (array_do_extend(self, bb) == -1)
860 return NULL;
861 Py_INCREF(self);
862 return (PyObject *)self;
863}
864
865static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000866array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000867{
868 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000869 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000870
Christian Heimese93237d2007-12-19 02:37:44 +0000871 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000872 if (n < 0)
873 n = 0;
874 items = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000875 if ((self->ob_descr->itemsize != 0) &&
876 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
877 return PyErr_NoMemory();
878 }
Christian Heimese93237d2007-12-19 02:37:44 +0000879 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000880 if (n == 0) {
881 PyMem_FREE(items);
882 self->ob_item = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000883 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000884 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000885 }
886 else {
Gregory P. Smith9d534572008-06-11 07:41:16 +0000887 if (size > PY_SSIZE_T_MAX / n) {
888 return PyErr_NoMemory();
889 }
Gregory P. Smith0470bab2008-07-22 04:46:32 +0000890 PyMem_RESIZE(items, char, n * size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000891 if (items == NULL)
892 return PyErr_NoMemory();
893 p = items;
894 for (i = 1; i < n; i++) {
895 p += size;
896 memcpy(p, items, size);
897 }
898 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +0000899 Py_SIZE(self) *= n;
900 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000901 }
902 }
903 Py_INCREF(self);
904 return (PyObject *)self;
905}
906
907
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000908static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000909ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000910{
911 if (ins1(self, where, v) != 0)
912 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000913 Py_INCREF(Py_None);
914 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000915}
916
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000917static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000918array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000920 Py_ssize_t count = 0;
921 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922
Christian Heimese93237d2007-12-19 02:37:44 +0000923 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000925 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000927 if (cmp > 0)
928 count++;
929 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930 return NULL;
931 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000932 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933}
934
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000936"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000937\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000938Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000939
940static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000941array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000942{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000943 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000944
Christian Heimese93237d2007-12-19 02:37:44 +0000945 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000946 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000947 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
948 Py_DECREF(selfi);
949 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000950 return PyInt_FromLong((long)i);
951 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000952 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000953 return NULL;
954 }
955 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
956 return NULL;
957}
958
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000959PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000960"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000962Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000963
Raymond Hettinger625812f2003-01-07 01:58:52 +0000964static int
965array_contains(arrayobject *self, PyObject *v)
966{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000967 Py_ssize_t i;
968 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000969
Christian Heimese93237d2007-12-19 02:37:44 +0000970 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000971 PyObject *selfi = getarrayitem((PyObject *)self, i);
972 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
973 Py_DECREF(selfi);
974 }
975 return cmp;
976}
977
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000978static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000979array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980{
981 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982
Christian Heimese93237d2007-12-19 02:37:44 +0000983 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000985 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
986 Py_DECREF(selfi);
987 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988 if (array_ass_slice(self, i, i+1,
989 (PyObject *)NULL) != 0)
990 return NULL;
991 Py_INCREF(Py_None);
992 return Py_None;
993 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000994 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000995 return NULL;
996 }
997 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
998 return NULL;
999}
1000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001001PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001002"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001003\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001004Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001005
1006static PyObject *
1007array_pop(arrayobject *self, PyObject *args)
1008{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001009 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001011 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001013 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001014 /* Special-case most common failure cause */
1015 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1016 return NULL;
1017 }
1018 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001019 i += Py_SIZE(self);
1020 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1022 return NULL;
1023 }
1024 v = getarrayitem((PyObject *)self,i);
1025 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1026 Py_DECREF(v);
1027 return NULL;
1028 }
1029 return v;
1030}
1031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001033"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001034\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001035Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001036
1037static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001038array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001039{
Martin v. Löwis99866332002-03-01 10:27:01 +00001040 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001041 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001042 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001043 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001044}
1045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001046PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001047"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001048\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001049 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001050
1051static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001052array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001053{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001054 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001055 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001056 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001057 return NULL;
1058 return ins(self, i, v);
1059}
1060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001062"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001063\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001064Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001065
1066
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001067static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001068array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001069{
Tim Peters077a11d2000-09-16 22:31:29 +00001070 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001071 retval = PyTuple_New(2);
1072 if (!retval)
1073 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001074
1075 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimese93237d2007-12-19 02:37:44 +00001076 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001077
1078 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001079}
1080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001081PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001082"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001083\n\
1084Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001085the length in items of the buffer used to hold array's contents\n\
1086The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001087the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001088
1089
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001090static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001091array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001092{
Christian Heimese93237d2007-12-19 02:37:44 +00001093 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001094}
1095
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001096PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001097"append(x)\n\
1098\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001099Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001100
1101
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001102static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001103array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001104{
1105 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001106 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001107
Guido van Rossum778983b1993-02-19 15:55:02 +00001108 switch (self->ob_descr->itemsize) {
1109 case 1:
1110 break;
1111 case 2:
Christian Heimese93237d2007-12-19 02:37:44 +00001112 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001113 char p0 = p[0];
1114 p[0] = p[1];
1115 p[1] = p0;
1116 }
1117 break;
1118 case 4:
Christian Heimese93237d2007-12-19 02:37:44 +00001119 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 char p0 = p[0];
1121 char p1 = p[1];
1122 p[0] = p[3];
1123 p[1] = p[2];
1124 p[2] = p1;
1125 p[3] = p0;
1126 }
1127 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001128 case 8:
Christian Heimese93237d2007-12-19 02:37:44 +00001129 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001130 char p0 = p[0];
1131 char p1 = p[1];
1132 char p2 = p[2];
1133 char p3 = p[3];
1134 p[0] = p[7];
1135 p[1] = p[6];
1136 p[2] = p[5];
1137 p[3] = p[4];
1138 p[4] = p3;
1139 p[5] = p2;
1140 p[6] = p1;
1141 p[7] = p0;
1142 }
1143 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001144 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001145 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001146 "don't know how to byteswap this array type");
1147 return NULL;
1148 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149 Py_INCREF(Py_None);
1150 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001151}
1152
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001153PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001154"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001155\n\
Fred Drakebf272981999-12-03 17:15:30 +00001156Byteswap 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 +000011574, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001158
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001159static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001160array_reduce(arrayobject *array)
1161{
1162 PyObject *dict, *result;
1163
1164 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1165 if (dict == NULL) {
1166 PyErr_Clear();
1167 dict = Py_None;
1168 Py_INCREF(dict);
1169 }
Christian Heimese93237d2007-12-19 02:37:44 +00001170 if (Py_SIZE(array) > 0) {
Gregory P. Smith9d534572008-06-11 07:41:16 +00001171 if (array->ob_descr->itemsize
1172 > PY_SSIZE_T_MAX / array->ob_size) {
1173 return PyErr_NoMemory();
1174 }
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001175 result = Py_BuildValue("O(cs#)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001176 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001177 array->ob_descr->typecode,
1178 array->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001179 Py_SIZE(array) * array->ob_descr->itemsize,
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001180 dict);
1181 } else {
1182 result = Py_BuildValue("O(c)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001183 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001184 array->ob_descr->typecode,
1185 dict);
1186 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001187 Py_DECREF(dict);
1188 return result;
1189}
1190
1191PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1192
1193static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001194array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001195{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001196 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001197 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001198 /* little buffer to hold items while swapping */
1199 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001200 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001201
Christian Heimese93237d2007-12-19 02:37:44 +00001202 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001203 for (p = self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001204 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001205 p < q;
1206 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001207 /* memory areas guaranteed disjoint, so memcpy
1208 * is safe (& memmove may be slower).
1209 */
1210 memcpy(tmp, p, itemsize);
1211 memcpy(p, q, itemsize);
1212 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001213 }
1214 }
Tim Petersbb307342000-09-10 05:22:54 +00001215
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001216 Py_INCREF(Py_None);
1217 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001218}
Guido van Rossume77a7571993-11-03 15:01:26 +00001219
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001220PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001221"reverse()\n\
1222\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001223Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001224
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001225static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001226array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001227{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001229 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001231 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001233 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001234 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001235 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001236 return NULL;
1237 }
1238 if (n > 0) {
1239 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001240 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001241 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001242 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001243 size_t newbytes;
1244 /* Be careful here about overflow */
Christian Heimese93237d2007-12-19 02:37:44 +00001245 if ((newlength = Py_SIZE(self) + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001246 (newbytes = newlength * itemsize) / itemsize !=
1247 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001248 goto nomem;
1249 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001250 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001251 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001252 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001253 return NULL;
1254 }
1255 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001256 Py_SIZE(self) += n;
1257 self->allocated = Py_SIZE(self);
1258 nread = fread(item + (Py_SIZE(self) - n) * itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001260 if (nread < (size_t)n) {
Christian Heimese93237d2007-12-19 02:37:44 +00001261 Py_SIZE(self) -= (n - nread);
1262 PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001263 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001264 self->allocated = Py_SIZE(self);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 PyErr_SetString(PyExc_EOFError,
1266 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001267 return NULL;
1268 }
1269 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001270 Py_INCREF(Py_None);
1271 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001272}
1273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001274PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001275"fromfile(f, n)\n\
1276\n\
1277Read 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 +00001278array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001279
1280
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001281static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001282array_fromfile_as_read(arrayobject *self, PyObject *args)
1283{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001284 if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001285 "use array.fromfile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001286 return NULL;
1287 return array_fromfile(self, args);
1288}
1289
1290
1291static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001292array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001293{
Guido van Rossum778983b1993-02-19 15:55:02 +00001294 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001295
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001296 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001298 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001299 return NULL;
1300 }
1301 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001302 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1303 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001304 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001305 clearerr(fp);
1306 return NULL;
1307 }
1308 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001309 Py_INCREF(Py_None);
1310 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001311}
1312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001313PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001314"tofile(f)\n\
1315\n\
1316Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001317write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001318
1319
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001320static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001321array_tofile_as_write(arrayobject *self, PyObject *f)
1322{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001323 if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001324 "use array.tofile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001325 return NULL;
1326 return array_tofile(self, f);
1327}
1328
1329
1330static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001331array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001332{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001333 Py_ssize_t n;
1334 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001335
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001336 if (!PyList_Check(list)) {
1337 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001338 return NULL;
1339 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001340 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001341 if (n > 0) {
1342 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001343 Py_ssize_t i;
Christian Heimese93237d2007-12-19 02:37:44 +00001344 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001345 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001346 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001347 return NULL;
1348 }
1349 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001350 Py_SIZE(self) += n;
1351 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001352 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001353 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001354 if ((*self->ob_descr->setitem)(self,
Christian Heimese93237d2007-12-19 02:37:44 +00001355 Py_SIZE(self) - n + i, v) != 0) {
1356 Py_SIZE(self) -= n;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001357 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1358 return PyErr_NoMemory();
1359 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +00001361 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001362 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001363 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001364 return NULL;
1365 }
1366 }
1367 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001368 Py_INCREF(Py_None);
1369 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001370}
1371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001372PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001373"fromlist(list)\n\
1374\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001375Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001376
1377
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001378static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001379array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001380{
Christian Heimese93237d2007-12-19 02:37:44 +00001381 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001382 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001383
Guido van Rossum778983b1993-02-19 15:55:02 +00001384 if (list == NULL)
1385 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001386 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001387 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001389 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001390 return NULL;
1391 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001392 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001393 }
1394 return list;
1395}
1396
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001397PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001398"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001399\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001400Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001401
1402
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001404array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001405{
1406 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001407 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001408 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001409 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001410 return NULL;
1411 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001412 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001413 "string length not a multiple of item size");
1414 return NULL;
1415 }
1416 n = n / itemsize;
1417 if (n > 0) {
1418 char *item = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001419 if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1420 ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1421 return PyErr_NoMemory();
1422 }
Christian Heimese93237d2007-12-19 02:37:44 +00001423 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001424 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001425 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001426 return NULL;
1427 }
1428 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001429 Py_SIZE(self) += n;
1430 self->allocated = Py_SIZE(self);
1431 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001432 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001433 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001434 Py_INCREF(Py_None);
1435 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001436}
1437
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001439"fromstring(string)\n\
1440\n\
1441Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001443
1444
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001445static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001446array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001447{
Gregory P. Smith9d534572008-06-11 07:41:16 +00001448 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1449 return PyString_FromStringAndSize(self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001450 Py_SIZE(self) * self->ob_descr->itemsize);
Gregory P. Smith9d534572008-06-11 07:41:16 +00001451 } else {
1452 return PyErr_NoMemory();
1453 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001454}
1455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001456PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001457"tostring() -> string\n\
1458\n\
1459Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001460representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001461
Martin v. Löwis99866332002-03-01 10:27:01 +00001462
1463
1464#ifdef Py_USING_UNICODE
1465static PyObject *
1466array_fromunicode(arrayobject *self, PyObject *args)
1467{
1468 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001469 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001470
1471 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1472 return NULL;
1473 if (self->ob_descr->typecode != 'u') {
1474 PyErr_SetString(PyExc_ValueError,
1475 "fromunicode() may only be called on "
1476 "type 'u' arrays");
1477 return NULL;
1478 }
1479 if (n > 0) {
1480 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001481 if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1482 return PyErr_NoMemory();
1483 }
Christian Heimese93237d2007-12-19 02:37:44 +00001484 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001485 if (item == NULL) {
1486 PyErr_NoMemory();
1487 return NULL;
1488 }
1489 self->ob_item = (char *) item;
Christian Heimese93237d2007-12-19 02:37:44 +00001490 Py_SIZE(self) += n;
1491 self->allocated = Py_SIZE(self);
1492 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001493 ustr, n * sizeof(Py_UNICODE));
1494 }
1495
1496 Py_INCREF(Py_None);
1497 return Py_None;
1498}
1499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001500PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001501"fromunicode(ustr)\n\
1502\n\
1503Extends this array with data from the unicode string ustr.\n\
1504The array must be a type 'u' array; otherwise a ValueError\n\
1505is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001506append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001507
1508
1509static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001510array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001511{
Martin v. Löwis99866332002-03-01 10:27:01 +00001512 if (self->ob_descr->typecode != 'u') {
1513 PyErr_SetString(PyExc_ValueError,
1514 "tounicode() may only be called on type 'u' arrays");
1515 return NULL;
1516 }
Christian Heimese93237d2007-12-19 02:37:44 +00001517 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001518}
1519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001520PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001521"tounicode() -> unicode\n\
1522\n\
1523Convert the array to a unicode string. The array must be\n\
1524a type 'u' array; otherwise a ValueError is raised. Use\n\
1525array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001526an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001527
1528#endif /* Py_USING_UNICODE */
1529
1530
1531static PyObject *
1532array_get_typecode(arrayobject *a, void *closure)
1533{
1534 char tc = a->ob_descr->typecode;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001535 return PyString_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001536}
1537
1538static PyObject *
1539array_get_itemsize(arrayobject *a, void *closure)
1540{
1541 return PyInt_FromLong((long)a->ob_descr->itemsize);
1542}
1543
1544static PyGetSetDef array_getsets [] = {
1545 {"typecode", (getter) array_get_typecode, NULL,
1546 "the typecode character used to create the array"},
1547 {"itemsize", (getter) array_get_itemsize, NULL,
1548 "the size, in bytes, of one array item"},
1549 {NULL}
1550};
1551
Martin v. Löwis111c1802008-06-13 07:47:47 +00001552static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001553 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001554 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001556 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001557 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001558 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001559 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1560 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001561 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001562 count_doc},
Thomas Wouters9e398ca2006-08-24 18:40:20 +00001563 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001564 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001565 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001566 extend_doc},
1567 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1568 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001569 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001570 fromlist_doc},
1571 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1572 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001573#ifdef Py_USING_UNICODE
1574 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1575 fromunicode_doc},
1576#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001577 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001578 index_doc},
1579 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1580 insert_doc},
1581 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1582 pop_doc},
Georg Brandl1e7c3752008-03-25 08:37:23 +00001583 {"read", (PyCFunction)array_fromfile_as_read, METH_VARARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001584 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001585 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1586 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001587 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001588 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001589 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001590 reverse_doc},
1591/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1592 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001593 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001594 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001595 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001596 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001597 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001598 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001599#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001600 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001601 tounicode_doc},
1602#endif
Georg Brandl1e7c3752008-03-25 08:37:23 +00001603 {"write", (PyCFunction)array_tofile_as_write, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001604 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001605 {NULL, NULL} /* sentinel */
1606};
1607
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001608static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001609array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001610{
Martin v. Löwis99866332002-03-01 10:27:01 +00001611 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001612 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001613 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001614
Christian Heimese93237d2007-12-19 02:37:44 +00001615 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001616 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001617 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001618 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001619 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001620 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001621
1622 if (typecode == 'c')
1623 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001624#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001625 else if (typecode == 'u')
1626 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001627#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001628 else
1629 v = array_tolist(a, NULL);
1630 t = PyObject_Repr(v);
1631 Py_XDECREF(v);
1632
1633 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001634 s = PyString_FromString(buf);
1635 PyString_ConcatAndDel(&s, t);
1636 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001637 return s;
1638}
1639
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001640static PyObject*
1641array_subscr(arrayobject* self, PyObject* item)
1642{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001643 if (PyIndex_Check(item)) {
1644 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001645 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001646 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001647 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001648 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001649 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001650 return array_item(self, i);
1651 }
1652 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001653 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001654 PyObject* result;
1655 arrayobject* ar;
1656 int itemsize = self->ob_descr->itemsize;
1657
Christian Heimese93237d2007-12-19 02:37:44 +00001658 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001659 &start, &stop, &step, &slicelength) < 0) {
1660 return NULL;
1661 }
1662
1663 if (slicelength <= 0) {
1664 return newarrayobject(&Arraytype, 0, self->ob_descr);
1665 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001666 else if (step == 1) {
1667 PyObject *result = newarrayobject(&Arraytype,
1668 slicelength, self->ob_descr);
1669 if (result == NULL)
1670 return NULL;
1671 memcpy(((arrayobject *)result)->ob_item,
1672 self->ob_item + start * itemsize,
1673 slicelength * itemsize);
1674 return result;
1675 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001676 else {
1677 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1678 if (!result) return NULL;
1679
1680 ar = (arrayobject*)result;
1681
1682 for (cur = start, i = 0; i < slicelength;
1683 cur += step, i++) {
1684 memcpy(ar->ob_item + i*itemsize,
1685 self->ob_item + cur*itemsize,
1686 itemsize);
1687 }
1688
1689 return result;
1690 }
1691 }
1692 else {
1693 PyErr_SetString(PyExc_TypeError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001694 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001695 return NULL;
1696 }
1697}
1698
1699static int
1700array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1701{
Thomas Wouters3ccec682007-08-28 15:28:19 +00001702 Py_ssize_t start, stop, step, slicelength, needed;
1703 arrayobject* other;
1704 int itemsize;
1705
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001706 if (PyIndex_Check(item)) {
1707 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001708
1709 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001710 return -1;
1711 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001712 i += Py_SIZE(self);
1713 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001714 PyErr_SetString(PyExc_IndexError,
1715 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001716 return -1;
1717 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001718 if (value == NULL) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001719 /* Fall through to slice assignment */
1720 start = i;
1721 stop = i + 1;
1722 step = 1;
1723 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001724 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001725 else
1726 return (*self->ob_descr->setitem)(self, i, value);
1727 }
1728 else if (PySlice_Check(item)) {
1729 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimese93237d2007-12-19 02:37:44 +00001730 Py_SIZE(self), &start, &stop,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001731 &step, &slicelength) < 0) {
1732 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001733 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001734 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001735 else {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001736 PyErr_SetString(PyExc_TypeError,
1737 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001738 return -1;
1739 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001740 if (value == NULL) {
1741 other = NULL;
1742 needed = 0;
1743 }
1744 else if (array_Check(value)) {
1745 other = (arrayobject *)value;
Christian Heimese93237d2007-12-19 02:37:44 +00001746 needed = Py_SIZE(other);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001747 if (self == other) {
1748 /* Special case "self[i:j] = self" -- copy self first */
1749 int ret;
1750 value = array_slice(other, 0, needed);
1751 if (value == NULL)
1752 return -1;
1753 ret = array_ass_subscr(self, item, value);
1754 Py_DECREF(value);
1755 return ret;
1756 }
1757 if (other->ob_descr != self->ob_descr) {
1758 PyErr_BadArgument();
1759 return -1;
1760 }
1761 }
1762 else {
1763 PyErr_Format(PyExc_TypeError,
1764 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +00001765 Py_TYPE(value)->tp_name);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001766 return -1;
1767 }
1768 itemsize = self->ob_descr->itemsize;
1769 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1770 if ((step > 0 && stop < start) ||
1771 (step < 0 && stop > start))
1772 stop = start;
1773 if (step == 1) {
1774 if (slicelength > needed) {
1775 memmove(self->ob_item + (start + needed) * itemsize,
1776 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001777 (Py_SIZE(self) - stop) * itemsize);
1778 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001779 needed - slicelength) < 0)
1780 return -1;
1781 }
1782 else if (slicelength < needed) {
Christian Heimese93237d2007-12-19 02:37:44 +00001783 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001784 needed - slicelength) < 0)
1785 return -1;
1786 memmove(self->ob_item + (start + needed) * itemsize,
1787 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001788 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001789 }
1790 if (needed > 0)
1791 memcpy(self->ob_item + start * itemsize,
1792 other->ob_item, needed * itemsize);
1793 return 0;
1794 }
1795 else if (needed == 0) {
1796 /* Delete slice */
1797 Py_ssize_t cur, i;
1798
1799 if (step < 0) {
1800 stop = start + 1;
1801 start = stop + step * (slicelength - 1) - 1;
1802 step = -step;
1803 }
1804 for (cur = start, i = 0; i < slicelength;
1805 cur += step, i++) {
1806 Py_ssize_t lim = step - 1;
1807
Christian Heimese93237d2007-12-19 02:37:44 +00001808 if (cur + step >= Py_SIZE(self))
1809 lim = Py_SIZE(self) - cur - 1;
Thomas Wouters3ccec682007-08-28 15:28:19 +00001810 memmove(self->ob_item + (cur - i) * itemsize,
1811 self->ob_item + (cur + 1) * itemsize,
1812 lim * itemsize);
1813 }
1814 cur = start + slicelength * step;
Christian Heimese93237d2007-12-19 02:37:44 +00001815 if (cur < Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001816 memmove(self->ob_item + (cur-slicelength) * itemsize,
1817 self->ob_item + cur * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001818 (Py_SIZE(self) - cur) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001819 }
Christian Heimese93237d2007-12-19 02:37:44 +00001820 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Wouters3ccec682007-08-28 15:28:19 +00001821 return -1;
1822 return 0;
1823 }
1824 else {
1825 Py_ssize_t cur, i;
1826
1827 if (needed != slicelength) {
1828 PyErr_Format(PyExc_ValueError,
1829 "attempt to assign array of size %zd "
1830 "to extended slice of size %zd",
1831 needed, slicelength);
1832 return -1;
1833 }
1834 for (cur = start, i = 0; i < slicelength;
1835 cur += step, i++) {
1836 memcpy(self->ob_item + cur * itemsize,
1837 other->ob_item + i * itemsize,
1838 itemsize);
1839 }
1840 return 0;
1841 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001842}
1843
1844static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001845 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001846 (binaryfunc)array_subscr,
1847 (objobjargproc)array_ass_subscr
1848};
1849
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001850static const void *emptybuf = "";
1851
Martin v. Löwis18e16552006-02-15 17:27:45 +00001852static Py_ssize_t
1853array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001854{
1855 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001856 PyErr_SetString(PyExc_SystemError,
1857 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001858 return -1;
1859 }
1860 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001861 if (*ptr == NULL)
1862 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001863 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001864}
1865
Martin v. Löwis18e16552006-02-15 17:27:45 +00001866static Py_ssize_t
1867array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001868{
1869 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001870 PyErr_SetString(PyExc_SystemError,
1871 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001872 return -1;
1873 }
1874 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001875 if (*ptr == NULL)
1876 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001877 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001878}
1879
Martin v. Löwis18e16552006-02-15 17:27:45 +00001880static Py_ssize_t
1881array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001882{
1883 if ( lenp )
Christian Heimese93237d2007-12-19 02:37:44 +00001884 *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001885 return 1;
1886}
1887
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001888static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001889 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001890 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001891 (ssizeargfunc)array_repeat, /*sq_repeat*/
1892 (ssizeargfunc)array_item, /*sq_item*/
1893 (ssizessizeargfunc)array_slice, /*sq_slice*/
1894 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1895 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001896 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001897 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001898 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001899};
1900
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001901static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001902 (readbufferproc)array_buffer_getreadbuf,
1903 (writebufferproc)array_buffer_getwritebuf,
1904 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001905 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001906};
1907
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001908static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001909array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001910{
1911 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001912 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001913 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001914
Georg Brandlb84c1372007-01-21 10:28:43 +00001915 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001916 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001917
1918 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1919 return NULL;
1920
1921 if (!(initial == NULL || PyList_Check(initial)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001922 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001923 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001924 it = PyObject_GetIter(initial);
1925 if (it == NULL)
1926 return NULL;
1927 /* We set initial to NULL so that the subsequent code
1928 will create an empty array of the appropriate type
1929 and afterwards we can use array_iter_extend to populate
1930 the array.
1931 */
1932 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001933 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001934 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1935 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001936 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001937 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001938
1939 if (initial == NULL || !(PyList_Check(initial)
1940 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001941 len = 0;
1942 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001943 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001944
1945 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001946 if (a == NULL)
1947 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001948
Guido van Rossum778983b1993-02-19 15:55:02 +00001949 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001950 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001951 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001952 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001953 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001954 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001955 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001956 return NULL;
1957 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001958 if (setarrayitem(a, i, v) != 0) {
1959 Py_DECREF(v);
1960 Py_DECREF(a);
1961 return NULL;
1962 }
1963 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001964 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001965 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001966 PyObject *t_initial, *v;
1967 t_initial = PyTuple_Pack(1, initial);
1968 if (t_initial == NULL) {
1969 Py_DECREF(a);
1970 return NULL;
1971 }
1972 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001973 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001974 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001975 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001976 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001977 return NULL;
1978 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001979 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001980#ifdef Py_USING_UNICODE
1981 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001982 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001983 if (n > 0) {
1984 arrayobject *self = (arrayobject *)a;
1985 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001986 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001987 if (item == NULL) {
1988 PyErr_NoMemory();
1989 Py_DECREF(a);
1990 return NULL;
1991 }
1992 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001993 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001994 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimese93237d2007-12-19 02:37:44 +00001995 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001996 }
1997#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001998 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001999 if (it != NULL) {
2000 if (array_iter_extend((arrayobject *)a, it) == -1) {
2001 Py_DECREF(it);
2002 Py_DECREF(a);
2003 return NULL;
2004 }
2005 Py_DECREF(it);
2006 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002007 return a;
2008 }
2009 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002010 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00002011 "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 +00002012 return NULL;
2013}
2014
Guido van Rossum778983b1993-02-19 15:55:02 +00002015
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002016PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002017"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002018an array of basic values: characters, integers, floating point\n\
2019numbers. Arrays are sequence types and behave very much like lists,\n\
2020except that the type of objects stored in them is constrained. The\n\
2021type is specified at object creation time by using a type code, which\n\
2022is a single character. The following type codes are defined:\n\
2023\n\
2024 Type code C Type Minimum size in bytes \n\
2025 'c' character 1 \n\
2026 'b' signed integer 1 \n\
2027 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002028 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002029 'h' signed integer 2 \n\
2030 'H' unsigned integer 2 \n\
2031 'i' signed integer 2 \n\
2032 'I' unsigned integer 2 \n\
2033 'l' signed integer 4 \n\
2034 'L' unsigned integer 4 \n\
2035 'f' floating point 4 \n\
2036 'd' floating point 8 \n\
2037\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002038The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002039\n\
2040array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002041");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002043PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002044"array(typecode [, initializer]) -> array\n\
2045\n\
2046Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002047initialized from the optional initializer value, which must be a list,\n\
2048string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002049\n\
2050Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002051the type of objects stored in them is constrained.\n\
2052\n\
2053Methods:\n\
2054\n\
2055append() -- append a new item to the end of the array\n\
2056buffer_info() -- return information giving the current memory info\n\
2057byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002058count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002059extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002060fromfile() -- read items from a file object\n\
2061fromlist() -- append items from the list\n\
2062fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002063index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002064insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002065pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002066read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002067remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002068reverse() -- reverse the order of the items in the array\n\
2069tofile() -- write all items to a file object\n\
2070tolist() -- return the array converted to an ordinary list\n\
2071tostring() -- return the array converted to a string\n\
2072write() -- DEPRECATED, use tofile()\n\
2073\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002074Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002075\n\
2076typecode -- the typecode character used to create the array\n\
2077itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002078");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002079
Raymond Hettinger625812f2003-01-07 01:58:52 +00002080static PyObject *array_iter(arrayobject *ao);
2081
Tim Peters0c322792002-07-17 16:49:03 +00002082static PyTypeObject Arraytype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002083 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002084 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002085 sizeof(arrayobject),
2086 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002087 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002088 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002089 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002090 0, /* tp_setattr */
2091 0, /* tp_compare */
2092 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002093 0, /* tp_as_number*/
2094 &array_as_sequence, /* tp_as_sequence*/
2095 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002096 0, /* tp_hash */
2097 0, /* tp_call */
2098 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002099 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002100 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002101 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002102 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002103 arraytype_doc, /* tp_doc */
2104 0, /* tp_traverse */
2105 0, /* tp_clear */
2106 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002107 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002108 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002109 0, /* tp_iternext */
2110 array_methods, /* tp_methods */
2111 0, /* tp_members */
2112 array_getsets, /* tp_getset */
2113 0, /* tp_base */
2114 0, /* tp_dict */
2115 0, /* tp_descr_get */
2116 0, /* tp_descr_set */
2117 0, /* tp_dictoffset */
2118 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002119 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002120 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002121 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002122};
2123
Raymond Hettinger625812f2003-01-07 01:58:52 +00002124
2125/*********************** Array Iterator **************************/
2126
2127typedef struct {
2128 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002129 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002130 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002131 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002132} arrayiterobject;
2133
2134static PyTypeObject PyArrayIter_Type;
2135
2136#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2137
2138static PyObject *
2139array_iter(arrayobject *ao)
2140{
2141 arrayiterobject *it;
2142
2143 if (!array_Check(ao)) {
2144 PyErr_BadInternalCall();
2145 return NULL;
2146 }
2147
2148 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2149 if (it == NULL)
2150 return NULL;
2151
2152 Py_INCREF(ao);
2153 it->ao = ao;
2154 it->index = 0;
2155 it->getitem = ao->ob_descr->getitem;
2156 PyObject_GC_Track(it);
2157 return (PyObject *)it;
2158}
2159
2160static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002161arrayiter_next(arrayiterobject *it)
2162{
2163 assert(PyArrayIter_Check(it));
Christian Heimese93237d2007-12-19 02:37:44 +00002164 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002165 return (*it->getitem)(it->ao, it->index++);
2166 return NULL;
2167}
2168
2169static void
2170arrayiter_dealloc(arrayiterobject *it)
2171{
2172 PyObject_GC_UnTrack(it);
2173 Py_XDECREF(it->ao);
2174 PyObject_GC_Del(it);
2175}
2176
2177static int
2178arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2179{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002180 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002181 return 0;
2182}
2183
2184static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002185 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002186 "arrayiterator", /* tp_name */
2187 sizeof(arrayiterobject), /* tp_basicsize */
2188 0, /* tp_itemsize */
2189 /* methods */
2190 (destructor)arrayiter_dealloc, /* tp_dealloc */
2191 0, /* tp_print */
2192 0, /* tp_getattr */
2193 0, /* tp_setattr */
2194 0, /* tp_compare */
2195 0, /* tp_repr */
2196 0, /* tp_as_number */
2197 0, /* tp_as_sequence */
2198 0, /* tp_as_mapping */
2199 0, /* tp_hash */
2200 0, /* tp_call */
2201 0, /* tp_str */
2202 PyObject_GenericGetAttr, /* tp_getattro */
2203 0, /* tp_setattro */
2204 0, /* tp_as_buffer */
2205 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2206 0, /* tp_doc */
2207 (traverseproc)arrayiter_traverse, /* tp_traverse */
2208 0, /* tp_clear */
2209 0, /* tp_richcompare */
2210 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002211 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002212 (iternextfunc)arrayiter_next, /* tp_iternext */
2213 0, /* tp_methods */
2214};
2215
2216
2217/*********************** Install Module **************************/
2218
Martin v. Löwis99866332002-03-01 10:27:01 +00002219/* No functions in array module. */
2220static PyMethodDef a_methods[] = {
2221 {NULL, NULL, 0, NULL} /* Sentinel */
2222};
2223
2224
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002225PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002226initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002227{
Fred Drakef4e34842002-04-01 03:45:06 +00002228 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002229
Martin v. Löwis99866332002-03-01 10:27:01 +00002230 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002231 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002232 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002233 if (m == NULL)
2234 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002235
2236 Py_INCREF((PyObject *)&Arraytype);
2237 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2238 Py_INCREF((PyObject *)&Arraytype);
2239 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002240 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002241}