blob: c505dadfc1399e99701c1cc90c0d1fb0c0b6f736 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000032 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000033 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000034 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000035 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000036 PyObject *weakreflist; /* List of weak references */
Guido van Rossum778983b1993-02-19 15:55:02 +000037} arrayobject;
38
Jeremy Hylton938ace62002-07-17 16:30:39 +000039static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000040
Martin v. Löwis99866332002-03-01 10:27:01 +000041#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimese93237d2007-12-19 02:37:44 +000042#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000043
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000044static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000045array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046{
47 char *items;
48 size_t _new_size;
49
50 /* Bypass realloc() when a previous overallocation is large enough
51 to accommodate the newsize. If the newsize is 16 smaller than the
52 current size, then proceed with the realloc() to shrink the list.
53 */
54
55 if (self->allocated >= newsize &&
Christian Heimese93237d2007-12-19 02:37:44 +000056 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000057 self->ob_item != NULL) {
Christian Heimese93237d2007-12-19 02:37:44 +000058 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000059 return 0;
60 }
61
62 /* This over-allocates proportional to the array size, making room
63 * for additional growth. The over-allocation is mild, but is
64 * enough to give linear-time amortized behavior over a long
65 * sequence of appends() in the presence of a poorly-performing
66 * system realloc().
67 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
68 * Note, the pattern starts out the same as for lists but then
69 * grows at a smaller rate so that larger arrays only overallocate
70 * by about 1/16th -- this is done because arrays are presumed to be more
71 * memory critical.
72 */
73
Christian Heimese93237d2007-12-19 02:37:44 +000074 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000075 items = self->ob_item;
76 /* XXX The following multiplication and division does not optimize away
77 like it does for lists since the size is not known at compile time */
78 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
79 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
80 else
81 items = NULL;
82 if (items == NULL) {
83 PyErr_NoMemory();
84 return -1;
85 }
86 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +000087 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000088 self->allocated = _new_size;
89 return 0;
90}
91
Tim Petersbb307342000-09-10 05:22:54 +000092/****************************************************************************
93Get and Set functions for each type.
94A Get function takes an arrayobject* and an integer index, returning the
95array value at that index wrapped in an appropriate PyObject*.
96A Set function takes an arrayobject, integer index, and PyObject*; sets
97the array value at that index to the raw C data extracted from the PyObject*,
98and returns 0 if successful, else nonzero on failure (PyObject* not of an
99appropriate type or value).
100Note that the basic Get and Set functions do NOT check that the index is
101in bounds; that's the responsibility of the caller.
102****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000103
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000104static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000105c_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000106{
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000107 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000108}
109
110static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000112{
113 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000114 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000115 return -1;
116 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000117 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000118 return 0;
119}
120
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000121static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
124 long x = ((char *)ap->ob_item)[i];
125 if (x >= 128)
126 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000127 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000128}
129
130static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000131b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000132{
Fred Drake541dc3b2000-06-28 17:49:30 +0000133 short x;
134 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
135 must use the next size up that is signed ('h') and manually do
136 the overflow checking */
137 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000138 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000139 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000140 PyErr_SetString(PyExc_OverflowError,
141 "signed char is less than minimum");
142 return -1;
143 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000144 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000145 PyErr_SetString(PyExc_OverflowError,
146 "signed char is greater than maximum");
147 return -1;
148 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000149 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000150 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000151 return 0;
152}
153
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000154static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000155BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000156{
157 long x = ((unsigned char *)ap->ob_item)[i];
158 return PyInt_FromLong(x);
159}
160
Fred Drake541dc3b2000-06-28 17:49:30 +0000161static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000163{
164 unsigned char x;
165 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
166 if (!PyArg_Parse(v, "b;array item must be integer", &x))
167 return -1;
168 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000169 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000170 return 0;
171}
Guido van Rossum549ab711997-01-03 19:09:47 +0000172
Martin v. Löwis99866332002-03-01 10:27:01 +0000173#ifdef Py_USING_UNICODE
174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
183 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
Neal Norwitz92a6be42006-04-03 04:46:28 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
196}
197#endif
198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000202 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
205static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000206h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000207{
208 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000209 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000210 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000211 return -1;
212 if (i >= 0)
213 ((short *)ap->ob_item)[i] = x;
214 return 0;
215}
216
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000218HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000219{
220 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
221}
222
Fred Drake541dc3b2000-06-28 17:49:30 +0000223static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000225{
226 int x;
227 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
228 must use the next size up and manually do the overflow checking */
229 if (!PyArg_Parse(v, "i;array item must be integer", &x))
230 return -1;
231 else if (x < 0) {
232 PyErr_SetString(PyExc_OverflowError,
233 "unsigned short is less than minimum");
234 return -1;
235 }
236 else if (x > USHRT_MAX) {
237 PyErr_SetString(PyExc_OverflowError,
238 "unsigned short is greater than maximum");
239 return -1;
240 }
241 if (i >= 0)
242 ((short *)ap->ob_item)[i] = (short)x;
243 return 0;
244}
Guido van Rossum549ab711997-01-03 19:09:47 +0000245
246static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000247i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000248{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000249 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000250}
251
252static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000254{
255 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000256 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000257 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000258 return -1;
259 if (i >= 0)
260 ((int *)ap->ob_item)[i] = x;
261 return 0;
262}
263
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000264static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000266{
267 return PyLong_FromUnsignedLong(
268 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
269}
270
271static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000273{
274 unsigned long x;
275 if (PyLong_Check(v)) {
276 x = PyLong_AsUnsignedLong(v);
277 if (x == (unsigned long) -1 && PyErr_Occurred())
278 return -1;
279 }
280 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000281 long y;
282 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000284 if (y < 0) {
285 PyErr_SetString(PyExc_OverflowError,
286 "unsigned int is less than minimum");
287 return -1;
288 }
289 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000290
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000292 if (x > UINT_MAX) {
293 PyErr_SetString(PyExc_OverflowError,
294 "unsigned int is greater than maximum");
295 return -1;
296 }
297
Guido van Rossum549ab711997-01-03 19:09:47 +0000298 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000299 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000300 return 0;
301}
302
303static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000305{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000307}
308
309static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000311{
312 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000313 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000314 return -1;
315 if (i >= 0)
316 ((long *)ap->ob_item)[i] = x;
317 return 0;
318}
319
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000320static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000322{
323 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
324}
325
326static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000328{
329 unsigned long x;
330 if (PyLong_Check(v)) {
331 x = PyLong_AsUnsignedLong(v);
332 if (x == (unsigned long) -1 && PyErr_Occurred())
333 return -1;
334 }
335 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000336 long y;
337 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000338 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000339 if (y < 0) {
340 PyErr_SetString(PyExc_OverflowError,
341 "unsigned long is less than minimum");
342 return -1;
343 }
344 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000345
Guido van Rossum549ab711997-01-03 19:09:47 +0000346 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000347 if (x > ULONG_MAX) {
348 PyErr_SetString(PyExc_OverflowError,
349 "unsigned long is greater than maximum");
350 return -1;
351 }
Tim Petersbb307342000-09-10 05:22:54 +0000352
Guido van Rossum549ab711997-01-03 19:09:47 +0000353 if (i >= 0)
354 ((unsigned long *)ap->ob_item)[i] = x;
355 return 0;
356}
357
358static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000359f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000360{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000361 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000362}
363
364static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000365f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000366{
367 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000368 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 return -1;
370 if (i >= 0)
371 ((float *)ap->ob_item)[i] = x;
372 return 0;
373}
374
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000378 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000379}
380
381static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000383{
384 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 return -1;
387 if (i >= 0)
388 ((double *)ap->ob_item)[i] = x;
389 return 0;
390}
391
392/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000393static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 {'c', sizeof(char), c_getitem, c_setitem},
395 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000396 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000397#ifdef Py_USING_UNICODE
398 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
399#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000402 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000403 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000405 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 {'f', sizeof(float), f_getitem, f_setitem},
407 {'d', sizeof(double), d_getitem, d_setitem},
408 {'\0', 0, 0, 0} /* Sentinel */
409};
Tim Petersbb307342000-09-10 05:22:54 +0000410
411/****************************************************************************
412Implementations of array object methods.
413****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000414
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000415static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000416newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000417{
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000420
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000422 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 return NULL;
424 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000425
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 nbytes = size * descr->itemsize;
427 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000428 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000431 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000433 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 }
Christian Heimese93237d2007-12-19 02:37:44 +0000435 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 if (size <= 0) {
437 op->ob_item = NULL;
438 }
439 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000440 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000441 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000442 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 }
445 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000446 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000447 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000448 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
455 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000456 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 ap = (arrayobject *)op;
Christian Heimese93237d2007-12-19 02:37:44 +0000458 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return (*ap->ob_descr->getitem)(ap, i);
460}
461
462static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 char *items;
Christian Heimese93237d2007-12-19 02:37:44 +0000466 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000473
474 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000479 if (where < 0)
480 where = 0;
481 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 if (where > n)
483 where = n;
484 /* appends don't need to call memmove() */
485 if (where != n)
486 memmove(items + (where+1)*self->ob_descr->itemsize,
487 items + where*self->ob_descr->itemsize,
488 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossum778983b1993-02-19 15:55:02 +0000492/* Methods */
493
494static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000495array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000497 if (op->weakreflist != NULL)
498 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000499 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyMem_DEL(op->ob_item);
Christian Heimese93237d2007-12-19 02:37:44 +0000501 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000502}
503
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504static PyObject *
505array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000506{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 arrayobject *va, *wa;
508 PyObject *vi = NULL;
509 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 PyObject *res;
512
Martin v. Löwis99866332002-03-01 10:27:01 +0000513 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000514 Py_INCREF(Py_NotImplemented);
515 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000517
518 va = (arrayobject *)v;
519 wa = (arrayobject *)w;
520
Christian Heimese93237d2007-12-19 02:37:44 +0000521 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000522 /* Shortcut: if the lengths differ, the arrays differ */
523 if (op == Py_EQ)
524 res = Py_False;
525 else
526 res = Py_True;
527 Py_INCREF(res);
528 return res;
529 }
530
531 /* Search for the first index where items are different */
532 k = 1;
Christian Heimese93237d2007-12-19 02:37:44 +0000533 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000534 vi = getarrayitem(v, i);
535 wi = getarrayitem(w, i);
536 if (vi == NULL || wi == NULL) {
537 Py_XDECREF(vi);
538 Py_XDECREF(wi);
539 return NULL;
540 }
541 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542 if (k == 0)
543 break; /* Keeping vi and wi alive! */
544 Py_DECREF(vi);
545 Py_DECREF(wi);
546 if (k < 0)
547 return NULL;
548 }
549
550 if (k) {
551 /* No more items to compare -- compare sizes */
Christian Heimese93237d2007-12-19 02:37:44 +0000552 Py_ssize_t vs = Py_SIZE(va);
553 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 int cmp;
555 switch (op) {
556 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000557 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 case Py_EQ: cmp = vs == ws; break;
559 case Py_NE: cmp = vs != ws; break;
560 case Py_GT: cmp = vs > ws; break;
561 case Py_GE: cmp = vs >= ws; break;
562 default: return NULL; /* cannot happen */
563 }
564 if (cmp)
565 res = Py_True;
566 else
567 res = Py_False;
568 Py_INCREF(res);
569 return res;
570 }
571
572 /* We have an item that differs. First, shortcuts for EQ/NE */
573 if (op == Py_EQ) {
574 Py_INCREF(Py_False);
575 res = Py_False;
576 }
577 else if (op == Py_NE) {
578 Py_INCREF(Py_True);
579 res = Py_True;
580 }
581 else {
582 /* Compare the final item again using the proper operator */
583 res = PyObject_RichCompare(vi, wi, op);
584 }
585 Py_DECREF(vi);
586 Py_DECREF(wi);
587 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
Martin v. Löwis18e16552006-02-15 17:27:45 +0000590static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
Christian Heimese93237d2007-12-19 02:37:44 +0000593 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
Christian Heimese93237d2007-12-19 02:37:44 +0000599 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return NULL;
602 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604}
605
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000606static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000607array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000608{
609 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 if (ilow < 0)
611 ilow = 0;
Christian Heimese93237d2007-12-19 02:37:44 +0000612 else if (ilow > Py_SIZE(a))
613 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 if (ihigh < 0)
615 ihigh = 0;
616 if (ihigh < ilow)
617 ihigh = ilow;
Christian Heimese93237d2007-12-19 02:37:44 +0000618 else if (ihigh > Py_SIZE(a))
619 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000620 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 if (np == NULL)
622 return NULL;
623 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000629array_copy(arrayobject *a, PyObject *unused)
630{
Christian Heimese93237d2007-12-19 02:37:44 +0000631 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000632}
633
634PyDoc_STRVAR(copy_doc,
635"copy(array)\n\
636\n\
637 Return a copy of the array.");
638
639static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000640array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000641{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000644 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000645 PyErr_Format(PyExc_TypeError,
646 "can only append array (not \"%.200s\") to array",
Christian Heimese93237d2007-12-19 02:37:44 +0000647 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return NULL;
649 }
650#define b ((arrayobject *)bb)
651 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return NULL;
654 }
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;
Martin v. Löwis99866332002-03-01 10:27:01 +0000818
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000819 if (!array_Check(bb))
820 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000821#define b ((arrayobject *)bb)
822 if (self->ob_descr != b->ob_descr) {
823 PyErr_SetString(PyExc_TypeError,
824 "can only extend with array of same kind");
825 return -1;
826 }
Gregory P. Smith9d534572008-06-11 07:41:16 +0000827 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
828 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
829 PyErr_NoMemory();
830 return -1;
831 }
Christian Heimese93237d2007-12-19 02:37:44 +0000832 size = Py_SIZE(self) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000833 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
834 if (self->ob_item == NULL) {
835 PyObject_Del(self);
836 PyErr_NoMemory();
837 return -1;
838 }
Christian Heimese93237d2007-12-19 02:37:44 +0000839 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
840 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
841 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000842 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000843
844 return 0;
845#undef b
846}
847
848static PyObject *
849array_inplace_concat(arrayobject *self, PyObject *bb)
850{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000851 if (!array_Check(bb)) {
852 PyErr_Format(PyExc_TypeError,
853 "can only extend array with array (not \"%.200s\")",
Christian Heimese93237d2007-12-19 02:37:44 +0000854 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000855 return NULL;
856 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000857 if (array_do_extend(self, bb) == -1)
858 return NULL;
859 Py_INCREF(self);
860 return (PyObject *)self;
861}
862
863static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000864array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000865{
866 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000867 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000868
Christian Heimese93237d2007-12-19 02:37:44 +0000869 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000870 if (n < 0)
871 n = 0;
872 items = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +0000873 if ((self->ob_descr->itemsize != 0) &&
874 (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
875 return PyErr_NoMemory();
876 }
Christian Heimese93237d2007-12-19 02:37:44 +0000877 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000878 if (n == 0) {
879 PyMem_FREE(items);
880 self->ob_item = NULL;
Christian Heimese93237d2007-12-19 02:37:44 +0000881 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000882 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000883 }
884 else {
Gregory P. Smith9d534572008-06-11 07:41:16 +0000885 if (size > PY_SSIZE_T_MAX / n) {
886 return PyErr_NoMemory();
887 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000888 PyMem_Resize(items, char, n * size);
889 if (items == NULL)
890 return PyErr_NoMemory();
891 p = items;
892 for (i = 1; i < n; i++) {
893 p += size;
894 memcpy(p, items, size);
895 }
896 self->ob_item = items;
Christian Heimese93237d2007-12-19 02:37:44 +0000897 Py_SIZE(self) *= n;
898 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000899 }
900 }
901 Py_INCREF(self);
902 return (PyObject *)self;
903}
904
905
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000906static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000908{
909 if (ins1(self, where, v) != 0)
910 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000911 Py_INCREF(Py_None);
912 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000913}
914
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000915static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000916array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000917{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000918 Py_ssize_t count = 0;
919 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920
Christian Heimese93237d2007-12-19 02:37:44 +0000921 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000923 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000925 if (cmp > 0)
926 count++;
927 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000928 return NULL;
929 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000930 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931}
932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000933PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000934"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000935\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000937
938static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000939array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000940{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000941 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000942
Christian Heimese93237d2007-12-19 02:37:44 +0000943 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000944 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000945 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
946 Py_DECREF(selfi);
947 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000948 return PyInt_FromLong((long)i);
949 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000950 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000951 return NULL;
952 }
953 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
954 return NULL;
955}
956
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000957PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000958"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000960Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961
Raymond Hettinger625812f2003-01-07 01:58:52 +0000962static int
963array_contains(arrayobject *self, PyObject *v)
964{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000965 Py_ssize_t i;
966 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000967
Christian Heimese93237d2007-12-19 02:37:44 +0000968 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000969 PyObject *selfi = getarrayitem((PyObject *)self, i);
970 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
971 Py_DECREF(selfi);
972 }
973 return cmp;
974}
975
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000976static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000977array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000978{
979 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980
Christian Heimese93237d2007-12-19 02:37:44 +0000981 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000983 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
984 Py_DECREF(selfi);
985 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000986 if (array_ass_slice(self, i, i+1,
987 (PyObject *)NULL) != 0)
988 return NULL;
989 Py_INCREF(Py_None);
990 return Py_None;
991 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000992 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000993 return NULL;
994 }
995 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
996 return NULL;
997}
998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000999PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001000"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001001\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001002Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001003
1004static PyObject *
1005array_pop(arrayobject *self, PyObject *args)
1006{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001007 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001008 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001009 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001011 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012 /* Special-case most common failure cause */
1013 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1014 return NULL;
1015 }
1016 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001017 i += Py_SIZE(self);
1018 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1020 return NULL;
1021 }
1022 v = getarrayitem((PyObject *)self,i);
1023 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1024 Py_DECREF(v);
1025 return NULL;
1026 }
1027 return v;
1028}
1029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001030PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001031"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001033Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001034
1035static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001036array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001037{
Martin v. Löwis99866332002-03-01 10:27:01 +00001038 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001039 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001040 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001041 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001042}
1043
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001044PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001045"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001046\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001047 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001048
1049static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001050array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001051{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001052 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001054 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001055 return NULL;
1056 return ins(self, i, v);
1057}
1058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001059PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001060"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001061\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001062Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001063
1064
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001065static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001066array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001067{
Tim Peters077a11d2000-09-16 22:31:29 +00001068 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001069 retval = PyTuple_New(2);
1070 if (!retval)
1071 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001072
1073 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimese93237d2007-12-19 02:37:44 +00001074 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001075
1076 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001077}
1078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001079PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001080"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001081\n\
1082Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001083the length in items of the buffer used to hold array's contents\n\
1084The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001085the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001086
1087
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001088static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001089array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001090{
Christian Heimese93237d2007-12-19 02:37:44 +00001091 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001092}
1093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001094PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001095"append(x)\n\
1096\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001097Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001098
1099
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001100static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001101array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001102{
1103 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001104 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001105
Guido van Rossum778983b1993-02-19 15:55:02 +00001106 switch (self->ob_descr->itemsize) {
1107 case 1:
1108 break;
1109 case 2:
Christian Heimese93237d2007-12-19 02:37:44 +00001110 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001111 char p0 = p[0];
1112 p[0] = p[1];
1113 p[1] = p0;
1114 }
1115 break;
1116 case 4:
Christian Heimese93237d2007-12-19 02:37:44 +00001117 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001118 char p0 = p[0];
1119 char p1 = p[1];
1120 p[0] = p[3];
1121 p[1] = p[2];
1122 p[2] = p1;
1123 p[3] = p0;
1124 }
1125 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001126 case 8:
Christian Heimese93237d2007-12-19 02:37:44 +00001127 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001128 char p0 = p[0];
1129 char p1 = p[1];
1130 char p2 = p[2];
1131 char p3 = p[3];
1132 p[0] = p[7];
1133 p[1] = p[6];
1134 p[2] = p[5];
1135 p[3] = p[4];
1136 p[4] = p3;
1137 p[5] = p2;
1138 p[6] = p1;
1139 p[7] = p0;
1140 }
1141 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001142 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001143 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001144 "don't know how to byteswap this array type");
1145 return NULL;
1146 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001147 Py_INCREF(Py_None);
1148 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001149}
1150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001151PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001152"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001153\n\
Fred Drakebf272981999-12-03 17:15:30 +00001154Byteswap 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 +000011554, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001156
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001158array_reduce(arrayobject *array)
1159{
1160 PyObject *dict, *result;
1161
1162 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1163 if (dict == NULL) {
1164 PyErr_Clear();
1165 dict = Py_None;
1166 Py_INCREF(dict);
1167 }
Christian Heimese93237d2007-12-19 02:37:44 +00001168 if (Py_SIZE(array) > 0) {
Gregory P. Smith9d534572008-06-11 07:41:16 +00001169 if (array->ob_descr->itemsize
1170 > PY_SSIZE_T_MAX / array->ob_size) {
1171 return PyErr_NoMemory();
1172 }
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001173 result = Py_BuildValue("O(cs#)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001174 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001175 array->ob_descr->typecode,
1176 array->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001177 Py_SIZE(array) * array->ob_descr->itemsize,
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001178 dict);
1179 } else {
1180 result = Py_BuildValue("O(c)O",
Christian Heimese93237d2007-12-19 02:37:44 +00001181 Py_TYPE(array),
Raymond Hettingere6e660b2007-04-02 17:29:30 +00001182 array->ob_descr->typecode,
1183 dict);
1184 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001185 Py_DECREF(dict);
1186 return result;
1187}
1188
1189PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1190
1191static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001192array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001193{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001194 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001195 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001196 /* little buffer to hold items while swapping */
1197 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001198 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001199
Christian Heimese93237d2007-12-19 02:37:44 +00001200 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001201 for (p = self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001202 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001203 p < q;
1204 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001205 /* memory areas guaranteed disjoint, so memcpy
1206 * is safe (& memmove may be slower).
1207 */
1208 memcpy(tmp, p, itemsize);
1209 memcpy(p, q, itemsize);
1210 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001211 }
1212 }
Tim Petersbb307342000-09-10 05:22:54 +00001213
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001214 Py_INCREF(Py_None);
1215 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001216}
Guido van Rossume77a7571993-11-03 15:01:26 +00001217
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001218PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001219"reverse()\n\
1220\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001221Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001222
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001223static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001224array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001225{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001227 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001228 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001229 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001233 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001234 return NULL;
1235 }
1236 if (n > 0) {
1237 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001238 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001239 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001240 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001241 size_t newbytes;
1242 /* Be careful here about overflow */
Christian Heimese93237d2007-12-19 02:37:44 +00001243 if ((newlength = Py_SIZE(self) + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001244 (newbytes = newlength * itemsize) / itemsize !=
1245 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001246 goto nomem;
1247 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001248 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001249 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 return NULL;
1252 }
1253 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001254 Py_SIZE(self) += n;
1255 self->allocated = Py_SIZE(self);
1256 nread = fread(item + (Py_SIZE(self) - n) * itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001257 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001258 if (nread < (size_t)n) {
Christian Heimese93237d2007-12-19 02:37:44 +00001259 Py_SIZE(self) -= (n - nread);
1260 PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001261 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001262 self->allocated = Py_SIZE(self);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001263 PyErr_SetString(PyExc_EOFError,
1264 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 return NULL;
1266 }
1267 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268 Py_INCREF(Py_None);
1269 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001270}
1271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001272PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001273"fromfile(f, n)\n\
1274\n\
1275Read 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 +00001276array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001277
1278
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001279static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001280array_fromfile_as_read(arrayobject *self, PyObject *args)
1281{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001282 if (PyErr_WarnPy3k("array.read() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001283 "use array.fromfile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001284 return NULL;
1285 return array_fromfile(self, args);
1286}
1287
1288
1289static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001290array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001291{
Guido van Rossum778983b1993-02-19 15:55:02 +00001292 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001293
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001294 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001295 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001296 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 return NULL;
1298 }
1299 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001300 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1301 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001302 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001303 clearerr(fp);
1304 return NULL;
1305 }
1306 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001307 Py_INCREF(Py_None);
1308 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001309}
1310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001311PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001312"tofile(f)\n\
1313\n\
1314Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001315write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001316
1317
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001318static PyObject *
Georg Brandl1e7c3752008-03-25 08:37:23 +00001319array_tofile_as_write(arrayobject *self, PyObject *f)
1320{
Benjamin Peterson9f4f4812008-04-27 03:01:45 +00001321 if (PyErr_WarnPy3k("array.write() not supported in 3.x; "
Benjamin Petersonf19a7b92008-04-27 18:40:21 +00001322 "use array.tofile()", 1) < 0)
Georg Brandl1e7c3752008-03-25 08:37:23 +00001323 return NULL;
1324 return array_tofile(self, f);
1325}
1326
1327
1328static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001329array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001330{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001331 Py_ssize_t n;
1332 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001333
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001334 if (!PyList_Check(list)) {
1335 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001336 return NULL;
1337 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001339 if (n > 0) {
1340 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001341 Py_ssize_t i;
Christian Heimese93237d2007-12-19 02:37:44 +00001342 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001344 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001345 return NULL;
1346 }
1347 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001348 Py_SIZE(self) += n;
1349 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001351 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001352 if ((*self->ob_descr->setitem)(self,
Christian Heimese93237d2007-12-19 02:37:44 +00001353 Py_SIZE(self) - n + i, v) != 0) {
1354 Py_SIZE(self) -= n;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001355 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1356 return PyErr_NoMemory();
1357 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001358 PyMem_RESIZE(item, char,
Christian Heimese93237d2007-12-19 02:37:44 +00001359 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001360 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001361 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001362 return NULL;
1363 }
1364 }
1365 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001366 Py_INCREF(Py_None);
1367 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001368}
1369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001370PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001371"fromlist(list)\n\
1372\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001373Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001374
1375
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001376static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001377array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001378{
Christian Heimese93237d2007-12-19 02:37:44 +00001379 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001380 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001381
Guido van Rossum778983b1993-02-19 15:55:02 +00001382 if (list == NULL)
1383 return NULL;
Christian Heimese93237d2007-12-19 02:37:44 +00001384 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001385 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001387 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 return NULL;
1389 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001390 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001391 }
1392 return list;
1393}
1394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001396"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001397\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001398Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001399
1400
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001401static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001402array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001403{
1404 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001405 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001407 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001408 return NULL;
1409 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001410 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001411 "string length not a multiple of item size");
1412 return NULL;
1413 }
1414 n = n / itemsize;
1415 if (n > 0) {
1416 char *item = self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001417 if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||
1418 ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {
1419 return PyErr_NoMemory();
1420 }
Christian Heimese93237d2007-12-19 02:37:44 +00001421 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001422 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001423 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001424 return NULL;
1425 }
1426 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001427 Py_SIZE(self) += n;
1428 self->allocated = Py_SIZE(self);
1429 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001430 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001431 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001432 Py_INCREF(Py_None);
1433 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001434}
1435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001436PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001437"fromstring(string)\n\
1438\n\
1439Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001440values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001441
1442
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001443static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001444array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001445{
Gregory P. Smith9d534572008-06-11 07:41:16 +00001446 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1447 return PyString_FromStringAndSize(self->ob_item,
Christian Heimese93237d2007-12-19 02:37:44 +00001448 Py_SIZE(self) * self->ob_descr->itemsize);
Gregory P. Smith9d534572008-06-11 07:41:16 +00001449 } else {
1450 return PyErr_NoMemory();
1451 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001452}
1453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001454PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001455"tostring() -> string\n\
1456\n\
1457Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001458representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001459
Martin v. Löwis99866332002-03-01 10:27:01 +00001460
1461
1462#ifdef Py_USING_UNICODE
1463static PyObject *
1464array_fromunicode(arrayobject *self, PyObject *args)
1465{
1466 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001467 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001468
1469 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1470 return NULL;
1471 if (self->ob_descr->typecode != 'u') {
1472 PyErr_SetString(PyExc_ValueError,
1473 "fromunicode() may only be called on "
1474 "type 'u' arrays");
1475 return NULL;
1476 }
1477 if (n > 0) {
1478 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Gregory P. Smith9d534572008-06-11 07:41:16 +00001479 if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {
1480 return PyErr_NoMemory();
1481 }
Christian Heimese93237d2007-12-19 02:37:44 +00001482 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001483 if (item == NULL) {
1484 PyErr_NoMemory();
1485 return NULL;
1486 }
1487 self->ob_item = (char *) item;
Christian Heimese93237d2007-12-19 02:37:44 +00001488 Py_SIZE(self) += n;
1489 self->allocated = Py_SIZE(self);
1490 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001491 ustr, n * sizeof(Py_UNICODE));
1492 }
1493
1494 Py_INCREF(Py_None);
1495 return Py_None;
1496}
1497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001498PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001499"fromunicode(ustr)\n\
1500\n\
1501Extends this array with data from the unicode string ustr.\n\
1502The array must be a type 'u' array; otherwise a ValueError\n\
1503is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001504append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001505
1506
1507static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001508array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001509{
Martin v. Löwis99866332002-03-01 10:27:01 +00001510 if (self->ob_descr->typecode != 'u') {
1511 PyErr_SetString(PyExc_ValueError,
1512 "tounicode() may only be called on type 'u' arrays");
1513 return NULL;
1514 }
Christian Heimese93237d2007-12-19 02:37:44 +00001515 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001516}
1517
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001518PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001519"tounicode() -> unicode\n\
1520\n\
1521Convert the array to a unicode string. The array must be\n\
1522a type 'u' array; otherwise a ValueError is raised. Use\n\
1523array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001524an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001525
1526#endif /* Py_USING_UNICODE */
1527
1528
1529static PyObject *
1530array_get_typecode(arrayobject *a, void *closure)
1531{
1532 char tc = a->ob_descr->typecode;
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001533 return PyString_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001534}
1535
1536static PyObject *
1537array_get_itemsize(arrayobject *a, void *closure)
1538{
1539 return PyInt_FromLong((long)a->ob_descr->itemsize);
1540}
1541
1542static PyGetSetDef array_getsets [] = {
1543 {"typecode", (getter) array_get_typecode, NULL,
1544 "the typecode character used to create the array"},
1545 {"itemsize", (getter) array_get_itemsize, NULL,
1546 "the size, in bytes, of one array item"},
1547 {NULL}
1548};
1549
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001550PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001551 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001552 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001553 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001554 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001556 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001557 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1558 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001559 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001560 count_doc},
Thomas Wouters9e398ca2006-08-24 18:40:20 +00001561 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001562 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001563 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001564 extend_doc},
1565 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1566 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001567 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001568 fromlist_doc},
1569 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1570 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001571#ifdef Py_USING_UNICODE
1572 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1573 fromunicode_doc},
1574#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001575 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001576 index_doc},
1577 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1578 insert_doc},
1579 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1580 pop_doc},
Georg Brandl1e7c3752008-03-25 08:37:23 +00001581 {"read", (PyCFunction)array_fromfile_as_read, METH_VARARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001582 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001583 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1584 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001585 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001586 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001587 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001588 reverse_doc},
1589/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1590 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001591 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001592 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001593 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001594 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001595 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001596 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001597#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001598 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001599 tounicode_doc},
1600#endif
Georg Brandl1e7c3752008-03-25 08:37:23 +00001601 {"write", (PyCFunction)array_tofile_as_write, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001602 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001603 {NULL, NULL} /* sentinel */
1604};
1605
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001606static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001607array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001608{
Martin v. Löwis99866332002-03-01 10:27:01 +00001609 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001610 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001611 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001612
Christian Heimese93237d2007-12-19 02:37:44 +00001613 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001614 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001615 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001616 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001617 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001618 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001619
1620 if (typecode == 'c')
1621 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001622#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001623 else if (typecode == 'u')
1624 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001625#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001626 else
1627 v = array_tolist(a, NULL);
1628 t = PyObject_Repr(v);
1629 Py_XDECREF(v);
1630
1631 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001632 s = PyString_FromString(buf);
1633 PyString_ConcatAndDel(&s, t);
1634 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001635 return s;
1636}
1637
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001638static PyObject*
1639array_subscr(arrayobject* self, PyObject* item)
1640{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001641 if (PyIndex_Check(item)) {
1642 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001643 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001644 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001645 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001646 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001647 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001648 return array_item(self, i);
1649 }
1650 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001651 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001652 PyObject* result;
1653 arrayobject* ar;
1654 int itemsize = self->ob_descr->itemsize;
1655
Christian Heimese93237d2007-12-19 02:37:44 +00001656 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001657 &start, &stop, &step, &slicelength) < 0) {
1658 return NULL;
1659 }
1660
1661 if (slicelength <= 0) {
1662 return newarrayobject(&Arraytype, 0, self->ob_descr);
1663 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001664 else if (step == 1) {
1665 PyObject *result = newarrayobject(&Arraytype,
1666 slicelength, self->ob_descr);
1667 if (result == NULL)
1668 return NULL;
1669 memcpy(((arrayobject *)result)->ob_item,
1670 self->ob_item + start * itemsize,
1671 slicelength * itemsize);
1672 return result;
1673 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001674 else {
1675 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1676 if (!result) return NULL;
1677
1678 ar = (arrayobject*)result;
1679
1680 for (cur = start, i = 0; i < slicelength;
1681 cur += step, i++) {
1682 memcpy(ar->ob_item + i*itemsize,
1683 self->ob_item + cur*itemsize,
1684 itemsize);
1685 }
1686
1687 return result;
1688 }
1689 }
1690 else {
1691 PyErr_SetString(PyExc_TypeError,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001692 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001693 return NULL;
1694 }
1695}
1696
1697static int
1698array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1699{
Thomas Wouters3ccec682007-08-28 15:28:19 +00001700 Py_ssize_t start, stop, step, slicelength, needed;
1701 arrayobject* other;
1702 int itemsize;
1703
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001704 if (PyIndex_Check(item)) {
1705 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001706
1707 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001708 return -1;
1709 if (i < 0)
Christian Heimese93237d2007-12-19 02:37:44 +00001710 i += Py_SIZE(self);
1711 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001712 PyErr_SetString(PyExc_IndexError,
1713 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001714 return -1;
1715 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001716 if (value == NULL) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001717 /* Fall through to slice assignment */
1718 start = i;
1719 stop = i + 1;
1720 step = 1;
1721 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001722 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001723 else
1724 return (*self->ob_descr->setitem)(self, i, value);
1725 }
1726 else if (PySlice_Check(item)) {
1727 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimese93237d2007-12-19 02:37:44 +00001728 Py_SIZE(self), &start, &stop,
Thomas Wouters3ccec682007-08-28 15:28:19 +00001729 &step, &slicelength) < 0) {
1730 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001731 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001732 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001733 else {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001734 PyErr_SetString(PyExc_TypeError,
1735 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001736 return -1;
1737 }
Thomas Wouters3ccec682007-08-28 15:28:19 +00001738 if (value == NULL) {
1739 other = NULL;
1740 needed = 0;
1741 }
1742 else if (array_Check(value)) {
1743 other = (arrayobject *)value;
Christian Heimese93237d2007-12-19 02:37:44 +00001744 needed = Py_SIZE(other);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001745 if (self == other) {
1746 /* Special case "self[i:j] = self" -- copy self first */
1747 int ret;
1748 value = array_slice(other, 0, needed);
1749 if (value == NULL)
1750 return -1;
1751 ret = array_ass_subscr(self, item, value);
1752 Py_DECREF(value);
1753 return ret;
1754 }
1755 if (other->ob_descr != self->ob_descr) {
1756 PyErr_BadArgument();
1757 return -1;
1758 }
1759 }
1760 else {
1761 PyErr_Format(PyExc_TypeError,
1762 "can only assign array (not \"%.200s\") to array slice",
Christian Heimese93237d2007-12-19 02:37:44 +00001763 Py_TYPE(value)->tp_name);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001764 return -1;
1765 }
1766 itemsize = self->ob_descr->itemsize;
1767 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1768 if ((step > 0 && stop < start) ||
1769 (step < 0 && stop > start))
1770 stop = start;
1771 if (step == 1) {
1772 if (slicelength > needed) {
1773 memmove(self->ob_item + (start + needed) * itemsize,
1774 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001775 (Py_SIZE(self) - stop) * itemsize);
1776 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001777 needed - slicelength) < 0)
1778 return -1;
1779 }
1780 else if (slicelength < needed) {
Christian Heimese93237d2007-12-19 02:37:44 +00001781 if (array_resize(self, Py_SIZE(self) +
Thomas Wouters3ccec682007-08-28 15:28:19 +00001782 needed - slicelength) < 0)
1783 return -1;
1784 memmove(self->ob_item + (start + needed) * itemsize,
1785 self->ob_item + stop * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001786 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001787 }
1788 if (needed > 0)
1789 memcpy(self->ob_item + start * itemsize,
1790 other->ob_item, needed * itemsize);
1791 return 0;
1792 }
1793 else if (needed == 0) {
1794 /* Delete slice */
1795 Py_ssize_t cur, i;
1796
1797 if (step < 0) {
1798 stop = start + 1;
1799 start = stop + step * (slicelength - 1) - 1;
1800 step = -step;
1801 }
1802 for (cur = start, i = 0; i < slicelength;
1803 cur += step, i++) {
1804 Py_ssize_t lim = step - 1;
1805
Christian Heimese93237d2007-12-19 02:37:44 +00001806 if (cur + step >= Py_SIZE(self))
1807 lim = Py_SIZE(self) - cur - 1;
Thomas Wouters3ccec682007-08-28 15:28:19 +00001808 memmove(self->ob_item + (cur - i) * itemsize,
1809 self->ob_item + (cur + 1) * itemsize,
1810 lim * itemsize);
1811 }
1812 cur = start + slicelength * step;
Christian Heimese93237d2007-12-19 02:37:44 +00001813 if (cur < Py_SIZE(self)) {
Thomas Wouters3ccec682007-08-28 15:28:19 +00001814 memmove(self->ob_item + (cur-slicelength) * itemsize,
1815 self->ob_item + cur * itemsize,
Christian Heimese93237d2007-12-19 02:37:44 +00001816 (Py_SIZE(self) - cur) * itemsize);
Thomas Wouters3ccec682007-08-28 15:28:19 +00001817 }
Christian Heimese93237d2007-12-19 02:37:44 +00001818 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Wouters3ccec682007-08-28 15:28:19 +00001819 return -1;
1820 return 0;
1821 }
1822 else {
1823 Py_ssize_t cur, i;
1824
1825 if (needed != slicelength) {
1826 PyErr_Format(PyExc_ValueError,
1827 "attempt to assign array of size %zd "
1828 "to extended slice of size %zd",
1829 needed, slicelength);
1830 return -1;
1831 }
1832 for (cur = start, i = 0; i < slicelength;
1833 cur += step, i++) {
1834 memcpy(self->ob_item + cur * itemsize,
1835 other->ob_item + i * itemsize,
1836 itemsize);
1837 }
1838 return 0;
1839 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001840}
1841
1842static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001843 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001844 (binaryfunc)array_subscr,
1845 (objobjargproc)array_ass_subscr
1846};
1847
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001848static const void *emptybuf = "";
1849
Martin v. Löwis18e16552006-02-15 17:27:45 +00001850static Py_ssize_t
1851array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001852{
1853 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001854 PyErr_SetString(PyExc_SystemError,
1855 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001856 return -1;
1857 }
1858 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001859 if (*ptr == NULL)
1860 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001861 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001862}
1863
Martin v. Löwis18e16552006-02-15 17:27:45 +00001864static Py_ssize_t
1865array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001866{
1867 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001868 PyErr_SetString(PyExc_SystemError,
1869 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001870 return -1;
1871 }
1872 *ptr = (void *)self->ob_item;
Raymond Hettinger01a807d2007-04-02 22:54:21 +00001873 if (*ptr == NULL)
1874 *ptr = emptybuf;
Christian Heimese93237d2007-12-19 02:37:44 +00001875 return Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001876}
1877
Martin v. Löwis18e16552006-02-15 17:27:45 +00001878static Py_ssize_t
1879array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001880{
1881 if ( lenp )
Christian Heimese93237d2007-12-19 02:37:44 +00001882 *lenp = Py_SIZE(self)*self->ob_descr->itemsize;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001883 return 1;
1884}
1885
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001886static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001887 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001888 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001889 (ssizeargfunc)array_repeat, /*sq_repeat*/
1890 (ssizeargfunc)array_item, /*sq_item*/
1891 (ssizessizeargfunc)array_slice, /*sq_slice*/
1892 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1893 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001894 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001895 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001896 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001897};
1898
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001899static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001900 (readbufferproc)array_buffer_getreadbuf,
1901 (writebufferproc)array_buffer_getwritebuf,
1902 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001903 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001904};
1905
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001906static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001907array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001908{
1909 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001910 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001911 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001912
Georg Brandlb84c1372007-01-21 10:28:43 +00001913 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001914 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001915
1916 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1917 return NULL;
1918
1919 if (!(initial == NULL || PyList_Check(initial)
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001920 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001921 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001922 it = PyObject_GetIter(initial);
1923 if (it == NULL)
1924 return NULL;
1925 /* We set initial to NULL so that the subsequent code
1926 will create an empty array of the appropriate type
1927 and afterwards we can use array_iter_extend to populate
1928 the array.
1929 */
1930 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001931 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001932 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1933 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001934 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001935 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001936
1937 if (initial == NULL || !(PyList_Check(initial)
1938 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001939 len = 0;
1940 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001941 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001942
1943 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001944 if (a == NULL)
1945 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001946
Guido van Rossum778983b1993-02-19 15:55:02 +00001947 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001948 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001949 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001950 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001951 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001952 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001953 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001954 return NULL;
1955 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001956 if (setarrayitem(a, i, v) != 0) {
1957 Py_DECREF(v);
1958 Py_DECREF(a);
1959 return NULL;
1960 }
1961 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001962 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +00001963 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001964 PyObject *t_initial, *v;
1965 t_initial = PyTuple_Pack(1, initial);
1966 if (t_initial == NULL) {
1967 Py_DECREF(a);
1968 return NULL;
1969 }
1970 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001971 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001972 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001973 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001974 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001975 return NULL;
1976 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001977 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001978#ifdef Py_USING_UNICODE
1979 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001980 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001981 if (n > 0) {
1982 arrayobject *self = (arrayobject *)a;
1983 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001984 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001985 if (item == NULL) {
1986 PyErr_NoMemory();
1987 Py_DECREF(a);
1988 return NULL;
1989 }
1990 self->ob_item = item;
Christian Heimese93237d2007-12-19 02:37:44 +00001991 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001992 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimese93237d2007-12-19 02:37:44 +00001993 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001994 }
1995#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001996 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001997 if (it != NULL) {
1998 if (array_iter_extend((arrayobject *)a, it) == -1) {
1999 Py_DECREF(it);
2000 Py_DECREF(a);
2001 return NULL;
2002 }
2003 Py_DECREF(it);
2004 }
Guido van Rossum778983b1993-02-19 15:55:02 +00002005 return a;
2006 }
2007 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00002008 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00002009 "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 +00002010 return NULL;
2011}
2012
Guido van Rossum778983b1993-02-19 15:55:02 +00002013
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002014PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002015"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002016an array of basic values: characters, integers, floating point\n\
2017numbers. Arrays are sequence types and behave very much like lists,\n\
2018except that the type of objects stored in them is constrained. The\n\
2019type is specified at object creation time by using a type code, which\n\
2020is a single character. The following type codes are defined:\n\
2021\n\
2022 Type code C Type Minimum size in bytes \n\
2023 'c' character 1 \n\
2024 'b' signed integer 1 \n\
2025 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002026 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002027 'h' signed integer 2 \n\
2028 'H' unsigned integer 2 \n\
2029 'i' signed integer 2 \n\
2030 'I' unsigned integer 2 \n\
2031 'l' signed integer 4 \n\
2032 'L' unsigned integer 4 \n\
2033 'f' floating point 4 \n\
2034 'd' floating point 8 \n\
2035\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002036The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002037\n\
2038array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002039");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002040
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002041PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00002042"array(typecode [, initializer]) -> array\n\
2043\n\
2044Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00002045initialized from the optional initializer value, which must be a list,\n\
2046string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002047\n\
2048Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002049the type of objects stored in them is constrained.\n\
2050\n\
2051Methods:\n\
2052\n\
2053append() -- append a new item to the end of the array\n\
2054buffer_info() -- return information giving the current memory info\n\
2055byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002056count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002057extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002058fromfile() -- read items from a file object\n\
2059fromlist() -- append items from the list\n\
2060fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002061index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002062insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002063pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002064read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002065remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002066reverse() -- reverse the order of the items in the array\n\
2067tofile() -- write all items to a file object\n\
2068tolist() -- return the array converted to an ordinary list\n\
2069tostring() -- return the array converted to a string\n\
2070write() -- DEPRECATED, use tofile()\n\
2071\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002072Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002073\n\
2074typecode -- the typecode character used to create the array\n\
2075itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002076");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002077
Raymond Hettinger625812f2003-01-07 01:58:52 +00002078static PyObject *array_iter(arrayobject *ao);
2079
Tim Peters0c322792002-07-17 16:49:03 +00002080static PyTypeObject Arraytype = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002081 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002082 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002083 sizeof(arrayobject),
2084 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002085 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002086 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002087 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002088 0, /* tp_setattr */
2089 0, /* tp_compare */
2090 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002091 0, /* tp_as_number*/
2092 &array_as_sequence, /* tp_as_sequence*/
2093 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002094 0, /* tp_hash */
2095 0, /* tp_call */
2096 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002097 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002098 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002099 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002100 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002101 arraytype_doc, /* tp_doc */
2102 0, /* tp_traverse */
2103 0, /* tp_clear */
2104 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002105 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002106 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002107 0, /* tp_iternext */
2108 array_methods, /* tp_methods */
2109 0, /* tp_members */
2110 array_getsets, /* tp_getset */
2111 0, /* tp_base */
2112 0, /* tp_dict */
2113 0, /* tp_descr_get */
2114 0, /* tp_descr_set */
2115 0, /* tp_dictoffset */
2116 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002117 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002118 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002119 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002120};
2121
Raymond Hettinger625812f2003-01-07 01:58:52 +00002122
2123/*********************** Array Iterator **************************/
2124
2125typedef struct {
2126 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002127 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002128 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002129 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002130} arrayiterobject;
2131
2132static PyTypeObject PyArrayIter_Type;
2133
2134#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2135
2136static PyObject *
2137array_iter(arrayobject *ao)
2138{
2139 arrayiterobject *it;
2140
2141 if (!array_Check(ao)) {
2142 PyErr_BadInternalCall();
2143 return NULL;
2144 }
2145
2146 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2147 if (it == NULL)
2148 return NULL;
2149
2150 Py_INCREF(ao);
2151 it->ao = ao;
2152 it->index = 0;
2153 it->getitem = ao->ob_descr->getitem;
2154 PyObject_GC_Track(it);
2155 return (PyObject *)it;
2156}
2157
2158static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002159arrayiter_next(arrayiterobject *it)
2160{
2161 assert(PyArrayIter_Check(it));
Christian Heimese93237d2007-12-19 02:37:44 +00002162 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002163 return (*it->getitem)(it->ao, it->index++);
2164 return NULL;
2165}
2166
2167static void
2168arrayiter_dealloc(arrayiterobject *it)
2169{
2170 PyObject_GC_UnTrack(it);
2171 Py_XDECREF(it->ao);
2172 PyObject_GC_Del(it);
2173}
2174
2175static int
2176arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2177{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002178 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002179 return 0;
2180}
2181
2182static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +00002183 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002184 "arrayiterator", /* tp_name */
2185 sizeof(arrayiterobject), /* tp_basicsize */
2186 0, /* tp_itemsize */
2187 /* methods */
2188 (destructor)arrayiter_dealloc, /* tp_dealloc */
2189 0, /* tp_print */
2190 0, /* tp_getattr */
2191 0, /* tp_setattr */
2192 0, /* tp_compare */
2193 0, /* tp_repr */
2194 0, /* tp_as_number */
2195 0, /* tp_as_sequence */
2196 0, /* tp_as_mapping */
2197 0, /* tp_hash */
2198 0, /* tp_call */
2199 0, /* tp_str */
2200 PyObject_GenericGetAttr, /* tp_getattro */
2201 0, /* tp_setattro */
2202 0, /* tp_as_buffer */
2203 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2204 0, /* tp_doc */
2205 (traverseproc)arrayiter_traverse, /* tp_traverse */
2206 0, /* tp_clear */
2207 0, /* tp_richcompare */
2208 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002209 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002210 (iternextfunc)arrayiter_next, /* tp_iternext */
2211 0, /* tp_methods */
2212};
2213
2214
2215/*********************** Install Module **************************/
2216
Martin v. Löwis99866332002-03-01 10:27:01 +00002217/* No functions in array module. */
2218static PyMethodDef a_methods[] = {
2219 {NULL, NULL, 0, NULL} /* Sentinel */
2220};
2221
2222
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002223PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002224initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002225{
Fred Drakef4e34842002-04-01 03:45:06 +00002226 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002227
Martin v. Löwis99866332002-03-01 10:27:01 +00002228 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002229 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002230 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002231 if (m == NULL)
2232 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002233
2234 Py_INCREF((PyObject *)&Arraytype);
2235 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2236 Py_INCREF((PyObject *)&Arraytype);
2237 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002238 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002239}